Что такое темы событий?

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

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

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

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

21 голос | спросил Narayan Prusty 10 MarpmFri, 10 Mar 2017 20:28:24 +03002017-03-10T20:28:24+03:0008 2017, 20:28:24

1 ответ


19

Можно рассматривать темы как разные имена индексов.

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

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

  PersonCreated(uint indexed age, uint indexed height);

И вы запускаете его в MyContract:

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

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

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

  • 0x36383cc9cfbf1dc87c78c2529ae2fcd4e3fc4e575e154b357ae3a8b2739113cf (хэш кексак-256 age

  • 0x048dd4d5794e69cea63353d940276ad61f89c65942226a2bb5bd352536892f82 (хеш Keccak-256 height), значение 176

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

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

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

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

Дополнительная информация здесь

ответил Mikko Ohtamaa 10 MarpmFri, 10 Mar 2017 21:09:10 +03002017-03-10T21:09:10+03:0009 2017, 21:09:10

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132