5.3 Eventos en Solidity





Eventos en Solidity – Curso de Solidity 5.3

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:

  1. Los balances se almacenan en un mapping.
  2. La función constructor inicializa el balance del creador del contrato con 1000 tokens.
  3. La función transfer permite a los usuarios transferir tokens a otras direcciones.
  4. 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.


AnteriorSiguiente

[mwai_chat]

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *