Почему разные EVM жалуются на то, что не могут оценить газ?
Пишу на Solidity контракт, пытаюсь его задеплоить в разные EVM совместимы блокчейны и получаю вот такую ошибку либо при деплое, либо при попытке выполнения функции контракта. Пробовал на EOS EVM, на KAVA и т.п. Везде похожее поведение...
Gas estimation errored with the following message (see below). The transaction execution will likely fail. Do you want to force sending?
Такой ответ должен означать ошибку при выполнении, причем любую. Например, метамаск чаще всего пишет в такой ситуации, что недостаточно средств для оплаты газа. Для понимания нужно увидеть код или же прописать во всех require текст ошибки (если конечно падает на нем). Еще как вариант контракт слишком большой, но тогда его не получится принципиально задеплоить
Контракт большой, но по ограничениям remix "пролезает". На каких-то EVM он даже не деплоится с этой ошибкой, на других деплоится нормально. А при выполнении любого метода дает ошибку. НО! При выполнении на Goerli, например, все ок.
Может быть там какие-то более ранние версии Solidity надо использовать и т.п.? Или совместимость других EVM с Ethereum преувеличена?
Лично не сталкивалась с несовместимостью, но могу представить, например, какой-то opcode не поддерживается. Как идея для проверки хорошая, взять хотя бы 0.7.x версию для компиляции.
Victoria Zotova, Ну и еще наблюдение, не все блокчейны поддерживают EIP-1559, а он где-то зашит в недрах openzeppelin и не пойму как его оттуда выкусывать. Это тоже сужает список EVM для работы с ними. Может тут есть какой-то совет?
EIP-1559 относится к блокчейну это правильно, но никак не относится к контрактам. По сути своей это изменение формата самой транзакции, но не байткода транзакции. A библиотеки openzeppelin это только solidity. После компиляции ничего кроме набора opcode на выходе ну будет (там конечно abi, metadata, но это все не обязательно). И совместимость с EVM будет определяться только по совместимости opcode.
И еще добавка по EIP-1559 - это изменило как комуницировать с клиентом ноды (своей или чужой), причем помню, что некоторые клиенты до сих пор могут принимать старый формат.
Victoria Zotova, ну вот я из remix пробую развернуть для AVAX или KAVA - ругается. может быть тут дело в самом remix, что он пытается деплой так отправить или еще как-то.. Вот и говорю, не понимаю, как свойства блокчейна влияют на деплой контракта... или это Metamask дурит?
Тут не могу сильно помочь, т.к. к Remix не очень тепло отношусь (по подобным причинам когда нужно разобраться в тонкостях). И Metamask тоже не раз скрывал реальную ошибку за бесполезным сообщением о газе. Так что в проектах где я участвую всегда используется либо web3.js либо web3.py (иногда правда в связке с metamask). Как идея в каком направлении двигаться: тестовая локальная нода + web3.js код для деплоя. Будет возможность убедиться, что это не проблема (или все же именно проблема) Remix с тем какие параметры транзакции задавать (а тут вариация не маленькая) и вполне вероятно получить нормальное сообщение об ошибке. Из IDE - рекомендую Visual Code, много плагинов для solidity.
Victoria Zotova, Спасибо. Просто у конечных пользователей часто Metamask, и даже если деплой пройдет гладко через web3 и т.п., то конечное взаимодействие все равно будет через кошелек, а вот тут уже засада...
VSS использую, кстати, а вот насчет тюнинга под solidity не задумывался. Какие плагины стоит поставить?
Например, на моем текущем проекте (thUSD) веб часть использвет web3.js плюс плагин для кошелька (можно и metamask). Как результат такое дебажить проще. Т.е. Метамаск не будет готовить транзакцию для подписания, это будет делать web часть, а Метамаск только подписывать (на случай, если что-то не так именно с подготовкой транзакций).
По поводу плагинов - кроме стандартного для solidity все остальное зависит от того какая среда для тестов и деплоя. Hardhat, foundry или что-то еще. И вот для этого всего обычно есть отдельный плагин (ручаюсь как минимум за hardhat)