¿Dónde se almacenan los registros de eventos de contratos en la arquitectura de Ethereum?

Antecedentes sobre eventos: https://github.com/ethereum/wiki/wiki/Solidity-Features

Los eventos permiten el uso conveniente de las instalaciones de registro de EVM. Los eventos son miembros hereditarios de los contratos. Cuando se les llama, hacen que los argumentos se almacenen en el registro de transacciones. Hasta tres parámetros pueden recibir el atributo indexado, lo que hará que los argumentos respectivos se traten como temas de registro en lugar de datos. El hash de la firma del evento es siempre uno de los temas. Todos los argumentos no indexados se almacenarán en la parte de datos del registro.

Si no está dentro del contenedor del contrato inteligente, ¿dónde residen los datos de registro?

Respuestas (3)

Los registros son parte de los recibos de transacciones. Los generan los clientes al ejecutar transacciones y se almacenan junto con la cadena de bloques para permitir su recuperación.

Los registros no forman parte de la cadena de bloques en sí, ya que no se requieren para el consenso (son solo datos históricos); sin embargo, la cadena de bloques los verifica, ya que los hashes de recepción de transacciones se almacenan dentro de los bloques.

¿Los registros se almacenan en un nodo? ¿o todos los nodos?, ¿solo el lado del cliente?
Todos los nodos actualmente (los nodos ligeros probablemente no los almacenarán, pero definitivamente tendrán una forma de recuperarlos). No hay conceptos de servidor/cliente. Todos los nodos son iguales.
Si obtiene los registros de eventos de un nodo, es posible que esté manipulado. ¿Cómo se asegura de que los registros de eventos sean correctos?
El hash de los registros de eventos se registra en el encabezado del bloque. Si tiene el encabezado, simplemente puede recopilar todos los registros de ese bloque, codificarlos y compararlos con el valor almacenado en el encabezado. Si coinciden, no se produjo ninguna manipulación.
En la práctica, ¿dónde encuentro los registros?

Para ayudar con la respuesta de @ Peter, es útil darse cuenta de qué son los eventos y los registros. Los eventos, registros y registros de eventos suelen ser términos de Ethereum que son intercambiables (en algunos contextos se prefiere un término en particular, por ejemplo, eventos en Solidity y web3.js, y registros como en EVM y Yellow Paper).

Los eventos/registros son el resultado de los códigos de operación LOG que se ejecutan en el EVM. Forman parte de las "transacciones internas" que se derivan de la ejecución de datos de transacciones a través de EVM.

Por lo tanto, siempre que tenga la cadena de bloques, tendrá todos los eventos/registros. Para mayor eficiencia, se almacenan como describe @Peter, pero conceptualmente no es necesario almacenarlos, ya que podrían volver a calcularse a partir de la cadena de bloques (que, por definición, consta de todos los bloques y datos de transacciones).

Finalmente, la poda no tiene efecto en los eventos/registros porque la poda se realiza en el estado trie y no se pierden bloques.

De la documentación oficial: https://solidity.readthedocs.io/en/v0.4.24/contracts.html#events

Los eventos son miembros hereditarios de los contratos. Cuando se les llama, hacen que los argumentos se almacenen en el registro de transacciones, una estructura de datos especial en la cadena de bloques. Estos registros están asociados con la dirección del contrato y se incorporarán a la cadena de bloques y permanecerán allí mientras se pueda acceder a un bloque (para siempre a partir de Frontier y Homestead, pero esto podría cambiar con Serenity). No se puede acceder a los datos de registro y eventos desde los contratos (ni siquiera desde el contrato que los creó).