SwiftHTML & CSSSolidityDesenvolvimento de JogosSolana/Rust
27.11.2024

Aula 159: Decodificando Registros de Eventos

Nos contratos inteligentes Ethereum, os eventos são importantes para registrar informações na blockchain. Quando você emite um evento de um contrato inteligente, isso cria uma entrada de log que pode ser observada fora da blockchain. Esse recurso é amplamente utilizado para monitorar mudanças de estado e notificar aplicações front-end sobre ações significativas.

Nesta aula, vamos explorar como decodificar registros de eventos de um contrato inteligente escrito em Solidity e como escutar esses eventos usando JavaScript com a biblioteca Web3.js.

Entendendo Eventos em Solidity

Os eventos são uma maneira de o seu contrato inteligente registrar certas ações que ocorrem. Você define eventos no seu contrato inteligente e, em seguida, os emite quando condições específicas são atendidas. Aqui está um exemplo simples de um contrato Solidity que inclui um evento e uma função para acionar esse evento:

pragma solidity ^0.8.0;

contract ArmazenamentoDeValor {
    event ValorAlterado(uint novoValor);

    uint public valor;

    function definirValor(uint _valor) public {
        valor = _valor;
        emit ValorAlterado(_valor);
    }
}

Nesse exemplo, o contrato ArmazenamentoDeValor tem um evento chamado ValorAlterado que registra o novo valor sempre que definirValor é chamado.

Implantando o Contrato

Para começar a trabalhar com o contrato, você precisa implantá-lo em uma rede Ethereum (por exemplo, em uma rede de testes como Rinkeby ou em uma blockchain local). Você pode implantar o contrato usando ferramentas como Truffle ou Hardhat, ou diretamente através do Remix.

Escutando Eventos com Web3.js

Uma vez que seu contrato está implantado, você pode escutar os eventos emitidos usando Web3.js. Abaixo está um exemplo de como configurar um ouvinte para o evento ValorAlterado em JavaScript:

const Web3 = require('web3');
const web3 = new Web3('https://rinkeby.infura.io/v3/YOUR_INFURA_PROJECT_ID'); // Substitua pelo seu ID do projeto Infura

const enderecoContrato = 'SEU_ENDEREÇO_CONTRATO'; // Substitua pelo endereço do seu contrato implantado
const abiContrato = [
    // Inclua apenas as partes necessárias do ABI para o evento
    {
        "anonymous": false,
        "inputs": [
            {
                "indexed": false,
                "internalType": "uint256",
                "name": "novoValor",
                "type": "uint256"
            }
        ],
        "name": "ValorAlterado",
        "type": "event"
    }
];

const contrato = new web3.eth.Contract(abiContrato, enderecoContrato);

contrato.events.ValorAlterado()
    .on('data', (evento) => {
        console.log('Evento de valor alterado:', evento);
        console.log('Novo valor:', evento.returnValues.novoValor);
    })
    .on('error', (erro) => {
        console.error(erro);
    });

Neste trecho de código, configuramos um ouvinte de eventos para o evento ValorAlterado. Quando o evento é emitido, o ouvinte registrará o novo valor no console.

Decodificando Registros de Eventos Manualmente

Em alguns casos, você pode querer recuperar eventos passados da blockchain e decodificá-los manualmente. Abaixo está um exemplo de como buscar logs para o evento ValorAlterado.

async function buscarEventosPassados() {
    const logs = await web3.eth.getPastLogs({
        fromBlock: '0x0', // Começar a partir do bloco gênesis
        toBlock: 'latest',
        address: enderecoContrato,
        topics: [web3.utils.sha3('ValorAlterado(uint256)')]
    });

    logs.forEach(log => {
        const decodificado = web3.eth.abi.decodeLog(
            [
                {
                    type: 'uint256',
                    name: 'novoValor'
                }
            ],
            log.data,
            log.topics.slice(1) // Ignorar o primeiro tópico que é a assinatura do evento
        );

        console.log('Evento buscado:', decodificado);
    });
}

buscarEventosPassados();

No exemplo acima, usamos o método getPastLogs para recuperar todos os logs correspondentes ao evento ValorAlterado. Em seguida, decodificamos cada log usando o método decodeLog do Web3.js, que nos permite extrair os valores relevantes dos dados do log.

Conclusão

Os eventos no Ethereum fornecem um mecanismo poderoso para rastrear mudanças e responder a ações dentro dos contratos inteligentes. Nesta aula, cobrimos como emitir eventos em Solidity, escutar esses eventos usando Web3.js e decodificar registros de eventos manualmente. Compreender esses conceitos é essencial para desenvolver aplicações descentralizadas (dApps) responsivas que interagem com a blockchain Ethereum.

Continue praticando e experimentando com seus próprios contratos inteligentes para fortalecer sua compreensão sobre registros de eventos!

Video

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

Thank you for voting!