Lição: 110: Escutando Eventos em Web3.js
No mundo do Ethereum e de aplicações descentralizadas (dApps), os eventos desempenham um papel crucial na comunicação entre contratos inteligentes e aplicações front-end. Os eventos são emitidos pelos contratos inteligentes para registrar mudanças ou ações importantes que podem ser rastreadas pelos clientes. Nesta aula, exploraremos como escutar esses eventos usando a biblioteca Web3.js.
Entendendo Eventos em Contratos Inteligentes
No Solidity, os eventos são definidos em um contrato e podem ser emitidos durante uma transação. Aqui está um exemplo simples de um contrato Solidity que emite um evento:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract ArmazenamentoSimples {
uint256 private dado;
event DadoArmazenado(uint256 indexed novoDado);
function armazenarDado(uint256 _dado) public {
dado = _dado;
emit DadoArmazenado(_dado);
}
function obterDado() public view returns (uint256) {
return dado;
}
}
Neste contrato, o evento DadoArmazenado
é emitido sempre que armazenarDado
é chamado. O evento registra o novo dado que está sendo armazenado.
Configurando o Web3.js
Para escutar eventos emitidos pelo contrato inteligente, precisamos configurar o Web3.js em nossa aplicação JavaScript. Primeiro, certifique-se de que o Web3.js está instalado:
npm install web3
Agora, criaremos um script simples para conectar ao nosso provedor Ethereum e escutar o evento DadoArmazenado
do contrato ArmazenamentoSimples
.
Conectando ao Ethereum
Veja como configurar o Web3.js e vincular ao nosso contrato inteligente:
const Web3 = require('web3');
// Conectar ao nó local do Ethereum
const web3 = new Web3('http://localhost:8545'); // Substitua pela URL do seu provedor
// ABI do Contrato (Interface Binária da Aplicação)
const abi = [
// Definição da ABI vai aqui
];
const contractAddress = 'SEU_ENDERECO_CONTRATO_AQUI'; // Substitua pelo endereço do seu contrato implantado
const contratoArmazenamentoSimples = new web3.eth.Contract(abi, contractAddress);
Certifique-se de substituir SEU_ENDERECO_CONTRATO_AQUI
pelo endereço real do contrato ArmazenamentoSimples
implantado e preencher o array abi
com a definição da ABI do seu contrato.
Escutando Eventos
Agora que temos o contrato configurado, podemos escutar o evento DadoArmazenado
:
contratoArmazenamentoSimples.events.DadoArmazenado()
.on('data', (event) => {
console.log('Evento DadoArmazenado Acionado:', event.returnValues);
})
.on('error', console.error);
Neste exemplo, usamos o método events
da instância do contrato para escutar o evento DadoArmazenado
. A função de callback é executada sempre que o evento é emitido, registrando os returnValues
do evento.
Juntando Tudo
Aqui está o código completo para escutar eventos do contrato ArmazenamentoSimples
:
const Web3 = require('web3');
const web3 = new Web3('http://localhost:8545'); // Substitua pela URL do seu provedor
const abi = [
// Substitua isso pela ABI do seu contrato
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "uint256",
"name": "novoDado",
"type": "uint256"
}
],
"name": "DadoArmazenado",
"type": "event"
},
// Outras definições de ABI...
];
const contractAddress = 'SEU_ENDERECO_CONTRATO_AQUI'; // Substitua pelo endereço do seu contrato implantado
const contratoArmazenamentoSimples = new web3.eth.Contract(abi, contractAddress);
contratoArmazenamentoSimples.events.DadoArmazenado()
.on('data', (event) => {
console.log('Evento DadoArmazenado Acionado:', event.returnValues);
})
.on('error', console.error);
Testando o Listener de Evento
Para testar o listener de eventos, implante o contrato ArmazenamentoSimples
e chame a função armazenarDado
. Você deverá ver o registrador de eventos imprimir os dados do evento emitido no console.
(async () => {
const contas = await web3.eth.getAccounts();
await contratoArmazenamentoSimples.methods.armazenarDado(42).send({ from: contas[0] });
})();
Aqui, enviamos uma transação para atualizar o dado armazenado para 42
, o que deve acionar o evento DadoArmazenado
.
Conclusão
Nesta aula, aprendemos como escutar eventos em Web3.js emitidos de um contrato inteligente. Os eventos são uma ferramenta poderosa para construir dApps responsivas que podem reagir a mudanças de estado sem precisar consultar continuamente a blockchain. Ao aproveitar os eventos, os desenvolvedores podem criar aplicações mais eficientes e amigáveis aos usuários na rede Ethereum.