Web3 & DApp Development Fundamentals · Lección

Eventos frente a almacenamiento

Compensaciones de gas

Lección 4 de 413 pasos

Eventos frente a almacenamiento es una lección gratuita de Web3 & DApp Development Fundamentals en CoddyKit. Esta es la lección 4 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Web3 & DApp Development Fundamentals, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Web3 & DApp Development Fundamentals incluye 4 lecciones en total.

Dos formas de registrar datos

Cuando ocurre algo en un contrato, puede registrarlo en el almacenamiento o en un registro de eventos. Elegir correctamente es una habilidad fundamental para optimizar el gas.

En esta lección se comparan las ventajas y desventajas para que sepa cuándo utilizar cada opción.

Resumen del almacenamiento

El almacenamiento es el estado permanente del contrato. Es el único dato que el propio contrato puede volver a leer posteriormente, pero escribir en él es muy costoso.

<code>mapping(address => uint256) public balances; // contract can read this</code>

Resumen de los eventos

Los eventos escriben en el registro de la transacción. Son mucho más económicos, pero el contrato no puede volver a leerlos en la cadena; solo pueden hacerlo los clientes fuera de la cadena.

<code>event BalanceChanged(address indexed who, uint256 newBalance);
// off-chain apps read this; the contract cannot</code>

Diferencia en el coste de gas

Escribir una posición de almacenamiento nueva (un SSTORE desde cero) cuesta alrededor de 20.000 unidades de gas. Emitir un topic o una palabra en un registro cuesta solo unos cientos de unidades de gas. Los eventos pueden ser un orden de magnitud más económicos.

La regla de oro

Una guía sencilla:

  • Almacene los datos que el contrato necesite leer o utilizar en la lógica futura
  • Emita únicamente los datos que necesite el mundo exterior (historial, interfaz de usuario, análisis)

No almacene datos únicamente para mostrarlos; emítalos en su lugar.

Qué debe almacenarse

Los saldos, la propiedad, las asignaciones y cualquier valor utilizado en comprobaciones de require o en cálculos futuros deben estar en el almacenamiento, porque el contrato los lee.

<code>function transfer(address to, uint256 amt) public {
    require(balances[msg.sender] >= amt); // needs storage
    balances[msg.sender] -= amt;
    balances[to] += amt;
}</code>

Qué puede ser solo un evento

El historial de transacciones, el registro de auditoría o el feed de notificaciones son casos perfectos para los eventos. El contrato nunca necesita volver a consultar esos registros, por lo que almacenarlos desperdiciaría gas.

<code>event Logged(address indexed user, string action, uint256 time);

function act(string memory a) public {
    emit Logged(msg.sender, a, block.timestamp); // no storage
}</code>

Use ambos conjuntamente

El patrón más habitual consiste en almacenar el nuevo estado y emitir un evento que describa el cambio. El valor almacenado impulsa la lógica; el evento mantiene sincronizada la interfaz de usuario.

<code>function deposit() public payable {
    balances[msg.sender] += msg.value; // storage for logic
    emit BalanceChanged(msg.sender, balances[msg.sender]); // event for UI
}</code>

Los logs no se pueden consultar en la cadena

Una limitación importante: otro contrato no puede leer los logs que usted emita. Si el contrato B necesita un valor, el contrato A debe exponerlo mediante almacenamiento o un valor de retorno, nunca mediante un evento.

Evite almacenar datos para el historial

Un error común de los principiantes es introducir cada acción en un array de almacenamiento para crear un historial. Este crece sin límite y resulta extremadamente costoso. Emita eventos en su lugar y permita que un indexador fuera de la cadena reconstruya el historial.

<code>// Anti-pattern: unbounded, costly
// historyArray.push(record);

// Better:
emit ActionRecorded(msg.sender, block.timestamp);</code>

Lista de comprobación para decidir

Pregúntese: ¿Algún código en la cadena leerá este valor más adelante?

  • Sí: almacenamiento (y, opcionalmente, emita también un evento)
  • No, solo sirve para mostrarlo o auditarlo: únicamente un evento

Esta única pregunta resuelve la mayoría de las decisiones de diseño.

Comprobación rápida

Compruebe su comprensión de los eventos y el almacenamiento.

Resumen

Ha aprendido la diferencia entre almacenamiento y eventos:

  • El almacenamiento se puede leer en la cadena, pero es costoso (~20k de gas por cada slot nuevo)
  • Los eventos son económicos, pero solo los clientes fuera de la cadena pueden leerlos
  • Almacene lo que necesite el contrato; emita lo que solo necesite el mundo exterior
  • El patrón habitual: actualizar el almacenamiento Y emitir un evento

No almacene nunca datos únicamente para el historial o para mostrarlos.

Gratis para empezar

Aprende Web3 & DApp Development Fundamentals con un tutor de IA — gratis

Escribe y ejecuta código real en tu navegador, obtén ayuda instantánea de un tutor de IA disponible 24/7 y continúa donde lo dejaste en la web o en la aplicación.

Cursos
29
Lecciones
105

Preguntas frecuentes

¿La lección «Eventos frente a almacenamiento» es gratis?

Sí — el texto completo de «Eventos frente a almacenamiento» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Web3 & DApp Development Fundamentals, actualiza a CoddyKit PRO. El curso de Web3 & DApp Development Fundamentals incluye 4 lecciones en total.

¿Qué aprenderé en «Eventos frente a almacenamiento»?

Compensaciones de gas Practicas Web3 & DApp Development Fundamentals con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar Web3 & DApp Development Fundamentals?

No se requiere experiencia previa. Web3 & DApp Development Fundamentals en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 4 de 4.

¿Cuánto tiempo toma la lección «Eventos frente a almacenamiento»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de Web3 & DApp Development Fundamentals?

Sí. Cada lección de Web3 & DApp Development Fundamentals incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Declaración de eventos
  2. Parámetros indexados
  3. Escuchar eventos
  4. Eventos frente a almacenamiento
← Volver a Web3 & DApp Development Fundamentals