Segregated Witness

A grande atualização de 2017 (SegWit)

🛠️ Tradução em andamento — esta página mostra o conteúdo básico; a versão integral será publicada em breve.

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)

Logotipo SegWit

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

Diagrama mostrando a nova seção de testemunha de uma transação usada para destravar entradas.

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.
Ícone Ferramenta Transaction Splitter

Separador de Transações

Cole uma transação bruta (hexadecimal) para dividi-la nos seus campos individuais.

2. Cálculo do Tamanho da Transação

Diagrama mostrando o cálculo do tamanho de uma transação em unidades de peso.

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:

Multiplicadores de peso por tipo de dado
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.

Ícone Ferramenta Transaction Splitter

Separador de Transações

Cole uma transação bruta (hexadecimal) para dividi-la nos seus campos individuais.

3. Aumento do Tamanho do Bloco

Diagrama mostrando o limite de tamanho do bloco em unidades de peso.

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:

  1. P2WPKH Diagrama mostrando a estrutura de um P2WPKH.
  2. P2WSH Diagrama mostrando a estrutura de um P2WSH.

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.

Ícone Ferramenta Script

Script

Decodifique e codifique um script.

0 bytes

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.

Ícone Ferramenta Address (Bech32)

Endereço (Bech32)

Codifique um script de travamento P2WPKH, P2WSH ou P2TR em um endereço.

ScriptPubKey
Versão
0 bytes
0 bytes Tipo:
Rede

Codificação Bech32 do ScriptPubKey

0 caracteres

    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

    Diagrama mostrando o compromisso wTXID dentro de um bloco.

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

    Diagrama mostrando o wTXID sendo calculado a partir dos dados brutos da transação incluindo os novos campos segwit.
    Ícone Ferramenta TXID

    TXID

    Crie um TXID a partir dos dados de uma transação bruta.

    0 bytes

    Bytes da transação efetivamente usados no hash (sem marker, flag nem testemunha):

    Usado internamente dentro dos dados da transação bruta

    0 bytes

    Usado externamente ao buscar transações em exploradores de blocos

    0 bytes
    Ícone Ferramenta wTXID

    wTXID

    Crie um wTXID a partir dos dados de uma transação bruta.

    0 bytes 0 bytes

    Também conhecido como o "hash" da transação nos comandos do bitcoin-cli

    0 bytes

    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:

    Para solicitar uma transação ou bloco incluindo os novos dados de testemunha, use os seguintes campos type:

    9. Outras Mudanças

    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.