Превышен лимит газа в блоке при составлении контракта Браузер Solidity

Использование браузера Solidity ( https://ethereum.github.io/browser-solidity/ ) для майнинга контракта в тестовой сети с внедренной учетной записью web3 и metamask выдает эту ошибку:

callback contain no result Gas required exceeds limit: 3000000

Ожидается, что этот контракт (исходный код => https://gist.github.com/computerphysicslab/f362383f9d3fed26becba48b934bbcfc ) будет стоить около 6 миллионов газа для развертывания (согласно среде JS VM). Тем не менее, при попытке увеличить лимит газа выбрасываются следующие ошибки:

callback contain no result Gas required exceeds limit: 4000000
callback contain no result Gas required exceeds block gas limit: 5000000
callback contain no result Gas required exceeds block gas limit: 6000000
callback contain no result Gas required exceeds block gas limit: 10000000
...

Таким образом, похоже, что добыча контракта невозможна, потому что существует ограничение на блок газа около 5 миллионов газа. Можно ли как-то преодолеть этот предел?

Ссылки:

Сбой компилятора браузера Solidity

почему браузерный компилятор солидности падает, когда код слишком длинный?

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

Ответы (3)

Если майнеры не увеличат лимит блочного газа, ваш единственный вариант — разделить контракт на несколько контрактов.

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

  • Краудсейл: управляйте краудсейлом, распределением токенов, вознаграждениями, открытием, закрытием
  • Токен: реализует ERC20, может создавать токены, одобрять передачу
  • Кошелек: управляйте средствами, полученными во время краудсейла.

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

Каждый контракт можно развернуть независимо, и с помощью метода конфигурации вы завершаете настройку.

Я пробовал, но разделение контракта с помощью команд include не снижает общую стоимость газа при развертывании.
Использование include не разделяет контракт. Это просто инструкция для компилятора объединить все эти вещи в один контракт.
@JuanIgnacioPérezSacristán Я обновил пример
Как связаны эти контракты? Как библиотеки? Или по наследству? В моем коде также используется наследование, и он требует слишком много газа, что делает его невозможным для развертывания.
@JuanIgnacioPérezSacristán Наследование соберет весь код воедино. Вы должны разделить контракты на отдельные, чтобы каждый из них можно было развернуть независимо. Посмотрите статус ico github.com/status-im/status-network-token , у них есть отдельные контракты и скрипт, который их развернет, и установит первоначальную конфигурацию. Они используют трюфель, который позволяет очень легко развернуть несколько контрактов и настроить их.
Иногда имеет смысл использовать библиотеки, если код можно использовать повторно, как, например, в SafeMath. Потому что библиотеки используют одни и те же общие данные. Если контракты разделены, они могут получить доступ к данным только через общедоступные методы.

На самом деле максимальное количество газа за транзакцию eth.getBlock('latest').gasLimitсоставляет около 4,7 миллиона на сегодняшний день.

Редактировать: лимит газа увеличивается, и кажется, что цель состоит в том, чтобы достичь лимита в 6,7 миллиона, поэтому, ничего не делая, вы вскоре сможете развернуть свой контракт. Источник: Реддит

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

Есть способы снизить стоимость газа:

  1. Упростите договор. (особенно конструкторы)
  2. Используйте оптимизатор
  3. Разделите его на несколько контрактов.
  4. Рефакторинг для использования библиотек

Например, вы можете попробовать использовать SafeMath вместо своей собственной реализации.

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

// @notice For debugging purposes when using solidity online browser
function whoAmI() constant returns (address) {
    return msg.sender;
}

Кстати, обсуждение увеличения лимита газа в разгаре, некоторые майнерские пулы уже увеличили его, но некоторые крупные все еще используют этот «старый» лимит, используемый для предотвращения DDOS-атак. Эта ветка на Reddit немного объясняет текущую проблему с лимитом газа.

Очень полезные советы. Мой код уже разбит на несколько контрактов, но для его развертывания по-прежнему требуется слишком много газа.
Я отредактировал свой ответ. Лимит газа увеличивается, и, похоже, цель состоит в том, чтобы достичь 6,7 млн. Достаточно, чтобы развернуть ваш контракт. Я надеюсь, что через несколько часов/дней вы сможете сделать это, не касаясь своего контракта.
Еще раз здравствуйте :) Мы достигли лимита газа более чем на 6М, вы можете попробовать развернуть контракт еще раз?

Вам нужно будет поместить некоторые вещи, такие как safemath, в библиотечный контракт , который вы можете развернуть как отдельные контракты. В противном случае вы не сможете сократить расходы на газ.