В видео были показаны две переменные "constant" и "immutable", после которых имя переменных писалось капсом (большими буквами). Их особенность в том, что данные переменные уже нельзя будет нигде изменять.
Так вот, если мы пишем "constant" по значение переменной мы должны указать сразу.
Если же мы используем "immutable", то создать переменную можно в начале, а присвоить значение один раз позже.
#constant #immutable
Так вот, если мы пишем "constant" по значение переменной мы должны указать сразу.
Если же мы используем "immutable", то создать переменную можно в начале, а присвоить значение один раз позже.
#constant #immutable
👍1🔥1
Solidity hints. Часть 16
Последний пост перед небольшим перерывом с циклом Solidity Hints, так как на следующей неделе мы поговорим про Account Abstractions.
Итак:
25. For values of immutable variables, 32 bytes are reserved in the code, even if they would fit in fewer bytes
26. The compiler does not reserve a storage slot for constant and immutable variables, and every occurrence is replaced by the respective value directly in the code.
что в переводе:
25. Для значений immutable переменных всегда резервируется 32 байта памяти, не смотря на то, что сами значения могут по итогу заниматься меньше места.
26. Компилятор не резервирует слот для хранения постоянных и неизменяемых переменных, и каждое их вхождение заменяется соответствующим значением непосредственно в коде.
Я решил объединить эти пункты, так как разбор описывает оба этих случая.
Если вы хоть раз интересовались работой памяти в Solidity, то наверняка слышали рекомендацию по упаковке в правильный порядок переменных состояния контракта, чтобы они занимали меньше места. Например,
uint256 - занимает весь слот памяти в 32 байта;
две переменных uint128 можно расположить рядом, чтобы они занимали только один слот, вместо двух.
address занимает 20 байтов, а bool - всего 1.
Зная размерность наших переменных мы может сгруппировать их таким образом, чтобы они компактно размещались в памяти.
При этом два вида переменных, constant и immutable - размещаются не в памяти контракта, а в его байткоде.
Значение переменной константы, при деплое контракта, просто копируется во все места в самом контракте, где к ней обращаются. Для значений immutable переменной происходит тоже самое, только для нее резервируется 32 байта, даже если значение занимает гораздо меньше места. Именно поэтому константы иногда могут быть дешевле по газу, чем immutable переменные.
#immutable #constant #storage #bytecode
Последний пост перед небольшим перерывом с циклом Solidity Hints, так как на следующей неделе мы поговорим про Account Abstractions.
Итак:
25. For values of immutable variables, 32 bytes are reserved in the code, even if they would fit in fewer bytes
26. The compiler does not reserve a storage slot for constant and immutable variables, and every occurrence is replaced by the respective value directly in the code.
что в переводе:
25. Для значений immutable переменных всегда резервируется 32 байта памяти, не смотря на то, что сами значения могут по итогу заниматься меньше места.
26. Компилятор не резервирует слот для хранения постоянных и неизменяемых переменных, и каждое их вхождение заменяется соответствующим значением непосредственно в коде.
Я решил объединить эти пункты, так как разбор описывает оба этих случая.
Если вы хоть раз интересовались работой памяти в Solidity, то наверняка слышали рекомендацию по упаковке в правильный порядок переменных состояния контракта, чтобы они занимали меньше места. Например,
uint256 - занимает весь слот памяти в 32 байта;
две переменных uint128 можно расположить рядом, чтобы они занимали только один слот, вместо двух.
address занимает 20 байтов, а bool - всего 1.
Зная размерность наших переменных мы может сгруппировать их таким образом, чтобы они компактно размещались в памяти.
При этом два вида переменных, constant и immutable - размещаются не в памяти контракта, а в его байткоде.
Значение переменной константы, при деплое контракта, просто копируется во все места в самом контракте, где к ней обращаются. Для значений immutable переменной происходит тоже самое, только для нее резервируется 32 байта, даже если значение занимает гораздо меньше места. Именно поэтому константы иногда могут быть дешевле по газу, чем immutable переменные.
#immutable #constant #storage #bytecode
👍4
В день смеха и розыгрышей хотел поделиться с вами интересным моментом работы с immutables и константами в смарт контрактах, а точнее с порядком их объявлений.
В некоторых случаях это может стоить вам повторного деплоя контрактов, в худшем - сломанными расчетами.
Посмотрите на код ниже:
contract Immutables {
uint256 public constA = constB + 100;
uint256 internal constant constB = 50;
// constA будет равно 150
uint256 public immA = immB + 100;
uint internal immutable immB = 25;
//immA будет равно 100, а не 125
}В первом случае в переменной будет установлено значение 150, во втором - 100. Это происходит потому, что immutable переменные не заменяются на этапе компиляции, а записываются в хранилище контракта при его развертывании (в конструкторе).
Порядок инициализации полей в Solidity сверху вниз:
1. Сначала вычисляется immA = immB + 100, но на этом этапе immB ещё не проинициализирован (по умолчанию 0).
2. Затем только присваивается immB = 25.
Поэтому immA получает значение 0 + 100 = 100.
Вот так компилятор умеет "шутить", если не знать, как он работает!
#immutable #constant
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12❤4