Was sind Solidity-Ereignisse und in welcher Beziehung stehen sie zu Themen und Protokollen?

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']]"

Signatur einer Veranstaltung ist ein Thema? LOG0 hat kein Thema, also hat das Ereignis keine Signatur?

Antworten (1)

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 foobarFunktion 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 age26 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

Wenn der Indexparameter eine Zeichenfolge, Bytes oder ein Array ist, dann ist stattdessen der keccak-256-Hash von das Thema. Im obigen Fall sollten Alter und Größe nicht gehasht werden. Ist das nicht richtig?
Ja. Die zahlenähnlichen Werte werden durchgesetzt, da uint256 meine fundierte Vermutung ist.
Wie ist der Satz "Das erste Argument wird für den Datenteil des Protokolls und die anderen als Themen verwendet" zu verstehen: solidity.readthedocs.io/en/v0.4.24/…
Und wenn der indizierte Parameter eine addressArt von Daten ist, die wir in den Protokollthemen abgerufen haben?
Die Adresse ist dieselbe wie bytes32.