Wie können wir die Entwicklung des Zustands einer Smart-Contract-Variable abrufen?

Ich habe einen einfachen Smart Contract mit einer variablen Farbe, die eine Zeichenfolge speichert.

Wenn ich das richtig verstehe, kann jede Transaktion den Zustand dieser Variable ändern und wird dauerhaft in der Blockchain gespeichert. Nehmen wir an, tx#1 ändert es auf Rot, tx#1 ändert es auf Blau und tx#2 auf Rot, tx#3 auf Grün.

Ich möchte Rot, Blau und Grün haben und nicht nur den letzten Zustand dieser variablen Farbe.

Wie kann ich das erreichen?

Vielen Dank

Antworten (2)

Der übliche Ansatz besteht darin, Ereignisse für alle Zustandsänderungen auszugeben. Diese können extern überwacht werden, einschließlich Wiedergabe von Anfang an und/oder Filter. Es ist eine gute Möglichkeit, einen Verlauf offenzulegen, ohne zu viel (teuren) Vertragsspeicher zu verwenden.

bytes32 x;

event LogChangedX(bytes32 X);

function doSomething(bytes32 newX) {
  x = newX;
  LogChangedX(x); 

Clients, z. B. Browser oder Server, können das Ereignisprotokoll durchsuchen, um alle Änderungen zu entdecken, die an "x" vorgenommen wurden. Verwendet Web3-Ereignis-Listener.

Es gibt einen teureren, speicherintensiveren Ansatz, der eher einer Datenbank-TXN-Verlaufstabelle ähnelt, aber für die meisten Anwendungsfälle nicht benötigt wird.

Ich hoffe es hilft.

Es hilft teilweise. Ich muss wirklich Farben als String speichern. Ich habe Farben als Beispiel genommen. In meinem Fall handelt es sich um IPFS-Links.
Meinetwegen. Sie werden wahrscheinlich Bytes32 anstelle der Ganzzahlen protokollieren und zurückgeben wollen. Wenn dies eine Art Namensdienst ist, dann benötigen Sie Getter mit Schlüsseln, zB function getValue(bytes32 key), und Setter mit beiden, zB functions(bytes32 key, bytes32 value). Sie können den Vertragsspeicher für den aktuellen Status verwenden und Ihren Verlauf von Ereignissen abrufen, es sei denn, mir fehlt ein wichtiges Detail. LogUpdate (Bytes32-Schlüssel, Bytes32-Wert). Normalerweise protokolliere ich standardmäßig alle Statusänderungen, also würde es LogNew, LogUpdated, LogDeleted usw. geben.
Wenn Sie über Namensdienste sprechen, beziehen Sie sich auf eine Art Hash-Tabellen, richtig?
Es tut uns leid. Ihr Vertrag, der Links zurückgibt, klang für mich wie eine Namensauflösung. Es war nur eine Vermutung. Ich habe die Antwort bearbeitet, um sie einfach "x" zu nennen und zu verdeutlichen, wie Sie die Änderungen nachverfolgen können. Sie könnten jeden Zustand reproduzieren, den x mit einem Web3-Client durchlaufen hat. Ich beginne mich zu fragen, ob Sie meinen, dass Sie auf diese Historie im Vertrag zugreifen möchten. Wenn ja, würde „Es gibt einen gasintensiveren, speicherintensiveren Ansatz …“ gelten. Lösbar, aber nicht trivial.

Sie können konstante Funktionen für ältere Zustände aufrufen, indem Sie die blockNumber in der Argumentliste angeben. Eine gute Möglichkeit, die blockNumber für Zustandsänderungen zu finden, ist das Ausgeben eines Ereignisses. Ich habe ein Beispiel erstellt, das dies hier zeigt:

https://github.com/chafey/ethereum-events

Und auch ein Blogeintrag:

http://chafey.blogspot.com/2017/03/applying-blockchain-to-healthcare-part_4.html

Hier ist ein Link zu dem Code, der die Ereignisse durchläuft und den älteren Status für die Smart Contracts erhält:

https://github.com/chafey/ethereum-events/blob/master/app/client/patientChanges.js#L6