Blockchain/Nível IV · Protocolo a fundo/4.1 Script/Lição 7
Witness segregado e maleabilidade de transações
O ID instável, a assinatura dividida e a correção que desbloqueou o Lightning
MateriaisUm explorador de blocos com capacidade de saída em JSONA string hexadecimal da transação P2PKH pré-SegWit (de 2016 ou anterior)A string hexadecimal da transação P2WPKH pós-SegWit
Curiosidade
- Por que um estranho poderia alterar a identidade de uma transação sem comprometer sua validade?
- Como mover as assinaturas para fora do hash corrige a maleabilidade, mantendo-as protegidas pelo consenso?
- O que é o peso do bloco (block weight), e por que o desconto aplicado aos dados do witness aumentou a capacidade?
Explorar
- Antes do SegWit, um ID de transação (txid) era o resultado da codificação SHA-256 dupla de toda a transação, incluindo as assinaturas. Terceiros podiam reencodificar uma assinatura, por exemplo, negando seu valor “s” ou alterando a forma como ela era empurrada para o script, sem invalidá-la, gerando um novo txid para o mesmo pagamento. Essa maleabilidade quebrava as cadeias de transações não confirmadas: se a transação filha de Alice fazia referência à sua transação pai por meio do ID, uma transação pai adulterada deixaria a transação filha “órfã”, confundindo carteiras e exchanges que rastreavam os pagamentos.
- A Mt. Gox citou esse mecanismo em fevereiro de 2014 para explicar o caos interno durante seu colapso, embora análises posteriores tenham mostrado que ele representava uma pequena parte das perdas relatadas. A vulnerabilidade persistiu porque as assinaturas ECDSA são inerentemente mutáveis em sua representação em bytes; terceiros, e após a implementação das regras BIP66 e low-S, principalmente os mineradores, podiam reescrevê-las. Essa instabilidade tornava inviável a criação de canais de pagamento bidirecionais como o Lightning, nos quais os estados dos canais dependem de IDs de transação específicos e previsíveis antes da confirmação.
- O Segregated Witness (BIP141), ativado em 24 de agosto de 2017, no bloco 481.824, resolveu esse problema separando os dados do witness do corpo da transação. O txid agora gera um hash apenas dos campos que não fazem parte do witness, tornando-o imutável diante de mudanças na codificação das assinaturas. Os dados do witness permanecem em uma estrutura distinta dentro da transação bruta, mas são excluídos do hash de identificação. Terceiros não podem mais alterar o txid, enquanto as assinaturas continuam a ser verificadas completamente por meio do consenso.
- Os dados do witness são comprometidos (committed) por meio de uma árvore Merkle referenciada na transação coinbase de cada bloco, garantindo que não possam ser removidos ou modificados sem invalidar o bloco. Embora estejam separados do txid, os dados do witness ainda contam para os limites de tamanho do bloco segundo uma nova métrica de “peso” (weight): 4.000.000 de unidades de peso por bloco. Cada byte que não é de witness conta como 4 unidades de peso, e cada byte de witness conta como 1, permitindo que transações com muitas assinaturas se encaixem mais facilmente.
- O BIP143 introduziu um novo esquema de hashing de assinaturas que eliminou os custos de hashing quadrático para transações com muitas entradas. O BIP141 definiu os programas de testemunho da versão 0, P2WPKH e P2WSH, que se tornaram o padrão para novos endereços, e o BIP144 especificou como os dados de testemunho são transmitidos entre pares. Essas mudanças não apenas corrigiram a problemática da maleabilidade, mas também estabeleceram as bases para futuras atualizações, como o Taproot, ao criar uma estrutura de programas de testemunho versionados que permite a evolução dos scripts sem violar as regras de consenso existentes.
- Abra um explorador de blocos e localize uma transação P2WPKH recente. Inspecione-a: as assinaturas aparecem em um campo separado chamado “witness”, em vez de estarem no scriptSig das entradas, e o txid é calculado sem elas. Compare isso com uma transação P2PKH anterior ao SegWit, de 2016, na qual as assinaturas estão no scriptSig e, portanto, influenciam o txid. A separação visual confirma que os dados do witness não influenciam mais a identidade da transação.
Fatos-chave
- O Segregated Witness foi ativado em 24 de agosto de 2017, no bloco 481.824.
- A maleabilidade das transações permitiu que terceiros alterassem um txid modificando a codificação da assinatura ECDSA, sem invalidar a transação.
- O BIP141 transferiu as assinaturas para uma estrutura de testemunho separada, excluída do cálculo do txid.
- O peso do bloco (block weight) tem um limite de 4.000.000 de unidades, sendo que os dados do witness são descontados por um fator de quatro em relação aos dados que não são de witness.
- O BIP143 introduziu um esquema de hash de assinatura que eliminou os custos de hash quadrático para transações com muitas entradas.
- O BIP141 introduziu programas de testemunho com numeração de versão (versão 0: P2WPKH e P2WSH), abrindo espaço para versões posteriores como o Taproot.
Exercício nove, seis, três, um
9ReunirListe 9 consequências técnicas ou econômicas da maleabilidade de transações antes de 2017. Indique quais usuários, carteiras, exchanges ou desenvolvedores de protocolo foram afetados.
6AgruparAgrupe os 9 em 6 categorias: instabilidade do ID, quebras na cadeia de transações não confirmadas, confusão nas exchanges, impossibilidade de canais, mutabilidade na codificação das assinaturas e lacunas na proteção do consenso.
3DestilarReduza os 6 para 3 razões principais pelas quais a maleabilidade impediu canais de pagamento escaláveis antes do SegWit.
1CristalizarEscreva 1 frase sobre como separar os dados de testemunho do hash do txid corrige a estabilidade do ID e, ao mesmo tempo, permite atualizações futuras de scripts.
Verificação de fatos
Datas, números e afirmações verificados com as fontes publicadas listadas abaixo.