SwiftHTML & CSSSolidityDesenvolvimento de JogosSolana/Rust
23.11.2024

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.

Video

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

Thank you for voting!