Explicado · Bitcoin
O que é SegWit, o testemunho que sai do corpo da transação do Bitcoin
O BIP 141 tira scripts e assinaturas do corpo da transação: o txid deixa de depender da assinatura, a malleabilidade some, o bloco ganha teto de 4 milhões de unidades de peso e o dado de testemunho vale um quarto.
Segregated Witness, ou SegWit, é o soft fork definido no BIP 141, uma especificação do campo de consenso assinada por Eric Lombrozo, Johnson Lau e Pieter Wuille, atribuída em 21 de dezembro de 2015 e com status Deployed. A proposta cria uma estrutura nova, o testemunho (witness), que guarda os dados necessários para validar a transação mas não para determinar seus efeitos: scripts e assinaturas saem do corpo da transação e passam a ser confirmados à parte da árvore de Merkle de transações.
Com isso cada transação ganha dois identificadores. O txid continua sendo o SHA256 duplo da serialização tradicional, sem nenhum dado de testemunho. O wtxid é o SHA256 duplo da serialização nova, com marcador de um byte zero, bandeira de um byte e o testemunho. Como a assinatura deixa de fazer parte do hash, a malleabilidade involuntária deixa de ser possível: mudar como a transação foi assinada deixa de mudar o identificador. O BIP aponta que isso permite cadeias de transações não confirmadas sem risco de contraparte, base de protocolos off-chain como a Lightning Network.
O bloco precisa registrar os wtxid. O wtxid da transação de coinbase é tratado como zero, a raiz do testemunho é calculada com os wtxid como folhas e o compromisso vai para um scriptPubKey da coinbase de pelo menos 38 bytes: seis primeiros bytes 0x6a24aa21a9ed e, depois, 32 bytes de hash duplo-SHA256 da raiz do testemunho com o valor reservado. Se nenhuma transação do bloco tiver dado de testemunho, o compromisso é opcional.
O limite do bloco deixa de ser o tamanho e passa a ser o peso. Peso é tamanho base multiplicado por três mais tamanho total, e a regra é peso máximo de 4.000.000. O tamanho base, o que um nó não atualizado enxerga, segue nos 1.000.000 bytes de sempre. O tamanho virtual da transação é o peso dividido por quatro, arredondado para cima, ou seja, o dado de testemunho custa um quarto. As sigops por bloco, antes limitadas a 20.000, são multiplicadas por quatro e passam a ter teto de 80.000, e cada entrada P2WPKH conta como uma sigop.
A regra nova aparece no scriptPubKey: um empurrão de um byte de versão, de OP_0 a OP_16, seguido de 2 a 40 bytes de programa de testemunho. Versão 0 com 20 bytes é P2WPKH, cujo testemunho tem exatamente dois itens, assinatura e chave pública, com HASH160 da chave batendo com o programa e só chaves comprimidas aceitas. Versão 0 com 32 bytes é P2WSH: o script sai do testemunho, é hasheado com SHA256 e roda com a pilha restante, admitindo witnessScript de até 10.000 bytes porque o limite de empurrão de 520 bytes não se aplica. Versões de 1 a 16 ficam reservadas para extensões futuras, sem interpretação do programa.
Como soft fork, os nós antigos continuam operando sem modificação, mas não validam o testemunho e tratam os programas de testemunho como scripts de qualquer um pode gastar, com exceção dos casos-limite. O BIP orienta que carteiras desatualizadas tratem esses scripts com suspeita.
O que o documento ainda deixava como extensão futura: prova de fraudes compacta para nós SPV, novos sistemas de script, como assinaturas Schnorr, assinaturas Lamport resistentes a computação quântica e árvores de sintaxe abstrata merklificadas, e tempo de bloqueio por entrada. A implantação prevista era por version bits, com o nome segwit e o bit 1, marcando início em 15 de novembro de 2016 e fim em 15 de novembro de 2017 na mainnet.