Un evento es una declaración que define un tipo de registro que puede ser emitido durante la ejecución de una función. Estos registros son inmutables, se almacenan en los logs de la blockchain, y pueden ser escuchados por aplicaciones externas a través de bibliotecas como web3.js o ethers.js.
indexed
para facilitar su búsqueda en los logs.
Los eventos se declaran utilizando la palabra clave event
:
event NombreEvento(tipoParametro nombreParametro, ...);
Se emiten dentro de una función usando la palabra clave emit
:
emit NombreEvento(valorParametro, ...);
pragma solidity ^0.8.0;
contract Ejemplo {
// Declaración del evento
event Transferencia(address indexed remitente, address indexed destinatario, uint256 valor);
// Función que emite el evento
function transferir(address _destinatario, uint256 _valor) public {
// Lógica de transferencia (omitiendo validaciones por simplicidad)
emit Transferencia(msg.sender, _destinatario, _valor);
}
}
Al declarar un evento, puedes marcar hasta tres parámetros como indexed
. Esto permite buscar estos valores en los logs de forma más eficiente.
event Transferencia(address indexed remitente, address indexed destinatario, uint256 valor);
En el ejemplo anterior, las aplicaciones externas pueden filtrar los eventos por las direcciones de remitente o destinatario.
contract EstadoContrato {
enum Estado { Inactivo, Activo }
Estado public estadoActual;
event CambioEstado(Estado estadoAnterior, Estado estadoNuevo);
function cambiarEstado(Estado _nuevoEstado) public {
emit CambioEstado(estadoActual, _nuevoEstado);
estadoActual = _nuevoEstado;
}
}
contract Deposito {
event DepositoRecibido(address indexed remitente, uint256 valor);
function recibirDeposito() public payable {
require(msg.value > 0, "El deposito debe ser mayor a cero");
emit DepositoRecibido(msg.sender, msg.value);
}
}
contract Token {
mapping(address => uint256) public balances;
event Transferencia(address indexed de, address indexed a, uint256 cantidad);
function transferir(address _a, uint256 _cantidad) public {
require(balances[msg.sender] >= _cantidad, "Saldo insuficiente");
balances[msg.sender] -= _cantidad;
balances[_a] += _cantidad;
emit Transferencia(msg.sender, _a, _cantidad);
}
}
1. Eficiencia: Usar eventos para transmitir información es más barato que almacenar datos adicionales en la blockchain.
2. Interacción con aplicaciones externas: Permiten a las DApps reaccionar a cambios en tiempo real.
3. Auditabilidad: Los eventos quedan registrados en los logs de la blockchain, proporcionando un historial verificable.
Para más detalles sobre los eventos en Solidity, consulta la documentación oficial de Solidity.
Jorge García
Fullstack developer