Я знаю, что индексированные аргументы индексируют значения этих аргументов, чтобы фильтрация была быстрее.
Но что такое темы? И для чего они используются?
Я знаю, что сигнатура события — это тема. А еще очень показательный аргумент - это топик.
А здесь https://github.com/ethereum/wiki/wiki/JavaScript-API#web3ethfilter что они имеют в виду, когда говорят: «Массив значений, каждое из которых должно отображаться в записях журнала. Порядок важен, если вы хотите чтобы исключить темы, используйте null, например [null, '0x00...']. Вы также можете передать другой массив для каждой темы с параметрами для этой темы, например [null, ['option1', 'option2']]"
Темы — это индексированные параметры события.
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 вы хотите отслеживать события создания всех лиц из age
26, вы можете просто сделать:
var createdEvent = myContract.PersonCreated({age: 26});
createdEvent.watch(function(err, result) {
if (err) {
console.log(err)
return;
}
console.log("Found ", result);
})
Или вы можете отфильтровать все прошлые события аналогичным образом.
Больше информации здесь
address
тип данных, которые мы получили в темах журналов?
lixq