Когда я развертываю контракт, получаю сообщение «Ошибка: код контракта не может быть сохранен, пожалуйста, проверьте количество газа»

случай 1. Когда мой контракт оценивает газ в 72 75 790 с помощью метода web3.eth.estimateGas в моем частном блокчейне. Он работает нормально, и контракт развернут.
Случай 2. Расчетная стоимость газа в моем контракте составляет 50 000 000, а сумма попутного газа - 50 000 000 + 300 000. но невозможно сохранить контракт в ethereum-blockchain с помощью web3 API в nodejs. Ошибка: код контракта не может быть сохранен, пожалуйста, проверьте количество газа.
Примечание. Я уже установил gasLimit на 200 000 000 000 (т.е. больше, чем предполагаемый газ) во время создания приватного блокчейна.

укажите код договора
@BadrBellaj это около 350 строк кода. тебе нужно?
только платные функции
@BadrBellaj Я не добавил в свой контракт оплачиваемую функцию. потому что я не отправляю эфир на контракт.
поделитесь кодом контракта в сути
Ссылка на код контракта @BadrBellaj Примечание: когда я комментирую функцию getHash, она работает нормально. В противном случае выдается ошибка типа «Контракт не может быть сохранен, пожалуйста, проверьте количество газа».

Ответы (1)

Контракт может быть просто слишком большим, и точка.

В последнем хардфорке был реализован максимальный размер контракта . Скорее всего, ваш контракт — если он использует 50 000 000 газа — намного больше этого. Если это действительно так, контракт никогда не будет создан.

Возможно, вы можете настроить свой частный блокчейн на более высокий максимальный размер кода, при условии, что вы используете только Parity. (См. конец обсуждения по ссылке.) Но если это невозможно или вы хотите использовать общедоступную цепочку, вам просто придется сократить контракт.

Вот несколько предложений.

  1. Используйте библиотеки . Это разделит ваш контракт на несколько субконтрактов, но, что более важно, сделает ваш код более элегантным и легким для чтения.
  2. Держись подальше от струн. В отличие почти от любого другого языка, строки требуют больших затрат, и чем меньше вы их используете, тем лучше для вас будет. Например, вы возвращаете строки из функций и в журналах. Вместо этого вы можете вернуть код ошибки (или различные виды событий) и заставить внешний интерфейс отображать его в удобочитаемой форме.
  3. Я также вижу места, где вы могли бы использовать перечисления вместо текстовых строк.
  4. Для каждого события у вас есть nowодин из аргументов. В этом нет необходимости — если у вас есть доступ к событию в web3.js, вы также можете узнать, из какого блока оно произошло, а также в какое время оно произошло.

Надеюсь это поможет!