Lição: 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
-
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.
-
Instância do Contrato: Criamos uma instância do contrato fornecendo a ABI e o endereço do contrato.
-
Listener de Evento: Escutamos o evento usando
meuContrato.events.ValorAlterado
. Você pode filtrar eventos passando um objetofilter
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.