Развертывание Truffle в тестовой сети говорит: Ошибка: превышено ограничение по блочному газу

Я пытаюсь развернуть образец контракта (следуя этому руководству ), но получаю сообщение об ошибке недостаточно газа. Я немного изменил цифры, но не смог это исправить. Я видел этот вопрос в обмене стеками, но есть несколько вещей, которые я не понимаю в предложенном там ответе:

  • Что значит модифицировать блок генезиса следующим образом?

    «Вы можете изменить свой блок генезиса, чтобы иметь лимит газа 0x2fefd8, который совпадает с основной сетью (3 141 592 газа). Вам также нужно будет сбросить эту тестовую цепочку, поскольку вы будете менять блок генезиса».

  • В файлах js, которые я печатаю ниже, есть два параметра «газа»: один в 2_deploy_contracts.js, а другой в truffle.js. Что означает каждый из них (как они влияют на развертывание контракта)? Есть ли другие места, связанные с количеством газа?

Моя ошибка и содержимое файла:

~/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)

миграции/1_initial_migration.js

var Migrations = artifacts.require("./Migrations.sol");
module.exports = function(deployer) {
  deployer.deploy(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 требует ('babel-register')

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

Ответы (6)

Внутри truffle.js добавьте

,gas: 4600000

Не забудьте маленькую "," так это выглядит

  networks: {
    development: {
      host: "localhost",
      port: 8545,
      network_id: "*",
      gas: 4600000
    }
Это следует принять как правильный ответ

Либо ваш контракт слишком велик, либо ваша конфигурация трюфелей — ерунда.

gas:1000258612000000000

и

{gas: 5000000}

Это недопустимые значения газа. Максимальное значение составляет около 4 м, так что просто невозможно, чтобы это было допустимым значением.

Вернитесь к своему закомментированному, и если вы все еще видите ошибку, вероятно, ваш контракт слишком велик и, вероятно, его следует разбить на библиотеки. Хороший способ проверить это — посмотреть на стоимость газа «создания» с помощью solc --gas path/to/contract.sol.

Что значит модифицировать блок генезиса следующим образом?

Это только в том случае, если вы используете тестовую сеть, поэтому игнорируйте ее, если только ваш проект не существует исключительно в частной цепочке.

В файлах js, которые я печатаю ниже, есть два параметра «газа»: один в 2_deploy_contracts.js, а другой в truffle.js. Что означает каждый из них (как они влияют на развертывание контракта)? Есть ли другие места, связанные с количеством газа?

Первый deployer.deploy— это максимальное значение газа, которое вы разрешаете для транзакции. Это также превышает предел блока в 4 м, так что исправьте и это.

Второй, похоже на описание сети(с трюфелем не совсем уверен). Это сообщает truffle максимальное значение газа в сети. не уверен, где найти самый последний лимит, но я проводил тесты с лимитом в 4 000 000. По данным ethstats.net сейчас их может быть около 6 миллионов.

В моем случае я использовал блок генезиса с очень низким лимитом газа:

"gasLimit": "2100000"

Указание количества газа немного ниже этого количества в truffle.js решило проблему для меня. Вот мое определение сети в truffle.js:

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

Я также столкнулся с подобной проблемой. Я использовал версию truffle v4.0.1 (ядро: 4.0.1). Если вы понизите версию до бета-версии, все будет работать нормально. 1. npm uninstall -g truffle 2. версия truffle (чтобы проверить, не был ли он удален) 3. npm install -g truffle@beta

Вы можете идти. Это должно решить проблему.

Я только что понизил версию и до сих пор не могу заставить Truffle слушать мое поле "gasPrice" - есть ли что-то помимо простого изменения этого поля и запуска компиляции truffle, которое я должен делать?
Надеюсь, вы запускаете truffle migrate после запуска truffle compile. Также вы можете попробовать поставить значение газа как максимальное значение, которое составляет 4 миллиона.
Оказалось, что это была проблема только с --dry-run

Я также следую тому же руководству, и у меня была такая же проблема. В truffle.js я отдал за газ 4700000. Также в файле миграции (второй файл) я изменил газ на 4700000 следующим образом:

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

Я использую truffle migrate --reset, и моя проблема решена.

Для тех из вас, кому ничего из этого не помогло, я удалил все и снова настроил (следуя упомянутому руководству), настроил газ в конфигурации трюфеля, и это сработало. Я использовал три узла.

Дело в том, что мой gasLimit застрял на 5003 (независимо от начального узла с --targetgaslimit после удаления полных данных цепочки), и я предполагаю, что это из-за динамического расчета лимита газа, используемого узлами, поэтому он уменьшился из-за бездействия сети. Это не имеет смысла, потому что, как только вся цепочка блоков будет удалена, это должно сбросить. Но по какой-то причине он застрял на этом значении.

После этого вам просто нужно проверить текущий лимит газа

geth attach <path_to_node_dir>/geth.ipc

и после подключения проверьте его через

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

а затем обязательно установите параметр газа в файле конфигурации трюфеля. После этого миграция заработала.