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

时间:2017-12-19 18:29:57

标签: ethereum solidity truffle consensys-truffle

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

我的合同非常庞大,当我试图将它部署到测试网时,我被指示将其拆分,以便合同不会超过气体限制。尽管如此,考虑到此合同确实已部署到具有默认气体限制的开发网络中。

所以我拿出了部分合同并从基地获得了另一份合同,并在那里添加了删除的部分。我试图将它部署到开发网络以便再次测试它,我现在得到错误:

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

所以我采取的步骤是:

  1. 将我的gasLimit更改为100,000,000,但没有解决它
  2. 检查我的合同是否是' abstract'

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

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

    1. 然后我将我的迁移文件拆分,以便进行迁移 分开,仍然没有运气。
    2. 我的父母合约大约有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);
      };
      

      我在这里发布了这个问题,因为我担心这可能是松露部署的常见问题。

      总而言之,我不相信这与实际的气体限制有任何关系,而是因为某些未知原因而失败并且无论如何打印此错误信息。

1 个答案:

答案 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
}

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

我不再从气体中获取'错误,我的合同和以前一样。