Glossário / Transações e taxas
SIGHASH_SINGLE
- O que é SIGHASH_SINGLE?
- SIGHASH_SINGLE é o sinalizador que ata uma assinatura a uma única saída, a que ocupa na lista a mesma posição que a entrada sendo assinada.
A entrada zero é emparelhada com a saída zero, a entrada um com a saída um, e todo o resto da transação fica sem assinatura. O desenho permite que várias partes garantam cada uma o seu próprio pagamento dentro de uma mesma transação compartilhada. Ele também carrega o erro de assinatura mais notório do bitcoin, que as entradas legadas ainda contêm.
Como funciona
O resumo mantém a entrada sendo assinada, a versão da transação, o locktime e exatamente uma saída: aquela cujo índice corresponde ao índice da entrada.
As saídas posteriores a esse índice são removidas da cópia antes do hash. As saídas anteriores a ele são mantidas como marcadores, mas esvaziadas, com valor de menos um e script vazio, de modo que seu conteúdo real também não é coberto. Os números de sequência de todas as outras entradas são zerados, como ocorre sob o sinalizador sem saídas.
Depois vem o bug. No algoritmo original, se o índice da entrada sendo assinada for maior ou igual ao número de saídas, não há saída correspondente para aplicar o hash. Em vez de falhar, o código retorna um resumo fixo: o valor um de 32 bytes. Todo assinante que cai nessa posição produz uma assinatura sobre o mesmo resumo, então a assinatura não está vinculada a nenhuma transação específica e pode ser copiada e repetida por qualquer um capaz de arranjar uma entrada no mesmo índice. O ramo sobrevive no Bitcoin Core até hoje, porque removê-lo mudaria a validade de bitcoins que já estão na cadeia.
As duas reescritas do algoritmo de hash de assinatura o fecharam. O BIP143 especifica que, para uma entrada segwit de versão 0 sem saída correspondente, a parte das saídas do resumo é de 32 bytes zero, enquanto o resto do resumo ainda se compromete com aquela entrada específica, então nada pode ser repetido. O BIP341 vai além: em uma entrada Taproot, uma assinatura desse tipo com um índice além do número de saídas simplesmente falha na validação.
Onde você o vê
O sinalizador aparece como um 03 no final de uma assinatura, e você o encontrará quase exclusivamente dentro de ofertas pré-assinadas, e não em pagamentos comuns.
O padrão é uma meia transação publicada como convite. Um vendedor assina a declaração “esta entrada minha entra, e a saída no índice correspondente me paga o preço que eu pedi”, e depois deixa o resto da transação em branco para um comprador preencher. Como a assinatura do vendedor ignora todas as outras entradas e saídas, o comprador pode adicionar seus próprios fundos, seu próprio troco e uma taxa no valor que a mempool exigir, e a garantia do vendedor continua valendo. Os mercados de Ordinals e Runes são construídos exatamente sobre isso, distribuídos como PSBTs, e é uma das poucas negociações genuinamente sem confiança que o bitcoin aceita sem nenhum terceiro no meio.
Ele quase sempre é combinado com ANYONECANPAY, porque sozinho o sinalizador ainda se compromete com a lista completa de entradas, o que frustra o propósito de deixar a transação aberta para outra pessoa completar.
SIGHASH_SINGLE vs SIGHASH_ANYONECANPAY
SIGHASH_SINGLE é um modo base e SIGHASH_ANYONECANPAY é um modificador, então eles respondem a perguntas diferentes. O modo base decide quanto do lado das saídas uma assinatura cobre: tudo, nada ou uma saída correspondente. O modificador decide quanto do lado das entradas ela cobre: todas as entradas, ou apenas aquela sendo assinada. Você escolhe um modo base e depois decide separadamente se adiciona o modificador, e é por isso que o byte do sinalizador em uma assinatura real costuma ser a soma dos dois, e não um deles isolado.