迁移合约时没气了
Out of gas while migrating a contract
我查看了其他 "out of gas" SO 帖子,但它们没有解决我的问题。
我正在使用以
开头的 ganache-cli
ganache-cli --account="0xce2ddf7d4509856c2b7256d002c004db6e34eeb19b37cee04f7b493d2b89306d, 2000000000000000000000000000000"
然后我执行
truffle migrate --reset
它returns有一个错误
Error encountered, bailing. Network state unknown. Review successful transactions manually.
Error: VM Exception while processing transaction: out of gas
(完整错误在最后)
这些是涉及的文件;
truffle.js
module.exports = {
networks: {
development: {
host: "localhost",
port: 8545,
network_id: "*",
gas: 470000
}
}
};
1_initial_migration.js
var Migrations = artifacts.require("./Migrations.sol");
module.exports = function(deployer) {
deployer.deploy(Migrations, {gas: 4500000});
};
2_deploy_contracts.js
var Voting = artifacts.require("./Voting.sol");
module.exports = function(deployer){
deployer.deploy(Voting, ['Rama', 'Nick', 'Jose'], {gas: 290000});
}
Voting.sol
pragma solidity ^0.4.18;
contract Voting {
mapping (bytes32 => uint8) public votesReceived;
bytes32[] public candidateList;
function Voting(bytes32[] candidateNames) public {
candidateList = candidateNames;
}
function totalVotesFor(bytes32 candidate) view public returns (uint8) {
require(validCandidate(candidate));
return votesReceived[candidate];
}
function voteForCandidate(bytes32 candidate) public {
require(validCandidate(candidate));
votesReceived[candidate] += 1;
}
function validCandidate(bytes32 candidate) view public returns (bool) {
for(uint i = 0; i < candidateList.length; i++) {
if (candidateList[i] == candidate) {
return true;
}
}
return false;
}
}
完全错误
Replacing Migrations...
... 0xaf3b7d40ac17f297a4970b75e1cc55659e86dea3ba7bcf13dd9f82e2b6cf0086
Migrations: 0x1ea6ea9d7528a8ac4b378ae799d2c38fe006b9b6
Saving successful migration to network...
... 0xa8400e873da3cb15719c2c31804ec558e73aa9bfa91c4dc48e922c0ed0db736f
Saving artifacts...
Running migration: 2_deploy_contracts.js
Deploying Voting...
... 0x72947eda435cf854abeeeb5483c9625efad45b664f3bcc7c2085f8aabdbb1076
Error encountered, bailing. Network state unknown. Review successful transactions manually.
Error: VM Exception while processing transaction: out of gas
at Object.InvalidResponse (C:\Users\Paul\AppData\Roaming\npm\node_modules\truffle\build\webpack:\~\web3\lib\web3\errors.js:38:1)
at C:\Users\Paul\AppData\Roaming\npm\node_modules\truffle\build\webpack:\~\web3\lib\web3\requestmanager.js:86:1
at C:\Users\Paul\AppData\Roaming\npm\node_modules\truffle\build\webpack:\~\truffle-migrate\index.js:225:1
at C:\Users\Paul\AppData\Roaming\npm\node_modules\truffle\build\webpack:\~\truffle-provider\wrapper.js:134:1
at XMLHttpRequest.request.onreadystatechange (C:\Users\Paul\AppData\Roaming\npm\node_modules\truffle\build\webpack:\~\web3\lib\web3\httpprovider.js:128:1)
at XMLHttpRequestEventTarget.dispatchEvent (C:\Users\Paul\AppData\Roaming\npm\node_modules\truffle\build\webpack:\~\xhr2\lib\xhr2.js:64:1)
at XMLHttpRequest._setReadyState (C:\Users\Paul\AppData\Roaming\npm\node_modules\truffle\build\webpack:\~\xhr2\lib\xhr2.js:354:1)
at XMLHttpRequest._onHttpResponseEnd (C:\Users\Paul\AppData\Roaming\npm\node_modules\truffle\build\webpack:\~\xhr2\lib\xhr2.js:509:1)
at IncomingMessage.<anonymous> (C:\Users\Paul\AppData\Roaming\npm\node_modules\truffle\build\webpack:\~\xhr2\lib\xhr2.js:469:1)
at emitNone (events.js:91:20)
错误信息正确。您没有发送足够的气体来创建合约。
部署合约时,部署的 3 个不同阶段会消耗 gas:
- 固有气体:这是任何交易中使用的基准量。对于所有交易,初始成本为 21,000 gas。对于合约创建,还有额外的 32,000。因此,在实际部署之前,您已经需要 53,000 gas。
- 构造函数执行:这是用于构造函数执行的 OPCODES 的气体。我在 Rinkeby 上部署了这个合约,你可以看到构造函数执行的所有 OPCODES 及其成本,here。这部分消耗了81,040 gas。
- 合约代码存储:最后,你有存储合约代码的成本。如果您查看气体估算工具,这被称为 "code deposit"。 运行time 合约代码存储的每个字节需要 200 gas。要获取合约代码的大小,运行
solc --optimize Voting.sol --bin-runtime -o .
并查看结果文件的大小。你的合约是 1116 字节(我使用的是 solc 版本 0.4.19,所以你在 .18 上的大小可能略有不同),这导致消耗了 223,200 gas。
总共是 357,240 gas,所以你的 290,000 限制太低了(Rinkeby 上的实际合约 运行 消耗了 351,640 gas。同样,我相信这个小差异是由于在编译器版本输出。我不是 100% 确定这一点,但差异足够小 - 实际上是 28 字节的合同代码 - 我没有深入挖掘以找到根本原因)。
HackerNoon 上有一篇很棒的文章,通过示例详细介绍了每个计算。
如果其他人遇到错误:
Error encountered, bailing. Network state unknown. Review successful transactions manually.
Error: VM Exception while processing transaction: out of gas
删除./build
目录并启用truffle.js
中的solc优化器:
module.exports = {
networks: {
development: {
host: "localhost",
port: 8545, // Using ganache as development network
network_id: "*",
gas: 4698712,
gasPrice: 25000000000
}
},
solc: {
optimizer: {
enabled: true,
runs: 200
}
}
};
我遇到了同样的问题,现在已经解决了。
运行时:VM 耗尽 gas 可能在两种情况下发生 -
同时使用truffle migrate --reset
- 确保启用 solidity 编译器的优化器。
添加-
solc: {
optimizer: {
enabled: true,
runs: 200
}
}
在truffle.js
在windows和truffle-config.js
在mac
同样在 networks->development
中,请提供高 gasPrice 和 gasLimit 并且 确保将其与 ganache-cli
(如果使用)
相匹配
- 发送交易时或使用 solidity 连接时-
这是最常见的错误,当合同在 remix
上运行良好但 Runtime
在 truffle
上运行时
当使用 web3
时,它使用的默认 gas 是 90000,有些调用会失败。因此,无论何时发送交易,请务必记得提供足够的 gas。
示例
await this.state.instance.methods.sendingTransactionFunction().send({from : this.state.account, gas : 1000000})
我查看了其他 "out of gas" SO 帖子,但它们没有解决我的问题。 我正在使用以
开头的 ganache-cliganache-cli --account="0xce2ddf7d4509856c2b7256d002c004db6e34eeb19b37cee04f7b493d2b89306d, 2000000000000000000000000000000"
然后我执行
truffle migrate --reset
它returns有一个错误
Error encountered, bailing. Network state unknown. Review successful transactions manually.
Error: VM Exception while processing transaction: out of gas
(完整错误在最后) 这些是涉及的文件;
truffle.js
module.exports = {
networks: {
development: {
host: "localhost",
port: 8545,
network_id: "*",
gas: 470000
}
}
};
1_initial_migration.js
var Migrations = artifacts.require("./Migrations.sol");
module.exports = function(deployer) {
deployer.deploy(Migrations, {gas: 4500000});
};
2_deploy_contracts.js
var Voting = artifacts.require("./Voting.sol");
module.exports = function(deployer){
deployer.deploy(Voting, ['Rama', 'Nick', 'Jose'], {gas: 290000});
}
Voting.sol
pragma solidity ^0.4.18;
contract Voting {
mapping (bytes32 => uint8) public votesReceived;
bytes32[] public candidateList;
function Voting(bytes32[] candidateNames) public {
candidateList = candidateNames;
}
function totalVotesFor(bytes32 candidate) view public returns (uint8) {
require(validCandidate(candidate));
return votesReceived[candidate];
}
function voteForCandidate(bytes32 candidate) public {
require(validCandidate(candidate));
votesReceived[candidate] += 1;
}
function validCandidate(bytes32 candidate) view public returns (bool) {
for(uint i = 0; i < candidateList.length; i++) {
if (candidateList[i] == candidate) {
return true;
}
}
return false;
}
}
完全错误
Replacing Migrations...
... 0xaf3b7d40ac17f297a4970b75e1cc55659e86dea3ba7bcf13dd9f82e2b6cf0086
Migrations: 0x1ea6ea9d7528a8ac4b378ae799d2c38fe006b9b6
Saving successful migration to network...
... 0xa8400e873da3cb15719c2c31804ec558e73aa9bfa91c4dc48e922c0ed0db736f
Saving artifacts...
Running migration: 2_deploy_contracts.js
Deploying Voting...
... 0x72947eda435cf854abeeeb5483c9625efad45b664f3bcc7c2085f8aabdbb1076
Error encountered, bailing. Network state unknown. Review successful transactions manually.
Error: VM Exception while processing transaction: out of gas
at Object.InvalidResponse (C:\Users\Paul\AppData\Roaming\npm\node_modules\truffle\build\webpack:\~\web3\lib\web3\errors.js:38:1)
at C:\Users\Paul\AppData\Roaming\npm\node_modules\truffle\build\webpack:\~\web3\lib\web3\requestmanager.js:86:1
at C:\Users\Paul\AppData\Roaming\npm\node_modules\truffle\build\webpack:\~\truffle-migrate\index.js:225:1
at C:\Users\Paul\AppData\Roaming\npm\node_modules\truffle\build\webpack:\~\truffle-provider\wrapper.js:134:1
at XMLHttpRequest.request.onreadystatechange (C:\Users\Paul\AppData\Roaming\npm\node_modules\truffle\build\webpack:\~\web3\lib\web3\httpprovider.js:128:1)
at XMLHttpRequestEventTarget.dispatchEvent (C:\Users\Paul\AppData\Roaming\npm\node_modules\truffle\build\webpack:\~\xhr2\lib\xhr2.js:64:1)
at XMLHttpRequest._setReadyState (C:\Users\Paul\AppData\Roaming\npm\node_modules\truffle\build\webpack:\~\xhr2\lib\xhr2.js:354:1)
at XMLHttpRequest._onHttpResponseEnd (C:\Users\Paul\AppData\Roaming\npm\node_modules\truffle\build\webpack:\~\xhr2\lib\xhr2.js:509:1)
at IncomingMessage.<anonymous> (C:\Users\Paul\AppData\Roaming\npm\node_modules\truffle\build\webpack:\~\xhr2\lib\xhr2.js:469:1)
at emitNone (events.js:91:20)
错误信息正确。您没有发送足够的气体来创建合约。
部署合约时,部署的 3 个不同阶段会消耗 gas:
- 固有气体:这是任何交易中使用的基准量。对于所有交易,初始成本为 21,000 gas。对于合约创建,还有额外的 32,000。因此,在实际部署之前,您已经需要 53,000 gas。
- 构造函数执行:这是用于构造函数执行的 OPCODES 的气体。我在 Rinkeby 上部署了这个合约,你可以看到构造函数执行的所有 OPCODES 及其成本,here。这部分消耗了81,040 gas。
- 合约代码存储:最后,你有存储合约代码的成本。如果您查看气体估算工具,这被称为 "code deposit"。 运行time 合约代码存储的每个字节需要 200 gas。要获取合约代码的大小,运行
solc --optimize Voting.sol --bin-runtime -o .
并查看结果文件的大小。你的合约是 1116 字节(我使用的是 solc 版本 0.4.19,所以你在 .18 上的大小可能略有不同),这导致消耗了 223,200 gas。
总共是 357,240 gas,所以你的 290,000 限制太低了(Rinkeby 上的实际合约 运行 消耗了 351,640 gas。同样,我相信这个小差异是由于在编译器版本输出。我不是 100% 确定这一点,但差异足够小 - 实际上是 28 字节的合同代码 - 我没有深入挖掘以找到根本原因)。
HackerNoon 上有一篇很棒的文章,通过示例详细介绍了每个计算。
如果其他人遇到错误:
Error encountered, bailing. Network state unknown. Review successful transactions manually.
Error: VM Exception while processing transaction: out of gas
删除./build
目录并启用truffle.js
中的solc优化器:
module.exports = {
networks: {
development: {
host: "localhost",
port: 8545, // Using ganache as development network
network_id: "*",
gas: 4698712,
gasPrice: 25000000000
}
},
solc: {
optimizer: {
enabled: true,
runs: 200
}
}
};
我遇到了同样的问题,现在已经解决了。
运行时:VM 耗尽 gas 可能在两种情况下发生 -
同时使用
truffle migrate --reset
- 确保启用 solidity 编译器的优化器。
添加-
solc: {
optimizer: {
enabled: true,
runs: 200
}
}
在truffle.js
在windows和truffle-config.js
在mac
同样在 networks->development
中,请提供高 gasPrice 和 gasLimit 并且 确保将其与 ganache-cli
(如果使用)
- 发送交易时或使用 solidity 连接时-
这是最常见的错误,当合同在 remix
上运行良好但 Runtime
在 truffle
当使用 web3
时,它使用的默认 gas 是 90000,有些调用会失败。因此,无论何时发送交易,请务必记得提供足够的 gas。
示例
await this.state.instance.methods.sendingTransactionFunction().send({from : this.state.account, gas : 1000000})