Solidity hints. Часть 19
Смотрим следующий пункт в репо и звучит он как:
30. For pure functions, the opcode STATICCALL is used, which does not guarantee that the state is not read, but at least that it is not modified. It is not possible to prevent functions from reading the state at the level of the EVM.
что в переводе:
Для чистых функций используется опкод STATICCALL, который не гарантирует, что память контракта не будет прочитана, но, по крайней мере, что она не будет изменена. Запретить функциям читать состояние на уровне EVM невозможно.
Когда вы пишите функции в контракте и помечаете их как view или pure, возможно, вы порой замечали, что компилятор может ругаться на некоторые варианты:
1. Когда вы с view функцией хотите изменить какую-либо переменную состояния;
2. Когда в с pure функцией хотите прочитать переменную состояния;
Они обе используют опкод STATICCALL "под капотом", который запрещает модифицировать память контракта, однако... он не запрещает читать его!
Тут я пока не нашел объяснения, на каком уровне идет запрет для pure чтения памяти контракта, если вы знаете ответ, поделитесь в комментариях.
И когда искал ответ но этот вопрос, наткнулся на интересный рабочий пример с pure функцией, где разработчик задавался вопросом, почему в этом случае pure может читать из памяти:
В обсуждениях пришли к выводу, что все дело в блоке assembly, который неявно конвертирует из storage в memory, как view:
The assembly in this function is pure. The problem is that the implicit conversion from storage to memory is view.
В последней версии Solidity 0.8.26 это все еще работает!
#assembly #pure #view
Смотрим следующий пункт в репо и звучит он как:
30. For pure functions, the opcode STATICCALL is used, which does not guarantee that the state is not read, but at least that it is not modified. It is not possible to prevent functions from reading the state at the level of the EVM.
что в переводе:
Для чистых функций используется опкод STATICCALL, который не гарантирует, что память контракта не будет прочитана, но, по крайней мере, что она не будет изменена. Запретить функциям читать состояние на уровне EVM невозможно.
Когда вы пишите функции в контракте и помечаете их как view или pure, возможно, вы порой замечали, что компилятор может ругаться на некоторые варианты:
1. Когда вы с view функцией хотите изменить какую-либо переменную состояния;
2. Когда в с pure функцией хотите прочитать переменную состояния;
Они обе используют опкод STATICCALL "под капотом", который запрещает модифицировать память контракта, однако... он не запрещает читать его!
Тут я пока не нашел объяснения, на каком уровне идет запрет для pure чтения памяти контракта, если вы знаете ответ, поделитесь в комментариях.
И когда искал ответ но этот вопрос, наткнулся на интересный рабочий пример с pure функцией, где разработчик задавался вопросом, почему в этом случае pure может читать из памяти:
pragma solidity ^0.8.15;
contract Demo {
string internal _thing = "I am a string";
function thing() external pure returns (string memory) {
string storage ref;
assembly ("memory-safe") {
ref.slot := _thing.slot
}
return ref;
}
}
В обсуждениях пришли к выводу, что все дело в блоке assembly, который неявно конвертирует из storage в memory, как view:
The assembly in this function is pure. The problem is that the implicit conversion from storage to memory is view.
В последней версии Solidity 0.8.26 это все еще работает!
#assembly #pure #view
🤔3