Как развернуть трюфельный контракт в сети разработчика при использовании наследования?

Я пытался развернуть контракт с использованием инфраструктуры Truffle, недавно я тестировал эти контракты в сети разработки.

Мой контракт был очень большим, и когда я попытался развернуть его в испытательной сети, мне было приказано разделить его так, чтобы контракт не превышал лимит газа. Хотя, имея в виду, этот контракт был развернут в сети разработки с лимитом газа по умолчанию.

Поэтому я вынул части контракта, вывел из базы еще один контракт и добавил туда удаленные разделы. Я попытался развернуть его в сети разработки, чтобы снова протестировать, теперь я получаю сообщение об ошибке:

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

Поэтому я предпринял следующие шаги:

  1. Измените мой gasLimit на 100 000 000, который не решил
  2. Проверьте, является ли мой контракт "абстрактным"

    • Насколько я понимаю, контракт является абстрактным, если он или его родитель имеет какие-либо функции без реализации. Мой нет.
  3. Затем я удалил весь код, кроме конструктора, из производного контракта, и все еще получаю эту ошибку

Я удалил файл, и развертывание работало только с моим базовым контрактом, как и раньше, поэтому родительский контракт не должен иметь каких-либо не реализованных функций И ​​он все еще не работает, когда я пытаюсь извлечь из него пустой контракт (убедитесь, что ничего не было реферат в производном договоре).

  1. Затем я разделил свои файлы миграции так, чтобы миграции происходили отдельно, но все же не повезло.

Мой родительский контракт имеет длину около 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 ответ

Я нашел решение этой проблемы, в основном, если вы наследуете от базового контракта, вы должны развернуть базовый контракт в конструкторе унаследованных контрактов следующим образом:

СТАРАЯ ВЕРСИЯ:

Просто развернул базу, затем развернул наследующий контракт со ссылкой на '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);

НОВАЯ ВЕРСИЯ

Разверните только наследующий контракт и создайте новый экземпляр базы в этом конструкторе.

  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
}

ПРИМЕЧАНИЕ. Базовый контракт инициализируется ПЕРЕД открывающими скобками для функции конструктора.

Я больше не получаю сообщение об отсутствии газа, и мой контракт работает, как и раньше.

Другие вопросы по тегам