SwiftHTML & CSSSolidityDesenvolvimento de JogosSolana/Rust
04.12.2024

Lição: 229: Fork do Mainnet para Testes

Nesta aula, vamos explorar o conceito de forking (divisão) da mainnet do Ethereum para fins de teste. O forking permite que os desenvolvedores criem uma cópia local do estado da mainnet, completa com contratos existentes e saldos de usuários, possibilitando um ambiente de teste realista. Essa técnica é particularmente útil quando você deseja garantir que seu contrato interaja corretamente com contratos existentes ou quando está testando em condições do mundo real.

O que é um Fork?

Um fork, na terminologia de blockchain, refere-se à criação de uma versão alternativa da blockchain. Quando falamos sobre forking da mainnet, estamos nos referindo à replicação do estado atual da blockchain da mainnet do Ethereum em um ambiente local ou em uma rede de testes. Isso significa que todas as transações, estados de contratos e saldos são copiados, proporcionando um ambiente rico para testes.

Por que Forkar a Mainnet?

  1. Teste Realista: Você pode observar como seus contratos inteligentes interagem com condições do mundo real e contratos existentes.
  2. Sem Taxas de Gas: Ao testar localmente, você não precisará pagar taxas de gas, o que pode ser benéfico ao realizar múltiplos testes.
  3. Simular Condições Adversas: Você pode simular cenários como altas taxas de gas, congestionamento de rede ou possíveis explorações em contratos inteligentes existentes.
  4. Depuração: É mais fácil debugar o código ao trabalhar com dados reais da mainnet.

Ferramentas para Forkar a Mainnet

Várias ferramentas facilitam o forking da mainnet do Ethereum, incluindo:

  1. Hardhat: Um ambiente de desenvolvimento versátil que suporta forking da mainnet.
  2. Ganache: Uma blockchain pessoal para desenvolvimento no Ethereum, que também suporta forking.
  3. Truffle: Um framework de desenvolvimento que pode configurar facilmente uma rede forkada.

Nesta aula, nos concentraremos principalmente em usar o Hardhat.

Configurando o Hardhat para Forking

Passo 1: Instalar o Hardhat

Primeiramente, instale o Hardhat no diretório do seu projeto, caso ainda não tenha feito isso.

mkdir meu-projeto-forkado
cd meu-projeto-forkado
npm init -y
npm install --save-dev hardhat

Passo 2: Criar um Projeto Hardhat

Em seguida, crie um projeto Hardhat.

npx hardhat

Siga as instruções para configurar seu projeto. Escolha "Create an empty hardhat.config.js".

Passo 3: Configurar o Hardhat para Forking

No arquivo hardhat.config.js, adicione a configuração para se conectar a um nó da mainnet do Ethereum, como o Infura ou Alchemy.

require("@nomiclabs/hardhat-waffle");

module.exports = {
    solidity: "0.8.0",
    networks: {
        hardhat: {
            fork: "https://mainnet.infura.io/v3/YOUR_INFURA_PROJECT_ID"
        }
    }
};

Certifique-se de substituir YOUR_INFURA_PROJECT_ID pelo seu ID de projeto Infura real.

Passo 4: Iniciar sua Rede Forkada do Hardhat

Para iniciar sua rede local forkada do Hardhat, execute:

npx hardhat node

Esse comando irá fork a mainnet do Ethereum e iniciar uma blockchain local onde você pode implantar e testar seus contratos.

Passo 5: Interagir com a Mainnet Forkada

Agora que você tem seu fork local em execução, pode escrever scripts para interagir com contratos existentes. Abaixo está um exemplo de como ler o saldo de um endereço Ethereum na mainnet forkada.

Crie um novo arquivo chamado scripts/checkBalance.js:

const { ethers } = require("hardhat");

async function main() {
    // Substitua pelo endereço Ethereum que você deseja verificar
    const address = "0xSeuEnderecoEthereum";

    // Conectar ao provedor
    const provider = ethers.getDefaultProvider();

    // Obter o saldo
    const balance = await provider.getBalance(address);
    console.log(`Saldo de ${address}: ${ethers.utils.formatEther(balance)} ETH`);
}

main()
    .then(() => process.exit(0))
    .catch((error) => {
        console.error(error);
        process.exit(1);
    });

Execute o script usando:

npx hardhat run scripts/checkBalance.js --network hardhat

Implantando Contratos na Rede Forkada

Você também pode implantar seus próprios contratos na mainnet forkada. Crie um contrato simples em contracts/MyContract.sol:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract MyContract {
    uint256 public value;

    function setValue(uint256 _value) public {
        value = _value;
    }
}

Crie um script de implantação em scripts/deploy.js:

const hre = require("hardhat");

async function main() {
    const MyContract = await hre.ethers.getContractFactory("MyContract");
    const myContract = await MyContract.deploy();
    await myContract.deployed();

    console.log("MyContract implantado em:", myContract.address);
}

main()
    .then(() => process.exit(0))
    .catch((error) => {
        console.error(error);
        process.exit(1);
    });

Execute o script de implantação com:

npx hardhat run scripts/deploy.js --network hardhat

Conclusão

Forkar a mainnet do Ethereum oferece uma ferramenta poderosa para desenvolvedores que desejam testar seus contratos inteligentes em um ambiente realista. Usando o Hardhat, você pode rapidamente configurar um fork local, interagir com dados do mundo real e garantir que seus contratos funcionem conforme o esperado. Essa abordagem não só ajuda no desenvolvimento de aplicações robustas, mas também na descoberta de potenciais problemas antes que eles cheguem à produção. Boa codificação!

Video

Did you like this article? Rate it from 1 to 5:

Thank you for voting!