使用继承时如何将松露合约部署到开发网络?

How to deploy truffle contract to dev network when using inheritance?

我一直在尝试使用 Truffle 框架部署合约,我最近一直在开发网络上测试这些合约。

我的合约非常大,当我试图将它部署到测试网上时,系统指示我将它拆分,这样合约就不会超过 gas 限制。虽然,请记住,该合约确实以默认气体限制部署到开发网络上。

所以我取出部分合同并从基础中派生出另一个合同,并在其中添加删除的部分。我试图将它部署到开发网络以再次测试它,我现在得到错误:

'Error: The contract code couldn't be stored, please check your gas amount.'

所以我采取的步骤是:

  1. 将我的 gasLimit 更改为 100,000,000 并没有解决问题
  2. 查看我的合同是否'abstract'

    • 我对此的理解是,合同是抽象的,如果它或它的 parent 有任何没有实现的功能。我的没有。
  3. 然后我删除了除构造函数之外的所有代码 派生合同,我仍然收到此错误

我删除了文件并且部署像以前一样只使用我的基础合约,因此父合约不能有任何未实现的功能并且当我尝试从中派生空合约时它仍然不起作用(确保派生合约中没有任何内容是抽象的)。

  1. 然后我将我的迁移文件分开以便进行迁移 分开,仍然没有运气。

我的父合同大约有 300 行长,所以没有必要 post 把它全部放在这里 - 我知道有些人会说 'it may just be too large' 然而,它在 500 行长的时候部署了dev 网络,现在它只有 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)

我的基础合约太大 post,它自己部署得很好,这意味着它不是抽象的。

我的衍生合约是:

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);
};

我在这里 post 编辑了这个问题,因为我担心这可能是 Truffle 部署的常见问题。

总而言之,我认为这与实际气体限制没有任何关系,相反,由于某些未知原因失败并打印此错误消息。

我找到了解决这个问题的方法,基本上,如果您从基础合约继承,您必须像这样在继承的合约构造函数中部署基础合约:

旧版本:

简单地部署了基础,然后在class名称

中部署了引用'is Crowdsale'的继承合约
  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
}

注意:基础合约在构造函数的左括号之前初始化。

我不再收到 'out of gas' 错误并且我的合约像以前一样运行。