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

Транзакции, комиссии и подтверждения

Различайте отправку, ожидание, исполнение и подтверждение блокчейн-транзакции.

В предыдущем уроке мы увидели, как кошелёк подписывает действие.

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

Важно различать несколько этапов:

отправка → ожидание → включение в блок → исполнение → подтверждение

Это не одно и то же.

Что такое транзакция

Транзакция — это подписанный запрос выполнить действие, которое может изменить состояние блокчейна.

Например:

1Отправить 0.1 ETH другому адресу

или:

1Вызвать функцию смарт-контракта

Транзакция содержит необходимые данные и цифровую подпись отправителя.

Но после нажатия кнопки Confirm изменение не происходит мгновенно.

Сначала транзакцию нужно принять и обработать сети.

Отправка и ожидание

Кошелёк передаёт подписанную транзакцию в сеть.

На этом этапе приложение может показать статус вроде:

1Pending

или:

1Ожидает подтверждения

Это означает: сеть знает о транзакции, но она ещё не была окончательно включена в блок.

До попадания в блок транзакция может некоторое время находиться в ожидании.

Продолжительность зависит, например, от:

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

Поэтому две транзакции, отправленные почти одновременно, не обязательно будут обработаны одновременно.

Gas и комиссии

Выполнение транзакций требует ресурсов сети.

Например, узлам необходимо:

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

В Ethereum стоимость этой работы измеряется с помощью gas.

Можно представить:

1Gas = количество вычислительной работы

А итоговая комиссия зависит от того, сколько gas было использовано и сколько стоит единица gas.

Упрощённо:

1Комиссия ≈ использованный gas × цена gas

Поэтому более сложная операция обычно требует больше вычислительных ресурсов, чем простой перевод ETH.

Простое чтение данных через приложение часто не требует отправки транзакции, а значит, и комиссии за неё.

Исполнение и откат

Когда транзакция включается в блок, сеть пытается её выполнить.

Например, транзакция может попросить смарт-контракт:

1registerMember()

Тогда код этой функции будет выполнен.

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

Например:

1До:
2
3members = 10
4
5После:
6
7members = 11

Это очень важное различие.

Кошелёк может успешно отправить транзакцию, но её выполнение всё равно может завершиться ошибкой.

Например, контракт содержит условие:

1require(balance >= amount);

Если условие не выполнено, транзакция завершится с ошибкой — revert.

В таком случае изменения состояния отменяются.

То есть:

1Транзакция включена в блок
2 ↓
3Код выполняется
4 ↓
5 ┌───────────┐
6 │ │
7 Success Revert
8 │ │
9Состояние Изменения
10изменилось отменены

При этом вычислительная работа уже была выполнена, поэтому комиссия за использованный gas обычно всё равно оплачивается.

Подтверждения

После включения транзакции в блок этот блок становится частью истории сети.

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

Поэтому приложения могут показывать:

11 confirmation

затем:

12 confirmations
23 confirmations
3...

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

Полный жизненный цикл

Упрощённо:

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

В приложениях часто встречаются статусы:

  • Pending — транзакция отправлена, но ещё ожидает обработки.
  • Success — транзакция включена и успешно выполнена.
  • Failed / Reverted — транзакция была обработана, но выполнение завершилось ошибкой.

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

Связь с Solidity

Позже вы будете писать функции вроде:

1function addMember() public {
2 members += 1;
3}

Чтобы вызвать такую функцию и изменить members, пользователь отправит транзакцию.

Затем сеть выполнит Solidity-код и, если выполнение успешно, сохранит новое состояние.

Именно поэтому понимание жизненного цикла транзакции важно ещё до изучения самого языка.

Задание

Соберите жизненный цикл успешной блокчейн-транзакции — от отправки подписанного запроса до последующих подтверждений.

Один из доступных блоков содержит неверное утверждение.

Схема

Расположите шаги от отправки подписанной транзакции до её подтверждений.

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

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