Skip to content

Latest commit

 

History

History
 
 

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 

Depuração de Transações OnChain: 2. Aquecimento

Autor: Sun

Tradução: Helen

Comunidade Discord

Este artigo é publicado na XREX e na WTF Academy

Os dados on-chain podem incluir transferências simples únicas, interações com um contrato DeFi ou vários contratos DeFi, arbitragem de empréstimo flash, propostas de governança, transações entre cadeias e muito mais. Nesta seção, vamos começar com um começo simples. Vou apresentar no BlockChain Explorer - Etherscan o que nos interessa e, em seguida, usar Phalcon para comparar as diferenças entre essas chamadas de função de transação: transferência de ativos, troca na UniSWAP, aumento de liquidez no Curve 3pool, propostas do Compound, Flashswap do Uniswap.

Comece a aquecer

  • O primeiro passo é instalar o Foundry no ambiente. Siga as instruções de instalação.
  • Cada cadeia tem seu próprio explorador de blockchain. Nesta seção, usaremos a rede blockchain Ethereum como estudo de caso.
  • As informações típicas às quais geralmente me refiro incluem:
    • Ação da transação: como a transferência de tokens ERC-20 complexos pode ser difícil de discernir, a Ação da Transação pode fornecer o comportamento chave da transferência. No entanto, nem todas as transações incluem essas informações.
    • De: msg.sender, o endereço da carteira de origem que executa esta transação.
    • Interagiu com (Para): Com qual contrato interagir
    • Transferência de Token ERC-20: Processo de Transferência de Token
    • Dados de Entrada: Os dados brutos de entrada da transação. Você pode ver qual função foi chamada e qual valor foi trazido.
  • Se você não sabe quais ferramentas são comumente usadas, você pode ver as ferramentas de análise de transações na primeira lição.

Transferência de ativos

圖片 O seguinte pode ser derivado do exemplo do Etherscan acima:

  • De: Endereço da carteira EOA de origem desta transação
  • Interagiu com (Para): Contrato Tether USD (USDT)
  • Tokens ERC-20 Transferidos: Transferência de 651,13 USDT da carteira do usuário A para o usuário B
  • Dados de Entrada: Chamada da função de transferência

De acordo com o Phalcon "Fluxo de Invocação":

  • Há apenas uma ''Chamada USDT.transfer''. No entanto, você deve prestar atenção ao "Valor". Como a Máquina Virtual Ethereum (EVM) não suporta operações de ponto flutuante, é usada uma representação decimal.
  • Cada token tem sua própria precisão, o número de casas decimais usadas para representar o valor do token. Nos tokens ERC-20, as casas decimais geralmente têm 18 dígitos, enquanto o USDT tem 6 dígitos. Se a precisão do token não for tratada corretamente, problemas surgirão.
  • Você pode consultar isso no contrato de token do Etherscan token contract.

圖片

圖片

Troca na Uniswap

圖片

O seguinte pode ser derivado do exemplo do Etherscan acima:

  • Ação da Transação: Um usuário realiza uma troca na Uniswap V2, trocando 12.716 USDT por 7.118 UNDEAD.
  • De: Endereço da carteira de origem desta transação
  • Interagiu com (Para): Um contrato de Bot MEV chamado contrato Uniswap para troca.
  • Tokens ERC-20 Transferidos: Processo de troca de tokens

De acordo com o Phalcon "Fluxo de Invocação":

  • O Bot MEV chama o contrato de par de negociação Uniswap V2 USDT/UNDEAD para chamar a função de troca para realizar a troca de tokens.

圖片

Foundry

Usamos o Foundry para simular a operação de trocar 1BTC por DAI na Uniswap.

forge test --contracts ./src/test/Uniswapv2.sol -vvvv
  • De acordo com a figura - trocamos 1 BTC por 16.788 DAI chamando a função swapExactTokensForTokens do Uniswap_v2_router.

圖片

Curve 3pool - DAI/USDC/USDT

圖片

O seguinte pode ser derivado do exemplo do Etherscan acima:

  • O objetivo desta transação é adicionar liquidez às três pools do Curve.
  • De: Endereço da carteira de origem desta transação
  • Interagiu com (Para): Curve.fi: Pool DAI/USDC/USDT
  • Tokens ERC-20 Transferidos: O usuário A transferiu 3.524.968,44 USDT para as três pools do Curve, e então o Curve emitiu 3.447.897,54 tokens 3Crv para o usuário A.

De acordo com o Phalcon "Fluxo de Invocação":

  • Com base na sequência de chamadas, foram executadas três etapas:
  1. add_liquidity 2. transferFrom 3. mint.

圖片

Proposta do Compound

圖片

O seguinte pode ser derivado do exemplo do Etherscan acima:

  • O usuário enviou uma proposta no Compound. O conteúdo da proposta pode ser visualizado clicando em "Decode Input Data" no Etherscan.

圖片

De acordo com o Phalcon "Fluxo de Invocação":

  • Enviar uma proposta através da função propose resulta na proposta número 44.

圖片

Uniswap Flashswap

Aqui usamos o Foundry para simular operações - como usar empréstimos flash na Uniswap. Introdução oficial ao Flash swap

forge test --contracts ./src/test/Uniswapv2_flashswap.sol -vv

圖片

  • Neste exemplo, um empréstimo flash de 100 WETH é tomado emprestado através da troca Uniswap UNI/WETH. Observe que uma taxa de 0,3% deve ser paga nas devoluções.
  • De acordo com a figura - fluxo de chamadas, o flashswap chama swap e depois paga chamando de volta uniswapV2Call.

圖片

  • Mais Introdução ao Flashloan e Flashswap:

    • A. Pontos comuns: Ambos podem emprestar Tokens sem garantir ativos, e eles precisam ser devolvidos no mesmo bloco, caso contrário a transação falha.

    • B. A diferença: Se o token0 for emprestado através do flashloan token0/token1, o token0 deve ser devolvido. O flashswap empresta o token0, e você pode devolver o token0 ou o token1, o que é mais flexível.

Para mais operações básicas de DeFi, consulte DeFiLab.

Cheatcodes do Foundry

Os cheatcodes do Foundry são essenciais para realizar análises de cadeia. Aqui, vou apresentar algumas funções comumente usadas. Mais informações podem ser encontradas no Cheatcodes Reference.

  • createSelectFork: Especifica uma rede e uma altura de bloco para copiar para testes. Deve incluir o RPC para cada cadeia em foundry.toml.
  • deal: Define o saldo de uma carteira de teste.
    • Definir saldo de ETH: deal(address(this), 3 ether);
    • Definir saldo de Token: deal(address(USDC), address(this), 1 * 1e18);
  • prank: Simula a identidade de uma carteira especificada. É eficaz apenas para a próxima chamada e definirá o msg.sender para o endereço da carteira especificada. Por exemplo, simular uma transferência de uma carteira de baleia.
  • startPrank: Simula a identidade de uma carteira especificada. Definirá o msg.sender para o endereço da carteira especificada para todas as chamadas até que stopPrank() seja executado.
  • label: Rotula um endereço de carteira para melhorar a legibilidade ao usar o debug do Foundry.
  • roll: Ajusta a altura do bloco.
  • warp: Ajusta o timestamp do bloco.

Obrigado por acompanhar! Hora de avançar para a próxima lição.

Recursos

Livro do Foundry

Awesome-foundry

Flashloan vs Flashswap .