Lição: 051: Parâmetros de Evento e Campos Indexados em Solidity
Nesta aula, vamos explorar como utilizar eventos de forma eficaz em contratos inteligentes Solidity, com foco em parâmetros de evento e campos indexados. Os eventos são um aspecto crucial dos contratos inteligentes Ethereum, pois permitem que você emita registros para várias ações e mudanças que ocorrem em seu contrato. Isso não apenas ajuda a rastrear o estado de seu contrato, mas também fornece uma interface para aplicações off-chain ouvirem e responderem a essas mudanças.
O que são Eventos em Solidity?
Eventos em Solidity são um mecanismo de registro que permite que contratos inteligentes registrem informações na blockchain. Quando um evento é emitido, ele gera uma entrada de log que pode ser acessada por clientes, aplicações front-end ou outros serviços externos. Os eventos são particularmente úteis para notificar consumidores externos sobre mudanças no estado do contrato.
Definindo Eventos
Para definir um evento em Solidity, você usa a palavra-chave event
, seguida pelo nome do evento e pelos parâmetros que ele recebe. Aqui está um exemplo simples:
pragma solidity ^0.8.0;
contract ExemploEvento {
event ValorAlterado(address indexed usuario, uint256 valorAntigo, uint256 valorNovo);
uint256 public valorArmazenado;
function setValor(uint256 novoValor) public {
uint256 valorAntigo = valorArmazenado;
valorArmazenado = novoValor;
emit ValorAlterado(msg.sender, valorAntigo, novoValor);
}
}
Neste exemplo, definimos um evento chamado ValorAlterado
, que registra o endereço do usuário que atualizou o valor, o valor antigo e o valor novo. A função setValor
atualiza a variável valorArmazenado
e emite o evento ValorAlterado
.
Campos Indexados
Uma das características poderosas dos eventos em Solidity é a capacidade de usar campos indexados. Campos indexados permitem que você filtre eventos de forma mais eficiente ao consultar logs na blockchain. Você pode marcar até três parâmetros como indexados, e esses parâmetros indexados criarão um índice de pesquisa que aplicações externas podem usar para filtrar logs de eventos.
No nosso exemplo anterior, usamos a palavra-chave indexed
para o parâmetro usuario
:
event ValorAlterado(address indexed usuario, uint256 valorAntigo, uint256 valorNovo);
Isso significa que, ao consultar eventos ValorAlterado
, você pode filtrá-los pelo endereço específico de um usuário. Parâmetros não indexados (como valorAntigo
e valorNovo
em nosso caso) ainda podem ser recuperados, mas não filtrados nas consultas de eventos.
Buscando Eventos
Para ilustrar como buscar e filtrar eventos, vamos imaginar que você implantou o contrato acima em uma rede Ethereum. Você pode usar uma biblioteca JavaScript como web3.js
ou ethers.js
para ouvir e manipular esses eventos emitidos.
Aqui está como você pode buscar o evento ValorAlterado
:
Usando ethers.js
Primeiro, certifique-se de ter o ethers.js instalado:
npm install ethers
Em seguida, você pode escrever seu código JavaScript da seguinte forma:
const { ethers } = require("ethers");
async function main() {
const provider = new ethers.providers.JsonRpcProvider("http://localhost:8545");
const contractAddress = "SEU_ENDEREÇO_DO_CONTRATO"; // substitua pelo endereço do seu contrato implantado
const abi = [
"event ValorAlterado(address indexed usuario, uint256 valorAntigo, uint256 valorNovo)",
"function setValor(uint256 novoValor)",
"function valorArmazenado() view returns (uint256)"
];
const contrato = new ethers.Contract(contractAddress, abi, provider);
// Configurando um ouvinte para o evento ValorAlterado
contrato.on("ValorAlterado", (usuario, valorAntigo, valorNovo) => {
console.log(`Valor alterado por: ${usuario}`);
console.log(`Valor Antigo: ${valorAntigo}`);
console.log(`Valor Novo: ${valorNovo}`);
});
}
main();
Este código configura um ouvinte para o evento ValorAlterado
. Quando um usuário chama a função setValor
no contrato inteligente, o ouvinte capturará e registrará os detalhes relevantes no console.
Conclusão
Nesta aula, cobrimos os conceitos essenciais sobre o uso de eventos em Solidity, com foco específico em parâmetros de evento e campos indexados. A utilização de parâmetros indexados pode aprimorar significativamente as capacidades de registro de eventos do seu contrato, facilitando para você e aplicações externas o acompanhamento de mudanças relevantes em seus contratos inteligentes. À medida que você continuar a desenvolver aplicações descentralizadas, dominar eventos será benéfico para uma gestão eficaz do estado e recuperação de dados.
Boas programações!