Начинаем с основ · урок 6

Контракт как публичная программа с правилами

Узнайте, как смарт-контракт проверяет правила, меняет состояние и фиксирует результат в блокчейне.

В предыдущих уроках мы увидели, как транзакция попадает в блокчейн и может изменить общее состояние сети.

Теперь разберём, что именно происходит, когда транзакция вызывает смарт-контракт.

Что такое смарт-контракт

Смарт-контракт — это программа, размещённая в блокчейне.

Она может:

  • хранить данные;
  • принимать вызовы;
  • проверять условия;
  • изменять своё состояние;
  • отправлять ETH или взаимодействовать с другими контрактами.

Например, контракт курса может хранить количество выполненных заданий:

ini
1completedTasks = 3

После успешного действия пользователя состояние может измениться:

ini
1completedTasks = 4

Что такое состояние

Состояние контракта — это данные, которые сохраняются между вызовами.

Например:

ini
1owner = 0xA1...
2members = 42
3paused = false

Эти значения не исчезают после завершения одной транзакции.

Именно изменение состояния делает многие вызовы смарт-контрактов значимыми для блокчейна.

Что такое функция контракта

Смарт-контракт предоставляет функции — действия, которые можно вызвать.

Например:

javascript
1function completeQuest() public {
2 completedTasks += 1;
3}

Пользователь не “редактирует переменную напрямую”.

Он вызывает функцию, а уже код функции решает:

  • разрешено ли действие;
  • какие проверки нужно выполнить;
  • как именно изменить состояние.

Контракт сначала проверяет правила

Представим, что награду можно получить только один раз.

Контракт может проверить условие:

scss
1require(!claimed[msg.sender]);

Если условие выполняется, контракт продолжает работу.

Если нет — выполнение прерывается.

То есть логика выглядит так:

1Запрос пользователя
2 ↓
3Проверка условий
4 ↓
5 Можно / Нельзя

Если проверка прошла

После успешной проверки контракт может изменить своё состояние.

Например:

sql
1claimed[user] = true

или:

ini
1balance = balance - 10

После успешного выполнения результат фиксируется в блокчейне.

Полный путь вызова

Упрощённо:

11. Пользователь вызывает функцию
2 ↓
32. Контракт получает входные данные
4 ↓
53. Контракт проверяет правила
6 ↓
74. Выполняет нужные действия
8 ↓
95. Обновляет состояние
10 ↓
116. Сеть фиксирует результат

Если одна из проверок не проходит, изменение состояния не сохраняется.

Чем смарт-контракт отличается от обычного сервера

Обычный серверный код контролируется владельцем приложения.

Команда может:

  • изменить код;
  • перезапустить сервер;
  • исправить данные;
  • изменить правила доступа.

Смарт-контракт после развёртывания работает по опубликованной логике.

Пользователь может сам проверить код и правила, по которым контракт принимает решения.

Это одна из причин, почему ошибки в смарт-контрактах особенно опасны: нельзя рассчитывать, что администратор просто “починит всё на сервере”.

Публичный код не означает безопасный код

То, что код доступен для проверки, не означает, что в нём нет ошибок.

Смарт-контракт может содержать:

  • логические ошибки;
  • неправильные проверки доступа;
  • уязвимости;
  • неверную работу с деньгами;
  • неожиданные способы взаимодействия.

Поэтому безопасность становится особенно важной частью Solidity-разработки.

Откуда контракт получает данные

Контракт хорошо знает данные самого блокчейна.

Например:

  • кто вызвал функцию;
  • сколько ETH было отправлено;
  • текущее состояние контракта;
  • номер блока;
  • время блока.

Но он не может сам открыть сайт и узнать:

1курс ETH/USD
2погоду
3результат футбольного матча

Для внешних данных нужны специальные механизмы и источники, например оракулы.

Эту тему можно изучить позже.

Связь с Solidity

Когда мы начнём писать Solidity, почти каждая задача будет строиться вокруг трёх вещей:

1Входные данные
2 ↓
3Проверки
4 ↓
5Изменение состояния

Например:

javascript
1function joinGuild() public {
2 require(!members[msg.sender]);
3 members[msg.sender] = true;
4}

Даже если синтаксис пока незнаком, идея уже должна быть понятна:

проверить правило → изменить состояние.

Задание

Соберите путь успешного изменения состояния смарт-контракта.

Один из блоков описывает действие, которого в нормальной модели происходить не должно.

Схема

Соберите путь исполнения действия смарт-контракта.

Добавьте первый блок
Доступные блоки

Войдите, чтобы сохранить прохождение.