Betrachten wir einen einfachen Vertrag, der eine Variable verfolgen soll. Eine Client-App muss auf den Verlauf dieser Variablen zugreifen, um ein Diagramm anzuzeigen.
Ich kann ein Array innerhalb des Vertrags erstellen und push()
den Wert jederzeit wie folgt (ungetesteter Code):
contract Price {
uint[] public priceHistory;
function logPrice(uint price) public {
priceHistory.push(price);
}
}
Vielleicht ist es eine billigere und bessere Option, Ereignisse ähnlich der folgenden auszugeben:
contract Price {
event PriceChanged(uint price);
function logPrice(uint price) public {
emit PriceChanged(price);
}
}
Gemäß (3) einer billigeren Form der Speicherung ist der zweite Ansatz kostengünstig. Meine Frage ist, können wir zuverlässig davon ausgehen, dass die Protokolle in zeitlicher Reihenfolge geschrieben werden (damit wir daraus eine Historie rekonstruieren können).
Die nächste Frage ist, wenn dieser Vertrag andere Verträge aufruft, die demselben Entwurfsmuster folgen (die gesamte Speicherung erfolgt in Protokollen), wie können wir eine Historie mit der richtigen Zeitordnung zusammenweben? dh das Einrichten ClientApp -> ContractA - ContractB -> ContractC
aus dem Lesen von Ereignisprotokollen für alle drei Verträge.
Ein Gedanke könnte sein, Transaktions-Hash vom ersten user -> contract
Aufruf an bis zu nachfolgenden contract -> contract
Aufrufen weiterzugeben.
Wenn dies ein monolithisches System wäre, hätte timestamp helfen können. Aber da es sich um ein verteiltes System handelt, frage ich mich, wie wir hier den Begriff einer Sequenz etablieren ?
Ja, aber mit einigen Nuancen, damit die Garantien gut verstanden werden.
Ereignisprotokolleinträge sind Teil der Transaktionen in Blöcken. Als solches können Sie über Ereignissequenzzusicherungen mit den gleichen Prinzipien argumentieren, die Sie verwenden würden, um über die Transaktionsreihenfolge zu argumentieren. Sie werden in der gleichen Reihenfolge eintreffen wie die Transaktionsminen.
Die Idee, Ereignisprotokolle als kostengünstigen Speicher zu verwenden, wird manchmal als „zustandsloses“ Muster bezeichnet. Der Hauptvorbehalt besteht darin, dass solche Einträge für die Vertragslogik nicht (leicht) zugänglich sind.
Ich bin mir nicht 100% sicher, was das bedeutet:
ClientApp -> VertragA -> VertragB -> VertragC
ContractA
dann ist es deterministisch und Sie können es in der Reihenfolge haben, in der die Funktionen aufgerufen wurden, oder in umgekehrter Reihenfolge, je nachdem, wie Sie die Vertragsfunktionen schreiben.ContractB
ContractC
Wenn Sie den Emitter des Ereignisses gewöhnlich zuerst platzieren, erhalten Sie „bereit (a), Ziel (b), Feuer (c). Alle drei Ereignisse kommen mit der bestätigten Transaktion in dieser Reihenfolge an.
emit LogReady(...
contractB.aim(...
Wenn Sie den Vertragsaufruf vor dem Ereignis platzieren, erhalten Sie Feuer (c), Bereit (b), Ziel (a) in dieser Reihenfolge, wenn die geschürfte Transaktion eintrifft.
contractB.aim(...
emit LogReady(...
Der zweite Weg ist intuitiver – erledige zuerst etwas und protokolliere dann, was du getan hast. Es führt zu eigenartigen (umgekehrten) Protokollen für lange Funktionsketten. Der erste Weg ist nicht so intuitiv, aber er ergibt eine schöne Sequenz, unabhängig davon, wie viele separate event LogName()
Protokolle beteiligt sind.
Ich hoffe es hilft.
Ereignisse haben garantiert dieselbe Reihenfolge wie Transaktionen. (Es gibt eine gewisse Zufälligkeit in der Reihenfolge der Transaktionen aufgrund der Art und Weise, wie Transaktionen für das Mining von Nodes ausgewählt werden.)
Transaktionen werden bestellt
Sie können
Der Code dafür wird in folgendem Thread bereitgestellt: web3: How do I get past events of myContract.myEvent?
Amarsch
arnabkaycee
Rob Hitchens
CJ42
Fire
,Ready
,Aim
) reagiert, wie würde sich die umgekehrte Reihenfolge auf die Logik der dApp auswirken? Die Anwendung dieser „eigentümlichen“ Reihenfolge klingt eher so, als könnte sie den dApp-Code fehlerhaft machen oder sich auf unerwartete Weise verhalten und zu web2-Sicherheitsproblemen führen. Was sind Ihre Erkenntnisse zu den potenziellen Sicherheitsauswirkungen dieser eigentümlichen Emissionsreihenfolge?Rob Hitchens