В день смеха и розыгрышей хотел поделиться с вами интересным моментом работы с 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