Segregated Witness
A grande atualização de 2017 (SegWit)
BIP 141: Segregated Witness (Camada de Consenso)
BIP 143: Verificação de Assinatura de Transação para Programa de Testemunha Versão 0
BIP 144: Segregated Witness (Serviços de Pares)
Segregated Witness (SegWit) foi uma grande atualização do software do Bitcoin, ativada em 2017 (bloco 481.824).
As principais mudanças foram uma nova estrutura de transação, um aumento do tamanho do bloco e a adição de um novo formato de endereço.
Esta página lista as mudanças técnicas introduzidas na atualização Segregated Witness. Para uma introdução sobre por que e como a atualização aconteceu, veja o guia para iniciantes sobre SegWit.
Motivação
Por que o Segregated Witness foi introduzido?
A razão principal da atualização Segregated Witness foi corrigir a maleabilidade das transações (transaction malleability).
Antes do Segregated Witness, os TXIDs das transações legadas eram criados a partir de todos os dados da transação, incluindo as assinaturas.
Porém, é possível ajustar as assinaturas dentro de uma transação e elas continuarem válidas, o que afetaria o TXID. Isso significava que alguém poderia mudar o TXID da sua transação depois que você a enviasse para a rede.
O problema é que qualquer transação que dependesse deste TXID (ou seja, transações que gastassem uma das saídas enquanto ela ainda estava no memory pool) se tornaria inválida. Em outras palavras, um minerador poderia "cancelar" os descendentes de transações no memory pool e impedi-los de serem minerados em um bloco.
Portanto, a mudança principal foi uma modificação na estrutura dos dados da transação para que as assinaturas não fizessem mais parte do cálculo do TXID, tornando os TXIDs confiáveis e permitindo gastar saídas de transações ainda no memory pool com segurança.
Estes novos dados de transação permitiram, ao mesmo tempo, um aumento do tamanho do bloco — por isso o SegWit foi introduzido como um conjunto de mudanças em uma única grande atualização do software.
Mudanças Técnicas
Quais foram as mudanças no Bitcoin?
A seguir está uma lista de todas as mudanças que ocorreram no Bitcoin com a atualização Segregated Witness.
Começo com as mudanças mais significativas primeiro (as que você tem mais chance de encontrar como desenvolvedor) e vou descendo até as mudanças menores.
1. Estrutura da Transação
A mudança principal foi a adição de uma nova estrutura de transação segwit.
Estas novas transações segwit incluem uma nova seção de testemunha (witness) que guarda o código de destravamento (assinaturas) para os novos scripts de travamento introduzidos na atualização.
Enquanto transações legadas usam o campo ScriptSig para destravar entradas, as transações segwit agora usam a nova seção testemunha.
- Scripts de travamento legados (ex.: P2PKH, P2SH) ainda precisam ser destravados usando o campo ScriptSig. Apenas os novos scripts (ex.: P2WPKH, P2WSH) usam o novo campo de testemunha para destravamento.
- Transações legadas que não usam a testemunha para destravar entradas continuam vulneráveis à maleabilidade de transação.
Transaction Splitter
2. Cálculo do Tamanho da Transação
Com a adição do novo campo de testemunha, as transações também receberam um novo cálculo de tamanho chamado peso (weight).
Em vez de medir o tamanho puramente pelo número de bytes, diferentes partes dos dados da transação receberam multiplicadores específicos para que algumas partes "pesassem menos" que outras:
| Tipo de Dado | Multiplicador |
|---|---|
| Dados Legados | bytes x 4 |
| Dados SegWit | bytes x 1 |
Como resultado, o código de destravamento em uma transação segwit pesa menos que em uma transação legada, efetivamente dando um desconto de tamanho (e taxas reduzidas) para quem usa as novas transações segwit.
Transaction Splitter
3. Aumento do Tamanho do Bloco
Usando o novo cálculo de peso para transações, o limite de tamanho do bloco foi alterado de 1.000.000 bytes para 4.000.000 unidades de peso.
Isso resulta em um aumento de tamanho de bloco de até 4 vezes o limite anterior.
Como os dados da transação sempre contêm alguns dados legados junto com os novos dados segwit, o aumento efetivo do tamanho do bloco fica em torno de 1.700.000 a 2.000.000 bytes na média (dependendo da composição das transações incluídas no bloco).
4. Scripts de Travamento
Dois novos padrões de script de travamento foram introduzidos para aproveitar o novo campo de testemunha para destravar certos tipos de saída:
Estes são funcionalmente os mesmos que os scripts de travamento legados P2PKH e P2SH.
A principal diferença é que P2WPKH e P2WSH são destravados usando a testemunha da transação em vez do ScriptSig.
Os novos scripts de travamento P2WPKH e P2WSH não usam a linguagem Script tradicional para travar e destravar. Eles usam uma estrutura fixa de bytes e têm seu próprio método de execução embutido no código. Mas ainda assim são funcionalmente equivalentes a P2PKH e P2SH.
Script
5. Formato de Endereço
Os novos scripts de travamento P2WPKH e P2WSH usam o novo formato de endereço Bech32.
Estes endereços Bech32 permitem melhor detecção de erros e são mais fáceis de transcrever.
Address (Bech32)
Enquanto scripts de travamento legados P2PKH e P2SH continuam usando endereços Base58, os novos P2WPKH e P2WSH usam endereços Bech32.
6. Algoritmo de Assinatura
Os novos scripts de travamento P2WPKH e P2WSH também usam um novo algoritmo de assinatura.
Este novo "algoritmo de assinatura segwit" foi projetado para ser mais eficiente que o algoritmo legado.
O processo para criar assinaturas para destravar P2WPKH e P2WSH é diferente do processo para scripts legados (ex.: P2PKH e P2SH).
Tanto o algoritmo legado quanto o novo segwit ainda usam ECDSA. A diferença está no método de preparação dos dados da transação para assinar ao destravar P2WPKH e P2WSH.
7. Compromisso wTXID
Devido ao fato de que as novas transações segwit contêm dados que não fazem mais parte do TXID, estes novos dados de testemunha precisam ser comprometidos ao bloco via um compromisso wTXID.
Além do TXID (que não inclui os novos campos de uma transação segwit), cada transação também tem um wTXID calculado aplicando hash em todos os dados de uma transação segwit (incluindo os novos campos).
TXID
wTXID
Portanto, ao construir um bloco, um minerador agora também calcula uma raiz de Merkle para todos os wTXIDs do bloco e a inclui via um compromisso wTXID na transação coinbase.
Como resultado, este compromisso wTXID impede que alguém modifique os dados de testemunha das transações incluídas em um bloco.
- O wTXID é colocado dentro da transação coinbase porque é a única parte de um bloco que pode incluir novos dados adicionais sem causar um hard fork.
- Como uma transação legada não inclui campos segwit, seu wTXID será o mesmo que seu TXID.
8. Mensagens de Rede
Ao se comunicar com outros nós na rede, agora é necessário solicitar especificamente que um nó envie os dados completos da transação para transações segwit (incluindo os novos dados de testemunha).
Enquanto em uma mensagem getdata o campo type era um dos seguintes:
01000000 = MSG_TX02000000 = MSG_BLOCK
Para solicitar uma transação ou bloco incluindo os novos dados de testemunha, use os seguintes campos type:
01000040 = MSG_WITNESS_TX02000040 = MSG_WITNESS_BLOCK
9. Outras Mudanças
- Além de bytes legados serem multiplicados por 4 no novo cálculo de tamanho, todas as operações de assinatura (ex.:
OP_CHECKSIG,OP_CHECKMULTISIG,OP_CHECKSIGVERIFY,OP_CHECKMULTISIGVERIFY) em uma transação legada também são multiplicadas por 4. Isto é importante ao calcular quantas operações de assinatura estão em um bloco, já que um bloco tem um limite de 80.000 operações de assinatura (sigops).
Resumo
Como você pode ver, o Segregated Witness introduziu múltiplas mudanças técnicas no Bitcoin de uma só vez.
Muitas destas mudanças parecem desnecessariamente complexas à primeira vista, mas isso porque foram necessárias soluções técnicas para introduzi-las como uma soft fork em vez de uma hard fork.
No entanto, dependendo do que você está desenvolvendo, provavelmente não precisa incluir todas as mudanças no seu software; você pode implementar apenas as mudanças relevantes para a sua ferramenta (ex.: você provavelmente não precisa se preocupar com as novas mensagens de rede se estiver desenvolvendo uma carteira).
Ainda assim, é útil estar ciente de todas as mudanças que ocorreram e como elas se conectam para criar a maior atualização do Bitcoin desde seu lançamento.
Implementar suporte para SegWit pode parecer um desafio técnico assustador no começo, mas se você trabalhar incorporando cada mudança aos poucos, você chega lá. É só ir um passo de cada vez.

