Remix - Инициализация создания контракта возвращает данные длиной более 24576 байт. Развертывание, скорее всего, завершится ошибкой). Что может быть сделано?

Я получаю следующую ошибку при развертывании моего контракта в Remix:

Инициализация создания контракта возвращает данные длиной более 24576 байт. Развертывание, скорее всего, не удастся. Дополнительная информация: eip-170

Контракт разбит на 2 контракта. A с 250 строками и B (B есть A) с 500 строками. Я также создал библиотеку и экспортировал некоторые из своих функций в эту библиотеку. В настоящее время я загружаю в среду Javascript VM. Стоит отметить, что когда я устанавливаю флажок «Включить оптимизацию» на вкладке «Компиляция», он все равно не работает. У меня есть несколько вопросов:

1) Как я могу проверить размер данных в Remix? Я получаю ошибку, что это более 24кб, как я могу проверить, сколько это точно?

2) Чем это вызвано? Это связано с длиной кода или количеством газа, который выполняется? Если это газ, почему, когда я добавляю намного больше газа к лимиту газа на вкладке «Выполнить» в ремиксе, он все равно дает мне ту же ошибку.

3) Любые распространенные способы уменьшить размер данных, чтобы я мог их развернуть?

Спасибо

для части 1) Проверьте объект байтового кода вашего контракта, он не должен превышать 24 КБ, строки напрямую не означают больший байтовый код, как указано в ответе @rick.
Хорошо сделал это. Странно то, что, как я уже сказал, у меня есть контракты A и B, а B — это A. Когда я удаляю зависимость B от A и развертываю A, все работает, и контракт развертывается. Когда я копирую байт-код и вставляю его в текстовый файл, размер составляет 60 КБ. Я смущен, так как эта ошибка говорит, что она не может быть больше 24 КБ? Стоит отметить, что когда B равно A, размер байт-кода составляет 202 КБ:/
github.com/ethereum/EIPs/blob/master/EIPS/eip-170.md «если инициализация создания контракта возвращает данные длиной более 0x6000 (2 ^ 14 + 2 ^ 13) байт, создание контракта завершается с ошибкой ошибка газа». Поэтому проверьте свой код контракта после его развертывания, так как в нем нет кода инициализации (конструктора и всего остального). Вероятно, он должен быть меньше 24 КБ (14952 символа).
Есть идеи, как это сделать в Remix? перед загрузкой вы можете проверить байт-код на вкладке «Компиляция». После развертывания, где вы можете увидеть экземпляр контракта, я не вижу, где проверить его байт-код (напоминаю, что я не использую какую-то тестовую сеть, такую ​​​​как Rinksby, где вы можете использовать Etherscan, просто Javascript VM Remix).
В ремиксе перейдите на вкладку сведений, найдите «объект байт-кода времени выполнения», если у вас есть доступ с помощью web3, затем используйте web3.et.getCode (contractAddress)

Ответы (2)

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

Ничего связанного с газом или без газа: просто больше разрешенного.

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

НО это может быть проблема, связанная с remix IDE. Прежде чем продолжить, сохраните файлы, очистите кеш браузера и перезапустите браузер. (Кстати, Chrome, похоже, лучше взаимодействует с Remix, чем с другими браузерами...)

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

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

См. Как оценить размер кода моего контракта? он слишком велик для развертывания сейчас !

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

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

Спасибо, Рик, очень полезно. Не могли бы вы взглянуть на мой комментарий к @sp4c3 и прояснить это?
Я добавил очень полезную ссылку: попробуйте прочитать это!
«Важно подчеркнуть, что разделение контракта на несколько контрактов/библиотек уменьшает размер байт-кода тогда и только тогда, когда они могут быть развернуты отдельно, и вы развертываете их отдельно. В противном случае результирующий байт-код будет больше!» Как я могу справиться с этим? это означает, что я должен развернуть библиотеку, получить адрес и указать его в своем контракте? Если да, то можно ли смоделировать это в Remix? Спасибо
Я думаю, что было бы лучше, если бы вы открыли один или несколько новых вопросов по этому вопросу и попытались получить полный вклад от всего сообщества. Во всяком случае, подумайте о том, чтобы разделить ваш контракт, переместив функции во второй контракт и вызывая их, как в «otherContract.transfer(from, to, value);» или похожие. Объяснить это в комментарии может быть сложно, но мультиконтрактный подход широко известен.

Включите оптимизацию смарт-контрактов в ремиксе. Это сработает