Glossário / Transações e taxas
Hash de assinatura
Outros nomes: Sighash.
- O que é o hash de assinatura?
- O hash de assinatura é o resumo que uma carteira assina de fato: uma cópia reconstruída da transação, ajustada conforme o sinalizador escolhido para aquela entrada e depois submetida duas vezes ao SHA-256.
Especificação no BIP-143.
Nenhuma assinatura cobre a transação como ela aparece na rede. Cada entrada recebe seu próprio resumo, construído por um procedimento que já foi reescrito duas vezes: o original de 2009, o BIP143 para entradas segwit e o BIP341 para o Taproot. O que o resumo deixa de fora é o que um atacante tem liberdade para mudar.
Como funciona
Construir um hash de assinatura significa montar uma cópia modificada da transação e calcular o hash dessa cópia, não o hash da transação que você está prestes a transmitir.
O procedimento original funciona assim. Pegue a transação, esvazie o script de desbloqueio de todas as entradas, insira o script que está sendo gasto na única entrada que você está assinando e depois mantenha, deixe em branco ou descarte as saídas conforme o sinalizador. Anexe o sinalizador como um número de quatro bytes, aplique o SHA-256 duas vezes sobre o conjunto inteiro e assine os 32 bytes que resultam disso.
Esse desenho tinha um custo que ninguém notou até as transações crescerem. Como cada entrada reconstrói a transação inteira e recalcula seu hash, o trabalho cresce com o quadrado do número de entradas. O BIP143 coloca números nisso: verificar um bloco comum de 1 MB leva algo em torno de 2 segundos, enquanto uma única transação de 1 MB montada de propósito, com 5.569 operações de assinatura, pode levar 25 segundos. Uma transação travando todos os nós da rede por tanto tempo é uma negação de serviço esperando para ser industrializada.
O BIP143 reescreveu o procedimento para entradas segwit versão 0 e resolveu dois problemas de uma vez. Três sub-hashes que cobrem os outpoints, os números de sequência e as saídas são calculados uma única vez e reutilizados em cada entrada, o que torna o custo linear. Mais importante para quem guarda bitcoins, o resumo agora se compromete com o valor da entrada que está sendo assinada. Antes disso, era preciso informar a um dispositivo de assinatura quanto valia uma entrada sem nenhuma forma de conferir, então um programa malicioso podia declarar um valor menor para as entradas e enganar uma carteira de hardware para aprovar uma taxa enorme.
O BIP341 reescreveu o procedimento uma terceira vez para o Taproot. O resumo do Taproot é um hash etiquetado, prefixado com uma string de domínio para que nunca possa ser confundido com um resumo de outro protocolo, e se compromete com os valores e os scripts de bloqueio de todas as entradas que estão sendo gastas, não apenas os da entrada assinada. Ele também introduz um valor de sinalizador padrão igual a zero, que cobre tudo o que a regra padrão cobre, mas nunca é escrito na assinatura.
Onde você o encontra
Você encontra o hash de assinatura de forma indireta, como o motivo pelo qual sua carteira de hardware se comporta como se comporta.
Assinar uma entrada legacy exige que o dispositivo receba a transação anterior completa, porque essa é a única forma de ele estabelecer por conta própria o valor da entrada. A Sparrow e a Electrum enviam essas transações para uma Trezor ou uma Ledger antes de assinar, e em uma carteira cheia de bitcoins antigos essa etapa é a razão pela qual um gasto demora bem mais do que você espera. Uma entrada segwit precisa apenas do valor, que o PSBT já carrega.
Ele aparece diretamente como o último byte de uma assinatura legacy ou segwit em um explorador de blocos. Uma assinatura terminada em 01 foi feita sob a regra que cobre tudo. Qualquer outro valor vale a pena entender antes de confiar na transação.
Hash de assinatura vs SIGHASH_ALL
O hash de assinatura é o resumo; o SIGHASH_ALL é uma das regras para construí-lo. Toda assinatura tem um hash de assinatura, incluindo as assinaturas Taproot que não carregam nenhum byte de sinalizador. O que varia é quais partes da transação entraram no resumo, e o sinalizador é apenas o rótulo dessa escolha. Dizer que uma transação “usa SIGHASH_ALL” descreve uma política; dizer que ela tem um hash de assinatura descreve algo que toda assinatura de bitcoin na história sempre teve.