Gas für interne Transaktionen (und Transaktionen im Allgemeinen)

Ich versuche, einen SmartContract für einen Token zu entwerfen, und ich habe einige Probleme mit den Gasberechnungen. Wenn ein Benutzer jemandem ein Token sendet, möchte ich, dass dafür eine Gebühr erhoben wird. Wo es für mich unscharf wird, ist das Gas. Ich habe gelesen, dass für alle Transaktionen mindestens 21.000 Gas bezahlt werden müssen, aber es ist nicht klar, was darin enthalten ist. Ich habe gelesen, dass das Speichern von Daten (SSTORE) beim ersten Mal 20.000 Benzin kostet, 5.000 Benzin für Updates und 5.000 zum Zurücksetzen (auf Null setzen) + Sie erhalten eine 15.000 Benzinrückerstattung. Nach meinem Verständnis aktualisiert das Senden von Tokens nur das Guthaben auf zwei Brieftaschen (unter Verwendung von SSTORE?), Daher sollte es eine der folgenden sein:

  1. Der Benutzer hat 10 Token und sendet 5 an eine neue Brieftasche: 5.000 + 20.000 = 25.000 Gas? (über 21k)
  2. Der Benutzer hat 10 Token und sendet 5 an eine vorhandene Brieftasche: 5.000 + 5.000 = 10.000 Gas? (aber da weniger als 21k dann 21k verwendet wird?)
  3. Der Benutzer hat 10 Token und sendet 10 an eine vorhandene Brieftasche: 5.000 + 5.000 = 10.000 Gas? (aber da weniger als 21k dann 21k verwendet wird?), wann tx fertig 15k in gas erstattet? (Geschieht diese Erstattung wegen der 21k-Grenze?)
  4. Der Benutzer hat 10 Token, sendet 10 an eine neue Brieftasche: 5.000 + 20.000 = 25.000 Gas (über 21.000), wenn tx fertig 15.000 Gas erstattet? (Geschieht diese Erstattung wegen der 21k-Grenze?)

Ich bin mir also nicht sicher, ob ich verstehe, woher die 21k-Grenze kommt / wie sie berechnet wird. Das Obige ist wichtig für mich zu verstehen, da es bestimmt, wie ich meinen Code schreibe.

Ich konnte diese Informationen nirgendwo finden, jemand hat mir gesagt, dass interne Transaktionen weniger als 21.000 kosten, jemand anderes hat mir gesagt, dass alle Transaktionen SSTORE-Operationen sind und 21.000 nur eine Untergrenze für die Kosten einer Transaktion ist, also wenn Sie es getan hätten Ein Benutzer, der einige Token an eine vorhandene Brieftasche (Vanilla ERC-20 SmartContract) sendet, wäre 5.000 + 5.000 + 11.000 (Netzwerkgebühr) = 21.000, aber wenn Sie einige andere Operationen (einschließlich des Sendens innerer Transaktionen) hätten, würde das Gas Sie über 21.000 bringen hätte 5k + 5k + other_ops >= 21k

Der Algorithmus, den ich zu schreiben versuche, ist:

  1. UserA (Sender) sendet ein Token an UserB (Empfänger)
  2. Eine Gebühr wird vom SmartContract berechnet
  3. Der Gebührenbetrag wird in ein Gebühren-Wallet transferiert
  4. UserB erhält den gesendeten Betrag abzüglich der Gebühren

An den Berechnungen sind Zeitstempel beteiligt, daher habe ich die Gaskosten heruntergebrochen auf (ohne alle anderen Berechnungskosten):

  1. Zeitstempelvariable UserA (SSTORE) aktualisieren: 5.000 Gas (oder 20.000 beim ersten Mal)
  2. Update-Zeitstempelvariable UserB (SSTORE): 5.000 Gas (oder 20.000 beim ersten Mal)
  3. Gebühr an Gebührengeldbeutel senden (Gebührengeldbeutel-Guthaben mit SSTORE intern aktualisieren?): 5.000 Gas
  4. Aktualisieren Sie das Guthaben von UserA, indem Sie Token an UserB & Fee Wallet senden (unter Verwendung von SSTORE intern?): 5.000 Gas
  5. Aktualisieren Sie das Guthaben von BenutzerB durch den Empfang von Token, die von BenutzerA gesendet wurden (unter Verwendung von SSTORE intern?): 5.000 Gas (oder 20.000 beim ersten Mal)

Insgesamt: 25.000 - 70.000 Benzin

Ist das richtig? Oder wird Schritt 3 21.000 Benzin kosten und die Schritte 4 + 5 (zusammen) werden auch 21.000 Benzin kosten, wie hier:

  1. Zeitstempelvariable UserA (SSTORE) aktualisieren: 5.000 Gas (oder 20.000 beim ersten Mal)
  2. Update-Zeitstempelvariable UserB (SSTORE): 5.000 Gas (oder 20.000 beim ersten Mal)
  3. Gebühr an Gebührenbrieftasche senden: 21.000 Gas
  4. tx-Kosten für das Senden von Token von UserA an UserB (ursprünglicher Betrag - Gebühren): 21.000 Gas

Gesamt: 52.000 - 82.000 Benzin

Danke schön! Gab

Das „Minimum 21.000 Gas“-Limit gilt für eine Transaktion, die von der Off-Chain gesendet wird (dh unter Verwendung eines externen Kontos).
Danke, also kosten die Transaktionen im SmartContract die beiden SSTORE-Operationen?
Ihre Frage ist zu lang und im Allgemeinen nicht lesbar. Versuchen Sie, es zu minimieren und konzentrieren Sie sich auf ein einzelnes Problem (dh stellen Sie eine einzelne Frage). Ich verstehe nicht einmal, von was "zwei SSTORE-Operationen" du sprichst. Muss ich nach deiner (sehr langen) Frage suchen?
Übrigens - woher hast du die 5.000 Gas in "Benutzer hat 10 Token, sendet 5 an eine neue Brieftasche: 5.000 + 20.000 = 25.000 Gas?" aus???
Ich habe es aus dem Ethereum Yellow Paper ( ethereum.github.io/yellowpaper/paper.pdf ). Ich gehe davon aus, dass Transaktionen SSTORE-Operationen sind, da es sich bei Transaktionen eigentlich um zwei globale Speicherschreiboperationen handelt. Ein Update (Schreiben in eine globale Variable ungleich Null) kostet 5.000, 20.000 für ein Schreiben (Schreiben in eine globale Variable mit Nullwert), 5.000 für ein Löschen (Setzen auf Null) und Sie erhalten eine Rückerstattung von 15.000.
Im Token-Vertrag ändern Sie also normalerweise mindestens zwei Variablen in dieser einzelnen Transaktion - das Guthaben des Senders und das Guthaben des Empfängers. Unter der Annahme, dass die erste nicht Null und die zweite Null ist, kommt das tatsächlich auf 25.000 hinaus. Aber natürlich können je nach interner Implementierung des Vertrages mehr Zustandsvariablen geändert werden. Und zu all dem wird in der Regel mindestens ein Ereignis sowie einige andere Operationen ausgegeben, obwohl letztere geringe Gaskosten verursachen.

Antworten (1)

Ich bin mir nicht sicher, ob ich verstehe, woher die 21k-Grenze kommt / wie sie berechnet wird

21K gasist kein Gaslimit, sondern die minimalen Gaskosten für eine Transaktion, die von einem externen Konto (dh von der Off-Chain) gesendet wird.

Diese Einschränkung gilt nicht für eine Transaktion, die von einem Smart-Contract-Konto (dh von der On-Chain) gesendet wird.

Ok, also ist mein Verständnis richtig, wenn man sagt:1. update timestamp variable UserA (SSTORE) : 5k gas (or 20k if 1st time) 2. update timestamp variable UserB (SSTORE) : 5k gas (or 20k if 1st time) 3. send fee to fee wallet (update fee wallet balance using SSTORE internally?) : 5k gas 4. update UserA balance from sending tokens to UserB & Fee wallet (using SSTORE internally?): 5k gas 5. update UserB balance from receiving tokens sent by UserA (using SSTORE internally?): 5k gas (or 20k if 1st time) Total : 25k - 70k gas