Закончился газ во время развертывания из-за большого количества операторов require()?

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

По наитию, я выполнил поиск и замену по всему контракту, который закомментировал каждый оператор require() . Ошибка отсутствия газа исчезла, и я смог успешно развернуться.

Если я использую оптимизатор solc, я могу успешно выполнить развертывание с неповрежденными операторами require () . Но тогда я не могу использовать отладчик Truffle, так как в настоящее время он не может сосуществовать с оптимизированным кодом, а отладчик мне очень нужен.

Я подумал, что это может быть связано с длинными строками, которые я использовал в качестве «возвратных сообщений» для операторов require() , поэтому я радикально сократил их размер, но ошибка все равно возникала. Затем я попытался изменить их все на пустые строки , но все равно получил ошибку. На самом деле кажется, что огромное количество операторов require() вызывает ошибку отсутствия газа , но только тогда, когда я не использую оптимизатор.

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

2_deploy_ebb.js
===============

   Replacing 'EtherBandBattlesManager'
   -----------------------------------
Error:  *** Deployment Failed ***

"EtherBandBattlesManager" ran out of gas (using a value you set in your network config or deployment parameters.)
   * Block limit:  100000000
   * Gas sent:     99999999

    at ./.nvm/versions/node/v8.11.1/lib/node_modules/truffle/build/webpack:/packages/truffle-deployer/src/deployment.js:364:1
    at <anonymous>
    at process._tickCallback (internal/process/next_tick.js:188:7)
Truffle v5.0.0-beta.2 (core: 5.0.0-beta.2)
Solidity v0.5.0 (solc-js)
Node v8.11.1

Ответы (1)

Мне стало известно о флаге в клиенте командной строки Ganache, который разрешает неограниченные размеры контрактов во время разработки. С помощью этого флага я теперь могу развертывать/мигрировать на Ganache, не получая ошибки об отсутствии газа (спасибо Джерри на канале Telegram Loom Network за то, что он рассказал мне об этом флаге).

Вот командная строка, которую я использую для запуска клиента Ganache CLI:

ganache-cli -d 100000000 --allowUnlimitedContractSize

Обратите внимание на дополнительный флаг -d , который позволяет указать более высокий максимальный предел газа в блоке, чем значение по умолчанию. Вы можете увидеть полный список флагов Ganache CLI на странице readme репозитория GitHub для этого проекта:

https://github.com/trufflesuite/ganache-core

Итак, когда я разрабатываю, я использую клиент CLI Ganache с флагом --allowUnlimitedContractSize и без использования оптимизатора solc . Когда я выполняю развертывание в Rinkeby или Main Net (или в любой другой нелокальной сети), чтобы избежать ошибок отсутствия газа, я включаю оптимизатор solc , добавляя следующий раздел верхнего уровня в мой файл конфигурации truffle.js :

solc: { optimizer: { enabled: true, runs: 200 } }