WEB3DEV

Cover image for Solidity: Como depurar uma transação de contrato já implantada na rede principal
Paulo Gio
Paulo Gio

Posted on

Solidity: Como depurar uma transação de contrato já implantada na rede principal

O caso

Isso pode acontecer com você: imagine que você testou a unidade, fez a análise estática e auditou seu contrato inteligente. Você acha que cobriu todos os casos e assim implanta contratos na rede principal. Tudo parece bem por um tempo e todo mundo está feliz, mas de repente surge uma falha em uma transação. Grandes finanças estão em jogo.

Você não tem ideia do que aconteceu, pois apenas vê uma “execução revertida”.

https://miro.medium.com/max/828/1*iMM5eL7Cwg8xWZZHAFN3Kg.webp

Quanto mais bem testado for o seu código, mais difícil será identificar o que deu errado. Para replicar o bug, você deve ter um estado de transação e variáveis de armazenamento exatas, ou seja, idealmente o que você só precisa saber é - em que linha do seu código de contrato aconteceu e quais eram os valores das variáveis durante a falha.

Felizmente você está coberto pelo ecossistema. Você pode obter o motivo exato da falha em minutos, usando uma ferramenta subestimada de depuração do Truffle, que evoluiu significativamente nos últimos tempos.

Preparação

Contras

A única desvantagem potencial dessa abordagem no momento é que você deve verificar seu contrato (tenho certeza de que haverá uma solução local no futuro). A verificação de contrato é um processo de publicação de sua fonte de contrato em um site oficial do explorador de blockchain, como etherscan.io, polygonscan.com ou bscscan.com, onde seu código de contrato é comparado ao bytecode do contrato implantado e a fonte é publicada e aberta para todos. Também fica acessível pela API que a depuração do Truffle está utilizando.

Achatando o contrato

Bem, todo mundo sabe como achatar (Flatten) um contrato, mas no caso de recém-chegados, devemos cobrir o assunto. Achatar é o processo de colocar seus contratos e todas as importações de contratos e importações de suas importações em um grande arquivo de origem. Isso é possível usando o Remix IDE com várias ferramentas de linha de comando. Geralmente, no caso de investigação de bugs, você obtém acesso ao repositório do contrato e pode simplesmente carregá-lo no Remix IDE. Para fazer isso corretamente:

https://miro.medium.com/max/828/1*qUou0T02v-rSaSJhHcZ4ZA.webp

Escolha “connect to localhost” e siga as instruções. Basicamente, é necessário instalar o remixd, que é uma ferramenta de linha de comando que conecta o remix ao seu sistema de arquivos local. Para executar, use:

remixd -s d:/src/project/  --remix-ide https://remix.ethereum.org
Enter fullscreen mode Exit fullscreen mode

Depois de carregar uma fonte, ative o plug-in Fattener no Remix IDE:

https://miro.medium.com/max/828/1*KQIe2CVyvNeuDIbl3-Dvqg.webp

Compile o contrato com bugs e use o plugin Flattener para achatar e salvar uma fonte achatada:

https://miro.medium.com/max/828/1*o87dXTK2E2aIK8DBT_nlrg.webp

Verificando o contrato

Informações que você precisará obter do implantador do contrato:

  • Versão exata do compilador;
  • Número de tempos de execução do otimizador;
  • Versão da EVM (geralmente é padrão).

Em algum lugar na página do contrato no explorador de blocos, encontre um link de verificação do contrato (você deve registrar uma conta no site para acessar o recurso):

https://miro.medium.com/max/828/1*8NhrVmDUlmPgt-i-3deMzg.webp

Muitas vezes, a página do verificador perguntará que tipo de fonte você está fornecendo. Selecione um único arquivo (single file) - pois você já tem a fonte achatada:

https://miro.medium.com/max/828/1*CEFVPi4TiGX8Qw1DKiya-g.webp

Obtenha as informações sobre a versão exata do compilador que foi usada para compilar o contrato antes de ser implantado. Se você inserir o valor incorreto, não poderá verificar seu contrato

https://miro.medium.com/max/828/1*uP7DqacbF5HFMlxFcTrweg.webp

https://miro.medium.com/max/828/1*ZrUn1q7JEcmSrq6jEZQmpw.webp

Na opção Otimização, se o bytecode do contrato foi otimizado durante a compilação, escolha - sim. Além disso, você deve saber os tempos de execução exatos do otimizador (um erro nessa etapa causará falha na verificação):

https://miro.medium.com/max/828/1*Fo8c_5NqHt07w82aP_2OZg.webp

E escolha a versão do EVM usada durante a compilação. Geralmente é o valor “default” (padrão), mas às vezes pode variar.

Se você fizer tudo corretamente, poderá verificar e publicar o código do contrato sem problemas.

https://miro.medium.com/max/828/1*S9Zlw6QHSCBu8ggTh6bEtA.webp

Mais tarde, a fonte publicada será acessada usando a API e baixada pelo depurador do Truffle (o depurador do Truffle suporta vários exploradores de blocos oficiais que testei pessoalmente com eth e polygon).

Depurando

O comando mágico é:

truffle debug --fetch-external --compile-none --url https://polygon-mainnet-public.unifra.io 0x72bb7d6665d72c32432d2accd4f1f8391a548575d211e78c0615b2e3aaeb3cfb
Enter fullscreen mode Exit fullscreen mode

A propósito, às vezes é possível depurar usando o Remix IDE também, mas é propenso a falhas, o que muitas vezes torna a tarefa impossível. Basicamente, funciona bem apenas com ethereum.

Você pode ter algumas dificuldades no caminho e aqui está como superá-las:

Claro que primeiro você precisa instalar o Truffle globalmente: npm install -g truffle. Você deve ter no mínimo a versão 5.6.1 do Truffle instalada para que isso funcione.

Após a instalação, você deve escolher um ponto de extremidade (endpoint) RPC para sua blockchain que suporte o método debug_traceTransaction, caso contrário, você receberá o erro de que o método não existe/não está disponível (algumas RPCs geralmente retornam um erro, mas se você tentar várias vezes, elas fornecerão acesso ao método). Se você não receber o ponto de extremidade privado do nó RPC onde tudo funciona bem, você pode escolher um ponto de extremidade no site chainlist.org.

https://miro.medium.com/max/828/1*kMuznonWhth33xj8n5J-0g.webp

Com nós públicos, você precisará executar o comando de depuração do Truffle várias vezes para superar os erros de “muitas conexões” e “nenhum método debug_traceTransaction disponível” (algumas RPCs não fornecem o método de fato).

O método debug_traceTransaction fornecerá o rastreamento passado completo, ou seja, tudo o que ocorreu durante a transação com falha.

Execute o comando:

truffle debug --fetch-external --compile-none --url URL_DO_PONTO_DE_EXTREMIDADE_RPC
Enter fullscreen mode Exit fullscreen mode

Ao executar o comando, evite executá-lo a partir da pasta onde residem os projetos do Truffle.

E se você tiver sorte, verá isso:

https://miro.medium.com/max/828/1*SKDAA_44H-lzcenRFI_3Kg.webp

Pressionar enter irá avançar para a próxima linha de execução:

https://miro.medium.com/max/828/1*SqSyA4u52CazIhVz1ykwOw.webp

E eventualmente (depois de apertar enter várias vezes) você chegará ao lugar onde tudo aconteceu:

https://miro.medium.com/max/828/1*SqSyA4u52CazIhVz1ykwOw.webp

Você pode reiniciar o processo digitando “r”.

E você pode acessar as variáveis que estiverem disponíveis em algum momento específico digitando “v”:

https://miro.medium.com/max/828/1*eBxm6rfcdkMscEngeJi7wA.webp

Lembre-se também de que existem muitas ferramentas que facilitarão sua vida na blockchain. Uma boa alternativa no momento para o Truffle é o Hardhat, que está em alta. Às vezes, o Remix IDE ajuda muito, mas isso é tudo muito simples! Tenho certeza que você vai descobrir muitos recursos interessantes de depuração do Truffle por si mesmo também. Desejo-lhe uma boa depuração!

E esta é uma imagem para a capa do artigo:

https://miro.medium.com/max/828/1*uTDR-XtQs9DoPV8r0vPKtg.webp

Artigo original publicado por BIOHAZARD. Traduzido por Paulinho Giovannini.

Top comments (0)