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):

Ícone Ferramenta

ECDSA

Assine um hash de mensagem de 32 bytes com uma chave privada (secp256k1) e veja a assinatura (r, s) e a codificação DER.

Nota: o ECDSA é aleatório por natureza, então a assinatura muda a cada execução. Uma assinatura recém-gerada é sempre verificada como válida.

Ícone Ferramenta

Schnorr (BIP340)

Assine um hash de mensagem de 32 bytes com uma chave privada usando assinaturas Schnorr (usadas no Taproot) e verifique-a.

Ícone Ferramenta HASH256
Ícone Ferramenta

HASH256

SHA-256 dupla. Faz o hash dos bytes de dados usando SHA-256 duas vezes: SHA256(SHA256(dados)).

0 bytes 0 bytes
Ícone Ferramenta Little Endian
Ícone Ferramenta

Little Endian

Converta um número entre as ordens de bytes big-endian e little-endian.

Tamanho:

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.

Ícone Ferramenta

Codificação DER

Serializa os dois números de uma assinatura ECDSA (r e s) no formato DER, usado dentro das transações.

Assinatura
0d
0d
0 bytes

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:

A grande maioria das assinaturas usa SIGHASH_ALL, que efetivamente "tranca" toda a transação, impedindo qualquer modificação após a assinatura.