O desenvolvedor Jeff Garzik que encabeça o hard fork do Bitcoin conhecido por SegWit2X, previsto para ocorrer no mês de novembro, incluiu no código proposto o tão pedido esquema de proteção contra ataques de repetição, que explicamos em detalhes do que se trata neste artigo aqui e também neste outro.
O mecanismo de proteção é do tipo opt-in, ou seja, ele deverá ser deflagrado pelo próprio usuário, caso este julgue necessário e assim queira. A ideia desta medida é enviar uma mensagem à rede para determinar a separação dos saldos de Bitcoin e Bitcoin 2X.
Antes de explicarmos exatamente como deverá funcionar o esquema de proteção contra repetição, é importante recapitularmos do que isso se trata. No caso de um hard fork sem a proteção contra repetição, qualquer transação de um saldo existente anterior ao evento da bifurcação da rede será válida em ambas redes. Ou seja, se Maria enviar ao João 1 moeda na rede X, o mesmo montante será válido na rede Y.
A Maria poderia, obviamente, querer enviar ao João 1 moeda da rede X e 1 moeda da rede Y, neste caso ela performaria a transação em ambas rede e não teria nenhum problema. Entretanto, se ela quiser enviar ao João somente 1 moeda da rede X e não 1 moeda da rede Y, ela poderia enfrentar um problema. Isso porque, ao enviar a transação na rede X, a mesma transação ficaria pública na rede Y e ocasionaria uma vulnerabilidade de segurança para os saldos dela.
Alguém poderia simplesmente pegar a transação pública da Maria que foi enviada na rede X e replicá-la na rede Y, daí o nome ataque de repetição. Isso faria com que João também obtivesse 1 moeda Y. Isso poderia causar uma série de transações não desejadas na rede.
Assim, um esquema de proteção contra esse tipo de ataque de repetição é geralmente a forma como se previne esse tipo de problema. Em outras palavras, ele faz as transações da rede X serem válidas apenas naquela rede, sendo o mesmo raciocínio verdadeiro para a rede Y.
Proteção bidirecional forte contra repetição versus proteção contra repetição opt-in
A proteção bidirecional forte contra repetição significa que as transações na rede X nunca serão válidas na rede Y depois do hard fork e vice-versa. Isso significa que todas as transações ganhariam uma espécie de marca sobre elas que deixaria claro para ambas redes qual transação pertence a qual.
Em agosto, a rede do Bitcoin passou por um hard fork que deu origem ao Bitcoin Cash. Naquela oportunidade, houve a implementação da proteção bidirecional forte contra repetição. Cada transação ganhou uma marca em sua assinatura e não houve qualquer problema para os usuários. Ela é considerada uma proteção forte contra repetição porque não existe a possibilidade de uma das redes não “enxergar” a marca feita sob determinada transação.
Enquanto isso, a proteção do tipo opt-in significa que a rede X precisa fazer alguma coisa especial para ser considerada inválida na rede Y. Ou seja, as transações continuam suscetíveis ao ataque de repetição, contudo se você manipular a sua transação de maneira adequada, tal transação não será válida na nova rede.
Em outras palavras, esse tipo de proteção opt-in é como uma porta que você precisa se lembrar de trancar, caso contrário a transação pode escapar da rede X e ir parar também na rede Y.
O que os desenvolvedores do SegWit2X propõem?
Os desenvolvedores do SegWit2X decidiram implementar um esquema de proteção opt-in que funciona da seguinte maneira: a Maria, quando enviar ao João uma transação na rede original do Bitcoin, precisará enviar uma pequena quantidade do seu saldo para o endereço 3Bit1xA4apyzgmFNT2k8Pvnd6zb6TnwcTi para garantir que a transação seja inválida na rede 2X. Este endereço foi escolhido por ser supostamente fácil de ser identificado (começa com 3Bit) e é bastante fácil de gastá-lo uma vez que a chave privada foi publicada e é conhecida.
Ou seja, depois do hard fork, você precisará criar um endereço para o seu saldo de Bitcoins originais e performar a transação que enviará todo o seu saldo de Bitcoin para este endereço, sem se esquecer de enviar uma pequena quantidade para o endereço provido pelos desenvolvedores do 2X. Somente assim a rede entenderá que ela deverá enviar somente o seu saldo de Bitcoins, e não de Bitcoin 2X, para o novo endereço. Assim, você dividiria os saldos e não teria mais problemas com um possível ataque de repetição. Parece bastante confuso e realmente é. Muitos usuários que não possuem tanto conhecimento técnico poderão ter problemas para realizar essa divisão no saldo dos seus Bitcoins, tanto o original quanto o 2X.
Além deste esquema de proteção proposto, outros esquemas opt-in estão sendo considerados, mas ainda não há nada consolidado.
Antes que você comece a enviar transações para o endereço mencionado acima, eu tenho uma importante observação a fazer. Esse esquema de proteção contra repetição apenas irá ser ativado APÓS a divisão da rede, ou seja, o evento do hard fork em si. É inútil enviar qualquer quantidade de Bitcoins para o endereço citado até que seja efetivado o hard fork, o que está previsto para ocorrer quando o bloco 494784 for minerado, o que deve acontecer por volta do dia 18 de novembro.
Por que o SegWit2X não quer adicionar uma proteção forte como fez o Bitcoin Cash?
Os desenvolvedores do SegWit2X acreditam que esta irá ser a rede com o maior apoio depois do hard fork, ou seja, a principal rede do Bitcoin. Por isso, eles querem que todas as carteiras de Bitcoin existentes atualmente sejam compatíveis com o 2X e não necessitem de atualizações. Com a proteção opt-in, não se faz necessário para os provedores de carteiras e serviços, como as corretoras, atualizarem o seus softwares. A visão dos desenvolvedores é que a implementação de uma proteção forte contra repetição acarretaria em uma divisão ainda maior da rede comparada àquela que já se faz necessária.
Quando o Bitcoin Cash se dividiu em 1º de agosto, praticamente não havia carteiras que davam suporte a esta nova moeda, especificamente porque o esquema de proteção contra ataques de repetição era forte e os desenvolvedores de carteira não tinham tido tempo para escrever o código e fazer os ajustes requeridos para tornar as transações na rede do Bitcoin Cash válidas em cada carteira. Parece que o time do SegWit2X tenta evitar isso ao tentar fazer as transações do 2X funcionarem nas carteiras atuais de Bitcoin e também nos serviços e comerciantes existentes.
Infelizmente, qualquer esquema forte de proteção contra ataque de repetição exige um hard fork. Muitos desenvolvedores do Bitcoin Core, o principal software cliente do Bitcoin, enxergam a realização de hard forks como algo que precisa de tempo e grande consenso entre a comunidade, o que justifica boa parte das acaloradas discussões que estão ocorrendo entre o Core e o 2X. Por isso, a implementação de uma proteção forte não dá sinais de ser factível a tempo do hard fork.
Portanto, se você quiser se resguardar de qualquer problema envolvendo um ataque de repetição, você precisará enviar seus Bitcoins originais para um novo endereço em uma carteira normal que dá suporte ao BItcoin. Contudo, cada uma dessas transações precisará enviar uma pequena quantidade para o endereço 3Bit1xA4apyzgmFNT2k8Pvnd6zb6TnwcTi. Se você não se importar com a questão de privacidade das suas transações, você poderá performar uma única transação que enviará os seus bitcoin para um outro endereço ou um conjunto de endereços. Apenas não se esqueça de se enviar um pouco para 3Bit1xA4apyzgmFNT2k8Pvnd6zb6TnwcTi na mesma transação. Não pode ser em transações diferentes.
Depois disso, no seu endereço original, você poderá gastar o seu saldo de 2X. Aquela passará a ser a sua carteira de Bitcoin 2X.
Conclusão
Hard forks trazem consigo muitas questões que a comunidade Bitcoin não tinha ainda que ter lidado antes. Ataques de repetição é um deles. Como sempre, seja cuidadoso ao fazer uma transação com Bitcoins e mantenha-se informado sobre eventos de divisão da rede como este que se aproxima antes de enviar seus Bitcoins para qualquer lugar.
PS: este texto teve como base a explicação técnica dada pelo desenvolvedor Jimmy Song neste post aqui.