Не удалось сохранить код контракта. Проверьте количество газа.

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

Мой контракт был развернут нормально, прежде чем добавить следующую функцию:

function setApproval(address addr, bool approved)payable returns(string, uint, uint) {

       //some logical operations and assignments

    }

как только я добавляю функцию и пытаюсь развернуть контракт, я получаю эту ошибку

Произошла ошибка, спасение. Состояние сети неизвестно. Просмотрите успешные транзакции вручную. Ошибка: код контракта не может быть сохранен, проверьте количество газа.

тестовый сервер rpc показывает следующие журналы

Transaction: 0xd5791ac0c6059cbd43e00a7fabe566ada3f0572966f12ff25da6e04215840f39 Contract created: 0x9062592c5dd06340401c1e750ddb025defabf5be Gas usage: 4712388 Block Number: 16 Block Time: Sat Jul 22 2017 03:30:30 GMT+0530 (India Standard Time) Runtime Error: out of gas

снова после удаления этой функции контракт развернут без ошибок

что не так с этой функцией?

Мой код контракта составляет около 250 строк, есть ли ограничения на размер кода контракта??

заранее спасибо

Как вы реализуете контракт? Попробуйте увеличить gasLimitнастройку, если есть.
Как вы реализуете свой контракт? Если вы разместите свой код, мы можем помочь вам с модифицированной версией. Чтобы изменить количество газа для одной транзакции, вы делаете что-то вроде этого eth.sendTransaction(params...., { gas: 10000000 }).
@jeff Я развертываю код с помощью консоли truffle. Можно ли увеличить лимит газа в блокчейне консорциума Azure Ethereum?
@Ismael Я получаю сообщение об ошибке при развертывании контракта. Речь идет не об одной транзакции, контракт без setApproval()функции развертывается без каких-либо ошибок, и я могу вызывать функции с помощью предложенного вами метода, но как только я добавлю эту конкретную функцию и попробуйте повторно развернуть контракт, я получаю сообщение об ошибке, которое я указал в вопросе
@ jeff Команда, которую я использую для развертыванияtruffle migrate --reset
@SwapnilKumbhar Я не знаю о трюфелях. Возможно, вы можете попробовать другой метод развертывания ( MEW предоставляет один), чтобы лучше определить проблему. Также мне кажется странным оплачиваемый постоянный метод, поскольку константные функции должны быть «бесплатными». Хотя не уверен, что это законно.
Это не постоянная функция, возможно, вас смущаетretrurns
@SwapnilKumbhar Если ошибка появляется только после добавления новой функции, причина, скорее всего, в том, что у вас закончился газ при развертывании. Поэтому следует увеличить количество газа. Я думаю, что в трюфеле вы должны изменить свою функцию развертывания на что-то вроде deployer.deploy(MyContract, params.., {gas: 5000000});увеличения количества газа, если это необходимо.
Какой код внутри setApproval? Если без этой функции он работает, то проблема должна быть связана с кодом, который вы пропустили в вопросе.
Код @pabloruiz55 внутри setApproval() не влияет на результат. Я пробовал комментировать код, наконец, после прочтения некоторых статей я пришел к выводу, что размер кода ограничен в блокчейне консорциума Azure ethereum, поскольку макс. лимит газа для блока 4712388.

Ответы (5)

В вашем 2_deploy_contracts.jsфайле поменяйте газценапо умолчанию большее число, т.е.:

// 2_deploy_contracts.js

const MyContract = artifacts.require('./MyContract.sol')

module.exports = function (deployer) {
  deployer.deploy(MyContract, { gas: 5000000 })
}

У меня была такая же проблема, и это сработало для меня.

это работает с testrpc, я пытался использовать это с сетью блокчейна консорциума Azure etherum, это не работает, наконец, после прочтения некоторых статей я пришел к предположению, что размер кода ограничен в блокчейне консорциума Azure ethereum, поскольку макс. лимит газа для блока составляет 4712388. Я считаю, что это ограничение блокчейна консорциума Azure ethereum.
@SwapnilKumbhar, я также использую сеть блокчейна консорциума Azure Ethereum и сталкиваюсь с этой ошибкой, когда пытаюсь развернуть контракт, бросающий мое приложение dApp. Но это хорошо работает для того же контракта, если я разверну его, выкину ремикс. Я не знаю, в чем моя проблема, но, похоже, что-то связано с процессом развертывания, а не с размером контракта или требуемым газом.
@dchang Можете ли вы поделиться здесь своим кодом контракта? это будет полезно для отладки вашей проблемы, а сейчас я предлагаю попробовать сократить количество строк кода и попытаться развернуть. Лучше попробуйте удалить какую-то тяжелую функцию. Если она работает, логически разделите свой контракт на несколько контрактов и разверните их по отдельности. Я применил это решение, когда столкнулся с проблемой с некоторыми большими контрактами.
@SwapnilKumbhar Как уже говорилось, проблема не в самом контракте, поскольку я могу развернуть его с помощью ремикса. И отбросить его я пытаюсь с помощью очень простого контракта: "прагма солидность ^0.5.3; контракт TestContrato{}". Вы не можете иметь проще, чем это. Дополнительное примечание: я не использую трюфель, вместо этого я пытаюсь использовать только web3 (версия 1.0.0-beta.36), используя метод deploy() или отправляя необработанную передачу с данными: байт-код

Когда контракт наследуется от интерфейса и не реализует функцию, будет выдана эта ошибка.

Трюфель 4.0.4 солк 0.4.18

interface IF { 
    function doSomething() external view returns(uint); 
}

contract Inherit is IF {
    Inherit() public; 
}

при развертывании. выдаст ошибку:

Не удалось сохранить код контракта. Проверьте количество газа.

решение заключается в реализации функции.

contract Inherit is IF {
    doSomething() external view returns(uint) {
        return 5;
    }
}

Проблема, которая возникает редко, но вызывает точно такое же сообщение об ошибке, заключается в следующем:

В настоящее время размер кода контракта ограничен 24 КБ, и иногда ваш байт-код может быть больше, что вызовет ту же проблему.

Перейдите к JSON-файлу сборки контракта и проверьте, не превышает ли развернутый размер байт-кода 24 КБ.

Решение. Эту проблему можно решить с помощью различных оптимизаций контрактов, таких как удаление достаточного количества геттеров, публичных объявлений и т. д.

Я использовал решение @rhlsthrm с дополнительной модификацией, потому что его решение дало мне

Ошибка: превышен лимит блокированного газа

Мое решение для Geth.

Во-первых, получите лимит газа из последнего блока

с использованием

eth.getBlock("latest").gasLimit

скопируйте лимит газа, а затем вставьте его вот так

var Identity = artifacts.require("./Identity.sol");

module.exports = function(deployer) {
  deployer.deploy(Identity, { gas: 794722 });
};

увеличьте значение газа в файле развертывания.

если вы зарегистрируете ошибку развертывания, вы можете увидеть детали газа, например:

cumulativeGasUsed: 1217170,
effectiveGasPrice: 2500000011,
gasUsed: 1000000,

пожалуйста, проверьте, меньше ли значение «gasUsed», чем «cumulativeGasUsed», поэтому вы должны увеличить значение газа в настройке кода развертывания, например:

const result = await new web3.eth.Contract(abi)
    .deploy({
      data: evm.bytecode.object,
    })
    .send({ from: accounts[0], gas: 1000000 });

измените значение газа (1000000) на (2000000) следующим образом:

const result = await new web3.eth.Contract(abi)
    .deploy({
      data: evm.bytecode.object,
    })
    .send({ from: accounts[0], gas: 2000000 });