What happens if you send tokens to a contract address?

Eventos en Smart Contracts: La Voz de la Blockchain

30/05/2021

Valoración: 4.62 (8990 votos)

En el universo de la blockchain, los smart contracts operan como agentes autónomos, ejecutando lógica de forma predecible y segura. Sin embargo, por naturaleza, son sistemas cerrados. ¿Cómo puede una aplicación descentralizada (dApp), una interfaz de usuario o cualquier servicio externo saber qué ha ocurrido dentro de un contrato tras una transacción? La respuesta reside en un concepto fundamental y a menudo subestimado: los eventos. Los eventos son el puente de comunicación entre el mundo on-chain y el mundo off-chain, actuando como notificaciones públicas y verificables de que algo importante ha sucedido.

Piénsalo de esta manera: si un smart contract es una caja fuerte digital que ejecuta operaciones, un evento es el recibo detallado que la caja emite cada vez que se completa una acción. Este recibo no se guarda dentro de la caja (lo que sería costoso), sino que se adjunta permanentemente al registro de la transacción. Cualquiera puede consultar estos recibos para entender el historial de actividades del contrato sin necesidad de abrirlo y revisar todo su contenido. Esta capacidad es crucial para construir aplicaciones interactivas y responsivas sobre la blockchain.

How to send ether from smart contract?
HOW TO SEND ETHER? , transfer (2300 gas, throws error) , send (2300 gas, returns bool) , call (forward all gas or set gas, returns bool)
Índice de contenido

¿Qué son Exactamente los Eventos en un Smart Contract?

Desde un punto de vista técnico, un evento es una estructura de datos personalizada que un smart contract emite durante su ejecución. Esta información se almacena en los registros (logs) del recibo de la transacción correspondiente. A diferencia de los datos guardados en el almacenamiento del contrato (state), los datos de los eventos no pueden ser leídos por otros contratos. Su propósito es ser consumidos por clientes externos, como librerías de JavaScript (Starknet.js, Ethers.js) o servicios de indexación, que escuchan activamente la blockchain en busca de estas señales.

Las características principales de los eventos son:

  • Comunicación Unidireccional: Permiten que el contrato informe al exterior. Son una forma de "gritar" información al mundo.
  • Eficiencia en Costos: Almacenar datos en los logs de una transacción es significativamente más barato en términos de gas que escribir en el almacenamiento del contrato. Por ello, se utilizan para registrar historiales de cambios y no para mantener el estado actual.
  • Inmutabilidad: Una vez que un evento es emitido y la transacción es confirmada, queda registrado de forma permanente e inmutable en la blockchain. Esto proporciona un rastro de auditoría verificable.
  • Indexación: Los eventos pueden tener campos especiales "clave" (keys) que son indexados por los nodos de la red, permitiendo a las aplicaciones buscar y filtrar eventos de manera muy rápida y eficiente.

Anatomía de un Evento: Un Ejemplo Práctico con Cairo

Para entender cómo se estructuran, veamos un ejemplo conceptual basado en el lenguaje Cairo para Starknet, donde un contrato gestiona una colección de libros. La definición de los eventos que este contrato puede emitir se agrupa en una enumeración (enum) especial.

#[starknet::contract] mod GestorDeLibros { #[storage] struct Storage {} #[event] #[derive(Drop, starknet::Event)] pub enum Event { LibroAgregado: LibroAgregado, CampoActualizado: CampoActualizado, LibroEliminado: LibroEliminado, } #[derive(Drop, starknet::Event)] pub struct LibroAgregado { pub id: u32, pub titulo: felt252, #[key] pub autor: felt252, // Este campo es una clave indexada } // ... otras estructuras para otros eventos ... #[abi(embed_v0)] impl GestorDeLibrosImpl of super::IGestorDeLibros { fn agregar_libro(ref self: ContractState, id: u32, titulo: felt252, autor: felt252) { // ... lógica para guardar el libro en el storage ... self.emit(LibroAgregado { id, titulo, autor }); } } }

Desglosemos los componentes clave:

  • #[event] pub enum Event: Es el contenedor principal que declara todos los posibles eventos que el contrato puede emitir. En nuestro caso, son LibroAgregado, CampoActualizado y LibroEliminado.
  • struct LibroAgregado: Define la estructura de datos para el evento específico de agregar un libro. Contiene un id, un titulo y un autor.
  • #[key] pub autor: felt252: Este es uno de los aspectos más importantes. El atributo #[key] marca el campo autor como un campo "clave" o indexado. Esto significa que las aplicaciones externas podrán filtrar muy rápidamente todas las transacciones que emitieron un evento LibroAgregado por un autor específico, sin tener que analizar los datos de cada evento uno por uno. Mejora radicalmente la eficiencia de la consulta.
  • self.emit(...): Es la instrucción dentro de una función del contrato que efectivamente dispara o emite el evento, empaquetando los datos correspondientes y añadiéndolos al log de la transacción.

El Recibo de la Transacción: Donde Viven los Eventos

Cuando una función como agregar_libro es llamada y se ejecuta con éxito, la transacción resultante contendrá un recibo. Dentro de este recibo, en la sección de eventos, encontraremos la información que emitimos. Siguiendo nuestro ejemplo, si llamamos a la función con id = 42, titulo = 'Misery' y autor = 'S. King', el recibo se vería similar a esto:

"events": [ { "from_address": "0x027d...be79", // Dirección del contrato "keys": [ "0x02d0...235bc", // Selector del evento ('LibroAgregado') "0x532e204b696e67" // Valor del campo 'autor' ('S. King') ], "data": [ "0x2a", // Valor del campo 'id' (42) "0x4d6973657279" // Valor del campo 'titulo' ('Misery') ] } ]

Observa cómo la información se divide:

  • from_address: Identifica qué contrato emitió el evento.
  • keys: Contiene los campos indexados. El primer elemento es siempre un identificador único del nombre del evento (un hash de "LibroAgregado"). Los siguientes son los valores de los campos marcados con #[key].
  • data: Contiene los campos no indexados, en el orden en que fueron definidos.

Esta estructura permite a las herramientas off-chain realizar búsquedas muy potentes, como "dame todos los libros agregados por 'S. King' en este contrato".

Tabla Comparativa: Campos Clave (Key) vs. Campos de Datos (Data)

Característica Campos Clave (`#[key]`) Campos de Datos (Data)
Propósito Filtrar y buscar eventos de manera eficiente. Almacenar información adicional sobre el evento.
Almacenamiento Se guardan en una estructura de datos indexada en el recibo. Se guardan como un blob de datos secuencial.
Costo de Gas Ligeramente más alto que los campos de datos debido a la indexación. Menor costo, es el almacenamiento de logs base.
Caso de Uso Direcciones de usuario, IDs de tokens, categorías, cualquier dato por el que se necesite buscar. Valores numéricos, strings largos, datos descriptivos que no se usarán para filtrar.

Preguntas Frecuentes (FAQ)

¿Son los eventos la única forma de obtener datos de un contrato?

No. También se pueden crear funciones de solo lectura (view) para consultar el estado actual del contrato. La diferencia clave es el propósito: las funciones view te dan una instantánea del estado *ahora*, mientras que los eventos te proporcionan un historial de los *cambios* que han ocurrido a lo largo del tiempo. Los eventos son un mecanismo de "push" (el contrato notifica), mientras que las llamadas a funciones son "pull" (tú preguntas).

Are smart contracts reversible?
Smart Contract transactions are irreversible.

¿Emitir eventos cuesta gas?

Sí. Toda escritura en la blockchain, incluyendo la creación de logs para eventos, consume gas. Sin embargo, es una de las operaciones de escritura más baratas, mucho más económica que modificar el almacenamiento persistente del contrato. Por eso son ideales para registrar información histórica.

¿Puedo cambiar o eliminar un evento una vez emitido?

No. Al igual que cualquier otro dato en una transacción confirmada, los eventos son inmutables. Esta es una característica de seguridad fundamental de la blockchain, que garantiza la transparencia y la integridad del historial de acciones.

¿Por qué son tan importantes los campos `#[key]`?

Porque sin ellos, encontrar un evento específico requeriría descargar y procesar los datos de *todos* los eventos emitidos por un contrato, una tarea extremadamente lenta y costosa. Los campos indexados actúan como un índice en una base de datos, permitiendo a los nodos de la red localizar la información solicitada de forma casi instantánea.

Conclusión: El Pulso de las Aplicaciones Descentralizadas

Los eventos son mucho más que un simple detalle técnico; son el sistema nervioso de las aplicaciones descentralizadas. Proporcionan el mecanismo vital que permite a las interfaces de usuario reaccionar a los cambios on-chain, a los servicios de análisis rastrear la actividad y a los usuarios tener una visión clara y transparente de lo que ocurre dentro de un smart contract. Sin eventos, la blockchain sería una colección de cajas negras silenciosas. Gracias a ellos, tenemos un ecosistema vibrante, interactivo y auditable donde la comunicación entre el contrato y el usuario es fluida y confiable.

Si quieres conocer otros artículos parecidos a Eventos en Smart Contracts: La Voz de la Blockchain puedes visitar la categoría Criptomonedas.

Subir