Lição 174: Interagindo com Contratos de Camada 2
À medida que o ecossistema Ethereum evolui, soluções de Camada 2 como Polygon, Optimism e Arbitrum ganharam imensa popularidade por fornecer escalabilidade e custos de transação mais baixos. Nesta lição, vamos explorar como interagir com contratos de Camada 2 usando Solidity e Web3.js.
Entendendo Soluções de Camada 2
As soluções de Camada 2 são construídas sobre a blockchain do Ethereum e têm como objetivo descarregar algumas das transações da cadeia principal do Ethereum (Camada 1). Isso ajuda a reduzir a congestão e as taxas de gás, aproveitando ainda a segurança do Ethereum.
As soluções comuns de Camada 2 incluem:
- Polygon: Uma solução de escalabilidade multi-chain.
- Rollups Otimistas: Uma técnica de escalabilidade que permite transações mais rápidas, ainda se baseando na segurança do Ethereum.
- Rollups de Conhecimento Zero: Utiliza provas criptográficas para agrupar várias transações em uma só.
Nesta lição, demonstraremos como interagir com um contrato inteligente simples implantado em uma rede de Camada 2 usando Solidity para o contrato e Web3.js para a interação.
Exemplo de Contrato Inteligente
Vamos primeiro criar um contrato inteligente simples em Solidity que podemos implantar em uma rede de Camada 2.
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract SimpleStorage {
uint256 private data;
event DataStored(uint256 indexed value);
function store(uint256 _data) public {
data = _data;
emit DataStored(_data);
}
function retrieve() public view returns (uint256) {
return data;
}
}
Explicação
- Variável de Estado:
data
armazena um número inteiro sem sinal. - Evento:
DataStored
é emitido sempre que um novo valor é armazenado. - Funções:
store
: Armazena um valor e emite um evento.retrieve
: Retorna o valor armazenado.
Implantando o Contrato em Camada 2
Para implantar o contrato SimpleStorage
em uma rede de Camada 2 como Polygon, você pode seguir os passos abaixo utilizando o framework Truffle ou Hardhat. Certifique-se de que seu ambiente esteja corretamente configurado com as configurações necessárias.
- Instalar Pacotes Necessários:
npm install --save-dev @nomiclabs/hardhat ethers
- Adicionar a Configuração da Sua Rede de Camada 2: Por exemplo, no
hardhat.config.js
:
require('@nomiclabs/hardhat-waffle');
module.exports = {
solidity: "0.8.0",
networks: {
polygon_mumbai: {
url: 'https://rpc-mumbai.maticvigil.com',
accounts: ['SUA_CHAVE_PRIVADA']
}
}
};
Substitua SUA_CHAVE_PRIVADA
pela chave privada da sua carteira (atenção para não expô-la).
- Implantar o Contrato:
Crie um script de implantação na pasta scripts
nomeado deploy.js
.
const hre = require("hardhat");
async function main() {
const SimpleStorage = await hre.ethers.getContractFactory("SimpleStorage");
const simpleStorage = await SimpleStorage.deploy();
await simpleStorage.deployed();
console.log("SimpleStorage implantado em:", simpleStorage.address);
}
main()
.then(() => process.exit(0))
.catch((error) => {
console.error(error);
process.exit(1);
});
Execute o script de implantação:
npx hardhat run scripts/deploy.js --network polygon_mumbai
Interagindo com o Contrato Usando Web3.js
Após a implantação do contrato, você pode interagir com ele usando Web3.js. Abaixo está um exemplo de como fazer isso em um arquivo JavaScript.
- Instalar Web3.js:
npm install web3
- Criar um Arquivo JavaScript: Por exemplo,
interact.js
.
const Web3 = require('web3');
const contractABI = [
// ABI gerado pelo compilador Solidity ou ferramentas como Remix
];
const contractAddress = 'SEU_ENDERECO_DE_CONTRATO'; // Substitua pelo endereço do seu contrato implantado
const main = async () => {
const web3 = new Web3('https://rpc-mumbai.maticvigil.com'); // Conectar à Camada 2
const account = 'SEU_ENDERECO_DE_CARTEIRA'; // Substitua pelo seu endereço de carteira
const simpleStorage = new web3.eth.Contract(contractABI, contractAddress);
// Armazenar um valor
const storeValue = async (value) => {
const tx = {
from: account,
to: contractAddress,
gas: 2000000,
data: simpleStorage.methods.store(value).encodeABI(),
};
const signedTx = await web3.eth.accounts.signTransaction(tx, 'SUA_CHAVE_PRIVADA'); // Assinar a transação
await web3.eth.sendSignedTransaction(signedTx.rawTransaction); // Enviar a transação
console.log(`Valor armazenado: ${value}`);
};
// Recuperar o valor armazenado
const retrieveValue = async () => {
const value = await simpleStorage.methods.retrieve().call();
console.log(`O valor armazenado é: ${value}`);
};
await storeValue(42); // Armazenar o número 42
await retrieveValue(); // Recuperar o valor
};
main().catch(console.error);
Usando o Arquivo JavaScript
Execute seu script de interação com Node.js:
node interact.js
Certifique-se de substituir espaços reservados como SEU_ENDERECO_DE_CONTRATO
, SEU_ENDERECO_DE_CARTEIRA
e SUA_CHAVE_PRIVADA
por valores reais.
Conclusão
Nesta lição, cobrimos como implantar um contrato simples em Solidity em uma rede de Camada 2 e interagir com ele usando Web3.js. Soluções de Camada 2 melhoram significativamente a experiência com Ethereum ao aumentar a escalabilidade e reduzir os custos de transação, tornando-se uma parte essencial do ecossistema Ethereum. Continue experimentando com soluções de Camada 2 e explore suas características únicas à medida que evoluem!