Pular para o conteúdo
buybitcoinsmart

Glossário / Transações e taxas

Maleabilidade de transações

Outros nomes: Transaction malleability.

O que é a maleabilidade de transações?
A maleabilidade de transações é a falha que permitia a um terceiro alterar o id de uma transação sem mudar para onde o dinheiro ia, recodificando os dados de assinatura que ela continha.

Especificação no BIP-66.

O pagamento continuava funcionando; só o nome dele mudava. O Bitcoin fechou a brecha por etapas entre 2015 e 2017, e o SegWit terminou o trabalho para as entradas que guardam as assinaturas na testemunha. As entradas legadas continuam maleáveis, o que é mais uma razão para guardar bitcoins em um endereço bc1.

Como funciona

Um id de transação é um hash dos bytes da transação, então alterar qualquer byte produz um id diferente, e em uma entrada legada a assinatura é um desses bytes.

Três tipos de folga tornavam possível uma alteração sem quebrar nada.

A primeira é aritmética. Uma assinatura ECDSA é um par de números, r e s, e para cada s válido existe um segundo valor igualmente válido: a ordem da curva menos s. Qualquer pessoa que observe a rede pode trocar um pelo outro e a verificação continua sendo aceita.

A segunda é a codificação. As assinaturas vinham envolvidas em DER, e a biblioteca da qual o bitcoin dependia aceitava variantes descuidadas: bytes zero à esquerda sobrando, marcadores de comprimento não canônicos, um preenchimento que nenhum codificador cuidadoso emitiria. Cada variante gerava um id diferente ao ser submetida ao hash.

A terceira é o script de desbloqueio em volta da assinatura. Colocar um item inofensivo extra na pilha deixava o resultado do script idêntico e os bytes serializados diferentes.

Os consertos chegaram uma camada por vez. O BIP66 transformou a codificação DER estrita em regra de consenso na altura 363.725, em 4 de julho de 2015, uma ativação lembrada sobretudo porque várias pools grandes estavam construindo sobre cabeçalhos que não tinham validado e produziram uma bifurcação de seis blocos naquela tarde. O Bitcoin Core 0.11.1, lançado em outubro de 2015, transformou os valores baixos de s em regra de política de retransmissão, documentada depois como BIP146. O BIP62, uma tentativa de enumerar e proibir todas as fontes restantes, foi abandonado por ser inviável e conserva até hoje o status Withdrawn. O que resolveu a questão foi o SegWit, ativo na altura 481.824, em 24 de agosto de 2017: as assinaturas passaram para a testemunha, o id é calculado sem a testemunha e, para uma entrada segwit, simplesmente não sobra nada para alterar.

Onde isso aparece

A maleabilidade nunca causou roubo; causou falhas de contabilidade, e é essa ainda a forma do risco.

A uma plataforma que guarda seus fundos e acompanhava os saques pelo id que havia transmitido podia ser mostrada uma transação confirmada com um id diferente, e ela podia concluir que o próprio pagamento havia falhado e enviar os bitcoins de novo. Esse padrão causou perdas reais em corretoras em 2014, e é por isso que operadores sérios conciliam por endereço de saída e valor, e não apenas pelo id.

As transações encadeadas foram a outra vítima. Uma transação filha que gasta uma transação pai não confirmada identifica a transação pai pelo id, então uma transação pai alterada deixa a transação filha permanentemente impossível de gastar. Qualquer protocolo que assine um reembolso antes de a transação de funding ser transmitida, que é exatamente o que a abertura de um canal Lightning faz, era inseguro de construir até os ids se tornarem estáveis.

Para quem compra e guarda, um único hábito cobre tudo isso. Um id não confirmado não é um fato. Ele ainda pode mudar por maleabilidade nas entradas legadas, e agora muda com frequência por um motivo sem relação, porque o Bitcoin Core retransmite o replace-by-fee completo por padrão e um remetente que aumenta a taxa publica um id novo. Espere uma confirmação e depois informe o id a quem pedir.

Maleabilidade de transações vs gasto duplo

A maleabilidade move o rótulo; um gasto duplo move o dinheiro. Em uma transação alterada, os mesmos bitcoins chegam ao mesmo endereço pelo mesmo valor, e só o software que memorizou o id antigo percebe que algo aconteceu. Em um gasto duplo, uma transação concorrente envia esses bitcoins para outro lugar e uma das versões acaba sem valor. Confundir as duas coisas ensina as pessoas a desconfiar de pagamentos confirmados, que é a lição errada: um id confirmado nunca foi maleável, porque a maleabilidade só se aplicava enquanto uma transação estava sem confirmação.

Não confundir com

Perguntas frequentes

A maleabilidade podia ser usada para roubar bitcoin?

Não diretamente. Os bitcoins ainda chegavam ao endereço previsto pelo valor previsto. As perdas vieram de software que confiava em um id de transação não confirmado e pagava duas vezes quando o id que ele memorizou nunca aparecia na blockchain.

A maleabilidade de transações está corrigida?

Para entradas segwit, sim, desde agosto de 2017. Entradas que gastam endereços legados que começam com 1 ou 3 ainda carregam suas assinaturas dentro da parte da transação submetida ao hash, então esses ids ainda podem ser alterados antes da confirmação.

Por que o id da minha transação não confirmada fica mudando?

Quase sempre porque a carteira remetente substituiu a transação por uma versão com taxa maior, o que produz um id diferente. O replace-by-fee completo é a política de retransmissão padrão nas versões modernas do Bitcoin Core, então isso é comportamento normal, e não um ataque.

Leia a seguir

Termos relacionados

Mais em Transações e taxas

Ler esta página em inglês