Assinatura
A prova de que você é o dono de uma chave pública
Uma assinatura é usada para provar que você é o dono de uma chave pública.
Ela é usada dentro das transações para destravar saídas que foram travadas a uma chave pública.
Uma assinatura é criada usando a chave privada que foi usada para criar a chave pública. A assinatura tem, portanto, uma conexão matemática única com a chave pública — o que é suficiente para provar que você é o "dono" da chave pública sem ter que revelar a chave privada original.
Criando
Como você assina uma transação de bitcoin?
Para criar uma assinatura, você precisa assinar uma mensagem usando a sua chave privada. No Bitcoin, essa mensagem são os dados da transação que contêm a entrada que você quer destravar.
O fluxo geral é: preparar os dados da transação (de uma forma específica), fazer o HASH256 deles para obter a mensagem, e então assinar a mensagem com a chave privada (gerando a assinatura) — repetindo para cada entrada que você quer assinar.
Há três algoritmos de assinatura, e o que você usa depende do tipo de script de travamento da saída:
Algoritmo Legado
Usado para criar assinaturas que destravam scripts não-segwit (P2PK, P2PKH, P2MS, P2SH). Resumidamente: você pega a transação, esvazia todos os ScriptSigs, coloca o ScriptPubKey da saída sendo gasta no lugar do ScriptSig da entrada que está assinando, adiciona o tipo de hash no fim, faz o HASH256 de tudo e assina com ECDSA.
Algoritmo SegWit
Usado para destravar P2WPKH e P2WSH (BIP 143). Ele reorganiza os dados que são hasheados — incluindo o valor da entrada sendo gasta — o que corrige problemas do algoritmo legado e permite verificar as taxas com mais segurança em carteiras de hardware. Também usa ECDSA.
Algoritmo Taproot
Usado para destravar P2TR (BIP 341). Usa o esquema de assinatura Schnorr (em vez de ECDSA) e hasheia ainda mais dados da transação para maior segurança.
As saídas não-segwit e segwit usam ECDSA; as saídas Taproot usam Schnorr. Você pode experimentar os dois algoritmos abaixo (assinar uma mensagem com uma chave privada e verificar a assinatura):
HASH256
Little Endian
Codificação DER
Como uma assinatura ECDSA é serializada?
Uma assinatura ECDSA é formada por dois números: r e s. Para colocá-los na transação, eles são serializados usando o padrão DER (Distinguished Encoding Rules), que codifica os dois valores com marcadores de tipo e tamanho. Um byte de tipo de hash é anexado ao fim.
As assinaturas Schnorr (Taproot) NÃO usam DER — são simplesmente os 64 bytes de r e s concatenados (mais o byte de tipo de hash, se não for o padrão).
Tipo de Hash da Assinatura (SIGHASH)
O que uma assinatura realmente assina?
O tipo de hash (sighash) é um byte no fim da assinatura que indica quais partes da transação a assinatura compromete. Os tipos principais:
SIGHASH_ALL(0x01) — assina todas as entradas e todas as saídas. O mais comum (a transação não pode ser alterada).SIGHASH_NONE(0x02) — assina todas as entradas, mas nenhuma saída (as saídas podem ser alteradas).SIGHASH_SINGLE(0x03) — assina todas as entradas e apenas a saída de mesmo índice.SIGHASH_ANYONECANPAY(0x80) — modificador: assina apenas a sua própria entrada (outras pessoas podem adicionar entradas).
A grande maioria das assinaturas usa SIGHASH_ALL, que efetivamente "tranca" toda a transação, impedindo qualquer modificação após a assinatura.