Visão geral
Uma bandeira sighash (hash de assinatura) é um byte anexado a cada assinatura em uma transação Bitcoin que especifica quais partes da transação a assinatura cobre. Ao variar a bandeira sighash, os signatários podem escolher bloquear toda a transação ou deixar certas partes modificáveis por outros. Essa flexibilidade habilita padrões avançados de transação como crowdfunding, pagamentos abertos e construção colaborativa de transações.
Tipos de Sighash
Bandeiras Sighash e o que cobrem:
SIGHASH_ALL (0x01) — Padrão, mais comum
┌────────────────────────────────┐
│ Assina: TODAS entradas + TODAS │
│ saídas │
│ Nada pode ser alterado │
│ "Concordo com exatamente essa │
│ tx" │
└────────────────────────────────┘
SIGHASH_NONE (0x02)
┌────────────────────────────────┐
│ Assina: TODAS entradas, NENHUMA│
│ saída │
│ Qualquer um pode mudar para │
│ onde os fundos vão │
│ "Autorizo gastar minha entrada,│
│ não me importo com o destino" │
└────────────────────────────────┘
SIGHASH_SINGLE (0x03)
┌────────────────────────────────┐
│ Assina: TODAS entradas + UMA │
│ saída (mesmo índice que a │
│ entrada) │
│ Outras saídas podem ser │
│ adicionadas │
│ "Quero minha saída específica, │
│ o resto é flexível" │
└────────────────────────────────┘
Modificador ANYONECANPAY (0x80) — Pode combinar com os acima:
┌────────────────────────────────┐
│ Assina: APENAS a entrada do │
│ signatário │
│ Outras entradas podem ser │
│ adicionadas │
│ "Outros podem contribuir com │
│ entradas" │
└────────────────────────────────┘
Bandeiras combinadas
O modificador ANYONECANPAY pode ser combinado com qualquer um dos três tipos base:
| Bandeira | Hex | Entradas assinadas | Saídas assinadas |
|---|---|---|---|
| ALL | 0x01 | Todas | Todas |
| NONE | 0x02 | Todas | Nenhuma |
| SINGLE | 0x03 | Todas | Uma (índice correspondente) |
| ALL|ANYONECANPAY | 0x81 | Uma (própria) | Todas |
| NONE|ANYONECANPAY | 0x82 | Uma (própria) | Nenhuma |
| SINGLE|ANYONECANPAY | 0x83 | Uma (própria) | Uma (índice correspondente) |
Casos de uso práticos
- SIGHASH_ALL — Pagamentos padrão onde o signatário quer bloquear toda a transação. Usado na grande maioria das transações Bitcoin.
- ALL|ANYONECANPAY — Crowdfunding: o criador define a saída (destinatário e valor), e múltiplos doadores cada um assina sua própria entrada. Uma vez que entradas suficientes são coletadas, a transação é válida.
- SINGLE|ANYONECANPAY — Cada signatário se compromete com seu par entrada-saída, permitindo a um grupo construir colaborativamente uma transação. Útil em certas construções de CoinJoin.
- NONE — Raramente usado, pois permite a qualquer um redirecionar os fundos. Poderia teoricamente ser usado em protocolos onde o destino de saída é determinado mais tarde.
Mudanças de Sighash no Taproot
A atualização Taproot introduziu SIGHASH_DEFAULT (0x00), que se comporta como SIGHASH_ALL mas economiza um byte ao não anexar a bandeira à assinatura. O Taproot também adicionou a proposta SIGHASH_ANYPREVOUT (BIP118, ainda não ativada) que permitiria assinaturas que não se comprometem com o UTXO de entrada específico, habilitando designs de canal Eltoo/LN-Symmetry.
Equívoco comum
Muitos usuários assumem que todas as assinaturas funcionam da mesma forma no Bitcoin. Na realidade, a bandeira sighash dá ao signatário controle refinado sobre o que está autorizando. No entanto, usar tipos de sighash não padrão requer uma compreensão cuidadosa, pois o uso incorreto pode resultar em fundos redirecionáveis por terceiros.