Was ist Nonce in Ethereum? Wie verhindert es doppelte Ausgaben?

Vor kurzem war ich von Blockchain fasziniert und fing an, Ethereum zu lernen. Ich bin auf das Konzept der Nonce in Ethereum gestoßen.

Nach Recherchen fand ich heraus, dass Nonce für zwei Zwecke verwendet wird.

a. Um Transaktionen im Zusammenhang mit einem Konto in Ordnung zu halten. dh wenn es eine Transaktion mit Nonce 3 gibt, die sich auf ein Konto im txpool bezieht und eine Transaktion mit Nonce 4 angekommen ist, wird diese Transaktion nicht abgebaut, bis und es sei denn, die Transaktion mit Nonce 3 wird abgebaut.

Ich verstehe das.

Aber ich habe eine Frage, die ich nicht finden kann?

i) Der Nonce-Wert bezieht sich auf eine Adresse, richtig? So können zwei Adressen gleichzeitig die gleiche Nonce haben, dh Konto mit Adresse A kann die neueste Nonce 2 haben, ähnlich kann Konto mit Adresse B auch die letzte Nonce 2 haben.

ii) Haben alle Knoten im Netzwerk den gleichen neuesten Nonce-Wert für alle im Netzwerk verfügbaren Konten?

Das heißt, wenn es drei Konten und 2 Bergleute gibt und der Nonce-Wert für drei Konten jeweils 1,2,3 beträgt, dann haben beide Bergleute die gleiche Nonce.

Annahme: Beide Miner sind synchron

b) Wie wird Nonce verwendet, um doppelte Ausgaben zu vermeiden?

Alles, was Sie brauchen, finden Sie hier: myetherwallet.groovehq.com/knowledge_base/topics/what-is-nonce
Am Ende musste ich mir das UTXO-Design von Bitcoin im Vergleich zum Gleichgewichtsdesign von Ethereum ansehen, um die Nonce wirklich zu verstehen. Es machte Sinn, als ich allein über Ethereum las, aber ich fragte mich immer wieder, warum Bitcoin es nicht brauchte.
eth account nonce hat nichts mit doppelten ausgaben zu tun. qr.ae/Tctelk

Antworten (2)

Was ist Nonce in Ethereum?

Wenn Sie sich auf das Glossar im Github-Wiki beziehen , gibt es zwei Arten von Nonce, die in Ethereum verwendet werden.

  1. Konto-Nonce – Es ist einfach die Transaktionsanzahl eines Kontos

Konto-Nonce: ein Transaktionszähler in jedem Konto. Dies verhindert Replay-Angriffe, bei denen eine Transaktion gesendet wird, z. 20 Münzen von A nach B können von B immer wieder gespielt werden, um das Guthaben von A kontinuierlich zu leeren.

  1. Proof of work nonce – Der zufällige Wert in einem Block, der verwendet wurde, um den Proof of Work zu erfüllen (abhängig von der Schwierigkeit zu diesem Zeitpunkt).

Proof of Work Nonce: ein bedeutungsloser Wert in einem Block, der angepasst werden kann, um zu versuchen, die Proof-of-Work-Bedingung zu erfüllen

Hier beziehen Sie sich auf das Konto Nonce, bei dem es sich um die Transaktionszählung von diesem Konto handelt.

i) Der Nonce-Wert bezieht sich auf eine Adresse, richtig? So können zwei Adressen gleichzeitig dieselbe Nonce haben, dh Konto mit Adresse A kann die neueste Nonce 2 haben, ähnlich kann Konto mit Adresse B auch die letzte Nonce 2 haben.

Ja, wie oben erklärt, es ist die Anzahl der Transaktionen und daher mit dem Konto verbunden. Da es sich um eine aufsteigende Nummer handelt, können zwei Konten gleichzeitig dieselbe Nonce haben.

ii) Haben alle Knoten im Netzwerk denselben neuesten Nonce-Wert für alle im Netzwerk verfügbaren Konten?

Wenn die Knoten mit der Blockchain synchronisiert werden, werden sie es schließlich tun. Da ein Knoten die längste gültige Kette akzeptiert, gibt es kein Problem damit, dass nicht alle Knoten mit dem neuesten Nonce-Wert in dem Moment aktualisiert werden, in dem eine Transaktion abgebaut wird. Nach der Synchronisierung haben sie denselben Nonce-Wert für das Konto. (Es ist offensichtlich, weil in einer Blockchain alle Knoten die gleichen Blockdaten haben sollen. Nach einer gewissen Zeit können Sie also ziemlich sicher sein, dass die Transaktion bestätigt wird, daher der Nonce-Wert)

b)Nonce wird verwendet, um doppelte Ausgaben zu verhindern, wie?

Double Spend zu vermeiden bedeutet, den gleichen Betrag nicht mehr zweimal zu verwenden. Wenn die Nonce auf die gleiche eingestellt ist, wird nur eine der Transaktionen abgebaut und meistens kann dies diejenige mit dem höheren Gaspreis sein, aber es kommt zu keinen doppelten Ausgaben, da am Ende in beiden Fällen nur eine Transaktion stattfindet Fall.

Ein weiterer Trick, der von Nonce vermieden wird, besteht darin, höhere Gaspreise zu verwenden, um eine später gesendete Transaktion vor einer früheren von demselben Konto abzubauen.

Stellen Sie sich eine Situation vor, in der A eine Transaktion von X ETH als Zahlung an B sendet und das Konto von A nur diese X ETH auf seinem Konto hat. Sobald die Transaktion zum Schürfen gesendet wurde, kann A eine weitere Transaktion von X ETH mit einem höheren Gaspreis an eines seiner anderen Konten senden, wodurch die erste gesendete Transaktion später abgebaut wird, indem er eine höhere Priorität in der Warteschlange für ausstehende Transaktionen erhält. Aber da Ethereum Nonce berücksichtigt, ist dies nicht erlaubt, da die Nonce der späteren Transaktion höher ist als die vorherige.

Sie können diese Frage auch stellen.

Upvoted, für die Erwähnung von PoW Nonce.
Angenommen, die erste Transaktion wurde x-mal bestätigt, richtig? Was hindert mich ansonsten daran, die doppelte Ausgabe mit einem höheren Gaspreis und mit derselben Nonce zu senden?
Bezüglich: "Konto-Nonce - Es ist einfach die Transaktionsanzahl eines Kontos" Dies ist nicht ganz richtig - die Nonce wird jedes Mal erhöht, wenn ein CREATE-Opcode ausgeführt wird, da eine einzelne Transaktion viele CREATE-Anweisungen ausgeben kann, kann diese Zahl erheblich höher sein als die Anzahl Transaktionen.
"Konto-Nonce: ein Transaktionszähler in jedem Konto. Dies verhindert Wiederholungsangriffe, bei denen eine Transaktion, die z. B. 20 Münzen von A nach B sendet, von B immer wieder wiederholt werden kann, um das Guthaben von A kontinuierlich zu leeren." Das sagt das Github-Glossar. Haben Sie eine Bezugsquelle?
Wenn es keine Nonces gäbe, wäre eine Wiedergabe ohne Front-Running möglich. Es wäre keine Gasmanipulation erforderlich. Der Grund dafür ist, dass ein ehrlicher Verifizierer mehrere Transaktionen mit demselben Von/An/Betrags-Tupel akzeptieren müsste, um rechtmäßig zuzulassen, dass derselbe Betrag zweimal von einem Konto zu einem anderen gesendet wird. Als solches wäre ein Gegner einfach in der Lage, dieselbe Transaktion erneut zu senden. Die Nonce fordert den Absender auf, eine neue Nachricht zu signieren, wenn derselbe Betrag auf dasselbe Konto überwiesen wird, und somit kann der Verifizierer Transaktionen, die einfach erneut übertragen werden, nun sicher verwerfen.

Erstens ist es "nonce", nicht "nounce".

i) Ja, jede Adresse hat eine Nonce. Adressen können dieselbe Nonce haben und tun dies oft.

ii) Ja, alle Knoten in derselben Blockchain haben für jede Adresse dieselbe Nonce aufgezeichnet, da die Nonces in der Blockchain gespeichert sind.

b) Die Nonce ist im Grunde nur ein Zähler, der verfolgt, wie viele Transaktionen eine Adresse gesendet hat.

Angenommen, eine Adresse A hat 1 ETH.

Zuerst versucht es, 1 ETH an Adresse B zu senden. Nennen wir diese Transaktion A0, weil sie von A signiert wurde und keine 0 hat. Jetzt versucht A, diese 1 ETH zu verdoppeln, indem es eine weitere Transaktion von 1 ETH an C sendet: nennen wir es Transaktion A1. A1 wird sofort von allen Knoten abgelehnt, da jeder Knoten sehen kann, dass A1 nach A0 kommen muss und nach A0 nicht genügend ETH in A vorhanden ist, um A1 zu senden.

Sie können also nicht mit verschiedenen Nonces doppelt ausgeben.

A könnte eine andere Strategie ausprobieren: doppelte Ausgaben mit derselben Nonce. Zuerst sendet A die Transaktion A0 an B und dann eine weitere Transaktion A0 an C. Beide haben dieselbe Nonce und dieselbe Quelle, aber ein unterschiedliches Ziel. Nur eine der A0-Transaktionen wird in die Blockchain aufgenommen, da alle Knoten sehen können, dass die Nonce 0 zweimal von A verwendet wurde, und dies nicht zulässig ist.

Sie können also auch nicht mit derselben Nonce doppelt ausgeben.

Wie funktioniert das mit mehreren ausstehenden Transaktionen, die gültig sind? Angenommen, ich habe 2 ETH. Wenn ich 1 ETH an A mit Nonce 0 und 1 ETH an B mit Nonce 1 gesendet habe und aus irgendeinem Grund die B1-Transaktion zuerst akzeptiert wird, wird dann A0 storniert, weil es jetzt einen akzeptierten tx mit einer höheren Nonce in der Kette gibt? Oder würde es trotzdem durchgehen?
Außerdem, wie soll ich Nonces im Offline-Szenario generieren. Angenommen, ich habe zwei Geräte, die die TX-Zählung intern, aber separat verfolgen. Wie kann ich beim Unterzeichnen einer Transaktion, die einige Zeit später eingereicht werden soll, sicherstellen, dass es keine Nonce-Kollision gibt?
@LOST-Transaktionen werden immer in der Reihenfolge der Nonce bestätigt. Nonce 5 wird immer nach Nonce 4 bestätigt. Wenn keine Transaktion mit Nonce 4 existiert, wird Nonce 5 nie bestätigt.
@LOST Wenn zwischen den Geräten keine Kommunikation stattfindet und sie jeweils in der Lage sein müssen, jederzeit eine Transaktion für eine spätere Übertragung zu signieren, gibt es keine Möglichkeit, eine Nonce-Kollision zu verhindern.
@jesses-busman Nun, hier ist ein Anwendungsfall :(