¿Qué son los eventos de Solidity y cómo se relacionan con temas y registros?

Sé que los argumentos indexados indexan los valores de esos argumentos para que el filtrado sea más rápido.

Pero, ¿qué son los temas? ¿Y para qué sirven?

Sé que la firma de un evento es un tema. Y también un argumento muy índice es un tema.

Y aquí https://github.com/ethereum/wiki/wiki/JavaScript-API#web3ethfilter ¿qué quieren decir cuando dicen "Una matriz de valores que deben aparecer en las entradas de registro. El orden es importante, si quieres para dejar temas fuera use nulo, por ejemplo, [null, '0x00...']. También puede pasar otra matriz para cada tema con opciones para ese tema, por ejemplo, [null, ['option1', 'option2']]"

Firma de un evento es un tema? LOG0 no tiene tema, ¿entonces el evento no tiene firma?

Respuestas (1)

Los temas son parámetros indexados a un evento.

topic[0]siempre se refiere al hash del hash del evento en sí, y puede tener hasta 3 argumentos indexados, cada uno de los cuales se reflejará en los temas.

EVM usa primitivos de bajo nivel llamados registros para mapearlos a una construcción de Solidity de alto nivel llamada Evento. Los registros pueden contener diferentes temas que son argumentos indexados.

Considere el evento:

  event PersonCreated(uint indexed age, uint height);

Y disparas la foobarfunción de MyContract:

  function foobar() {
        emit PersonCreated(26, 176);
  }

Esto creará una entrada de registro de EVM de bajo nivel con temas

  • 0x6be15e8568869b1e100750dd5079151b32637268ec08d199b318b793181b8a7d (hash de Keccak-256 PersonCreated(uint256,uint256))

  • 0x36383cc9cfbf1dc87c78c2529ae2fcd4e3fc4e575e154b357ae3a8b2739113cf (hash de Keccak-256 age), valor 26

Notará que la altura no será un tema, pero se incluirá en la sección de datos del evento.

Internamente, su nodo Ethereum (Geth / Parity) indexará argumentos para construir sobre índices de búsqueda indexables, de modo que pueda realizar búsquedas fácilmente por valor más adelante. Debido a que la creación de índices requiere espacio de disco adicional, los parámetros indexados en los eventos tienen un costo de gas adicional. Sin embargo, se requieren indexados para cualquier búsqueda significativa en la escala de eventos por valor posterior.

Ahora, en el cliente web3, desea ver los eventos de creación de todas las personas que tienen age26, simplemente puede hacer lo siguiente:

var createdEvent = myContract.PersonCreated({age: 26});
createdEvent.watch(function(err, result) {
  if (err) {
    console.log(err)
    return;
  }
  console.log("Found ", result);
})

O podría filtrar todos los eventos pasados ​​de manera similar.

Más información aquí

Si el parámetro de índice es una cadena, bytes o matriz, el hash keccak-256 es el tema en su lugar. En el caso anterior, la edad y la altura no deben cifrarse. ¿No es así?
Sí. Los valores similares a números se transmiten como uint256 es mi conjetura.
Cómo entender la oración "el primer argumento se usará para la parte de datos del registro y los demás como temas": solidity.readthedocs.io/en/v0.4.24/…
¿Y si el parámetro indexado es addressqué tipo de datos recuperamos dentro de los temas de registros?
La dirección es la misma que bytes32.