SwiftHTML & CSSSolidityDesenvolvimento de JogosSolana/Rust
22.11.2024

Aula 109: Registros de Eventos e Filtros

Nesta aula, vamos explorar o conceito de eventos em Solidity, como emiti-los e como escutá-los e filtrá-los usando web3.js. Os eventos são um recurso poderoso em contratos inteligentes do Ethereum, permitindo que você registre dados que podem ser facilmente acessados por aplicações externas.

O que são Eventos?

Eventos em Solidity oferecem uma maneira de registrar dados na blockchain que podem ser escutados e recuperados por aplicações de frontend. Eles são armazenados nos registros de transações, permitindo capturar mudanças de estado importantes sem exigir um processamento intensivo na blockchain.

Declarando Eventos

Para declarar um evento em um contrato Solidity, use a palavra-chave event seguida pelo nome do evento e seus parâmetros indexados. Você pode ter até três parâmetros indexados, permitindo uma filtragem eficiente.

Aqui está um exemplo de uma declaração simples de evento:

pragma solidity ^0.8.0;

contract MeuContrato {
    event ValorAlterado(address indexed autor, uint256 novoValor);

    uint256 public valor;

    function setValor(uint256 _valor) public {
        valor = _valor;
        emit ValorAlterado(msg.sender, _valor);
    }
}

Neste contrato, definimos um evento chamado ValorAlterado, que registra o endereço do usuário que alterou o valor e o novo valor em si. A função setValor atualiza valor e emite um evento.

Emitindo Eventos

Para emitir um evento, você simplesmente chama a palavra-chave emit seguida pelo nome do evento e quaisquer parâmetros:

emit ValorAlterado(msg.sender, _valor);

Esta linha de código emite o evento ValorAlterado, tornando-o disponível nos registros para que aplicações fora da cadeia possam escutá-lo.

Escutando Eventos com Web3.js

Uma vez que um evento é emitido, você pode escutá-lo usando web3.js. Abaixo está um exemplo de como se conectar à rede Ethereum e ouvir o evento ValorAlterado do seu contrato inteligente.

Configurando o Web3.js

Primeiro, verifique se você tem o web3.js instalado. Se ainda não o tiver, você pode adicioná-lo ao seu projeto:

npm install web3

Escutando Eventos

Em seguida, você pode usar o seguinte trecho de código para escutar eventos emitidos pelo seu contrato inteligente:

const Web3 = require('web3');
const web3 = new Web3(Web3.givenProvider || 'http://localhost:8545');

// Substitua pelo seu endereço de contrato inteligente e ABI
const enderecoContrato = '0xSeuEnderecoContrato';
const abiContrato = [
    // ... ABI gerada pelo compilador Solidity
];

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

meuContrato.events.ValorAlterado({
    filter: { autor: '0xSeuEndereco' }, // Opcional: filtrar por parâmetro indexado
    fromBlock: 'latest'
}, function (error, evento) {
    if (error) {
        console.error(error);
    } else {
        console.log(evento.returnValues);
    }
});

Explicação

  1. Inicialização do Web3: Inicializamos o web3 com um provedor. Normalmente, você se conectaria a um nó Ethereum em execução localmente ou a uma rede de teste como a Rinkeby.

  2. Instância do Contrato: Criamos uma instância do contrato fornecendo a ABI e o endereço do contrato.

  3. Listener de Evento: Escutamos o evento usando meuContrato.events.ValorAlterado. Você pode filtrar eventos passando um objeto filter para escutar casos específicos (por exemplo, eventos emitidos por um endereço específico).

Filtrando Registros de Eventos

Você também pode recuperar registros de eventos passados usando o método getPastEvents. Veja como você pode recuperar eventos anteriores emitidos pelo contrato:

meuContrato.getPastEvents('ValorAlterado', {
    filter: { autor: '0xSeuEndereco' }, // Opcional: filtrar por parâmetro indexado
    fromBlock: 0,
    toBlock: 'latest'
}, function (error, eventos) {
    if (error) {
        console.error(error);
    } else {
        console.log(eventos);
    }
});

Parâmetros Explicados

  • filter: Um objeto que especifica parâmetros indexados para filtrar os eventos.
  • fromBlock: O número do bloco a partir do qual começar a procurar eventos.
  • toBlock: O número do bloco para buscar até, usando 'latest' para indicar o bloco mais recente.

Conclusão

Nesta aula, cobrimos como declarar, emitir e escutar eventos em contratos inteligentes Solidity. Os eventos são uma parte crucial da construção de aplicativos descentralizados, proporcionando uma maneira de comunicar mudanças de estado de forma eficaz. Ao aproveitar o web3.js, os desenvolvedores podem criar aplicações frontend mais interativas e reativas que respondem a eventos da blockchain em tempo real.

Lembre-se sempre de ter os eventos em mente ao projetar seus contratos inteligentes, pois eles não apenas ajudam na depuração, mas também melhoram a interação do usuário em suas aplicações descentralizadas.

Video

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

Thank you for voting!