我一直在尝试使用Truffle框架部署合同,我最近在开发网络上测试了这些合同。
我的合同非常庞大,当我试图将它部署到测试网时,我被指示将其拆分,以便合同不会超过气体限制。尽管如此,考虑到此合同确实已部署到具有默认气体限制的开发网络中。
所以我拿出了部分合同并从基地获得了另一份合同,并在那里添加了删除的部分。我试图将它部署到开发网络以便再次测试它,我现在得到错误:
'Error: The contract code couldn't be stored, please check your gas amount.'
所以我采取的步骤是:
检查我的合同是否是' abstract'
然后我删除了除构造函数之外的所有代码 派生合同,我仍然得到这个错误
我删除了文件,部署只和我以前的基本合同一起使用,因此父合同不能有任何未实现的功能,当我尝试从中获取空契约时,它仍然不起作用(确保派生合同中没有任何内容是抽象的)。
我的父母合约大约有300行,所以没有必要在这里张贴所有内容 - 我知道有些人会说'它可能只是太大了''然而,它在开发网络上的500线长时部署,现在它只有250线长,衍生合约275线长,它没有部署。
错误:
Running migration: 2_deploy_contracts.js
Replacing ERC20Token...
... 0xcae613274de1aa278e7ae5d1239f43445132a417d98765a4f227ea2439c9e4fc
ERC20Token: 0xeec918d74c746167564401103096d45bbd494b74
Replacing Crowdsale...
... 0x0ffc7291d84289c1391a81ed9f76d1e165285e3a3eadc065732aa288ea049b3a
Crowdsale: 0x0d8cc4b8d15d4c3ef1d70af0071376fb26b5669b
Saving successful migration to network...
... 0x7f351d76f61f7b801913f59b808688a2567b64933cdfdcf78bb18b0bf4e4ff69
Saving artifacts...
Running migration: 3_more_deployed_contracts.js
Deploying StagedSale...
... 0x216136bb24d317b140a247f10ec4d6791559739111a85932133cd4a66b12a1d9
Error encountered, bailing. Network state unknown. Review successful
transactions manually.
Error: The contract code couldn't be stored, please check your gas
amount.
at Object.callback
(/usr/local/lib/node_modules/truffle/build/cli.bundled.js:329221:46)
at /usr/local/lib/node_modules/truffle/build/cli.bundled.js:39618:25
at /usr/local/lib/node_modules/truffle/build/cli.bundled.js:331159:9
at /usr/local/lib/node_modules/truffle/build/cli.bundled.js:175492:11
at /usr/local/lib/node_modules/truffle/build/cli.bundled.js:314196:9
at XMLHttpRequest.request.onreadystatechange
(/usr/local/lib/node_modules/truffle/build/cli.bundled.js:329855:7)
我的基本合同太大而无法发布,并且它本身就可以很好地部署,这意味着它不是抽象的。
我的合同是:
pragma solidity ^0.4.16;
import "./SafeMath.sol";
import "./Crowdsale.sol";
contract StagedSale is Crowdsale {
using SafeMath for uint256;
/*
* Setup the contract and transfer ownership to appropriate beneficiary
*/
function StagedSale
(
uint256 _stage1Duration,
uint256 _stage2Duration
) public {
uint256 stage1duration = _stage1Duration.mul(1 minutes);
uint256 stage2duration = _stage2Duration.mul(1 minutes);
}
我的衍生合同的迁移文件:
var StagedSale = artifacts.require("./StagedSale.sol");
module.exports = function(deployer) {
const stage1Duration = 1;
const stage2Duration = 1;
deployer.deploy(StagedSale, stage1Duration, stage2Duration);
};
我在这里发布了这个问题,因为我担心这可能是松露部署的常见问题。
总而言之,我不相信这与实际的气体限制有任何关系,而是因为某些未知原因而失败并且无论如何打印此错误信息。
答案 0 :(得分:2)
我已经找到了解决方法,基本上如果你从基础合同继承,你必须在继承的契约构造函数中部署基本契约,如下所示:
OLD VERSION:
简单地部署了基础,然后部署了继承合同,并引用了#Crowsale'在班级名称
deployer.deploy(ERC20Token, initialAmount, tokenName, decimalUnits,tokenSymbol).then(function() {
return deployer.deploy(Crowdsale, softCap, hardCap, etherCostOfEachToken, sendFundsTo, toChecksumAddress(ERC20Token.address), durationInMinutes);
});
deployer.deploy(FinalizableSale);
新版
仅部署继承契约并在该构造函数中创建新的base实例
deployer.deploy(ERC20Token, initialAmount, tokenName, decimalUnits,tokenSymbol).then(function() {
return deployer.deploy(Finalizable, softCap, hardCap, etherCostOfEachToken, sendFundsTo, toChecksumAddress(ERC20Token.address), durationInMinutes);
});
最终建构者:
function FinalizableSale(uint256 _fundingGoalInEthers, uint256 _fundingLimitInEthers, uint256 _etherCostOfEachToken, address _sendFundsTo, address _tokenAddress, uint256 _durationInMinutes)
Crowdsale(_fundingGoalInEthers, _fundingLimitInEthers, _etherCostOfEachToken, _sendFundsTo, _tokenAddress, _durationInMinutes)
{
//do something
}
注意:在构造函数的左括号之前初始化基本契约。
我不再从气体中获取'错误,我的合同和以前一样。