Die Bereitstellung von Transaktionsausführungen ist durch die block gas limit
dynamisch veränderlichen begrenzt. Wenn ein Block nur zu einer Transaktion passt, dann ist das Gaslimit pro Transaktion theoretisch dasselbe wie das Blockgaslimit. Ab 2020 liegt diese Grenze bei rund 10 Millionen. Es gibt auch eine Mindestgrundgebühr für jede Transaktion von 21.000 Gas.
Aus der Antwort auf diese Frage Wie werden Transaktionen in einem Block gespeichert? @Richard Horrocks:
Bergleute können Transaktionen jedoch nach Belieben ordnen, solange die Reihenfolge einer Reihe gültiger Zustandsübergänge entspricht.
[F] Daher wird die Transaktionsreihenfolge basierend auf den Minern entschieden, aber wie werden die Transaktionen entschieden, die in Blöcke aufgenommen werden sollen?
Wie ich weiß, wählen Miner die profitabelsten Transaktionen basierend auf aus gasPrice * gasLimit
. Werden Ihre Transaktionen durch die Verwendung eines sehr hohen Gaslimits irgendwie langsamer ausgeführt? @iamdefinitelyahuman:
Die Begründung: Miner versuchen, ihren Gewinn innerhalb jedes Blocks zu maximieren. Aufrufe an
eth_estimateGas
können rechenintensiv sein, sodass Miner normalerweise nicht das tatsächliche Gas bestimmen, das jeder TX verbraucht. Stattdessen berechnen siegasPrice * gasLimit
für jede gegebene Transaktion und bestimmen daraus die kostengünstigste Gruppe von Transaktionen, die abgebaut werden können.
=> Zum Beispiel sende ich eine Transaktion mit einem sehr hohen Wert gasPrice
von 10.000.000 gasLimit
. Es wird ausgewählt und einem Block hinzugefügt. Da es den gesamten gasLimit
Block verbraucht, ist keine andere Transaktion enthalten.
Danach, während der Ausführung, verbrauchte meine Transaktion nur 21.000 Gas und der verbleibende Teil wird mir zurückerstattet. Es verbleiben noch 9.979.000 Gas, die auf dem Block verbraucht werden müssen. Kann der Miner dynamisch weitere Transaktionen hinzufügen, nachdem die Ausführung ausgewählter Transaktionen abgeschlossen ist?
oder alle Transaktionen werden statisch entschieden und können nicht aktualisiert werden, nachdem ihre Ausführungen abgeschlossen sind. Wenn dies der Fall ist, neigen Miner dazu, viele kleinere TXs gegenüber einem großen zu priorisieren, und größere werden nie eingesetzt.
=> Gibt es einen gemeinsamen Algorithmus für Miner, um zu entscheiden, welche Transaktionen in einen Block aufgenommen werden sollen? Nehmen wir an, werden alle Kombinationen ausstehender Transaktionen generiert, um die profitabelste mit Brute-Force- oder Greedy-Algorithmus auszuwählen? Da Zeit sehr wichtig ist, um das Rätsel zuerst zu lösen, kann die Entscheidung, welche Transaktionen in den Block aufgenommen werden sollen, zusätzliche Zeit in Anspruch nehmen.
Wie wird entschieden, welche Transaktionen in Blöcke aufgenommen werden?
Kurze Antwort
Wie sie wollen.
Es ist nicht deterministisch und wird nicht durch das Protokoll eingeschränkt.
eine Transaktion mit einem sehr hohen gasPrice, der 10.000.000 gasLimit hat.
Allein mit gasLimit zu arbeiten, wäre aufgrund des von Ihnen gegebenen Beispiels ein sehr ineffizienter Miner. Bei der Ausführung verbrauchte die Transaktion nur eine sehr geringe Menge an Gas und zahlte daher nur eine sehr geringe Gebühr.
Aus Sicht des Bergmanns gibt es keinen Unterschied zwischen „tatsächlichen“ Kosten und geschätzten Kosten. Dies liegt daran, dass der Miner tatsächlich die kanonische Transaktionsreihenfolge bestimmt. Falls das etwas kryptisch ist:
Kann der Miner dynamisch weitere Transaktionen hinzufügen, nachdem die Ausführung ausgewählter Transaktionen abgeschlossen ist
Ja. Das tun sie. Sie spielen Tetris mit ausstehenden Transaktionen und versuchen, den in Blöcken verpackten Gaspreis * zu optimieren. Alles, was sie tun, ist hypothetisch. Sie können die Transaktionen (tatsächliche Gaskosten) proben und den Block packen, aber nichts ist abgeschlossen, bis sie die schwer fassbare Nonce finden und ihren Block senden. Es besteht keine Einschränkung, die Konfiguration neu anzuordnen, wenn neue Transaktionen eintreffen und sich neue Gelegenheiten ergeben.
Intuitiv
Um die Optimierungen und Algorithmen wirklich zu sehen, sollten Sie in den Quellcode der beliebten Miner eintauchen. Ich bin mir nicht sicher, ob sie es so machen, weil "wie sie wollen" viele meiner Bedenken abdeckt. Nachdem ich das gesagt habe ...
Wenn ich mich diesem Problem nähern würde, würde ich, glaube ich, einem Algorithmus wie dem Packen eines Schiffscontainers folgen, in dem ich die maximal mögliche Masse auf begrenztem Raum haben möchte.
Ein möglicherweise naiver, aber einfacher Weg wäre, die Kisten/Transaktionen nach Dichte/Gaspreis zu ordnen und sie in dieser Reihenfolge (absteigend) zu stopfen. Das würde einige Hohlräume hinterlassen.
Ein Block ist ein eindimensionaler Raum, sodass wir uns keine Gedanken über die Form des zusätzlichen Raums machen müssen. Füllen Sie also einfach den höchsten gasPrice (jede Größe / jede Gasverbrennung) in den gesamten verfügbaren Raum und fahren Sie fort, bis kein verbleibendes gasLimit mehr vorhanden ist.
Es würde Gelegenheiten für kleine Transaktionen mit niedrigem Gaspreis geben, die gegen Ende passen, da der Algo nach etwas suchen wird, das klein genug ist, um den letzten verbleibenden Platz zu füllen. Es würde die Transaktion mit dem höchsten tatsächlich passenden gasPrice bevorzugen.
Ich denke, die Realität ist etwas nuancierter, da ein Miner auch die Suche nach der Nonce optimieren muss und möglicherweise nicht zu viel Zeit für die Reorganisation aufwenden sollte, wenn neue Transaktionen eintreffen. Ich habe mich oft gefragt, wie oft sie neu bewerten. Es kann tatsächlich insgesamt effizienter sein, sich hauptsächlich auf die Suche nach der Blockbelohnung zu konzentrieren, anstatt eine Pause einzulegen, um die Transaktionsgebühren vollständig zu optimieren. Auch die Möglichkeit, dass Bergleute unterschiedliche Ansätze verwenden, hat den Effekt, dass die Art und Weise, wie das Netzwerk es insgesamt tut, ausgeglichen wird. Wenn beispielsweise einige Miner große oder kleine Transaktionen ignorieren, wird diese Verzerrung durch andere Algorithmen ausgeglichen, die sich mit anderen Methoden nähern.
Als dApp-Entwickler oder -Benutzer reicht es normalerweise aus zu verstehen, dass Transaktionen von gasPrice ungefähr priorisiert werden, große Transaktionen aufgrund des massiven Blocks, den sie benötigen, einige Zeit dauern können und Miner innerhalb der Protokollbeschränkungen tun dürfen, was sie wollen , blockieren hauptsächlich gasLimit.
Ich hoffe es hilft.
Ich hoffe es hilft.
Alper
gasPrice
10.000.000gasLimit
ausgewählt wird, die nur 21.000 Gas verbraucht, werden später neue Transaktionen aus den ausstehenden Transaktionen zum verbleibenden gasLimit-Betrag hinzugefügt. Dies geht rekursiv weiter (da der Rückerstattungsprozess stattgefunden hat auch für neu ausgewählte Transaktionen) bis eine Gasmenge einer angepassten Transaktion verbraucht wird, die nahe bei 10.000.000 (aktuellgasLimit
) liegt.Rob Hitchens
Rob Hitchens
Daniel Coffmann
Rob Hitchens