# Валидация транзакции
Каждая транзакция проходит проверку на валидность в следующих случаях:
- Нода получает транзакцию методом
broadcast
через Node REST API или gRPC Server. - Нода получает транзакцию по бинарному протоколу от другой ноды в сети.
- Генератор блока добавляет транзакцию в блок.
- Нода получает блок (или микроблок) от другой ноды в сети.
Полная валидация транзакции включает следующие проверки:
Проверка корректности полей транзакции, в том числе:
• Проверка временной метки: временная метка транзакции может отличаться от временной метки текущего блока не более чем на 2 часа назад или 1,5 часа вперед.
• Проверка версии транзакции: активированы ли все фичи, необходимые для поддержки данной версии.
• Проверка типа транзакции: активированы ли все фичи, необходимые для поддержки данного типа.
• Проверка количества токенов: значения должны быть неотрицательными.
• Проверка полей, зависящих от типа транзакции.
Проверка баланса отправителя.
Достаточно ли средств на оплату комиссии. Если используется спонсорский ассет, проверяется также баланс спонсора.
В зависимости от типа транзакции: достаточно ли средств для перевода; для перечисления платежей, приложенных к транзакции вызова скрипта; достаточно ли средств у отправителей ордеров в транзакции обмена.
Проверка подписи транзакции для обычного аккаунта, или верификация скриптом аккаунта при отправке транзакции со смарт-аккаунта, или верификация функцией-верификатором при отправке с dApp. Аналогичная проверка выполняется для ордеров в транзакции обмена.
Для транзакции вызова скрипта и Ethereum-транзакции, которая выполняет вызов dApp-скрипта:
4.1. Вычисление результата выполнения вызываемой функции.
4.2. Проверка баланса dApp: достаточно ли средств на выполнение действий скрипта.
4.3. Проверка, что комиссия за транзакцию не ниже минимальной комиссии с учетом действий скрипта.
Верификация транзакции скриптами ассетов, если в транзакции используются смарт-ассеты, включая скрипты ассетов в действиях скрипта.
При получении транзакции методом
broadcast
, при добавлении транзакции в блок, а также при получении блока по сети выполняется полная валидация. В случае получения транзакции вызова скрипта по сети выполняется только часть вычислений вызываемой функции в пределах порога для сохранения неуспешных транзакций.
# Результат валидации
При получении транзакции методом broadcast
и по сети:
- Если транзакция не прошла какую-либо из проверок, она отбрасывается.
- Если транзакция прошла все проверки, она добавляется в UTX pool — список транзакций, ожидающих попадания в блок.
При добавлении транзакции в блок результат зависит от типа транзакции.
Транзакция вызова скрипта или Ethereum-транзакция, которая выполняет вызов dApp-скрипта:
- Если транзакция не прошла одну из проверок 1–3, она отбрасывается или пропускается.
- Если транзакция успешно прошла проверки 1–3, а вычисление результата (проверка 4.1) завершилось ошибкой или выбрасыванием исключения прежде, чем сложность выполненных вычислений превысила порог для сохранения неуспешных транзакций, транзакция также отбрасывается или пропускается.
- Если транзакция прошла проверки 1–3, но не прошла проверки 4–5 (при этом результат вызываемой функции вычислен успешно либо сложность вычислений превысила порог), транзакция становится неуспешной:
"applicationStatus": "script_execution_failed"
. Транзакция сохраняется на блокчейне, с отправителя транзакции взимается комиссия. Других изменений состояния блокчейна транзакция не влечет. - Если транзакция прошла все проверки, она сохраняется на блокчейне и является успешной:
"applicationStatus": "succeeded"
, за нее также взимается комиссия.
Транзакция обмена:
- Если транзакция не прошла одну из проверок 1–3, она отбрасывается или пропускается.
- Если транзакция успешно прошла проверки 1–3, но не прошла проверку 5, транзакция становится неуспешной:
"applicationStatus": "script_execution_failed"
. Транзакция сохраняется на блокчейне, с отправителя транзакции (матчера) взимается комиссия. Других изменений в балансах транзакция не влечет, в частности, комиссия матчера с отправителей ордеров не взимается. - Если транзакция прошла все проверки, она сохраняется на блокчейне и является успешной:
"applicationStatus": "succeeded"
. Взимается как комиссия за транзакцию с матчера, так и комиссия с отправителей ордеров.
Транзакции остальных типов:
- Если транзакция не прошла какую-либо из проверок, она отбрасывается или пропускается.
- Если транзакция прошла все проверки, она сохраняется на блокчейне как успешная и за нее взимается комиссия.
# Пропуск транзакции
Транзакция из оспоренного блока может стать невалидной в оспаривающем блоке. Такая транзакция вместо отбрасывания становится пропущенной: "applicationStatus": "elided"
. Она сохраняется на блокчейне, не порождая никаких изменений состояния, в частности, балансов. Подробнее см. в разделе Waves 1.5: легкая нода.
До активации фичи № 15
До активации фичи № 15 “Ride V4, VRF, Protobuf, Failed transactions” действовал другой порядок валидации транзакций. В частности, была возможной оплата комиссии за транзакцию вызова скрипта за счет средств, переведенных dApp-скриптом отправителю.
Проверка корректности полей транзакции, в том числе:
• Проверка временной метки: временная метка транзакции может отличаться от временной метки текущего блока не более чем на 2 часа назад или 1,5 часа вперед.
• Проверка версии транзакции: активированы ли все фичи, необходимые для поддержки данной версии.
• Проверка типа транзакции: активированы ли все фичи, необходимые для поддержки данного типа.
• Проверка полей, зависящих от типа транзакции.
Проверка подписи транзакции для обычного аккаунта, или верификация скриптом аккаунта при отправке транзакции со смарт-аккаунта, или верификация функцией-верификатором при отправке с dApp. Аналогичная проверка выполняется для ордеров в транзакции обмена.
Верификация транзакции скриптами ассетов, если в транзакции используются смарт-ассеты, за исключением скриптов ассетов в действиях dApp-скрипта, которые выполняются в п. 5.
Проверка баланса отправителя.
Достаточно ли средств на оплату комиссии. Если используется спонсорский ассет, проверяется также баланс спонсора.
В зависимости от типа транзакции: достаточно ли средств для перевода; для перечисления платежей, приложенных к транзакции вызова скрипта; достаточно ли средств у отправителей ордеров в транзакции обмена.
Для транзакции вызова скрипта:
5.1. Вычисление результата вызываемой функции dApp-скрипта.
5.2. Верификация скриптами ассетов, если в действиях скрипта используются смарт-ассеты.
5.3. Проверка баланса dApp: достаточно ли средств на выполнение действий скрипта.
5.4. Проверка, что комиссия за транзакцию не ниже минимальной комиссии с учетом действий скрипта.
Транзакция сохраняется в блокчейне и за нее взимается комиссия, если она успешно прошла все проверки.