Was macht das indexierte Keyword?

Was bewirkt das Schlüsselwort „indexed“ in der folgenden Codezeile? Ich vermute, es teilt dem Ereignisobjekt nur mit, dass die folgende Eingabe protokolliert werden soll? Können wir es auch an anderen Orten verwenden, zB außerhalb von Veranstaltungen?

event Transfer (Adresse indiziert von, Adresse indiziert auf, uint256-Wert);

Antworten (2)

Was bewirkt das Schlüsselwort „indexed“ in der folgenden Codezeile? Ich vermute, es teilt dem Ereignisobjekt nur mit, dass die folgende Eingabe protokolliert werden soll?

Mit den indizierten Parametern für protokollierte Ereignisse können Sie nach diesen Ereignissen suchen, indem Sie die indizierten Parameter als Filter verwenden.

Können wir es auch an anderen Orten verwenden, zB außerhalb von Veranstaltungen?

Das indizierte Schlüsselwort ist nur für protokollierte Ereignisse relevant.



Aus Verträge - Ereignisse :

Bis zu drei Parameter können das Attribut indexed erhalten, wodurch nach den jeweiligen Argumenten gesucht wird: In der Benutzeroberfläche kann nach bestimmten Werten indexierter Argumente gefiltert werden.

Im Folgenden finden Sie Code zum Testen der indizierten Schlüsselwörter mithilfe des TransferEreignisses von The DAO mit der folgenden Definition:

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

Lassen Sie uns nach allen The DAO- TransferEreignissen zwischen Block 2254451 und 2256451 suchen:

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
...

Lassen Sie uns nach allen TransferEreignissen zwischen denselben Blöcken suchen, aber mit einem _fromParameter von 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

Lassen Sie uns nach allen TransferEreignissen zwischen denselben Blöcken suchen, aber mit einem _toParameter von 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
...

Sie können jedoch nicht mit dem nicht indizierten Parameter nach TransferEreignissen suchen - in den zurückgegebenen Ergebnissen funktioniert der Filter nicht:_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
Warum gibt es bei der Definition des zu beobachtenden Ereignisses zwei Klammern statt einer? Wie warum: theDAO.Transfer({}, {fromBlock: theDAOStartingBlock, toBlock: theDAOStartingBlock + 2000});statttheDAO.Transfer({fromBlock: theDAOStartingBlock, toBlock: theDAOStartingBlock + 2000});
Haben Sie ein anderes Beispiel für die indexedNutzung von Veranstaltungen auf Web3.py@The Officious BokkyPooBah?
Wird indexedes überhaupt noch benötigt, jetzt wo wir Offchain-Tools wie thegraph.com haben, die jedes einzelne Ereignis lesen, an dem wir interessiert sind? Diese Argumentation lässt mich denken, dass wir das indexedganz vergessen können.

Das indizierte Schlüsselwort hilft Ihnen, die Protokolle zu filtern, um die gewünschten Daten zu finden. So können Sie nach bestimmten Elementen suchen, anstatt alle Protokolle zu erhalten. Im Algemeinen :

  event <Identifier>(<parameters>)

Wobei höchstens 3 Parameter die indizierte Eigenschaft erhalten können. Wenn es als Funktion aufgerufen wird, gibt es einen Log-Opcode aus, der die nicht indizierten Argumente als Daten enthält, serialisiert gemäß ABI (32-Byte-Segmentierung, Ausrichtung) und sha3("("","...")").

in der offiziellen Dokumentation.

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

In der Ereignisfunktion können bis zu drei Parameter das Attribut indexed erhalten, wodurch die entsprechenden Argumente als Protokollthemen statt als Daten behandelt werden . Der Hash der Signatur des Ereignisses ist immer eines der Themen. Alle nicht indizierten Argumente werden im Datenteil des Protokolls gespeichert.

Beispiel (von consensys.net ), ein vorgeschlagener Token-Standard hat:

event Transfer(address indexed _from, address indexed _to, uint256 _value)

Dies bedeutet, dass ein Frontend effizient nur auf Token-Transfers achten kann, die von einem Adress-TokenContract gesendet werden:Transfer({_from: senderAddress})

Oder erhalten von einer Adresse:tokenContract.Transfer({_to: receiverAddress})

Oder von einer Adresse an eine bestimmte Adresse gesendet:tokenContract.Transfer({_from: senderAddress, _to: receiverAddress})

Sollte ich den gleichen Ansatz Web3.pyauch durchführen?