Solidity v0.4.10 представила функции revert()
и require()
, а также поддержку REVERT
кода операции . Насколько я могу судить, это означает, что любой контракт, составленный с использованием ^0.4.10
, будет выражать другое поведение throw
после мегаполиса.
Фон:
Согласно документации Solidity Exceptions :
предоставленное пользователем исключение генерируется в следующих ситуациях:
- Вызывающий бросок.
- Вызов require с аргументом, который оценивается как false.
а также
Внутри Solidity выполняет операцию возврата (инструкцию
0xfd
) при возникновении предоставленного пользователем исключения.
Вывод:
Таким образом, кажется, что недавно скомпилированные/развернутые контракты будут включать в себя 0xfd
опкод, который на усадьбе является просто INVALID
операцией, но станет REVERT
после метрополиса.
Вопрос:
Верен ли мой вывод?
Есть ли случаи, когда измененное поведение может быть проблематичным?
Да, это правильно, согласно этому разговору .
Все неопределенные инструкции ведут себя так же, как INVALID. И да, поведение
0xfd
меняется на Метрополисе, но до или после Метрополиса0xfd
всегда бросает. Разница заключается в том, предоставляется ли вызывающему абоненту некоторый выход... а также в том, что оставшаяся часть газа возвращается.