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.
Die Kosten Ihrer Bereitstellung basieren auf 5 Faktoren, wobei ein 6. die geschätzten Bereitstellungskosten beeinflusst:
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.
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.
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.
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
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.
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:
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,000
und den Gaspreis auf eingestellt 20 gwei
haben, dann würde der Client verlangen, dass Sie mindestens 0.134 ETH
auf 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:
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
V. Kartoplya
Prashant Prabhakar Singh
Mikko Ohtamaa