Wie funktioniert der EIP 150-Gaskostenalgorithmus auf jeder Stapelebene?

Basierend auf EIP 150 ändern Sie die Gesprächstiefe anhängen.

EIP und EIP-Diskussion :

Beachten Sie, dass mit den angegebenen Parametern die de-facto maximale Call-Stack-Tiefe auf ~340 (von ~1024) begrenzt ist, wodurch der Schaden verringert wird, der durch weitere potenzielle DoS-Angriffe mit quadratischer Komplexität verursacht wird, die auf Anrufen beruhen.

Zu dieser akzeptierten Antwort :

Mit den neuen Regeln darf der Anruf nicht mehr als 63/64 des Gases des Elternteils verbrauchen. Wenn Ihr Gas also X ist, dann ruft N an, es wird maximal X * (63/64) ^ n sein.

[F] Ist diese Aussage mit den neuen Regeln korrekt?

Nach meinen Berechnungen ist folgende Aussage falsch:

Wenn Ihr Gas X ist, dann ruft N an, es wird max X * (63/64) ^ n sein

weil wir auch die kumulierte Gassumme bis zum nth-Aufruf auf dem Stack hinzufügen müssen.

Daher (n-1)wird das Gas des Elternteils bis zum Erreichen des Anrufs als neuer Gaswert verringert: X_n'auf jeder Stapelebene.

Zum Beispiel:

1    => X_1   = X        * (63/64)^n 
2    => X_2   = X_1      * (63/64)^n //X_1 is used instead of X
3    => X_3   = X_2      * (63/64)^n //X_2 is used instead of X
...
N    => X_(N)  = X_(N-1) * (63/64)^n
1022 => X_1022 = X_1021  * (63/64)^n //X_1021 is used instead of X
1023 => X_1023 = X_1022  * (63/64)^n //X_1022 is used instead of X

Der N -te Aufruf sollte also etwa so lauten: , X_n * (63/64)^nwobei X_nviel kleiner als das ursprüngliche X sein sollte. Die Gasverbrauchsgrenze wird also viel kleiner.

Insgesamt ist die Hauptfrage, die ich habe:

[F] Wie funktioniert der EIP 150-Gaskostenalgorithmus auf jeder Stapelebene? und wie wird die Gasverbrauchsgrenze auf jeder Stapelebene beeinflusst?

Bitte beachten Sie, dass ich die Antwort nicht in Frage stelle, ich möchte nur verstehen, was richtig sein sollte.

Vielen Dank für Ihre wertvolle Zeit und Hilfe.

Unten auf der Seite, die Sie verlinkt haben, heißt es: „Dieses EIP befindet sich jetzt unter github.com/ethereum/EIPs/blob/master/EIPS/eip-150.md . Bitte gehen Sie dort hin, um die korrekte Spezifikation zu erhalten. Der Text in diesem Ausgabe kann falsch oder veraltet sein und wird nicht gepflegt."
Vielen Dank für den Link! Scheint schwer verständlich zu sein. Wenn es wenig mit der Funktionsweise des Algorithmus zu tun hat, wäre es hilfreich zu verstehen, wie der Algorithmus funktioniert. @ Jesse Busmann

Antworten (1)

[F] Ist diese Aussage mit den neuen Regeln korrekt?

Ja. Das in jeder Schornsteintiefe verfügbare Gas wird diese Menge sicherlich nicht überschreiten.

[F] Wie funktioniert der EIP 150-Gaskostenalgorithmus auf jeder Stapelebene? und wie wird die Gasverbrauchsgrenze auf jeder Stapelebene beeinflusst?

Nehmen Sie ein konkretes Beispiel.

Nehmen wir an, ein Vertrag wird mit 4.000.000 Gas gekündigt. Das maximale Gas, das es an jeden aufgerufenen Vertrag weitergeben kann, beträgt 4.000.000 * 63 / 64 = 3.937.500. Dies ist das Gas, das für den Vertrag in Schornsteintiefe 1 verfügbar ist.

Jetzt ruft der Kontrakt bei Stack-Tiefe 1 einen anderen Kontrakt auf, das maximale Gas, das er weitergeben kann, beträgt 3.937.500 * 63 / 64 = 3.875.977. Dies ist das für den Vertrag verfügbare Gas in Schornsteintiefe 2 und beträgt 4.000.000 * (63/64)^2.

Der Kontrakt in Stack-Tiefe 2 ruft einen anderen Kontrakt auf. Es kann maximal 3.875.977 * 63 / 64 = 3.815.415 Gas bis zur Schornsteintiefe 3 weiterleiten, was 4.000.000 * (63/64) ^ 3 entspricht.

Usw. Bei jeder Stack-Tiefe N steht dem Kontrakt bei dieser Stack-Tiefe maximal X * (63/64)^N Gas zur Verfügung, wobei X das anfängliche Gas in der aufrufenden Transaktion ist und die oberste Ebene 0 ist.

Wenn dies der einzige Mechanismus wäre, dann wäre die gesamte mögliche Stack-Tiefe, die Sie erreichen könnten, wenn Sie mit 4.000.000 Gas beginnen, log(4.000.000/700)/log(64/63) = 549. Allerdings, weil das Durchführen der Vertragsanrufe jedes Mal Gas verbraucht (700 Gas, daher kommen die 700 in dieser Berechnung: Sie benötigen mindestens 700 Gas, um einen weiteren Anruf zu tätigen), die tatsächliche maximale Tiefe, die Sie erreichen können, ist etwas geringer (daher die ~340 aus dem EIP, wenn Sie mit beginnen 5,5 Millionen Benzin).

Genauer sieht es eigentlich so aus, wenn man die Kosten von 700 Gas für den Vertragsabruf berücksichtigt:

Stack depth 0: X gas available
Stack depth 1: (X - 700) * 63/64 gas available
Stack depth 2: ((X - 700) * (63/64) - 700) * (63/64) gas available
Stack depth 3: (((X - 700) * (63/64) - 700) * (63/64) - 700) * (63/64) gas available
...
Stack depth N: X * (63/64)^N - 700 * 63*(1-(63/64)^N) gas available (after simplifying the expression)

Die letzte Zeile wird berechnet, indem beachtet wird, dass jede Zeile wie folgt vereinfacht wird.

Stack depth N: X * (63/64)^N - 700 * [(63/64) + (63/64)^2 + ... + (63/64)^N]

Der Teil in eckigen Klammern ist dann die Summe einer geometrischen Folge, die sich nach der bekannten Formel zu (63/64) * (1 - (63/64^N) / (1 - (63/64)) = summiert 63 * (1 - (63/64)^N)

Danke schön! Bei Stapeltiefe 2, sollten wir das nicht tun (63/64)^2? Bei Stapeltiefe N; warum hast du gemacht: 1-(63/64)^N? @benjaminion
@Alper Nein!!! Ihre Änderung ist falsch - wird zurückgesetzt. Das ist der springende Punkt. Sieh dir die Klammern an. Das (1-(63/64^N))ist Teil der Berechnung der Summe einer geometrischen Folge, um die 700 Gaskosten eines Anrufs zu berücksichtigen. Ich habe den Ausdruck in der letzten Zeile vereinfacht, indem ich die Begriffe kombiniert habe.
Ich verstehe den ersten Teil {0,1,2,3}, aber ich habe mich in der vereinfachten Version verlaufen, um es mathematisch zu visualisieren. Wenn ich Klammern öffne, erscheint so etwas: X * (63/64)^N - 700 * 63 + 700 * 63*(63/64)^N. Wenn N 1 oder 2 oder 3 ist, gibt es nicht den Wert, den Sie auf der Tiefe 1-2-3 gezeigt haben. @benjaminion
@Alper Ich habe weitere Erklärungen zur Vereinfachung hinzugefügt. Die Formel scheint korrekt zu sein und stimmt mit der Tiefe von 1,2,3 Linien überein, wenn ich sie berechne.
Tolle Antwort, tolle Hilfe! PS: Entschuldigung für zu viele zusätzliche Fragen. @benjaminion