5.3 Eventos en Solidity
En Solidity, los eventos son una parte integral de cómo los contratos interactúan y comunican con el mundo exterior. Se utilizan principalmente para la funcionalidad de la capa de aplicación descentralizada (DApp), permitiendo que las aplicaciones escuchen y reaccionen a cambios en el estado del contrato. Los eventos en Solidity son similares a los logs en otros lenguajes de programación, pudiendo ser monitoreados por los usuarios y sistemas externos.
Definición de Eventos
Los eventos se definen utilizando la palabra clave event
y pueden tener varios parámetros. Estos parámetros pueden ser indexados, lo que permite una búsqueda más eficiente en los registros. A continuación, se muestra un ejemplo de una definición de evento:
event Transfer(address indexed from, address indexed to, uint256 value)
En este ejemplo, el evento Transfer
tiene tres parámetros: from
, to
, y value
. Los parámetros from
y to
están indexados, lo que permite su búsqueda en los logs.
Emisión de Eventos
Para emitir un evento, se utiliza la palabra clave emit
seguida del nombre del evento y los parámetros correspondientes. Aquí hay un ejemplo de cómo emitir el evento Transfer
definido anteriormente:
function transfer(address _to, uint256 _value) public { // Código de lógica de transferencia aquí // Emitimos el evento de transferencia emit Transfer(msg.sender, _to, _value) }
En este ejemplo, el evento Transfer
se emite con los parámetros msg.sender
(dirección del remitente), _to
(dirección del destinatario), y _value
(cantidad transferida).
Escuchar Eventos
Una vez que se emite un evento, puede ser capturado por aplicaciones descentralizadas (DApps) que escuchan a esos eventos utilizando bibliotecas como web3.js
. Aquí hay un ejemplo de cómo se puede escuchar el evento Transfer
en una DApp:
const contract = new web3.eth.Contract(abi, contractAddress) contract.events.Transfer({ filter: {}, fromBlock: 0 }, function(error, event) { if (error) { console.error(Error:, error) } else { console.log(Evento capturado:, event) } })
En este código, se utiliza web3.eth.Contract
para crear una instancia del contrato, luego se suscribe al evento Transfer
. Cuando el evento se emite, se ejecuta la función de callback que maneja el evento.
Importancia de los Eventos
- Monitoreo del Estado: Los eventos permiten a las DApps monitorear cambios en el estado de los contratos inteligentes sin necesidad de realizar constantes llamadas a la blockchain.
- Registro Histórico: Los eventos se almacenan en la blockchain como logs, proporcionando un registro histórico fiable y accesible.
- Optimización de Gas: Emitir eventos es más barato en términos de gas que almacenar datos en el contrato.
Ejemplo Completo
A continuación, se muestra un contrato completo que utiliza eventos para comunicar transferencias de tokens:
pragma solidity ^0.8.0 contract Token { mapping(address => uint256) public balances event Transfer(address indexed from, address indexed to, uint256 value) constructor() { balances[msg.sender] = 1000 // Iniciar con 1000 tokens } function transfer(address _to, uint256 _value) public { require(balances[msg.sender] >= _value, Saldo insuficiente) balances[msg.sender] -= _value balances[_to] = _value emit Transfer(msg.sender, _to, _value) } }
En este contrato simple de token:
- Los balances se almacenan en un mapping.
- La función
constructor
inicializa el balance del creador del contrato con 1000 tokens. - La función
transfer
permite a los usuarios transferir tokens a otras direcciones. - El evento
Transfer
se emite cada vez que se realiza una transferencia.
En resumen, los eventos son una herramienta poderosa en Solidity para la comunicación entre contratos inteligentes y aplicaciones externas. Permiten un monitoreo eficiente y proporcionan un registro de las acciones importantes dentro de la blockchain.
Deja una respuesta