Что делает ключевое слово indexed в приведенной ниже строке кода? Я предполагаю, что это просто сообщает объекту события, что следующий ввод должен быть зарегистрирован? Можем ли мы использовать его в других местах, то есть вне мероприятий?
передача события (адрес, с которого индексируется, адрес, на который индексируется, значение uint256);
Что делает ключевое слово indexed в приведенной ниже строке кода? Я предполагаю, что это просто сообщает объекту события, что следующий ввод должен быть зарегистрирован?
Индексированные параметры для зарегистрированных событий позволят вам искать эти события, используя индексированные параметры в качестве фильтров.
Можем ли мы использовать его в других местах, то есть вне мероприятий?
Ключевое слово indexed относится только к зарегистрированным событиям.
Из Контрактов - События :
До трех параметров могут получить атрибут indexed, что приведет к поиску соответствующих аргументов: Можно отфильтровать определенные значения индексированных аргументов в пользовательском интерфейсе.
Ниже приведен код для проверки проиндексированных ключевых слов с использованием Transfer
события DAO со следующим определением:
event Transfer(address indexed _from, address indexed _to, uint256 _amount);
Давайте найдем все Transfer
события The DAO между блоками 2254451 и 2256451:
var theDAOABIFragment = [{"anonymous":false,"inputs":[{"indexed":true,"name":"_from","type":"address"},{"indexed":true,"name":"_to","type":"address"},{"indexed":false,"name":"_amount","type":"uint256"}],"name":"Transfer","type":"event"}];
var theDAOAddress = "0xBB9bc244D798123fDe783fCc1C72d3Bb8C189413";
var theDAOStartingBlock = 2254451;
var theDAO = web3.eth.contract(theDAOABIFragment).at(theDAOAddress);
var theDAOTransferEvent = theDAO.Transfer({}, {fromBlock: theDAOStartingBlock, toBlock: theDAOStartingBlock + 2000});
console.log("address\tfrom\t\tto\tamount\tblockHash\tblockNumber\tevent\tlogIndex\ttransactionHash\ttransactionIndex");
theDAOTransferEvent.watch(function(error, result){
console.log(result.address + "\t" + result.args._from + "\t" + result.args._to + "\t" +
result.args._amount / 1e16 + "\t" +
result.blockHash + "\t" + result.blockNumber + "\t" + result.event + "\t" + result.logIndex + "\t" +
result.transactionHash + "\t" + result.transactionIndex);
});
address from to amount blockHash blockNumber event logIndex transactionHash transactionIndex
0xbb9bc244d798123fde783fcc1c72d3bb8c189413 0xd430709a70da06c5c25157a97dba3c3e664590af 0x736d8160b1b191e770854d9499f7a2b55934afe0 130 0xf65e39b1b21bb287c190254e38e5c0fdff5d1383aa572ba638495254910b3026 2254451 Transfer 0 0x1729300794020bc93829a214f83281e3ebd39a5606e170de1cbd32212bf75478 0
0xbb9bc244d798123fde783fcc1c72d3bb8c189413 0x736d8160b1b191e770854d9499f7a2b55934afe0 0x0a869d79a7052c7f1b55a8ebabbea3420f0d1e13 130 0xbe040de4624be6947888b72fe1ca29541f2cc85ba170579d88f3953a3abe4353 2254463 Transfer 0 0x98603d36fd9d9471776a67437ec10cd01a23ce30c3d61d03cdd128e24cce8aa0 1
...
Будем искать все Transfer
события между теми же блоками, но с _from
параметром 0xd430709a70da06c5c25157a97dba3c3e664590af
:
theDAOTransferEvent.stopWatching();
theDAOTransferEvent = theDAO.Transfer({_from: "0xd430709a70da06c5c25157a97dba3c3e664590af"}, {fromBlock: theDAOStartingBlock, toBlock: theDAOStartingBlock + 2000});
console.log("address\tfrom\t\tto\tamount\tblockHash\tblockNumber\tevent\tlogIndex\ttransactionHash\ttransactionIndex");
theDAOTransferEvent.watch(function(error, result){
console.log(result.address + "\t" + result.args._from + "\t" + result.args._to + "\t" +
result.args._amount / 1e16 + "\t" +
result.blockHash + "\t" + result.blockNumber + "\t" + result.event + "\t" + result.logIndex + "\t" +
result.transactionHash + "\t" + result.transactionIndex);
});
address from to amount blockHash blockNumber event logIndex transactionHash transactionIndex
0xbb9bc244d798123fde783fcc1c72d3bb8c189413 0xd430709a70da06c5c25157a97dba3c3e664590af 0x736d8160b1b191e770854d9499f7a2b55934afe0 130 0xf65e39b1b21bb287c190254e38e5c0fdff5d1383aa572ba638495254910b3026 2254451 Transfer 0 0x1729300794020bc93829a214f83281e3ebd39a5606e170de1cbd32212bf75478 0
Будем искать все Transfer
события между теми же блоками, но с _to
параметром 0x0a869d79a7052c7f1b55a8ebabbea3420f0d1e13
:
theDAOTransferEvent.stopWatching();
theDAOTransferEvent = theDAO.Transfer({_to: "0x0a869d79a7052c7f1b55a8ebabbea3420f0d1e13"}, {fromBlock: theDAOStartingBlock, toBlock: theDAOStartingBlock + 2000});
console.log("address\tfrom\t\tto\tamount\tblockHash\tblockNumber\tevent\tlogIndex\ttransactionHash\ttransactionIndex");
theDAOTransferEvent.watch(function(error, result){
console.log(result.address + "\t" + result.args._from + "\t" + result.args._to + "\t" +
result.args._amount / 1e16 + "\t" +
result.blockHash + "\t" + result.blockNumber + "\t" + result.event + "\t" + result.logIndex + "\t" +
result.transactionHash + "\t" + result.transactionIndex);
});
0xbb9bc244d798123fde783fcc1c72d3bb8c189413 0x736d8160b1b191e770854d9499f7a2b55934afe0 0x0a869d79a7052c7f1b55a8ebabbea3420f0d1e13 130 0xbe040de4624be6947888b72fe1ca29541f2cc85ba170579d88f3953a3abe4353 2254463 Transfer 0 0x98603d36fd9d9471776a67437ec10cd01a23ce30c3d61d03cdd128e24cce8aa0 1
0xbb9bc244d798123fde783fcc1c72d3bb8c189413 0xab28341e676e8c600168a32efa3e2300e64ba66d 0x0a869d79a7052c7f1b55a8ebabbea3420f0d1e13 1800 0xf2c8d81186fcdc117aaedc9c6addeaace1f979bb61ededf256bdab1533a41c00 2254587 Transfer 0 0x7e8a5bbbafedf67793d897e305f3c8b32443601cf2f521a99abfec52c4880e21 1
...
Но нельзя искать Transfer
события по неиндексированному параметру _amount
— в возвращаемых результатах _amount
не работает фильтр по:
theDAOTransferEvent.stopWatching();
theDAOTransferEvent = theDAO.Transfer({_amount: 1800}, {fromBlock: theDAOStartingBlock, toBlock: theDAOStartingBlock + 2000});
console.log("address\tfrom\t\tto\tamount\tblockHash\tblockNumber\tevent\tlogIndex\ttransactionHash\ttransactionIndex");
theDAOTransferEvent.watch(function(error, result){
console.log(result.address + "\t" + result.args._from + "\t" + result.args._to + "\t" +
result.args._amount / 1e16 + "\t" +
result.blockHash + "\t" + result.blockNumber + "\t" + result.event + "\t" + result.logIndex + "\t" +
result.transactionHash + "\t" + result.transactionIndex);
});
address from to amount blockHash blockNumber event logIndex transactionHash transactionIndex
0xbb9bc244d798123fde783fcc1c72d3bb8c189413 0xd430709a70da06c5c25157a97dba3c3e664590af 0x736d8160b1b191e770854d9499f7a2b55934afe0 130 0xf65e39b1b21bb287c190254e38e5c0fdff5d1383aa572ba638495254910b3026 2254451 Transfer 0 0x1729300794020bc93829a214f83281e3ebd39a5606e170de1cbd32212bf75478 0
0xbb9bc244d798123fde783fcc1c72d3bb8c189413 0x736d8160b1b191e770854d9499f7a2b55934afe0 0x0a869d79a7052c7f1b55a8ebabbea3420f0d1e13 130 0xbe040de4624be6947888b72fe1ca29541f2cc85ba170579d88f3953a3abe4353 2254463 Transfer 0 0x98603d36fd9d9471776a67437ec10cd01a23ce30c3d61d03cdd128e24cce8aa0 1
0xbb9bc244d798123fde783fcc1c72d3bb8c189413 0x0a869d79a7052c7f1b55a8ebabbea3420f0d1e13 0xc1b8997966867efbf303c1f2fc75edf585d6b9a0 23532.873 0x32b5c1eae010445f608a3ae5bfa783aea786b59ddd3c84ed8b7f9f8e789f72eb 2254559 Transfer 0 0xcf997ddc59492cab35c76386efe359497e4ea2dcd40fe1ce5af7896ea293ed53 2
0xbb9bc244d798123fde783fcc1c72d3bb8c189413 0xc1b8997966867efbf303c1f2fc75edf585d6b9a0 0xbf4ed7b27f1d666546e30d74d50d173d20bca754 23532.873 0xc1fe6cb56865b20409f34dbc2920853cce63fa81c17354888a6608ea29cbed72 2254565 Transfer 0 0x00616b47b25edbbeffba0d2fb6e0590024fa6313e4127613dcb9341b4c5ad9e0 0
Ключевое слово indexed помогает вам фильтровать журналы, чтобы найти нужные данные. таким образом, вы можете искать определенные элементы вместо получения всех журналов. в целом :
event <Identifier>(<parameters>)
Где не более 3 параметров могут получить индексированное свойство. Если вызывается как функция, выдает код операции журнала, содержащий неиндексированные аргументы в виде данных, сериализованных в соответствии с ABI (32-байтовая сегментация, выравнивание) и sha3("("","...")").
в официальной документации.
https://github.com/ethereum/wiki/wiki/Solidity-Features
в функции события до трех параметров могут получить индексированный атрибут, что приведет к тому, что соответствующие аргументы будут рассматриваться как темы журнала, а не как данные . Хэш подписи события всегда является одной из тем. Все неиндексированные аргументы будут храниться в части данных журнала.
Пример (от consensys.net ), предлагаемый стандарт токена имеет:
event Transfer(address indexed _from, address indexed _to, uint256 _value)
Это означает, что внешний интерфейс может эффективно просто отслеживать передачу токенов, которые отправляются по адресу tokenContract:Transfer({_from: senderAddress})
Или получено по адресу:tokenContract.Transfer({_to: receiverAddress})
Или отправлено по адресу на определенный адрес:tokenContract.Transfer({_from: senderAddress, _to: receiverAddress})
Web3.py
?
Джон ДеБорд
theDAO.Transfer({}, {fromBlock: theDAOStartingBlock, toBlock: theDAOStartingBlock + 2000});
вместоtheDAO.Transfer({fromBlock: theDAOStartingBlock, toBlock: theDAOStartingBlock + 2000});
альпер
indexed
использования событий наWeb3.py
@The Officious BokkyPooBah?альмель
indexed
он больше, теперь, когда у нас есть автономные инструменты, такие как thegraph.com, которые будут считывать каждое интересующее нас событие? Это рассуждение заставляет меня думать, что мы можемindexed
полностью забыть об этом.