Я пытаюсь развернуть образец контракта (следуя этому руководству ), но получаю сообщение об ошибке недостаточно газа. Я немного изменил цифры, но не смог это исправить. Я видел этот вопрос в обмене стеками, но есть несколько вещей, которые я не понимаю в предложенном там ответе:
«Вы можете изменить свой блок генезиса, чтобы иметь лимит газа 0x2fefd8, который совпадает с основной сетью (3 141 592 газа). Вам также нужно будет сбросить эту тестовую цепочку, поскольку вы будете менять блок генезиса».
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"
}
}
}
Внутри 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.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
а затем обязательно установите параметр газа в файле конфигурации трюфеля. После этого миграция заработала.
вейвкайтер