Что такое события Solidity и как они связаны с темами и журналами?

Я знаю, что индексированные аргументы индексируют значения этих аргументов, чтобы фильтрация была быстрее.

Но что такое темы? И для чего они используются?

Я знаю, что сигнатура события — это тема. А еще очень показательный аргумент - это топик.

А здесь https://github.com/ethereum/wiki/wiki/JavaScript-API#web3ethfilter что они имеют в виду, когда говорят: «Массив значений, каждое из которых должно отображаться в записях журнала. Порядок важен, если вы хотите чтобы исключить темы, используйте null, например [null, '0x00...']. Вы также можете передать другой массив для каждой темы с параметрами для этой темы, например [null, ['option1', 'option2']]"

Подпись события - это тема? LOG0 не имеет темы, поэтому у события нет подписи?

Ответы (1)

Темы — это индексированные параметры события.

topic[0]всегда ссылается на хэш хеша самого события и может иметь до 3 индексированных аргументов, каждый из которых будет отражен в темах.

EVM использует низкоуровневые примитивы, называемые журналами, для сопоставления их с высокоуровневой конструкцией Solidity, называемой Event. Журналы могут содержать разные темы, которые являются проиндексированными аргументами.

Рассмотрим событие:

  event PersonCreated(uint indexed age, uint height);

И вы запускаете foobarфункцию MyContract:

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

Это создаст низкоуровневую запись журнала EVM с темами

  • 0x6be15e8568869b1e100750dd5079151b32637268ec08d199b318b793181b8a7d (хэш Keccak-256 PersonCreated(uint256,uint256))

  • 0x36383cc9cfbf1dc87c78c2529ae2fcd4e3fc4e575e154b357ae3a8b2739113cf (хэш Keccak-256 от age), значение 26

Вы заметите, что высота не будет темой, но будет включена в раздел данных события.

Внутри ваш узел Ethereum (Geth/Parity) будет индексировать аргументы для построения индексируемых поисковых индексов, чтобы вы могли легко выполнять поиск по значению позже. Поскольку для создания индексов требуется дополнительное место на диске, индексированные параметры в событиях требуют дополнительных затрат на газ. Тем не менее, indexed требуется для любого значимого поиска в масштабе событий по значению позже.

Теперь в клиенте web3 вы хотите отслеживать события создания всех лиц из age26, вы можете просто сделать:

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

Или вы можете отфильтровать все прошлые события аналогичным образом.

Больше информации здесь

Если параметр индекса является строкой, байтами или массивом, то вместо этого темой является хэш keccak-256. В приведенном выше случае возраст и рост не должны хешироваться. Разве это не так?
Да. Числовые значения проталкиваются, поскольку я предположил, что uint256.
Как понимать предложение «первый аргумент будет использоваться для части данных журнала, а остальные в качестве тем»: solidity.readthedocs.io/en/v0.4.24/…
И если индексированный параметр — это addressтип данных, которые мы получили в темах журналов?
Адрес такой же, как bytes32.