Volver a la página principal
lunes 9 diciembre 2024
5

Cómo usar eventos en Solidity para notificar cambios de estado a aplicaciones externas

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.

Características principales:

  • Eficiencia: Los eventos son más económicos en términos de gas que almacenar datos directamente en variables de estado.
  • Inmutabilidad: Una vez emitido, un evento no puede ser modificado.
  • Indexación: Permiten etiquetar parámetros como indexed para facilitar su búsqueda en los logs.

Sintaxis básica de eventos

Declaración de un evento

Los eventos se declaran utilizando la palabra clave event:

event NombreEvento(tipoParametro nombreParametro, ...);

Emisión de un evento

Se emiten dentro de una función usando la palabra clave emit:

emit NombreEvento(valorParametro, ...);

Ejemplo básico

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);
    }
}

Parámetros indexados en eventos

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.

Ejemplos prácticos de uso de eventos

Notificación de un cambio de estado

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;
    }
}

Registro de depósitos

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);
    }
}

Emisión de tokens

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);
    }
}

Ventajas de los eventos

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.

Consideraciones importantes

  • Los datos emitidos en un evento no se pueden leer directamente desde un contrato, ya que los eventos son solo para aplicaciones externas.
  • No abuses de los eventos; emitir demasiados puede aumentar los costos de gas de las transacciones.
  • Asegúrate de incluir información relevante y suficiente para que las aplicaciones externas puedan interpretar los eventos.

Referencias oficiales

Para más detalles sobre los eventos en Solidity, consulta la documentación oficial de Solidity.

Etiquetas:
solidity
Compartir:
Creado por:
Author photo

Jorge García

Fullstack developer