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
        • Как вычисляется transactionsRoot
        • Как доказывается присутствие транзакции в блоке
        • Инструменты
      waves_logo Docs

          # Корневой хеш транзакций

          Поле transactionsRoot в заголовке блока представляет собой корневой хеш дерева Меркла транзакций блока. Корневой хеш является доказательством того, что все транзакции присутствуют в блоке в заданном порядке.

          Корневой хеш транзакций в заголовке блоке позволяет:

          • Предоставлять доказательство присутствия транзакции в блоке без предъявления всех транзакций.
          • Подписывать только заголовок блока, отдельно от транзакций.

          Поле transactionsRoot появилось в заголовке блока с момента активации фичи № 15 “Ride V4, VRF, Protobuf, Failed transactions”.

          # Как вычисляется transactionsRoot

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

            HA = hash(TA)

            HB = hash(TB)

            и т.д.

          2. Хеши объединяются попарно, вычисляется хеш каждого объединения:

            HAB = hash(HA + HB)

            Если количество хешей нечетное, последний хеш объединяется с хешем нулевого байта:

            HGH = hash(HG + hash(0))

          3. Шаг 2 повторяется, пока не будет получен корневой хеш:

            HABCDEFGH

            Этот хеш записывается в поле transactionsRoot.

          Если блок пустой, то transactionsRoot = hash(0).

          В блокчейне Waves для хеширования используется алгоритм BLAKE2b-256 .

          # Как доказывается присутствие транзакции в блоке

          Допустим, на стороне 1 имеется полная копия блокчейна, а на стороне 2 — только заголовки блоков.

          Для доказательства присутствия транзакции в блоке сторона 1 предоставляет стороне 2 следующие данные:

          • T — проверяемую транзакцию;
          • merkleProofs — массив соседних хешей (верхних хешей соседних веток) на каждом уровне, снизу вверх;
          • index — порядковый номер транзакции в блоке.

          Например, для транзакции TD:

          • merkleProofs = [ HС, HAB, HEFGH ]
          • index = 3

          Сторона 2 проверяет предоставленные доказательства:

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

            HD = hash(TD)

          2. Объединяет текущий хеш с соответствующим соседним хешем из массива merkleProofs, вычисляет хеш объединения.

            index позволяет определить, в каком порядке объединять хеши:

            • Если n-й бит числа index с конца равен 0, то порядок такой: текущий хеш + n-й хеш массива merkleProofs (хеш из массива справа). • Если n-й бит равен 1, то порядок такой: n-й хеш массива merkleProofs + текущий хеш (хеш из массива слева).

            Например, index = 310 = 112, поэтому:

            • merkleProofs[0] = HС cлева, • merkleProofs[1] = HAB слева, • merkleProofs[2] = HEFGH справа.

          3. Повторяет шаг 2, пока не будет получен корневой хеш:

            HABCDEFGH

          4. Сравнивает полученный корневой хеш с полем transactionsRoot в заголовке блока. Если хеши совпали, значит, транзакция присутствует в блоке.

          # Инструменты

          Следующие методы Node API принимают на вход идентификаторы транзакций и для каждой транзакции предоставляют доказательства присутствия в блоке:

          • GET /transactions/merkleProof
          • POST /transactions/merkleProof

          Описание методов см. в разделе Транзакции.

          Для проверки присутствия транзакции на том же блокчейне нет необходимости использовать корневой хеш транзакций, поскольку нода Waves хранит полную копию блокчейна, включающую все транзакции. Можно использовать функцию Ride:

          transactionHeightById(id: ByteVector): Int|Unit
          

          Функция возвращает высоту блока транзакции, если транзакция с таким id присутствует на блокчейне, и unit в противном случае. Описание функции см. в разделе Функции блокчейна.

          Для проверки присутствия транзакции в блоке на другом блокчейне можно использовать функцию Ride:

          createMerkleRoot(merkleProofs: List[ByteVector], valueBytes: ByteVector, index: Int): ByteVector
          

          Эта функция применима при условии, что другой блокчейн использует такой же алгоритм вычисления корневого хеша транзакций; в частности, для всех Waves-based блокчейнов. Функция createMerkleRoot вычисляет корневой хеш по предоставленным доказательствам и хешу транзакции (шаги 1–3). Чтобы проверить наличие транзакции в блоке, остается сравнить вычисленный хеш с полем transactionsRoot в заголовке блока. Описание функции см. в разделе Функции верификации.

          Блок
          Блок генезиса
          Блок
          Блок генезиса