SwiftHTML & CSSSolidityDesenvolvimento de JogosSolana/Rust
16.11.2024

Lição: 049: Eventos em Solidity

Nesta aula, vamos explorar eventos em Solidity, uma funcionalidade importante que permite que contratos inteligentes se comuniquem com aplicações front-end. Os eventos são usados para registrar informações sobre alterações no estado do contrato que podem ser acessadas fora da blockchain.

O que são Eventos?

Os eventos permitem que contratos inteligentes emitam logs, que podem ajudar as aplicações a escutarem por mudanças específicas no estado do contrato. Esses logs são armazenados na blockchain e podem ser facilmente consultados por aplicações off-chain, tornando-os uma ferramenta vital para a comunicação com usuários e outros sistemas.

Definindo Eventos

Para definir um evento em Solidity, usamos a palavra-chave event seguida pelo nome do evento e pelos parâmetros que serão emitidos quando o evento for acionado.

Aqui está um exemplo simples:

pragma solidity ^0.8.0;

contract ArmazenamentoSimples {
    uint256 public numero;

    // Define um evento para mudanças no número
    event NumeroAlterado(uint256 novoNumero);

    // Função para definir o número
    function definirNumero(uint256 _numero) public {
        numero = _numero;

        // Emite um evento quando o número é alterado
        emit NumeroAlterado(_numero);
    }
}

Análise do Contrato

  1. Declaração do Contrato: Começamos declarando um contrato chamado ArmazenamentoSimples.
  2. Variável de Estado: Declaramos uma variável de estado numero que armazenará nosso valor.
  3. Declaração do Evento: Criamos um evento chamado NumeroAlterado que aceitará um único parâmetro, novoNumero.
  4. Definindo o Número: Na função definirNumero, definimos a variável de estado e emitimos o evento para registrar a alteração.

Emitindo Eventos

Quando a função definirNumero é chamada, ela não apenas atualiza a variável de estado, mas também emite o evento NumeroAlterado. Esse evento emitido inclui o novo número, facilitando o rastreamento de alterações:

ArmazenamentoSimples instanciaArmazenamento = new ArmazenamentoSimples();
instanciaArmazenamento.definirNumero(42);

A chamada acima emitirá o seguinte log na blockchain:

NumeroAlterado(42)

Escutando Eventos

Aplicações front-end podem escutar eventos emitidos da blockchain. Veja como você pode escutar o evento NumeroAlterado usando Web3.js:

const Web3 = require('web3');
const web3 = new Web3('http://localhost:8545'); // Conectar ao seu Nó Ethereum

const enderecoContrato = '0xSeuEnderecoContrato';
const abiContrato = [ /* ABI do seu Contrato */ ];

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

// Escutando o evento NumeroAlterado
contratoArmazenamentoSimples.events.NumeroAlterado()
    .on('data', evento => {
        console.log('Número alterado para: ', evento.returnValues.novoNumero);
    })
    .on('error', console.error);

Explicação do Código JavaScript

  1. Importamos a biblioteca Web3 e nos conectamos a um nó Ethereum.
  2. Criamos uma instância do contrato usando a ABI e o endereço do contrato.
  3. Configuramos um listener de eventos no contrato para escutar o evento NumeroAlterado.
  4. Quando o evento é detectado, registramos o novo número no console.

Melhores Práticas para Eventos

  1. Use Parâmetros Indexados: Se você deseja filtrar eventos usando valores específicos, pode tornar os parâmetros indexados. Isso ajuda na consulta mais fácil de logs:
event NumeroAlterado(address indexed definidor, uint256 novoNumero);
  1. Mantenha os Eventos Descritivos: Use nomes claros e descritivos para seus eventos para facilitar a compreensão do que eles representam.

  2. Limite o Uso de Eventos: Emita eventos somente para alterações significativas de estado a fim de evitar inchaço desnecessário na blockchain e melhorar o desempenho.

Conclusão

Os eventos são um recurso poderoso no Solidity que permite a comunicação entre contratos inteligentes e aplicações front-end. Utilizando eventos de forma eficaz, você pode criar aplicativos descentralizados mais interativos e responsivos. Nesta aula, abordamos a definição de eventos, como emiti-los e como escutá-los usando Web3.js. À medida que você constrói seus próprios contratos inteligentes, lembre-se de utilizar eventos para manter os usuários informados sobre alterações importantes no estado.

Video

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

Thank you for voting!