Daten aus Smart Contracts mit Ereignissen loggen
In Solidity sind Ereignisse ausgesendete Signale, die Smart Contracts auslösen können. Dezentrale Anwendungen (Dapps) oder alles, was mit der Ethereum-JSON-RPC-API verbunden ist, können auf diese Ereignisse hören und entsprechend handeln. Ein Ereignis kann auch indiziert werden, sodass der Ereignisverlauf später durchsuchbar ist.
Ereignisse
Das häufigste Ereignis auf der Ethereum-Blockchain zum Zeitpunkt des Verfassens dieses Artikels ist das Transfer-Ereignis, das von ERC-20-Token ausgegeben wird, wenn jemand Token transferiert.
event Transfer(address indexed from, address indexed to, uint256 value);
Die Ereignis-Signatur wird innerhalb des Vertragscodes deklariert und kann mit dem Schlüsselwort emit ausgegeben werden. Zum Beispiel loggt das Transfer-Ereignis, wer den Transfer gesendet hat (from), an wen (to) und wie viele Token transferiert wurden (value).
Wenn wir zu unserem Counter-Smart-Contract zurückkehren und beschließen, jedes Mal zu loggen, wenn der Wert geändert wird. Da dieser Vertrag nicht dazu gedacht ist, bereitgestellt zu werden, sondern als Basis für den Aufbau eines anderen Vertrags durch Erweiterung dient, wird er als abstrakter Vertrag bezeichnet. Im Fall unseres Zähler-Beispiels würde das so aussehen:
pragma solidity 0.5.17;
contract Counter {
event ValueChanged(uint oldValue, uint256 newValue);
// Private Variable vom Typ unsigned int, um die Anzahl der Zählungen zu speichern
uint256 private count = 0;
// Funktion, die unseren Zähler inkrementiert
function increment() public {
count += 1;
emit ValueChanged(count - 1, count);
}
// Getter, um den Zählwert abzurufen
function getCount() public view returns (uint256) {
return count;
}
}
Beachte Folgendes:
-
Zeile 5: Wir deklarieren unser Ereignis und was es enthält, den alten Wert und den neuen Wert.
-
Zeile 13: Wenn wir unsere Zählervariable inkrementieren, geben wir das Ereignis aus.
Wenn wir nun den Vertrag bereitstellen und die Inkrement-Funktion aufrufen, werden wir sehen, dass Remix dies automatisch anzeigt, wenn man auf die neue Transaktion innerhalb eines Arrays namens logs klickt.
Logs sind sehr nützlich für das Debuggen deiner Smart Contracts, aber sie sind auch wichtig, wenn du Anwendungen baust, die von verschiedenen Personen genutzt werden. Sie erleichtern Analysen, um zu verfolgen und zu verstehen, wie dein Smart Contract genutzt wird. Die durch Transaktionen generierten Logs werden in beliebten Block-Explorern angezeigt, und du kannst sie beispielsweise auch verwenden, um offchain-Skripte zu erstellen, die auf bestimmte Ereignisse hören und bei deren Eintreten Aktionen ausführen.
