Na última quinta-feira [02/12] o blog “Schneier on Security” divulgou o caso [e deu início a uma discussão técnica] do hacker que roubou US $ 31 milhões da empresa de blockchain MonoX Finance, explorando um bug no software que o serviço usa para redigir contratos inteligentes.

Especificamente, o atacante usou o mesmo token tanto para o tokenIn quanto para o tokenOut, que são métodos para trocar o valor de um token por outro neste tipo de operação. Funciona mais ou menos assim: O MonoX atualiza os preços após cada troca, calculando novos preços para ambos os tokens [in e out]. Quando a troca é concluída, o preço do tokenIn, ou seja, o token que é enviado pelo usuário, diminui, e o preço do tokenOut, o token recebido pelo usuário, aumenta.
Ao usar o mesmo token para as diferentes operações de tokenIn e tokenOut, o hacker inflou muito o preço do token MONO porque a atualização do tokenOut sobrescreveu a atualização de preço do tokenIn. O hacker então trocou o token por $ 31 milhões em tokens nas blockchains Ethereum e Polygon.
O problema básico neste evento é que, na arquitetura da blockchain, o código é a autoridade final – não há um protocolo de adjudicação. Então, se houver uma vulnerabilidade no código, não há recurso possível [e, claro, existem muitas vulnerabilidades no código].
Para muito observadores, incluindo Bruce Schneier, essa é uma razão suficiente para não usar contratos inteligentes para algo importante, por enquanto.
Os sistemas de adjudicação baseados na intervenção humana não são uma inútil bagagem humana pré Internet. Eles são vitais.
Bruce Schneier
Código de programação versus arbitragem humana
Na modesta opinião deste bloguista, embora, de fato, estejamos muito longe de o código ser um árbitro da justiça melhor do que um ser humano, acho que o problema básico aqui tem menos a ver com o código sendo a autoridade final e mais a ver com a falta de um protocolo de adjudicação.
No momento, não há uma boa maneira de ajustar retrospectivamente os resultados desses chamados contratos “inteligentes” com base em conhecimentos ou fatos que só podem ser totalmente apreciados ex post ao invés de ex ante, seja o conhecimento de funcionalidades não intencionais do código ou circunstâncias específicas não antecipadas pelas partes contratantes.
Este parece ser um problema bem compreendido por profissionais do direito e um aspecto amplamente suportado por diversos sistemas jurídicos (por meio de várias doutrinas, como quebra de expectativa ou previsibilidade). Já os tecnologistas proponentes de contratos inteligentes [incluindo a mim] parecem não ter ainda uma visão clara desses aspectos.
Uma transferência legítima de acordo com as regras codificadas
Para além do ‘problema básico’ descrito acima, existe um outro problema não menos básico e que se não for tratado corretamente deixará os “Contratos Inteligentes” para sempre quebrados: a maioria dos programadores normalmente escreve código sequencial limitado, não código de máquina de estado completo. Assim, uma grande quantidade elementos computacionais é deixada de fora na implementação dos contratos. Esses elementos, portanto, ficam “pendurados” e esperando para ser usados [e abusados].
Alguns críticos da blockchain dos contratos inteligentes argumentam que seria necessário incorporar uma versão forte da chamada Lógica de Hoare para garantir a integridade da computação na blockchain. A lógica de Hoare é um conjunto fundamental de regras, publicadas no final dos anos 1960. O bloco fundamental da Lógica de Hoare é a Tripla de Hoare.
Uma tripla de Hoare é da forma
{P} C {Q}
Onde {P} e {Q} são afirmações sobre o estado do sistema e C é um comando.
P, é a pré-condição
Q, é a pós-condição
Onde as asserções P e Q são expressas como fórmulas na lógica de predicados.
Quando a pré-condição P é atendida, a execução do comando C causa mudanças no sistema e estabelece a pós-condição Q.
Embora seja possível construir um código de “estado completo” com a lógica de Hoare, não é algo que a maioria das pessoas goste de fazer. Em suma, é um processo tedioso, não criativo, e colocar os pingos nos i’s e cruzar os t’s podem ser tarefas incrivelmente tediosas. Portanto, raramente é implementada, o que acaba inevitavelmente trazendo problemas em um tempo futuro.
Na vida normal, a última coisa que alguém realmente deseja é ter contratos irrevogáveis. Então a arbitragem geralmente fica “embutida” informalmente nos contratos inteligentes, através de métodos ad hoc. Em princípio, não há razão para que os contratos inteligentes não possam ter arbitragem embutida. Mas isso apenas cria uma série de questões subsequentes que ninguém quer abordar.
Até que a arbitragem de fato ou o controle total do estado sejam implementados nos Smart Contracts, veremos muito mais desse tipo de coisa acontecendo.
Move fast, break things
Eu temo que o problema descrito aqui seja um resultado lógico da abordagem “mova-se rápido e quebre coisas” preconizadas pelo Manifesto Ágil. As pessoas precisam pensar com clareza sobre até onde [e se] podemos utilizar certos paradigmas de desenvolvimento de sistemas na construção da infraestrutura da blockchain.
E como eu disse em outros posts aqui, precisamos parar de chamar as coisas de “inteligentes” quando elas são estúpidas. Antigamente, um dispositivo que não era útil sem uma conexão de rede era apropriadamente chamado de terminal burro. O código é sempre vulnerável, e qualquer desenvolvedor que não entenda isso é um “stupid hire”.