Переменные состояния и локальные переменные
Алекс замечает, что переменные в Solidity работают совершенно по-разному в зависимости от того, где они объявлены:
— «Оказывается, место объявления переменной кардинально влияет на то, как она работает, сколько стоит и как долго живет!»
Ключевые термины урока
Переменная состояния (State Variable) — переменная, объявленная на уровне контракта, которая хранится в блокчейне навсегда и доступна всем функциям контракта. Изменения таких переменных требуют значительных затрат стоимости вызова функции.
Локальная переменная (Local Variable) — переменная, объявленная внутри функции, которая существует только во время выполнения этой функции и хранится в памяти EVM. Операции с локальными переменными стоят очень мало стоимости вызова функции.
Storage — постоянное хранилище блокчейна, где хранятся переменные состояния. Каждая запись в storage стоит дорого, но данные сохраняются навсегда.
Memory — временное хранилище EVM, где хранятся локальные переменные во время выполнения функции. Операции с memory дешевые, но данные исчезают после завершения функции.
Область видимости (Scope) — часть кода, где переменная доступна для использования. Локальные переменные доступны только в пределах блока кода, где они объявлены.
Стоимость вызова функции записи в storage — затраты стоимости вызова функции на запись данных в постоянное хранилище блокчейна. Первая запись стоит ~20,000 стоимости вызова функции, последующие изменения ~5,000 стоимости вызова функции.
Оптимизация стоимости вызова функции — техника минимизации затрат на выполнение смарт-контракта путем правильного использования локальных переменных для промежуточных вычислений и минимизации операций записи в storage.
Переменные состояния — память блокчейна
Переменные состояния — это переменные, которые объявляются на уровне контракта и хранятся в блокчейне навсегда.
Синтаксис объявления переменных состояния
Переменные состояния объявляются на уровне контракта (вне функций) по следующему синтаксису:
Основные характеристики переменных состояния
- Хранятся в блокчейне — каждое изменение записывается в блок и становится частью истории
- Доступны всем функциям контракта для чтения и изменения
- Сохраняются между вызовами — значения не исчезают после выполнения функций
- Стоят дорого — каждое изменение требует стоимости вызова функции за запись в storage
- Образуют состояние контракта — именно они определяют текущее состояние смарт-контракта
Стоимость операций с переменными состояния
Алекс изучает экономику переменных состояния:
— «Вау! Первая запись в переменную стоит в 4 раза дороже последующих изменений. А обнуление переменной даже возвращает часть потраченной стоимости вызова функции!»
Локальные переменные — временные помощники
Локальные переменные — это переменные, которые объявляются внутри функций и существуют только во время выполнения этой функции.
Синтаксис объявления локальных переменных
Локальные переменные объявляются внутри функций по следующему синтаксису:
Отличия синтаксиса локальных переменных от переменных состояния:
- Расположение: Локальные переменные объявляются только внутри функций
- Модификаторы видимости: У локальных переменных НЕТ модификаторов видимости (
public, private, internal)
- Модификаторы хранилища: Для сложных типов (массивы, строки, структуры) может указываться
memory или storage
- Константы и immutable: Локальные переменные НЕ МОГУТ быть
constant или immutable
Основные характеристики локальных переменных
- Хранятся в памяти — используют временное хранилище EVM
- Живут только во время выполнения функции — создаются при входе, уничтожаются при выходе
- Дешевые в использовании — операции с ними стоят очень мало стоимости вызова функции
- Не сохраняются — значения исчезают после завершения функции
- Доступны только внутри функции где объявлены
Экономия стоимости вызова функции с локальными переменными
— «Невероятно! Использование локальных переменных для промежуточных вычислений может сэкономить треть стоимости вызова функции!»
Области видимости локальных переменных
Алекс изучает, где именно доступны локальные переменные:
Практический пример
Алекс создает простой пример, показывающий разницу между переменными состояния и локальными переменными:
Лучшие практики использования переменных
Алекс выводит правила оптимального использования переменных:
1. Используй переменные состояния для данных, которые должны сохраняться
2. Используй локальные переменные для временных вычислений
3. Минимизируй операции записи в переменные состояния
4. Объявляй переменные в нужной области видимости
— «Теперь я понимаю разницу! Переменные состояния — это как публикация информация в газете: опубликовать свой текст стоит денег, но про него узнают все, и он навсегда сохранится в истории. А локальные переменные — как листочек для черновых вычислений: дешево использовать, но подойдет только для временных записей.»
Практическое задание по переменным состояния и локальным переменным
Алекс изучил разницу между переменными состояния и локальными переменными, но теперь ему нужна практика. Он решил создать контракт системы голосования, но столкнулся с проблемой оптимизации стоимости вызова функции.
— «Я понимаю теорию, но как применить это на практике? Мой контракт голосования работает, но тратит слишком много стоимости вызова функции. Нужно оптимизировать использование переменных!»
Помоги Алексу оптимизировать контракт, правильно выбрав между переменными состояния и локальными переменными для максимальной экономии стоимости вызова функции.
Дополнительные материалы
Официальная документация