Что делает проиндексированное ключевое слово?

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

передача события (адрес, с которого индексируется, адрес, на который индексируется, значение uint256);

Ответы (2)

Что делает ключевое слово 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
Почему при определении события для просмотра используются две скобки вместо одной? Например, почему: theDAO.Transfer({}, {fromBlock: theDAOStartingBlock, toBlock: theDAOStartingBlock + 2000});вместоtheDAO.Transfer({fromBlock: theDAOStartingBlock, toBlock: theDAOStartingBlock + 2000});
У вас есть другой пример indexedиспользования событий на Web3.py@The Officious BokkyPooBah?
Нужен ли indexedон больше, теперь, когда у нас есть автономные инструменты, такие как thegraph.com, которые будут считывать каждое интересующее нас событие? Это рассуждение заставляет меня думать, что мы можем indexedполностью забыть об этом.

Ключевое слово 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?