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
- Declaração do Contrato: Começamos declarando um contrato chamado
ArmazenamentoSimples
. - Variável de Estado: Declaramos uma variável de estado
numero
que armazenará nosso valor. - Declaração do Evento: Criamos um evento chamado
NumeroAlterado
que aceitará um único parâmetro,novoNumero
. - 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
- Importamos a biblioteca
Web3
e nos conectamos a um nó Ethereum. - Criamos uma instância do contrato usando a ABI e o endereço do contrato.
- Configuramos um listener de eventos no contrato para escutar o evento
NumeroAlterado
. - Quando o evento é detectado, registramos o novo número no console.
Melhores Práticas para Eventos
- 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);
-
Mantenha os Eventos Descritivos: Use nomes claros e descritivos para seus eventos para facilitar a compreensão do que eles representam.
-
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.