Что делает ключевое слово indexed?

Что означает ключевое слово "indexed" в нижней строке кода? Я предполагаю, что он просто сообщает объекту события, что следующий вход должен быть зарегистрирован? Можем ли мы использовать его в других местах, то есть вне событий?

событие Передача (адрес проиндексирован, адрес проиндексирован, значение uint256);
37 голосов | спросил Lucky B 14 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowWed, 14 Sep 2016 05:46:32 +0300 2016, 05:46:32

2 ответа


45

Q Что означает ключевое слово «индексированное» в нижней строке кода? Я предполагаю, что он просто сообщает объекту события, что следующий вход должен быть зарегистрирован?

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

Q Можем ли мы использовать его в других местах, т.е. вне событий?

Ключевое слово indexed относится только к зарегистрированным событиям.



От Контракты - События :

  

До трех параметров можно получить индексированный атрибут, который приведет к поиску соответствующих аргументов: в пользовательском интерфейсе можно фильтровать определенные значения индексированных аргументов.

Ниже приведен код для проверки индексированных ключевых слов с использованием события Transfer DAO со следующим определением:

event Transfer(address indexed _from, address indexed _to, uint256 _amount);

Давайте ищем все события DAO Transfer между блоками 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
ответил The Officious BokkyPooBah 14 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowWed, 14 Sep 2016 09:45:53 +0300 2016, 09:45:53
6

Ключевое слово indexed позволяет вам фильтровать журналы, чтобы найти нужные данные. таким образом, вы можете искать определенные элементы, а не получать все журналы. в целом:

  event <Identifier>(<parameters>)

Если не более 3 параметров могут получить проиндексированное свойство. Если вызывается как функция, выдает код операции журнала, содержащий неиндексированные аргументы в виде данных, сериализуется в соответствии с ABI (32-байтовая сегментация, выравнивание) и sha3 ("(" "," ... ")").

в официальной документации.

https://github.com/ethereum/wiki/wiki/Solidity-Features

  

в функции события до трех параметров может получить атрибут   индексируется, что приведет к тому, что соответствующие аргументы будут обрабатываться как log   темы вместо данных . Хеш подписи события   всегда одна из тем. Все неиндексированные аргументы будут сохранены в   часть данных журнала.

Пример (из consensys.net ):

Предлагаемый стандарт токена имеет: событие Transfer (адрес проиндексирован _from, адрес проиндексирован _to, uint256 _value). Это означает, что интерфейс может эффективно наблюдать за переносами токенов, которые отправляются по адресу tokenContract: Transfer({_from: senderAddress})

Или получен по адресу: tokenContract.Transfer({_to: receiverAddress})

Или отправляется по адресу на определенный адрес: tokenContract.Transfer({_from: senderAddress, _to: receiverAddress})

ответил Badr Bellaj 14 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowWed, 14 Sep 2016 14:19:07 +0300 2016, 14:19:07

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

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

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