Pular para o conteúdo
buybitcoinsmart

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.

Não confundir com

Perguntas frequentes

Por que assinar uma transação antiga demora tanto na minha carteira de hardware?

Porque o hash de assinatura legacy não se compromete com o valor da entrada, o dispositivo precisa receber cada transação anterior por inteiro para calcular os valores por conta própria. As entradas segwit pulam essa etapa, e é por isso que bitcoins modernos são assinados em segundos.

O hash de assinatura é a mesma coisa que o id de transação?

Não. O id de transação é o hash da transação como ela será transmitida. Um hash de assinatura cobre uma cópia modificada, diferente para cada entrada e cada sinalizador, e nunca aparece em lugar algum da cadeia.

Termos relacionados

Mais em Transações e taxas

Ler esta página em inglês