В предыдущих уроках мы увидели, как транзакция попадает в блокчейн и может изменить общее состояние сети.
Теперь разберём, что именно происходит, когда транзакция вызывает смарт-контракт.
Что такое смарт-контракт
Смарт-контракт — это программа, размещённая в блокчейне.
Она может:
- хранить данные;
- принимать вызовы;
- проверять условия;
- изменять своё состояние;
- отправлять ETH или взаимодействовать с другими контрактами.
Например, контракт курса может хранить количество выполненных заданий:
1completedTasks = 3После успешного действия пользователя состояние может измениться:
1completedTasks = 4Что такое состояние
Состояние контракта — это данные, которые сохраняются между вызовами.
Например:
1owner = 0xA1...2members = 423paused = falseЭти значения не исчезают после завершения одной транзакции.
Именно изменение состояния делает многие вызовы смарт-контрактов значимыми для блокчейна.
Что такое функция контракта
Смарт-контракт предоставляет функции — действия, которые можно вызвать.
Например:
1function completeQuest() public {2 completedTasks += 1;3}Пользователь не “редактирует переменную напрямую”.
Он вызывает функцию, а уже код функции решает:
- разрешено ли действие;
- какие проверки нужно выполнить;
- как именно изменить состояние.
Контракт сначала проверяет правила
Представим, что награду можно получить только один раз.
Контракт может проверить условие:
1require(!claimed[msg.sender]);Если условие выполняется, контракт продолжает работу.
Если нет — выполнение прерывается.
То есть логика выглядит так:
1Запрос пользователя2 ↓3Проверка условий4 ↓5 Можно / НельзяЕсли проверка прошла
После успешной проверки контракт может изменить своё состояние.
Например:
1claimed[user] = trueили:
1balance = balance - 10После успешного выполнения результат фиксируется в блокчейне.
Полный путь вызова
Упрощённо:
11. Пользователь вызывает функцию2 ↓32. Контракт получает входные данные4 ↓53. Контракт проверяет правила6 ↓74. Выполняет нужные действия8 ↓95. Обновляет состояние10 ↓116. Сеть фиксирует результатЕсли одна из проверок не проходит, изменение состояния не сохраняется.
Чем смарт-контракт отличается от обычного сервера
Обычный серверный код контролируется владельцем приложения.
Команда может:
- изменить код;
- перезапустить сервер;
- исправить данные;
- изменить правила доступа.
Смарт-контракт после развёртывания работает по опубликованной логике.
Пользователь может сам проверить код и правила, по которым контракт принимает решения.
Это одна из причин, почему ошибки в смарт-контрактах особенно опасны: нельзя рассчитывать, что администратор просто “починит всё на сервере”.
Публичный код не означает безопасный код
То, что код доступен для проверки, не означает, что в нём нет ошибок.
Смарт-контракт может содержать:
- логические ошибки;
- неправильные проверки доступа;
- уязвимости;
- неверную работу с деньгами;
- неожиданные способы взаимодействия.
Поэтому безопасность становится особенно важной частью Solidity-разработки.
Откуда контракт получает данные
Контракт хорошо знает данные самого блокчейна.
Например:
- кто вызвал функцию;
- сколько ETH было отправлено;
- текущее состояние контракта;
- номер блока;
- время блока.
Но он не может сам открыть сайт и узнать:
1курс ETH/USD2погоду3результат футбольного матчаДля внешних данных нужны специальные механизмы и источники, например оракулы.
Эту тему можно изучить позже.
Связь с Solidity
Когда мы начнём писать Solidity, почти каждая задача будет строиться вокруг трёх вещей:
1Входные данные2 ↓3Проверки4 ↓5Изменение состоянияНапример:
1function joinGuild() public {2 require(!members[msg.sender]);3 members[msg.sender] = true;4}Даже если синтаксис пока незнаком, идея уже должна быть понятна:
проверить правило → изменить состояние.
Задание
Соберите путь успешного изменения состояния смарт-контракта.
Один из блоков описывает действие, которого в нормальной модели происходить не должно.