В предыдущем уроке мы увидели, как кошелёк подписывает действие.
Теперь разберём, что происходит после того, как подписанная транзакция отправляется в блокчейн.
Важно различать несколько этапов:
отправка → ожидание → включение в блок → исполнение → подтверждение
Это не одно и то же.
Что такое транзакция
Транзакция — это подписанный запрос выполнить действие, которое может изменить состояние блокчейна.
Например:
1Отправить 0.1 ETH другому адресуили:
1Вызвать функцию смарт-контрактаТранзакция содержит необходимые данные и цифровую подпись отправителя.
Но после нажатия кнопки Confirm изменение не происходит мгновенно.
Сначала транзакцию нужно принять и обработать сети.
Отправка и ожидание
Кошелёк передаёт подписанную транзакцию в сеть.
На этом этапе приложение может показать статус вроде:
1Pendingили:
1Ожидает подтвержденияЭто означает: сеть знает о транзакции, но она ещё не была окончательно включена в блок.
До попадания в блок транзакция может некоторое время находиться в ожидании.
Продолжительность зависит, например, от:
- загруженности сети;
- предлагаемой комиссии;
- правил конкретного блокчейна.
Поэтому две транзакции, отправленные почти одновременно, не обязательно будут обработаны одновременно.
Gas и комиссии
Выполнение транзакций требует ресурсов сети.
Например, узлам необходимо:
- проверить подпись;
- выполнить код;
- прочитать или изменить состояние;
- включить результат в блок.
В Ethereum стоимость этой работы измеряется с помощью gas.
Можно представить:
1Gas = количество вычислительной работыА итоговая комиссия зависит от того, сколько gas было использовано и сколько стоит единица gas.
Упрощённо:
1Комиссия ≈ использованный gas × цена gasПоэтому более сложная операция обычно требует больше вычислительных ресурсов, чем простой перевод ETH.
Простое чтение данных через приложение часто не требует отправки транзакции, а значит, и комиссии за неё.
Исполнение и откат
Когда транзакция включается в блок, сеть пытается её выполнить.
Например, транзакция может попросить смарт-контракт:
1registerMember()Тогда код этой функции будет выполнен.
Если всё прошло успешно, состояние блокчейна может измениться.
Например:
1До:23members = 1045После:67members = 11Это очень важное различие.
Кошелёк может успешно отправить транзакцию, но её выполнение всё равно может завершиться ошибкой.
Например, контракт содержит условие:
1require(balance >= amount);Если условие не выполнено, транзакция завершится с ошибкой — revert.
В таком случае изменения состояния отменяются.
То есть:
1Транзакция включена в блок2 ↓3Код выполняется4 ↓5 ┌───────────┐6 │ │7 Success Revert8 │ │9Состояние Изменения10изменилось отмененыПри этом вычислительная работа уже была выполнена, поэтому комиссия за использованный gas обычно всё равно оплачивается.
Подтверждения
После включения транзакции в блок этот блок становится частью истории сети.
По мере того как сеть продолжает строить свою историю, уверенность в результате увеличивается.
Поэтому приложения могут показывать:
11 confirmationзатем:
12 confirmations23 confirmations3...В современных сетях механизмы окончательности могут быть устроены сложнее, но для начала достаточно помнить: включение в блок означает, что транзакция уже обработана, а дальнейшее подтверждение сети повышает уверенность в окончательности результата.
Полный жизненный цикл
Упрощённо:
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-код и, если выполнение успешно, сохранит новое состояние.
Именно поэтому понимание жизненного цикла транзакции важно ещё до изучения самого языка.
Задание
Соберите жизненный цикл успешной блокчейн-транзакции — от отправки подписанного запроса до последующих подтверждений.
Один из доступных блоков содержит неверное утверждение.