Wie funktioniert das Ethereum ETH-Buchhaltungssystem und verhindert Doppelausgaben?

Bei Bitcoin basiert das BTC-Buchhaltungssystem auf UTXOs (Unspent Transaction Outputs), wodurch verhindert wird, dass dieselbe BTC mehrmals ausgegeben wird. Ich habe gehört, dass Ethereum ein einfacheres Kontostandssystem hat, aber ich kenne die Details nicht. Wie funktioniert der Kontostand von Ethereum?

Wenn ich eine Nachricht habe, die 1 ETH von Alice an Bob sendet, was verhindert, dass dieselbe Nachricht mehr als einmal verwendet wird? Gibt es ein Sequenznummernsystem (wie TCP)?

Wenn Alice zuerst eine Nachricht signiert, die 1 ETH von Alice an Bob sendet, und dann eine Nachricht signiert, die 1 ETH von Alice an Charlie sendet, kann die zweite Nachricht vor der ersten bestätigt werden?

Antworten (3)

Jedes Konto hat einen global zugänglichen , der Replaynonce -Angriffe in der gleichen Kette und doppelte Ausgaben verhindert. Das ist die Sequenznummer, die Miner überprüfen, da ein Block, der eine Transaktion mit einer falschen Nonce enthält, ein ungültiger Block ist (andere Miner bauen nicht darauf auf). (Das schützt nicht vor Cross-Chain-Replay-Angriffen.)noncenonce

Zweite Nachricht (mit höherer Nonce) kann nicht vor der ersten bestätigt werden.

Siehe dies für ergänzende Details wie:

Ein globaler Zustand speichert eine Liste von Konten mit Salden, Code und internem Speicher

Eine Transaktion ist gültig, wenn das sendende Konto über genügend Guthaben verfügt, um sie zu bezahlen. In diesem Fall wird das sendende Konto belastet und dem empfangenden Konto der Wert gutgeschrieben

Wie würde das also funktionieren, wenn ich zwei Knoten erstellen und den Schlüsselspeicher auf beide Knoten kopieren und dann zwei konkurrierende Transaktionen ausführen würde? Ich gehe davon aus, dass einer "gewinnen" würde, aber das konnte nicht durch die Nonce bestimmt werden, weil sie identisch wären.
Ich bin mir nicht sicher, welcher Teil der Klärung bedarf. Derjenige, der gewinnt, schreibt an die Blockchain: Sagen Sie bei Nonce N Ihre Zahlung Ihres gesamten Ethers an Alice. Jede andere Transaktion mit Nonce N wird abgelehnt. Wenn Sie bei Nonce N+1 versuchen, Ihren gesamten Ether an Bob zu zahlen, ist dies eine ungültige Transaktion, da Ihr Konto jetzt einen Saldo von 0 hat. Diejenige, die bei N gewinnt, wird durch die vom Miner gewählte Transaktion bestimmt: Der Miner akzeptiert nur die erste Transaktion, die es sieht, mit Nonce N. Ein Miner kann Ihre tx an Alice wählen, und ein anderer Miner kann tx an Bob wählen: nur einer von ihnen wird den Block gewinnen und minen.
Auf Knoten AI habe Konto x bei Nonce n. Auf Knoten BI habe ich einmal Konto x, dh ich habe den Schlüsselspeicher kopiert. Zum gleichen Zeitpunkt führe ich einen Aufruf an Vertrag C auf Knoten A aus, um alle Gelder an Alice zu zahlen, und an Knoten B, um Bob alle Gelder zu zahlen. Beide Knoten führen den Code lokal aus, analysieren den globalen Speicher und sehen, dass ich beide bezahlen kann, aber da der aktuelle Block noch nicht abgebaut wurde, kann keiner der Knoten noch etwas von der anderen Ausführung wissen. Wenn es um das Mining des Blocks geht, sollte nur einer enthalten sein, aber die Nonce wird noch nicht inkrementiert, da beide um denselben Block konkurrieren.
... also frage ich, wie das gelöst werden würde?
Es wird von anderen Bergleuten gelöst, die wählen, ob sie die von Knoten A präsentierte Blockchain oder die von Knoten B präsentierte erweitern möchten. Wenn es keine anderen Bergleute gibt, haben Sie zwei Ketten, wie das Ausführen mehrerer privater Blockchains oder Testnetze.
Ich denke, diese Frage verdient einen Testfall, da Ihre Antwort davon ausgeht, dass sowohl Knoten A als auch Knoten B Mining-Knoten sind und dass sie ihre eigene Transaktion erfolgreich abgebaut haben, was zu einem Fork geführt hat. In Wirklichkeit haben beide Knoten möglicherweise nichts abgebaut (sie sind möglicherweise nicht einmal Mining-Knoten), was bedeuten würde, dass bis zum Abbau eines Blocks beide Transaktionen im Netzwerk zirkulieren und beide am Ende in denselben Block abgebaut werden könnten.
Ein Punkt, den Sie bei der Vermeidung von Doppelausgaben beachten sollten, ist, dass Ethereum ein dezentralisiertes Netzwerk ist, und (ziemlich oft) Sie Teile des Netzwerks haben werden, die einen Blick auf die Blockchain haben, die mit anderen Teilen kollidiert. Wenn Knoten A seine txn in China und Knoten B in Brasilien aussendet, dann akzeptieren verschiedene Miner A und lehnen B ab und umgekehrt. Am Ende wird ein Bergmann einen Block abbauen und es wird EINER VON A oder B darin enthalten sein. Wenn es beides hätte, wäre es nicht gültig, keine anderen Knoten würden es akzeptieren, und der Miner hat Strom verschwendet, um einen ungültigen Block abzubauen.

Ich gebe hier keine Antwort, aber ich arbeite an einer kleinen Diskussion mit @eth, die für die Frage des OP relevant ist, und ich wollte teilen, was ich dank @eth und ein bisschen herumlesen gelernt habe.

Das Missverständnis, das ich hatte, war, dass alle Knoten Code ausführen, wenn eine Transaktion diesen Code aufruft, und daher angenommen, dass das Ergebnis der Ausführung des Codes dann an das Netzwerk zirkuliert, gesammelt und in einen Block geschürft wird.

Dieser Prozess der Transaktion, Übertragung, Sammlung und des Bergbaus zur Bestätigung funktioniert in der Bitcoin-Blockchain, aber nicht in der Ethereum-Blockchain und ist der Grund, warum ich missverstanden habe, warum doppelte Ausgaben in der Ethereum-Blockchain nicht möglich sind. Der Mechanismus ist nicht sofort offensichtlich, also wollte ich ihn erklären.

Bei Ethereum ist es richtig, dass alle Knoten den Code ausführen, aber das gilt besonders für Mining-Knoten. Jeder Mining-Knoten bestimmt die Transaktionen, die er ausführen möchte, und während er sie ausführt, sucht er gleichzeitig auch nach dem nächsten Block.

Dies bedeutet, dass ein Mining-Knoten, wenn er das Glück hat, den nächsten Block zu entdecken, bereits die gewonnene Transaktion ausgewählt hat und nicht zwei konkurrierende Transaktionen mit derselben Nonce ausführen wird.

Mit anderen Worten, jede gegebene Kombination aus Adresse und Nonce kann nur einmal pro Knoten ausgeführt werden, und wenn sie bei der Ausführung ausgeführt wird und der Knoten den Block erfolgreich findet, würde die Nonce inkrementiert werden. Dies würde dazu führen, dass alle anderen Knoten die konkurrierende Transaktion ablehnen, da die globale Registrierung von Adressen und Nonces sagen würde, dass die Nonce zu niedrig sei, wodurch alle Doppelausgabeversuche ausgeschlossen würden.

Ich hoffe, das hilft anderen zu verstehen, warum das funktioniert.

Das klingt für mich nach einer Antwort ... Die Frage ist, welcher Mechanismus doppelte Ausgaben verhindert. Die Antwort ist, dass der Miner entscheiden kann, welche Transaktionen in den Block aufgenommen werden, und Konten eine global zugängliche Nonce haben.
+1 für diese Antwort. (In der ursprünglichen Frage wurde nicht ausdrücklich nach doppelten Ausgaben gefragt, und ich habe versucht, die Frage klarer zu machen. Aber dann habe ich die Antwort nicht erweitert, also danke für die Erklärung.)
@TjadenHess Vielen Dank für Ihre genaue Erklärung: "Globally Accessible Nonce" wurde verwendet, um die andere Antwort zu verbessern.

Ich glaube, ich bin etwas spät dran, aber das wurde bereits in der folgenden Frage beantwortet

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

Guck mal.

Nein, du bist sehr spät dran.