Return в Solidity и return в assembly
Знали ли вы, что return в assembly ведет себя по-другому, чем return в solidity?
В assembly return фактически является опкодом, который прекращает выполнение контекста и возвращает срез (часть информации) памяти.
Например, в функции:
В solidity "return <value>" как бы говорит компилятору, что функция завершила свое выполнение и <value> должно быть возвращено для следующего контекста.
Для external функций это, по сути, означает вызов Return, а для internal - типа "просто возвращайся".
Return в solidity служит как полезная абстракция и позволяет нашим функциям прекращаться раньше, порой избегая другую логику исполнения, как например тут:
Пост переведен из данной ветки Твиттера от philogy.
Фух, я еще постигаю assembly и мне крайне интересно, как работает вся эта штуковина изнутри.
#return #assembly
Знали ли вы, что return в assembly ведет себя по-другому, чем return в solidity?
В assembly return фактически является опкодом, который прекращает выполнение контекста и возвращает срез (часть информации) памяти.
Например, в функции:
function someLogic() external returns(bool success) {
assembly {
return(0x00, 0x20)
}
_someMoreLogic();
}
действие никогда не дойдет до _someMoreLogic(), прекратившись на участке assembly.В solidity "return <value>" как бы говорит компилятору, что функция завершила свое выполнение и <value> должно быть возвращено для следующего контекста.
Для external функций это, по сути, означает вызов Return, а для internal - типа "просто возвращайся".
Return в solidity служит как полезная абстракция и позволяет нашим функциям прекращаться раньше, порой избегая другую логику исполнения, как например тут:
function someLogic() internal {
if (isOwner()) return;
uint fee = calculateFee();
_charheFee();
}
Если же мы хотим создать подобную логику с помощью assembly, нам потребуется использовать for циклы:function someLogic() internal {
assembly{
for {} 1 {} {
if eq(caller(), sload(owner, slot)) {
break
}
let fee := calcFee()
break
}
}
}
В этом случае for {} 1 {} {} выступает эквивалентом while(true), и исполнение может прекратиться либо после первого if, при вополнении условий, либо уже в конце функции.Пост переведен из данной ветки Твиттера от philogy.
Фух, я еще постигаю assembly и мне крайне интересно, как работает вся эта штуковина изнутри.
#return #assembly
❤5👍1