В прошлом уроке мы развернули smart contract и получили его blockchain-адрес.
Теперь с контрактом можно взаимодействовать.
Но взаимодействия бывают двух принципиально разных типов:
прочитать существующие данные
и
изменить состояние блокчейна
Это различие будет встречаться практически во всём Solidity.
Что такое состояние контракта
Состояние — это данные, которые контракт хранит в блокчейне.
Например:
1guildScore = 1002members = 123paused = falseПосле успешной транзакции эти значения могут измениться и сохраниться для следующих вызовов.
Чтение: узнать текущее значение
Иногда пользователю нужно только узнать текущее значение.
Например: какой сейчас guildScore?
Такой запрос ничего не меняет:
1До:2guildScore = 10034Читаем значение56После:7guildScore = 100Мы просто получили уже существующие данные.
Через приложение такие запросы обычно можно выполнить без отправки пользовательской транзакции.
Упрощённо:
1Приложение2 ↓3Запрос на чтение4 ↓5Blockchain node6 ↓7Текущее значениеПоскольку состояние не изменяется, новую запись в блокчейн создавать не требуется.
Изменение: сохранить новое значение
Теперь представим другое действие: увеличить guildScore на 10.
До:
1guildScore = 100После успешного выполнения:
1guildScore = 110Это уже изменение общего состояния блокчейна.
Поэтому требуется транзакция:
1Пользователь2 ↓3Подписывает транзакцию4 ↓5Сеть выполняет код6 ↓7Состояние изменяетсяТакое действие может потребовать gas и должно быть подтверждено сетью.
Блокчейн хранит общее состояние, с которым должны согласиться участники сети.
Если мы только спрашиваем: какое значение уже хранится? — ничего нового сохранять не нужно.
Но если мы говорим: измени значение со 100 на 110 — сеть должна выполнить операцию и зафиксировать новое состояние.
Поэтому:
1Чтение → получить существующие данные23Изменение → выполнить транзакцию и сохранить новое состояниеПример с guildScore
Представим smart contract с числом:
1uint256 public guildScore = 100;Пользователь может захотеть просто узнать:
1guildScore?Ответ:
1100Состояние не изменилось.
Но если контракт предоставляет действие:
1addScore(10)то после успешной транзакции значение может стать:
1110Теперь состояние изменилось.
Важно понимать: отсутствие транзакции не означает, что никакой код вообще не выполняется.
Blockchain node может выполнить функцию локально, чтобы вычислить ответ.
Разница в другом: результат такого чтения не записывает новое состояние в блокчейн.
Функции чтения и изменения
Позже в Solidity вы встретите функции с ключевыми словами view и pure.
Они связаны с операциями, которые не изменяют состояние. Пока запоминать точные правила не нужно.
Если функция меняет state variable, например:
1members = members + 1;результат должен стать частью общего состояния. Поэтому пользователь отправляет транзакцию.
Она:
- 1.подписывается;
- 2.отправляется в сеть;
- 3.выполняется;
- 4.может использовать gas;
- 5.после успеха изменяет состояние.
Запомните простое правило:
Хочу узнать → чтение.
Хочу изменить → транзакция.
Например:
1Узнать баланс → чтение2Узнать guildScore → чтение3Посмотреть owner → чтение45Изменить guildScore → транзакция6Зарегистрировать участника → транзакция7Отправить ETH → транзакцияКак это выглядит в dApp
В dApp это может выглядеть очень по-разному.
Кнопка «Показать мой баланс» может сразу получить данные.
А действие «Join Guild» может открыть кошелёк и попросить подтвердить транзакцию.
Поэтому некоторые кнопки blockchain-приложения работают мгновенно, а другие вызывают MetaMask или другой кошелёк.
В основном курсе вы будете создавать и те, и другие функции.
Одни будут только возвращать данные. Другие будут изменять состояние контракта.
Например:
1function getScore() public view returns (uint256) {2 return guildScore;3}только читает состояние.
А функция вида:
1function increaseScore() public {2 guildScore += 1;3}изменяет его.
Пока не нужно запоминать синтаксис. Главное — понять разницу между двумя действиями.
Чтение получает уже существующие данные и не сохраняет новое состояние.
Изменение состояния требует blockchain-транзакции.
Именно поэтому чтение и запись в smart contracts имеют разную стоимость и разный пользовательский flow.
Задание
Разделите чтение и изменение состояния.
Расположите действия в правильной последовательности для изменения состояния smart contract.
Один из блоков относится только к чтению данных и не должен входить в этот путь.