Truffle-Bereitstellung im Testnetzwerk sagt: Fehler: Blockgasgrenze überschritten

Ich versuche, einen Mustervertrag bereitzustellen (gemäß dieser Anleitung ), aber ich erhalte eine Fehlermeldung, dass nicht genug Benzin vorhanden ist. Ich habe die Zahlen ein wenig geändert, konnte es aber nicht korrigieren. Ich habe diese Frage im Stapelaustausch gesehen, aber es gibt einige Dinge, die ich in der dort vorgeschlagenen Antwort nicht verstehe:

  • Was bedeutet es, den Genesis-Block wie folgt zu modifizieren?

    "Sie können Ihren Genesis-Block so ändern, dass er ein Gaslimit von 0x2fefd8 hat, das dem Hauptnetzwerk (3.141.592 Gas) entspricht. Sie müssen auch diese Testkette zurücksetzen, da Sie den Genesis-Block ändern werden."

  • In den js-Dateien, die ich unten drucke, gibt es zwei "Gas"-Parameter: einen in 2_deploy_contracts.jsund den anderen in truffle.js. Was bedeutet jeder von ihnen (wie wirken sie sich auf die Bereitstellung eines Vertrags aus)? Gibt es noch andere Orte, die sich auf die Menge der Gasprobleme beziehen?

Mein Fehler und Dateiinhalt:

~/voting$ truffle deploy
Using network 'development'.

Running migration: 1_initial_migration.js
  Deploying Migrations...
Error encountered, bailing. Network state unknown. Review successful transactions manually.
Error: exceeds block gas limit
    at Object.InvalidResponse (/usr/lib/node_modules/truffle/build/cli.bundled.js:37022:16)
    at /usr/lib/node_modules/truffle/build/cli.bundled.js:209743:36
    at XMLHttpRequest.request.onreadystatechange (/usr/lib/node_modules/truffle/build/cli.bundled.js:208522:13)
    at XMLHttpRequestEventTarget.dispatchEvent (/usr/lib/node_modules/truffle/build/cli.bundled.js:210395:18)
    at XMLHttpRequest._setReadyState (/usr/lib/node_modules/truffle/build/cli.bundled.js:210685:12)
    at XMLHttpRequest._onHttpResponseEnd (/usr/lib/node_modules/truffle/build/cli.bundled.js:210840:12)
    at IncomingMessage.<anonymous> (/usr/lib/node_modules/truffle/build/cli.bundled.js:210800:24)
    at emitNone (events.js:91:20)
    at IncomingMessage.emit (events.js:185:7)
    at endReadableNT (_stream_readable.js:974:12)

migrations/1_initial_migration.js

var Migrations = artifacts.require("./Migrations.sol");
module.exports = function(deployer) {
  deployer.deploy(Migrations);
};

migrations/2_deploy_contracts.js

var Voting = artifacts.require("./Voting.sol");
module.exports = function(deployer) {
  deployer.deploy(Voting, ['Rama', 'Nick', 'Jose'], {gas: 5000000});
};

truffle.js require('babel-register')

module.exports = {
  networks: {
    development: {
      host: 'localhost',
      port: 8545,
      network_id: '*', // Match any network id
      // gas:400000000000,
      gas:1000258612000000000,
      from: "0xf212bb926f7a831ff745e4236fc704a9947de77c"
    }
  }
}

Antworten (6)

Fügen Sie in truffle.js hinzu

,gas: 4600000

Vergiss das kleine "," nicht, so sieht es aus

  networks: {
    development: {
      host: "localhost",
      port: 8545,
      network_id: "*",
      gas: 4600000
    }
Dies sollte als richtige Antwort akzeptiert werden

Entweder ist Ihr Vertrag völlig zu groß oder Ihre Trüffelkonfiguration ist Quatsch.

gas:1000258612000000000

und

{gas: 5000000}

Dies sind ungültige Gaswerte. Das Maximum liegt bei etwa 4 m, daher gibt es auf keinen Fall einen gültigen Wert.

Gehen Sie zurück zu Ihrem auskommentierten, und wenn Sie den Fehler immer noch sehen, ist Ihr Vertrag wahrscheinlich zu groß und sollte wahrscheinlich in Bibliotheken aufgeteilt werden. Eine gute Möglichkeit, dies zu überprüfen, besteht darin, sich die „Schöpfungs“-Gaskosten mit anzusehen solc --gas path/to/contract.sol.

Was bedeutet es, den Genesis-Block wie folgt zu modifizieren?

Dies ist nur der Fall, wenn Sie ein Testnetzwerk betreiben. Ignorieren Sie es also, es sei denn, Ihr Projekt existiert ausschließlich in einer privaten Kette.

In den js-Dateien, die ich unten drucke, gibt es zwei „gas“-Parameter: einen in 2_deploy_contracts.js und den anderen in truffle.js. Was bedeutet jeder von ihnen (wie wirken sie sich auf die Bereitstellung eines Vertrags aus)? Gibt es noch andere Orte, die sich auf die Menge der Gasprobleme beziehen?

Der erste deployer.deployist nur der maximale Gaswert, den Sie für die Transaktion zulassen. Dies liegt auch über dem Blocklimit von 4 m, also beheben Sie das auch.

Der zweite sieht aus wie eine Beschreibung des Netzwerks (bei Trüffel bin ich mir nicht ganz sicher). Dies sagt truffle, was der maximale Gaswert des Netzwerks ist. Ich bin mir nicht sicher, wo ich das aktuellste Limit finden kann, aber ich habe meine Tests mit einem Limit von 4.000.000 durchgeführt. Laut ethstats.net könnten das jetzt bis zu 6m sein.

In meinem Fall habe ich einen Genesis-Block mit einem sehr niedrigen Gaslimit verwendet:

"gasLimit": "2100000"

Durch die Angabe einer Gasmenge etwas unterhalb dieser Menge in truffle.js wurde das Problem für mich gelöst. Hier ist meine Netzwerkdefinition in truffle.js:

"private": {
    network_id: 15,
    host: "localhost",
    port: 8545,
    gas: 2000000
},

Ich stand auch vor dem ähnlichen Problem. Die von mir verwendete Version von Truffle war Truffle v4.0.1 (Kern: 4.0.1). Wenn Sie auf die Beta-Version herunterstufen, funktioniert alles einwandfrei. 1. npm uninstall -g truffle 2. truffle version (um zu prüfen, ob es deinstalliert ist) 3. npm install -g truffle@beta

Du bist startklar. Dies sollte das Problem beheben.

Ich habe gerade ein Downgrade durchgeführt und kann Truffle immer noch nicht dazu bringen, auf mein Feld "gasPrice" zu hören. Gibt es etwas, das über das Ändern dieses Felds und das Ausführen der Truffle-Kompilierung hinausgeht, was ich tun sollte?
Ich hoffe, Sie führen die Truffle-Migration aus, nachdem Sie die Truffle-Kompilierung ausgeführt haben. Sie können auch versuchen, den Gaswert als Maximalwert anzugeben, der 4 Millionen beträgt.
Es stellte sich heraus, dass dies nur ein Problem mit --dry-run war

Ich folge auch der gleichen Anleitung und hatte das gleiche Problem. In truffle.js habe ich 4700000 für das Gas gegeben. Auch in der Migrationsdatei (der zweiten Datei) habe ich das Gas wie folgt auf 4700000 geändert:

var Voting = artifacts.require("./Voting.sol");
module.exports = function(deployer) {
  deployer.deploy(Voting, ['Rama', 'Nick', 'Jose'], {gas: 4700000});
};

Ich laufe mit Truffle Migrate --Reset und mein Problem wurde gelöst.

Für diejenigen unter Ihnen, die nicht geholfen haben, habe ich alles gelöscht und neu eingerichtet (gemäß der erwähnten Anleitung), Gas in der Truffle-Konfiguration eingerichtet und es hat funktioniert. Ich habe drei Knoten verwendet.

Die Sache ist, dass mein gasLimit bei 5003 hängen geblieben ist (unabhängig davon, ob der Knoten mit --targetgaslimit nach dem Entfernen vollständiger Kettendaten gestartet wurde), und ich denke, es liegt an der dynamischen Gaslimitberechnung, die die Knoten verwenden, sodass sie aufgrund von Netzwerkinaktivität abgenommen hat. Es macht keinen Sinn, denn sobald die gesamte Blockchain gelöscht ist, sollte diese zurückgesetzt werden. Aber aus irgendeinem Grund blieb es bei diesem Wert hängen.

Danach müssen Sie nur noch das aktuelle Gaslimit überprüfen

geth attach <path_to_node_dir>/geth.ipc

und sobald die Verbindung hergestellt ist, überprüfen Sie sie über

web3.eth.getBlock("pending").gasLimit

und stellen Sie dann sicher, dass Sie gas param in Ihrer Trüffel-Konfigurationsdatei einstellen. Danach hat die Migration funktioniert.