So lösen Sie ein asynchrones Solidity-Problem

Wie geht man mit asynchronem Betrieb wegen der Blockchain-Verzögerung um? Wie funktioniert die Blockchain bei hoher Parallelität? wie geht man mit der sich gegenseitig ausschließenden Variablen um?

Antworten (2)

Die Blockchain selbst ist effektiv Single-Threaded: Transaktionen werden einzeln ausgeführt, und der Status der vorherigen Transaktion wurde geändert, wenn sie dann von der nächsten Transaktion referenziert wird. Wenn Sie beispielsweise einer Reihe von Datensätzen eine aufsteigende ID zuweisen möchten, können Sie sicher sein, dass letztendlich jede ID nur einem Datensatz zugewiesen wird.

Das Problem ist, dass Sie beim Senden einer Transaktion nicht nur nicht im Voraus wissen, in welcher Reihenfolge sie im Verhältnis zu anderen Transaktionen ablaufen wird, sondern Sie wissen es auch nicht unmittelbar danach, da der Block, der sie gerade verarbeitet hat, möglicherweise verwaist ist und ersetzt wird durch einen Block, der Transaktionen in einer anderen Reihenfolge akzeptierte. In unserem ID-Beispiel können Sie also einen Datensatz erstellen, indem Sie eine Transaktion von Ihrem Javascript-Code senden, sehen, wie sie eine ID erhält, dann später zurückkommen und feststellen, dass die ID, von der Sie dachten, dass sie Ihrem Datensatz zugewiesen wurde, jetzt zu einem anderen Datensatz gehört.

Das Ergebnis ist, dass Dinge, die eine strenge Ordnung erfordern, innerhalb der Blockchain verwaltet werden müssen, die letztendlich immer mit sich selbst konsistent ist, und dass Sie nicht von einer sofortigen Konsistenz in Bezug auf externe Systeme ausgehen können.

Wie Sie sagten, das ID-Beispiel. Es scheint, dass die Blockchain nicht asynchron sein könnte.
Die Blockchain ist in Bezug auf externe Prozesse asynchron; Es gibt keine Garantie dafür, wann oder ob eine Transaktion verarbeitet wird und in welcher Reihenfolge sie aufgenommen wird. Intern ist es völlig synchron. Jede Transaktionsausführung endet, bevor irgendeine andere Transaktion ausgeführt wird.
und was ist mit Mining-Threads? Wie wirkt sich das gleichzeitige Ausführen mehrerer Mining-Threads auf den Status aus?

Es gibt keine Parallelität auf der Blockchain. Die Transaktionen werden von dem Knoten, der den Block erstellt, gemäß der Reihenfolge geordnet, in der dieser Knoten die Transaktionen erhalten hat.

In einem Fall, der wie eine Race-Condition erscheinen mag, z. B. bei einem Token-Austausch, bei dem viele Aufträge innerhalb der Blockzeit und gemäß Zustandswerten wie dem im vorherigen Block gesehenen Preis platziert werden können, werden viele Transaktionen möglicherweise einfach aufgrund dieses Preises ungültig wird nach dem Prinzip „Wer zuerst kommt, mahlt zuerst“ in den TX-Pool eingestellt.

Die Transaktionen können vom Miner beliebig im Block geordnet werden, nicht unbedingt in der Reihenfolge, in der sie eingehen. Die meisten Miner werden sie nach Gaspreis bestellen (wenn sie die Vanilla-Implementierung von Geth verwenden), aber die Implementierung liegt wirklich bei ihnen. (Siehe ethereum.stackexchange.com/questions/6107/… )