Константы и неизменяемые значения
Эффективные по расходу газа значения
«Константы и неизменяемые значения» — бесплатный урок Web3 & DApp Development Fundamentals на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Web3 & DApp Development Fundamentals, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Web3 & DApp Development Fundamentals содержит 4 уроков всего.
Фиксированные значения экономят газ
Некоторые значения никогда не меняются после развёртывания контракта. Для них Solidity предоставляет ключевые слова constant и immutable, которые хранят значение в байткоде контракта, а не в дорогих слотах storage.
Их использование снижает расход газа и показывает читателям намерение разработчика.
Объявление констант
constant должен быть присвоен в момент объявления, а его значение должно быть известно во время компиляции. Это значение больше никогда не изменится.
По соглашению имена констант записывают ПРОПИСНЫМИ_БУКВАМИ.
<code>uint256 public constant MAX_SUPPLY = 1000000;
string public constant NAME = 'MyToken';</code>Как работают константы
constant не занимает слот storage. Компилятор подставляет его значение везде, где оно используется, поэтому чтение практически ничего не стоит.
Благодаря этому константы идеально подходят для таких настроек, как количество десятичных знаков, ограничения и фиксированные комиссии.
<code>uint8 public constant DECIMALS = 18;
function unit() public pure returns (uint256) {
return 10 ** DECIMALS; // inlined at compile time
}</code>Объявление неизменяемых переменных
Переменная immutable задаётся один раз — при объявлении или в конструкторе — и после этого уже не может измениться.
В отличие от констант, её значение может зависеть от данных времени выполнения, например от аргументов развёртывания.
<code>address public immutable owner;
constructor() {
owner = msg.sender; // set at deploy time
}</code>Constant и Immutable
Ключевое различие заключается в том, когда фиксируется значение:
constant— фиксируется во время компиляции, должно быть литеральным выражениемimmutable— фиксируется во время развёртывания, может использовать аргументы конструктора
Оба значения хранятся в байткоде, а не в слотах хранилища.
Неизменяемое значение с аргументами конструктора
Неизменяемые значения особенно полезны, когда при каждом развёртывании нужны разные фиксированные параметры, например общий объём выпуска токена или адрес связанного контракта.
<code>uint256 public immutable cap;
constructor(uint256 _cap) {
cap = _cap; // unique per deployment
}</code>Экономия газа
Чтение обычной переменной состояния требует операции SLOAD (чтения из хранилища), что обходится дорого. Константы и неизменяемые значения читаются непосредственно из байткода, поэтому это гораздо дешевле.
Преобразовать часто читаемую фиксированную конфигурацию в constant/immutable — простой способ оптимизации.
<code>// Expensive: storage read each call
uint256 public feeStorage = 100;
// Cheap: read from bytecode
uint256 public constant FEE = 100;</code>Что не может быть константой
constant не может зависеть от чего-либо, вычисляемого во время выполнения. Такие значения, как block.timestamp, msg.sender или данные, прочитанные из хранилища, запрещены для констант.
В таких случаях используйте immutable.
<code>// ERROR: not compile-time known
// uint256 constant T = block.timestamp;
// OK as immutable
uint256 immutable deployedAt;
constructor() { deployedAt = block.timestamp; }</code>Неизменяемые значения доступны только для чтения
После завершения конструктора неизменяемому значению больше нельзя присвоить новое значение. Любая попытка записать в него за пределами конструктора приведёт к ошибке компиляции.
<code>address public immutable factory;
constructor(address f) { factory = f; }
function change(address x) public {
// factory = x; // ERROR: cannot assign
}</code>Распространённые варианты использования
Типичные варианты:
constant— для десятичности токена, ограничений максимального выпуска и фиксированных ставок комиссийimmutable— для владельца, временной отметки развёртывания и адресов связанных контрактов
Оба варианта повышают понятность кода и уменьшают расход газа по сравнению с изменяемым состоянием.
<code>uint8 public constant DECIMALS = 18;
address public immutable deployer;
constructor() { deployer = msg.sender; }</code>Соглашения об именовании
Согласно широко распространённому соглашению, имена constant записываются в формате UPPER_SNAKE_CASE, а имена immutable часто используют обычный camelCase или начинаются с подчёркивания, если это параметры конструктора.
Единообразные имена ускоряют аудит.
<code>uint256 public constant MAX_HOLDERS = 500;
address public immutable treasury;</code>Быстрая проверка
Проверьте, насколько хорошо Вы поняли константы и неизменяемые значения.
Итоги
Вы узнали о газоэффективных фиксированных значениях:
constant— литерал времени компиляции, встроенный в байткод, в формате UPPER_CASEimmutable— задаётся один раз при развёртывании (часто в конструкторе), после чего доступно только для чтения- Оба варианта позволяют избежать дорогостоящего чтения из хранилища (SLOAD)
Используйте константы для заранее известных литералов, а неизменяемые значения — для конфигурации, различающейся при каждом развёртывании.
Изучай Web3 & DApp Development Fundamentals с ИИ-репетитором — бесплатно
Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.
- Курсы
- 29
- Уроки
- 105
Часто задаваемые вопросы
Урок «Константы и неизменяемые значения» бесплатный?
Да — полный текст урока «Константы и неизменяемые значения» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Web3 & DApp Development Fundamentals, подпишись на CoddyKit PRO. Курс Web3 & DApp Development Fundamentals содержит 4 уроков всего.
Чему я научусь в уроке «Константы и неизменяемые значения»?
Эффективные по расходу газа значения Ты практикуешь Web3 & DApp Development Fundamentals с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Web3 & DApp Development Fundamentals?
Предыдущий опыт не требуется. Web3 & DApp Development Fundamentals на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.
Сколько времени занимает урок «Константы и неизменяемые значения»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Web3 & DApp Development Fundamentals?
Да. Каждый урок Web3 & DApp Development Fundamentals включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Типы значений
- Ссылочные типы
- Хранилище и память
- Константы и неизменяемые значения