SwiftHTML & CSSSolidityDesenvolvimento de JogosSolana/Rust
11.12.2024

Lição: 298: Padrões Avançados de Eventos em Solidity

Nesta aula, exploraremos padrões avançados para o uso de eventos em Solidity. Os eventos são um recurso poderoso que fornecem uma maneira de registrar informações na blockchain, tornando-as acessíveis para aplicativos off-chain. Abordaremos vários padrões, incluindo parâmetros indexados, filtragem de eventos e melhores práticas para o uso eficiente de eventos.

1. Entendendo Eventos

Os eventos permitem que desenvolvedores registrem informações específicas que podem ser posteriormente recuperadas por serviços externos. Eles são emitidos durante a execução do contrato e podem ser indexados para facilitar a busca.

Sintaxe

event NomeDoEvento(Tipo indexed param1, Tipo param2);

Exemplo Básico

Aqui está um contrato simples que inclui eventos:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract ArmazenamentoSimples {
    uint256 public dadosArmazenados;

    event DadosArmazenados(uint256 indexed dados, address indexed remetente);

    function armazenar(uint256 dados) public {
        dadosArmazenados = dados;
        emit DadosArmazenados(dados, msg.sender);
    }
}

Neste exemplo, o evento DadosArmazenados registra os dados que estão sendo armazenados e o endereço do remetente.

2. Parâmetros Indexados

Parâmetros indexados em eventos permitem que desenvolvedores filtrem e busquem informações específicas nos logs de eventos. Solidity permite até três parâmetros indexados por evento.

Exemplo com Parâmetros Indexados

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract Token {
    event Transferencia(
        address indexed de, 
        address indexed para, 
        uint256 valor
    );

    mapping(address => uint256) public saldos;

    function transferir(address para, uint256 valor) public {
        require(saldos[msg.sender] >= valor, "Saldo insuficiente");
        saldos[msg.sender] -= valor;
        saldos[para] += valor;
        emit Transferencia(msg.sender, para, valor);
    }
}

No evento Transferencia, de e para são indexados, facilitando a filtragem de transferências pelo remetente ou destinatário.

3. Filtrando Eventos

Uma vez que os eventos são emitidos, eles podem ser filtrados no front-end usando o endereço do remetente ou receptor. Aqui está um exemplo de como filtrar esses eventos em JavaScript usando web3.js:

const filtroDeEvento = {
    fromBlock: 0,
    toBlock: 'latest',
    filter: {
        from: enderecoRemetente,
        to: enderecoReceptor
    }
};

const eventos = await contrato.getPastEvents('Transferencia', filtroDeEvento);

4. Estruturando Eventos para Contratos Complexos

Em contratos mais complexos, os eventos ajudam a monitorar mudanças e interações de forma eficiente. Evite emitir eventos com muitos detalhes. Em vez disso, concentre-se nas informações essenciais e utilize sistemas externos para lidar com a complexidade.

Exemplo com Estruturas

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract Leilao {
    struct Lance {
        address lancedor;
        uint256 valor;
    }

    Lance public maiorLance;

    event NovoLance(address indexed lancedor, uint256 valor);

    function fazerLance() public payable {
        require(msg.value > maiorLance.valor, "O lance deve ser maior");

        maiorLance = Lance(msg.sender, msg.value);
        emit NovoLance(msg.sender, msg.value);
    }
}

Neste exemplo de leilão, apenas o maior lance é armazenado, e o evento NovoLance fornece os detalhes necessários.

5. Melhores Práticas

  1. Use Parâmetros Indexados com Sabedoria: Limite os parâmetros indexados a dados essenciais para filtragem.
  2. Evite Eventos Excessivamente Complexos: A simplicidade é fundamental. Registre o que for necessário e deixe sistemas off-chain lidarem com estruturas complexas.
  3. Considerações de Gas: Lembre-se de que emitir eventos também consome gas; otimize seus eventos para desempenho e custo.

Conclusão

Nesta aula, abordamos padrões avançados de eventos em Solidity, enfatizando parâmetros indexados, mecanismos de filtragem e melhores práticas para o uso eficiente de eventos. Compreender e aproveitar o poder dos eventos pode melhorar significativamente a usabilidade e o desempenho dos seus contratos inteligentes. Sempre lembre-se de manter seus eventos significativos enquanto preserva a simplicidade do contrato.

Video

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

Thank you for voting!