Nehmen wir den im Whitepaper (Abschnitt Blockchain und Mining) beschriebenen Blockvalidierungsalgorithmus , so heißt es bei Punkt 6:
Sei
TX
die Transaktionsliste des Blocks mitn
Transaktionen. Für allei
in0...n-1
, setS[i+1] = APPLY(S[i],TX[i])
. Wenn eine Anwendung einen Fehler zurückgibt oder wenn das im Block bis zu diesem Zeitpunkt insgesamt verbrauchte Gas das GASLIMIT überschreitet, geben Sie einen Fehler zurück .
Ist die kühne Behauptung wahr? Ich meine, wenn der fettgedruckte Teil wahr wäre, würde das bedeuten, dass gültige Blöcke keine Transaktionen mit Fehlern enthalten können? Oder ist es einfach ein generischer Validierungsalgorithmus, der nicht dem echten entspricht?
(Ich weiß mit Sicherheit, dass es gültige Blöcke mit fehlgeschlagenen Transaktionen gibt, z. B. Gasausnahme, Callstack-Überlauf usw., z. B. https://etherscan.io/tx/0x3967f859c56c61f3365f6873ea001985e4e694952a9c22b68be731132c8e3e77 )
Es ist wichtig zu verstehen, dass dies ein Blockvalidierungsalgorithmus ist. Wenn in diesem Abschnitt des Whitepapers über die Rückgabe eines Fehlers gesprochen wird, geschieht dies auf der Blockebene und nicht auf der Transaktionsebene. Ein Fehler auf Blockvalidierungsebene lässt nicht zu, dass ein Block an das Netzwerk weitergegeben wird, im Gegensatz zu einem Fehler auf Transaktionsebene, der an das Netzwerk gesendet wird, wie Sie in Ihrem Beispiellink gezeigt haben.
wenn das im Block bis zu diesem Punkt verbrauchte Gesamtgas das GASLIMIT überschreitet, wird ein Fehler zurückgegeben
Wenn man dies aus der Sicht der Blockvalidierung betrachtet, ist dies absolut sinnvoll. Wenn ein Miner versucht, Transaktionen in seinen Block aufzunehmen, deren Gesamtsumme gas
größer als ist GASLIMIT
, ist der Block ungültig und wird daher niemals das Netzwerk sehen. Wäre dies nicht der Fall, würden Miner jede Transaktion in ihren Block aufnehmen, um alle Transaktionsgebühren zu erhalten.
Wenn eine Anwendung einen Fehler zurückgibt ... einen Fehler zurückgeben.
Der Schlüssel dazu ist zu verstehen, dass es sich um eine Anwendung und nicht um eine bestimmte Transaktion handelt. In dieser Anweisung bezieht sich eine Anwendung auf einen Mining-Client oder jemanden, der die Blöcke validiert. Mit diesem Verständnis ist es klarer, dass diese Aussage wahr ist – wenn die blockvalidierende Anwendung einen Fehler zurückgibt, gib einen Fehler zurück.
fehler Korrektur:
oder wenn das gesamte im Block verbrauchte Gas
=> oder ob das gesamte bei der Transaktion verbrauchte Gas ist
Im Falle eines Blocks muss das gasLimit des Blockheaders größer sein als die Summe des gasLimits der Transaktionen.
Briomkez
APPLY
. Sie meinen also buchstäblich eine Ausnahme im laufenden Programm (und nicht auf EVM-Ebene) oder habe ich es falsch verstanden? (Sorry, aber für mich immer noch etwas verwirrend)Shane Fontaine
Briomkez
Shane Fontaine
timestamp
in den Block aufnehmen sollen, und Sie tatsächlich keins in den Block aufnehmen, wenn Sie ihn an das Netzwerk senden, wird er auf Anwendungsebene abgelehnt. Für das gesamte verbrauchte Gas ist das einfach, wenn Sie (ein Miner) versuchen, Transaktionen einzubeziehen, deren Summegas
über dem liegtgasLimit
.Briomkez
Shane Fontaine