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 n
th-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)^n
wobei X_n
viel 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.
[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)
(63/64)^2
? Bei Stapeltiefe N; warum hast du gemacht: 1-(63/64)^N
? @benjaminion(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.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
Jesus
Alper