Изучая переменные, Алекс обнаруживает еще одну важную концепцию:
— «А что, если некоторые значения никогда не должны изменяться? Например, максимальное количество акций в обращении или имя контракта? Неужели для них тоже нужны обычные переменные и они будут занимать место в блокчейне?»
Он изучает документацию и находит ответ: в Solidity есть константы — переменные, которые нельзя изменить после компиляции, и которые не будут занимать место в блокчейне.
Константы
Термины
Константа (constant) — переменная, значение которой устанавливается на этапе компиляции и никогда не может быть изменено. Значение должно быть известно заранее. Экономит стоимость вызова функции, так как значение "вшито" в код контракта.
Неизменяемая переменная (immutable) — переменная, значение которой устанавливается один раз при создании контракта (в конструкторе) и больше не может быть изменено. Используется для параметров, которые зависят от условий развертывания контракта.
Инициализация при компиляции — присвоение значения переменной на этапе компиляции кода. Это значение становится частью байт-кода контракта.
Инициализация при развертывании — присвоение значения переменной в момент создания экземпляра контракта в блокчейне.
Что такое константы?
Алекс понимает:
— «Константа — это как каменная табличка с высеченным на ней значением. Один раз написал — и навсегда. Никто и никогда не сможет это изменить, даже владелец контракта. Компилятор просто подставит эти значения, как будто бы я указал значения вручную в местах использования»
Константы решают важные задачи:
Безопасность — гарантируют, что критические значения не будут случайно изменены
Экономия стоимости вызова функции — константы "вшиты" в код и не требуют обращения к хранилищу блокчейна
Читаемость кода — сразу понятно, что это значение фиксированное
Ключевые слова
В Solidity есть два способа создать неизменяемые значения: constant и immutable.
Константы времени компиляции
Для объявления константы используется ключевое слово constant.
Значение должно быть известно на момент написания кода:
Solidity
contractTokenContract{
// Эти значения известны заранее и никогда не изменятся
stringpublicconstant NAME ="SuperToken";
stringpublicconstant SYMBOL ="SPT";
uint256publicconstant MAX_SUPPLY =1000000;
uint256publicconstant DECIMALS =18;
// Математические константы
uint256publicconstant PERCENTAGE_BASE =100;
uint256publicconstant SECONDS_IN_DAY =24*60*60;
}
Константы времени развертывания
Для объявления неизменяемой переменной используется ключевое слово immutable.
Значение устанавливается один раз при создании контракта (в конструкторе):
Solidity
contractTokenContract{
// Эти значения устанавливаются при создании контракта
addresspublicimmutable OWNER;
uint256publicimmutable CREATION_TIME;
uint256publicimmutable INITIAL_SUPPLY;
// При развертывании контракта передается параметр _initialSupply
constructor(uint256 _initialSupply) {
OWNER =msg.sender; // Зависит от того, кто создает контракт
CREATION_TIME =block.timestamp; // Зависит от времени создания
INITIAL_SUPPLY = _initialSupply; // Передается как параметр
}
}
Разница между constant и immutable
Алекс составляет таблицу различий:
Аспект
constant
immutable
Когда устанавливается
При компиляции
При развертывании (в конструкторе)
Где инициализируется
При объявлении
В конструкторе
Может зависеть от параметров
❌ Нет
✅ Да
Экономия стоимости вызова функции
✅ Максимальная
✅ Высокая
Когда использовать
Универсальные константы
Параметры развертывания
Экономия стоимости вызова функции
Алекс понимает важное преимущество:
— «Константы экономят деньги! Обычная переменная хранится в блокчейне и каждое обращение к ней добавляет стоимость вызова функции. А константы "вшиты" прямо в код контракта!»
Solidity
contractGasComparison{
// Обычная переменная — при каждом чтении к стоимости вызова функции добавляется стоимость доступа к хранилищу
uint256 x = maxSupplyVariable; // Читает из storage, ~2100 стоимости вызова функции
}
functiongetMaxSupplyCheap() public{
uint256 x = MAX_SUPPLY_CONSTANT; // Вшито в код, ~200 стоимости вызова функции
}
}
— «Теперь я понимаю! Константы — это как фундамент дома. Его уже не поменяешь после того, как дом построен. А переменные — это как мебель, которую можно переставлять.»
Практические примеры использования констант
Алекс изучает, в каких ситуациях лучше всего использовать константы и неизменяемые переменные.
Алекс продолжал изучать Solidity и дошел до темы констант. Он понял разницу между constant, immutable и обычными переменными, но столкнулся с практическим вопросом: «Как понять, что именно сделать константой, а что оставить обычной переменной?»
Он решил создать контракт для кофейни, где нужно хранить различную информацию: название кофейни, цены на напитки, адрес владельца и количество проданных чашек кофе. Но теперь перед ним стоит вопрос — какие из этих данных должны быть константами?
Помоги Алексу правильно выбрать тип для каждой переменной в контракте кофейни.