Führt jeder Knoten den Vertragscode für jede Transaktion aus?

Diese Frage wurde vor einiger Zeit auf Reddit gestellt:

Wenn ein Knoten eine Transaktion an das Netzwerk sendet und den Empfänger als Vertrag hat, führt dann jeder Knoten den Vertrags-Bytecode mit den Eingaben aus, um den Hash zu bestätigen? Oder führt der erste Knoten, der die Transaktion empfängt, den Transaktions-Hash aus und erstellt ihn, der dann verteilt wird und für den Konsens verwendet wird. Wird der Vertragscode grundsätzlich einmal oder mehrmals für jede Transaktion ausgeführt? Ich gehe davon aus, dass es ersteres ist, wenn auf jedem Knoten die EVM ausgeführt wird. Reddit: Grundlegende Fragen zum Ethereum EVM und State Storage

Antworten (4)

Ja, die Antwort ist ganz logisch. Jeder Knoten muss die Ergebnisse einer Transaktion überprüfen, die einen Smart Contract aufruft. Das Ergebnis ist, dass mindestens jeder vollständige Knoten den Code ausführt.

Der Hash der Transaktion ist nicht relevant, bis er in einen Merkle-Baum gesteckt wird. Bei der Durchführung der Ausführung kümmern wir uns nur um die Gasmenge, die übergebenen Daten und den Code des aufgerufenen Vertrags. Wenn die Ausführung abgeschlossen ist, kann der Speicherbaum des Vertrags aktualisiert werden, sodass wir den Merkle-Root-Hash dieses Baums neu berechnen (und jeden anderen Vertrag, der möglicherweise von diesem aufgerufen wurde!).

Quelle .

Was macht ein Nicht-Mining-Knoten mit dem Ergebnis der Ausführung eines willkürlichen Vertrags? Ein Mining-Knoten würde von Natur aus versuchen, die Transaktion zu verifizieren und das Ergebnis zur Blockchain hinzuzufügen, aber das gilt nicht für einen Nicht-Mining-Knoten.
Ich bin überrascht. Es klingt nicht sehr skalierbar, wenn jeder einzelne Knoten denselben Code ausführen muss. Ich würde denken, dass ein Knoten es ausführen würde (vielleicht zufällig) und dann die Transaktion als bereit signieren würde, um dem nächsten Block hinzugefügt zu werden. Was passiert, wenn der Codebedarf die Verarbeitungsfähigkeit jedes einzelnen Knotens übersteigt?
@Brain2000 Ich habe Details zu einer Frage zur Skalierbarkeit aktualisiert: ethereum.stackexchange.com/questions/133/…
@ Brain2000 Wenn nur ein Knoten die EVM ausführen und dann die Ergebnisse für alle anderen Knoten veröffentlichen würde, denen sie blind vertrauen, würde dies ein Sicherheitsproblem aufwerfen. Wenn es andererseits nur auf 51 % der Knoten laufen würde, wodurch die Ressourcen der anderen 49 % der Knoten geschont würden, würde das Sicherheitsproblem wahrscheinlich nicht auftreten.

Jeder Full Node verarbeitet jede Transaktion. Die Bergleute wählen basierend auf dem Gaspreis aus, welche Transaktionen ausgeführt werden sollen. Sobald ein Block abgebaut ist, muss jeder Knoten alle Vertragsausführungen erneut ausführen, um den Block zu verifizieren.

Bedeutet das also, dass jeder Knoten alle geminten Verträge zweimal ausführt? Einmal, wenn es unbestätigt ist und zweitens, wenn es abgebaut wird.

Ja, jeder (vollständige) Knoten führt den Vertragscode für jede Transaktion aus.

Da die Ausführung von Vertragscode relativ teuer ist, tun Knoten dies nur, wenn sie es müssen. Wenn ein Knoten eine Transaktion erhält, führt er zunächst nur ein paar grundlegende Prüfungen durch, wie zum Beispiel:

  • Ist die Signatur gültig?
  • Hat das sendende Konto genug Ether, um das Gas zu bezahlen?
  • Liegt das Gas unterhalb der Sperrgasgrenze?

Wenn die grundlegenden Prüfungen bestanden werden, leitet der Knoten die Transaktion weiter. Mining-Knoten führen dann die relativ teure Aufgabe der Ausführung der Transaktion aus, fügen sie in einen Block ein und erheben die Transaktionsgebühr. Wenn ein (vollständiger) Knoten den Block erhält, führt er die Transaktionen im Block aus, um die Sicherheit und Integrität der von ihm erstellten Blockchain unabhängig zu überprüfen.

Gibt es dazu ein Ablaufdiagramm/Ablaufdiagramm?
@NathanAw Nicht, dass ich wüsste, und es ist möglich, dass Knotenimplementierungen Unterschiede aufweisen.

In der aktuellen Version führt jeder Knoten jeden Vertrag aus. Da dies nicht skalierbar ist, ist es sehr wahrscheinlich, dass "Sharding" implementiert wird, bei dem einige Zustände nur auf bestimmten Knoten liegen. Auf sie wird dann bei Bedarf asynchron zugegriffen. Daran arbeitet Vitalik derzeit

Sharding kommt zu Ethereum..