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?
- Teste Realista: Você pode observar como seus contratos inteligentes interagem com condições do mundo real e contratos existentes.
- 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.
- 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.
- 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:
- Hardhat: Um ambiente de desenvolvimento versátil que suporta forking da mainnet.
- Ganache: Uma blockchain pessoal para desenvolvimento no Ethereum, que também suporta forking.
- 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!