waves_logo Docs
  • Почему Waves
    Почему Waves
  • Основные понятия
    Основные понятия
  • Аккаунт
    • Создание аккаунта
      Создание аккаунта
    • Адрес
      Адрес
    • Баланс аккаунта
      Баланс аккаунта
    • Хранилище данных аккаунта
      Хранилище данных аккаунта
    • Псевдоним
      Псевдоним
    • dApp и смарт-аккаунт
      dApp и смарт-аккаунт
    Аккаунт
  • Токен (ассет)
    • NFT: невзаимозаменяемый токен
      NFT: невзаимозаменяемый токен
    • Смарт-ассет
      Смарт-ассет
    • ID токена
      ID токена
    • WAVES
      WAVES
    Токен (ассет)
  • Транзакция
    • Комиссия за транзакцию
      • Спонсирование комиссии
        Спонсирование комиссии
      Комиссия за транзакцию
    • Подпись и подтверждения
      Подпись и подтверждения
    • Типы транзакций
      • Вызов скрипта
        Вызов скрипта
      • Выпуск
        Выпуск
      • Генезис
        Генезис
      • Данные
        Данные
      • Довыпуск
        Довыпуск
      • Закрытие лизинга
        Закрытие лизинга
      • Лизинг
        Лизинг
      • Массовый перевод
        Массовый перевод
      • Обмен
        • Ордер
          Ордер
        Обмен
      • Обновление информации ассета
        Обновление информации ассета
      • Перевод
        Перевод
      • Сжигание токена
        Сжигание токена
      • Cоздание псевдонима
        Cоздание псевдонима
      • Спонсирование
        Спонсирование
      • Установка скрипта
        Установка скрипта
      • Установка скрипта ассета
        Установка скрипта ассета
      • Ethereum-like транзакция
        Ethereum-like транзакция
      Типы транзакций
    • Валидация транзакции
      Валидация транзакции
    Транзакция
  • Блок
    • Корневой хеш транзакций
      Корневой хеш транзакций
    • Блок генезиса
      Блок генезиса
    Блок
  • Нода
    • Лизинг
      Лизинг
    • Доход генератора блока
      Доход генератора блока
    • Монетарная политика
      Монетарная политика
    Нода
  • Mainnet, Testnet, Stagenet
    Mainnet, Testnet, Stagenet
  • Unit Zero
    Unit Zero
  • Оракул
    Оракул
  • Протоколы и форматы данных
    • [en] Cryptographic practical details
      [en] Cryptographic practical details
    • Leased Proof of Stake
      Leased Proof of Stake
    • [en] Waves-NG solution
      [en] Waves-NG solution
    • Протокол Waves-NG
      Протокол Waves-NG
    • Waves 1.5
      Waves 1.5
    • Типы данных блокчейна
      Типы данных блокчейна
    • Бинарные форматы
      • Бинарный формат адреса
        Бинарный формат адреса
      • Бинарный формат псевдонима
        Бинарный формат псевдонима
      • Бинарный формат блока
        Бинарный формат блока
      • [en] Network message binary format
        • [en] Block message binary format
          [en] Block message binary format
        • [en] Checkpoint message binary format
          [en] Checkpoint message binary format
        • [en] Get block message binary format
          [en] Get block message binary format
        • [en] Get peers message binary format
          [en] Get peers message binary format
        • [en] Get signatures message binary format
          [en] Get signatures message binary format
        • [en] Handshake message binary format
          [en] Handshake message binary format
        • [en] Peers message binary format
          [en] Peers message binary format
        • [en] Score message binary format
          [en] Score message binary format
        • [en] Signatures message binary format
          [en] Signatures message binary format
        • [en] Transaction message binary format
          [en] Transaction message binary format
        [en] Network message binary format
      • Бинарный формат ордера
        Бинарный формат ордера
      • Бинарный формат транзакции
        • Вызов скрипта
          Вызов скрипта
        • Выпуск
          Выпуск
        • Генезис
          Генезис
        • Данные
          Данные
        • Довыпуск
          Довыпуск
        • Лизинг
          Лизинг
        • Массовый перевод
          Массовый перевод
        • Обмен
          Обмен
        • Обновление информации ассета
          Обновление информации ассета
        • Отмена лизинга
          Отмена лизинга
        • Сжигание токена
          Сжигание токена
        • Cоздание псевдонима
          Cоздание псевдонима
        • Спонсирование
          Спонсирование
        • Перевод
          Перевод
        • Установка скрипта
          Установка скрипта
        • Установка скрипта ассета
          Установка скрипта ассета
        • Ethereum-like
          Ethereum-like
        Бинарный формат транзакции
      • Бинарный формат подтверждений
        Бинарный формат подтверждений
      Бинарные форматы
    • [en] Validation rules
      [en] Validation rules
    Протоколы и форматы данных
  • Термины
    Термины
      • English
      • Русский
      On this page
      waves_logo Docs

          # Валидация транзакции

          Каждая транзакция проходит проверку на валидность в следующих случаях:

          • Нода получает транзакцию методом broadcast через Node REST API или gRPC Server.
          • Нода получает транзакцию по бинарному протоколу от другой ноды в сети.
          • Генератор блока добавляет транзакцию в блок.
          • Нода получает блок (или микроблок) от другой ноды в сети.

          Полная валидация транзакции включает следующие проверки:

          1. Проверка корректности полей транзакции, в том числе:

            • Проверка временной метки: временная метка транзакции может отличаться от временной метки текущего блока не более чем на 2 часа назад или 1,5 часа вперед.

            • Проверка версии транзакции: активированы ли все фичи, необходимые для поддержки данной версии.

            • Проверка типа транзакции: активированы ли все фичи, необходимые для поддержки данного типа.

            • Проверка количества токенов: значения должны быть неотрицательными.

            • Проверка полей, зависящих от типа транзакции.

          2. Проверка баланса отправителя.

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

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

          3. Проверка подписи транзакции для обычного аккаунта, или верификация скриптом аккаунта при отправке транзакции со смарт-аккаунта, или верификация функцией-верификатором при отправке с dApp. Аналогичная проверка выполняется для ордеров в транзакции обмена.

          4. Для транзакции вызова скрипта и Ethereum-транзакции, которая выполняет вызов dApp-скрипта:

            4.1. Вычисление результата выполнения вызываемой функции.

            4.2. Проверка баланса dApp: достаточно ли средств на выполнение действий скрипта.

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

          5. Верификация транзакции скриптами ассетов, если в транзакции используются смарт-ассеты, включая скрипты ассетов в действиях скрипта.

          При получении транзакции методом 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-скриптом отправителю.

          1. Проверка корректности полей транзакции, в том числе:

            • Проверка временной метки: временная метка транзакции может отличаться от временной метки текущего блока не более чем на 2 часа назад или 1,5 часа вперед.

            • Проверка версии транзакции: активированы ли все фичи, необходимые для поддержки данной версии.

            • Проверка типа транзакции: активированы ли все фичи, необходимые для поддержки данного типа.

            • Проверка полей, зависящих от типа транзакции.

          2. Проверка подписи транзакции для обычного аккаунта, или верификация скриптом аккаунта при отправке транзакции со смарт-аккаунта, или верификация функцией-верификатором при отправке с dApp. Аналогичная проверка выполняется для ордеров в транзакции обмена.

          3. Верификация транзакции скриптами ассетов, если в транзакции используются смарт-ассеты, за исключением скриптов ассетов в действиях dApp-скрипта, которые выполняются в п. 5.

          4. Проверка баланса отправителя.

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

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

          5. Для транзакции вызова скрипта:

            5.1. Вычисление результата вызываемой функции dApp-скрипта.

            5.2. Верификация скриптами ассетов, если в действиях скрипта используются смарт-ассеты.

            5.3. Проверка баланса dApp: достаточно ли средств на выполнение действий скрипта.

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

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

          Ethereum-like транзакция
          Блок
          Ethereum-like транзакция
          Блок