SwiftHTML & CSSSolidityDesenvolvimento de JogosSolana/Rust
17.11.2024

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!

Video

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

Thank you for voting!