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
- Use Parâmetros Indexados com Sabedoria: Limite os parâmetros indexados a dados essenciais para filtragem.
- Evite Eventos Excessivamente Complexos: A simplicidade é fundamental. Registre o que for necessário e deixe sistemas off-chain lidarem com estruturas complexas.
- 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.