Testemunha (Witness)
A região da transação usada para destravar entradas segwit
A testemunha (witness) é a região de uma transação usada para destravar entradas segwit.
Ela é usada para destravar saídas que têm novos scripts de travamento segregados ("programas de testemunha"), como P2WPKH, P2WSH e P2TR. Se alguma das entradas de uma transação tem um programa de testemunha segwit, você precisa usar a seção de testemunha para destravá-la.
A área de testemunha é uma atualização usada em preferência aos campos ScriptSig. Mas o ScriptSig ainda é usado para destravar scripts legados (P2PK, P2PKH, P2MS, P2SH).
Witness (testemunha) é só outra palavra para as assinaturas nas transações.
Estrutura
Como você destrava uma entrada usando a testemunha?
A testemunha contém um campo de testemunha para cada entrada da transação.
Cada campo de testemunha começa com um campo de itens da pilha (stack items), indicando o número de itens que ele contém; depois, para cada item, há um campo de tamanho seguido do item em si.
Um campo de testemunha é funcionalmente igual ao ScriptSig, mas, em vez de usar OP_CODES para empurrar itens para a pilha, você usa campos compact size antes de cada item. Portanto, você não pode usar nenhum OP_CODE dentro dele para operações lógicas; tudo o que você pode fazer é empurrar dados para a pilha — que é tudo o que é necessário para destravar os tipos de script mais comuns.
A testemunha só pode empurrar dados para a pilha. Por exemplo, no ScriptSig você poderia usar 0x58 (OP_8) para empurrar o número 8; mas, na testemunha, você precisaria usar o byte 0x08 diretamente.
| Campo | Formato |
|---|---|
| Itens da Pilha | compact size |
| Tamanho do Item | compact size |
| Item | bytes |
As duas últimas linhas se repetem para cada item; a estrutura inteira se repete para cada entrada.
Se você está destravando entradas legadas e segwit na mesma transação, precisa definir o campo de testemunha das entradas legadas como 00 (nenhum item), pois cada entrada precisa ter o seu próprio campo de testemunha.
Testemunha e TXID
Os dados de testemunha não fazem parte do TXID — eles só entram no wTXID. Foi esse o principal objetivo do SegWit: tirar as assinaturas do cálculo do TXID, tornando-o imutável após o envio.