Was ist der tatsächliche Preis für die Bereitstellung eines Vertrags im Mainnet?

Ich versuche, einen Vertrag im Mainnet bereitzustellen, aber ich habe einige Probleme bei der Bereitstellung mit Truffle.

➜  ballot git:(master) ✗ truffle migrate --network mainnet --dry-run
Using network 'mainnet' (dry run).

Running migration: 1_initial_migration.js
  Deploying Migrations...
Error encountered, bailing. Network state unknown. Review successful transactions manually.
sender doesn't have enough funds to send tx. The upfront cost is: 670197500000000000 and the sender's account only has: 120000000000000000

Laut diesem Fehler würde die Bereitstellung des Vertrags 0,67 ETH (~750 US-Dollar) kosten. Ich finde das sehr schwer zu glauben.

Beeinflusst die Codekomplexität den Bereitstellungspreis? Nicht sicher, was es sonst sein würde.

Es scheint, dass Truffle einen lächerlichen Gaspreis für die Bereitstellung des Vertrags verlangt. Ich habe versucht, die gasPrice-Einstellung in truffle.js auf etwas niedriger (21 Gwei) anzupassen, aber es ändert sich nichts. Ich bin mir immer noch nicht sicher, warum das passiert.
Sie können Remix verwenden, um die Transaktionskosten für Ihren Vertrag zu schätzen. Und stellen Sie sogar den Vertrag von Remix bereit.
Wenn der Ethereum-Knoten die Gaskosten auf die maximalen Gaskosten pro Block schätzt, bedeutet dies normalerweise, dass Ihr Code in irgendeiner Weise fehlerhaft ist und einen ungültigen Sprung (require(), throw oder eine andere Form einer Ausnahme) verursachen würde.

Antworten (5)

Die Kosten Ihrer Bereitstellung basieren auf 5 Faktoren, wobei ein 6. die geschätzten Bereitstellungskosten beeinflusst:

  1. Die Pauschalgebühr von 32k Gas. Der CREATE-Opcode, der während der Vertragserstellung aufgerufen wird, kostet fest 32.000 Gas. Dies kommt natürlich zu den 21k Gas eines normalen TX hinzu. Hinweis: Während der Vertragserstellung von einer EOA (Nichtvertragsadresse) wird der CREATE-Opcode nicht explizit aufgerufen. Der Rückgabewert des TX wird tatsächlich zum Erstellen des Vertrags verwendet, aber die feste Gebühr von 32.000 ist dieselbe.

  2. Die Menge an Bytecode im kompilierten Vertrag. Mehr Bytecode bedeutet mehr Speicherplatz, und jedes Byte kostet 200 Benzin. Das summiert sich sehr schnell. Beachten Sie, dass geerbte übergeordnete Verträge ebenfalls im Bytecode enthalten sind.

  3. Die TX-Daten. Der gesamte Bytecode, den Sie als TX-Daten senden, kostet 68 für Nicht-Null-Bytes und 4 für Null-Bytes.

  4. Der eigentliche Code, der vor der Vertragserstellung ausgeführt wird, zB der Vertragskonstruktor. Wenn der Konstruktor viel Berechnung erfordert, um den Bytecode zu generieren, dann wird es extra teuer. Hinweis: Sie zahlen für State Writes/Reads, die hier in Ihrem Konstruktor stattfinden, und diese können teuer sein

  5. Der Gaspreis. Je höher der Gaspreis ist, desto höher werden die Kosten. Siehe ethgasstation.info für gute Benzinpreise, die Sie jetzt nutzen können. Zum Zeitpunkt des Schreibens sind 2 Gwei ein schnell zu verwendender Gaspreis.

  6. Gaslimit. Lassen Sie das Tool, das Sie für die Bereitstellung verwenden, dies für Sie schätzen, und erhöhen Sie es dann etwas. Es wird das ungenutzte Gas zurückgeben, aber stellen Sie sicher, dass Sie mindestens so viel Gas liefern, wie es benötigt, oder es fällt aus und Sie zahlen immer noch für das Gas.

Wenn Sie einen Vertrag mit einem einfachen Konstruktor und 5.000 Byte kompiliertem Bytecode bereitstellen, zahlen Sie insgesamt ungefähr:

ERSTELLEN 32k

Sende 21k

VERTRAGSCODE 5k*200

GESCHÄTZTE NICHT-NULL-TX-BYTE 5,5k*(0,95*68)

GESCHÄTZTE NULL-TX-BYTE 5.5k*(.05*4)

KONSTRUKTOR 1k

Dies entspricht ~1,41 Millionen Gas, was derzeit weniger als 5 USD entspricht. Die Gaspreise waren vor ein paar Wochen 20-mal so hoch wie jetzt, Sie hätten also 100 US-Dollar für die gleiche Vertragserstellung bezahlen können.

Mehr zu den Bytecode-basierten Kosten können Sie im Yellow Paper nachlesen

Wenn Sie Hilfe bei der Optimierung von Verträgen benötigen, helfe ich Ihnen gerne, aber nicht kostenlos.

Bearbeiten: #3 zwischen #2 und #4 hinzugefügt

Bearbeiten 2: Feste Zahlen und anschließende Mathematik für Txdata-Kosten ungleich Null (64 => 68)

Wenn Ihr Vertrag so viel kostet, müssen Sie eine Reihe von Speicherinitialisierungen durchführen. Speicher kostet bei weitem am meisten beim Lesen/Schreiben.

Die Ironie von Solidity besteht darin, dass es weniger kostet, Dinge im Speicher zu wiederholen. Wenn Sie also einige Variablen haben, können Sie sie neu initialisieren und neu berechnen. Es ist wahrscheinlich besser, dies jedes Mal im Speicher zu tun, wenn eine Vertragsmethode aufgerufen wird.

Sie sollten Ihren Bereitstellungsprozess in einem privaten Netzwerk testen oder das Netzwerk gründlich testen, bevor Sie Mainnet ausprobieren. Ich teste meine auf Rinkeby, weil in Ropsten die Blockgasgrenze zu niedrig ist.

Meiner Erfahrung nach ist die gasPrice-Einstellung in truffle.js effektiv. Ich habe meine Verträge erfolgreich mit der folgenden Syntax bereitgestellt:

    geth_mainnet: {
      host: "127.0.0.1",
      port: 8545, // geth-mainnet
      network_id: "1",
      gasPrice: 2000000000, // 2 GWei
      from: "0x...your-address-goes-here..."
    }

Siehe 2.505.437 Gas * 2 Gwei = 6 $ und 5.435.035 Gas * 2 Gwei = 13 $ .

Paar Vorbehalte:

  • Stellen Sie sicher, dass Ihr Konto über genügend Guthaben verfügt, nicht nur für Ihre Smart Contract-Bereitstellung, sondern auch für die Bereitstellung des Truffle-Migrationsvertrags und Aufrufe zu diesem Vertrag.
  • Wenn Sie low gasPrice verwenden, stellen Sie besser sicher, dass das Mainnet nicht zu beschäftigt ist, überprüfen Sie https://ethgasstation.info/ . Wenn Ihre Transaktion nicht genügend Priorität erhält und in 50 Blöcken nicht abgebaut werden kann, wird truffle/web3 eine Zeitüberschreitung haben. Je nachdem, wie weit Sie im Truffle-Migrationsprozess sind, kann Ihre eigentliche Vertragsbereitstellung noch andauern und erfolgreich abgeschlossen werden, aber die Vertragsadresse wird nicht unter build/ aufgezeichnet.

Dies ist nicht die Antwort auf die Frage, aber ich möchte dies zu den vorherigen Antworten hinzufügen.

Wenn Sie Ihre Transaktion festschreiben, berechnet der Ethereum-Client, wie viel die Transaktion kosten würde, wenn die Transaktion das gesamte bereitgestellte Gas bis zum Gaslimit verwenden würde.

Wenn Sie also das Gaslimit auf 6,700,000und den Gaspreis auf eingestellt 20 gweihaben, dann würde der Client verlangen, dass Sie mindestens 0.134 ETHauf Ihrer Brieftasche haben. Ich bin mir nicht sicher, ob es möglich ist, diese Überprüfung zu deaktivieren.

Sie können versuchen, das Gaslimit für Ihre Transaktionen oder den Gaspreis zu senken, dies würde jedoch zu einer längeren Bestätigungszeit führen

Mein Ansatz ist:

  1. Stellen Sie es in einem Testnetz wie Ropsten bereit und notieren Sie das verwendete Gas
  2. Gehen Sie zu https://web3-tools.com/ und geben Sie das Gas ein, um das benötigte Gas in USD zurückzurechnen

Wie die akzeptierte Antwort war mein Basisvertrag ungefähr 1.400.000 (im Vergleich zu 21.000) für eine Übertragung

Offenlegung: Ich schrieb web3-tools.com