Ich weiß, dass indizierte Argumente die Werte für diese Argumente indizieren, sodass das Filtern schneller ist.
Aber was sind Themen? Und wofür werden sie verwendet?
Ich weiß, dass die Unterschrift eines Ereignisses ein Thema ist. Und auch sehr Indexargument ist ein Thema.
Und hier https://github.com/ethereum/wiki/wiki/JavaScript-API#web3ethfilter , was meinen sie, wenn sie sagen: „Ein Array von Werten, die jeweils in den Log-Einträgen erscheinen müssen. Die Reihenfolge ist wichtig, wenn Sie möchten Um Themen wegzulassen, verwenden Sie null, z. B. [null, '0x00...']. Sie können auch ein anderes Array für jedes Thema mit Optionen für dieses Thema übergeben, z. B. [null, ['option1', 'option2']]"
Themen sind indizierte Parameter zu einem Ereignis.
topic[0]
bezieht sich immer auf den Hash des Ereignisses selbst und kann bis zu 3 indizierte Argumente haben, die sich jeweils in den Themen widerspiegeln.
EVM verwendet Low-Level-Primitive namens Logs, um sie einem High-Level-Solidity-Konstrukt namens Event zuzuordnen. Protokolle können verschiedene Themen enthalten, die indizierte Argumente sind.
Ereignis berücksichtigen:
event PersonCreated(uint indexed age, uint height);
Und Sie feuern es mit der foobar
Funktion von MyContract
:
function foobar() {
emit PersonCreated(26, 176);
}
Dadurch wird ein Low-Level-EVM-Protokolleintrag mit Themen erstellt
0x6be15e8568869b1e100750dd5079151b32637268ec08d199b318b793181b8a7d (Keccak-256-Hash von PersonCreated(uint256,uint256)
)
0x36383cc9cfbf1dc87c78c2529ae2fcd4e3fc4e575e154b357ae3a8b2739113cf (Keccak-256-Hash von age
), Wert 26
Sie werden feststellen, dass die Höhe kein Thema sein wird, aber sie wird in den Datenabschnitt der Veranstaltung aufgenommen.
Intern indiziert Ihr Ethereum-Knoten (Geth / Parity) Argumente, um auf indexierbaren Suchindizes aufzubauen, sodass Sie später problemlos nach Werten suchen können. Da das Erstellen von Indizes zusätzlichen Speicherplatz beansprucht, verursachen indizierte Parameter in Ereignissen zusätzliche Gaskosten. Indexe sind jedoch erforderlich, um später in der Skala von Ereignissen nach Wert sinnvoll nachschlagen zu können.
Jetzt möchten Sie im Web3-Client nach Schöpfungsereignissen aller Personen suchen, die age
26 Jahre alt sind. Sie können einfach Folgendes tun:
var createdEvent = myContract.PersonCreated({age: 26});
createdEvent.watch(function(err, result) {
if (err) {
console.log(err)
return;
}
console.log("Found ", result);
})
Oder Sie können alle vergangenen Ereignisse auf ähnliche Weise filtern.
Weitere Informationen hier
address
Art von Daten ist, die wir in den Protokollthemen abgerufen haben?
lixq