Visão geral
No Bitcoin, a testemunha são os dados que provam autorização para gastar um UTXO — consistindo tipicamente de assinaturas digitais e chaves públicas. Com a introdução do Segregated Witness (SegWit), esses dados de autorização foram movidos ("segregados") do corpo principal da transação para uma estrutura de testemunha separada, resolvendo a maleabilidade de transações e habilitando o desconto de testemunha.
Estrutura de transação pré-SegWit vs. SegWit
Transação pré-SegWit:
┌────────────────────────────────────┐
│ Versão │
│ Entradas: │
│ TXID anterior + Índice │
│ ScriptSig (assinatura + pubkey) │ ← Dados de testemunha
│ Sequência │ dentro do corpo tx
│ Saídas: │
│ Valor + ScriptPubKey │
│ Locktime │
└────────────────────────────────────┘
TXID = Hash(estrutura completa acima)
Transação SegWit:
┌────────────────────────────────────┐
│ Versão │
│ Marcador + Bandeira (0x0001) │
│ Entradas: │
│ TXID anterior + Índice │
│ ScriptSig (vazio para nativo) │
│ Sequência │
│ Saídas: │
│ Valor + ScriptPubKey │
│ Testemunha: │
│ [assinatura, pubkey] │ ← Separado!
│ Locktime │
└────────────────────────────────────┘
TXID = Hash(estrutura SEM testemunha)
Por que a segregação importa
Ao mover os dados de testemunha para fora do cálculo do TXID:
- Correção da maleabilidade: Modificar os dados de testemunha não altera mais o TXID, permitindo o encadeamento confiável de transações essencial para a Lightning Network.
- Desconto de taxa: Os bytes de testemunha são contados a um quarto do peso (o desconto de testemunha), incentivando a adoção do SegWit e aumentando efetivamente a capacidade do bloco.
- Versionamento de scripts: A estrutura de testemunha inclui um byte de versão, permitindo futuras atualizações de scripts (como Tapscript) sem interromper os formatos de transação existentes.
A testemunha no Taproot
As transações Taproot usam a versão de testemunha 1. Para gastos por caminho de chave, a testemunha contém uma única assinatura Schnorr de 64 bytes. Para gastos por caminho de script, a testemunha inclui o script, uma prova Merkle da inclusão do script na árvore de scripts, e os dados que satisfazem as condições do script.
Conceitos errôneos comuns
A testemunha não é opcional para transações SegWit — é necessária para que a transação seja válida. O termo "segregado" significa que os dados de testemunha estão estruturalmente separados da parte da transação usada para calcular o TXID, não que possam ser descartados. Os nós completos armazenam e validam os dados de testemunha; eles são apenas excluídos do hash do TXID.