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

          # Бинарный формат транзакции

          Подробнее о транзакции.

          Транзакции хранятся на блокчейне в бинарном формате (байтовом представлении). Расширения ноды, в частности gRPC-сервер, могут работать непосредственно с данными в бинарном формате.

          Подпись транзакции и ее идентификатор также формируются на основе бинарного формата, а именно байтов тела транзакции. Состав байтов тела транзакции приведен в описании бинарного формата каждого типа и версии транзакции. Как правило, к байтам тела транзакции относятся все поля транзакции, за исключением:

          • идентификатора транзакции (он не хранится на блокчейне),
          • флага версии,
          • подтверждений (proofs) или подписи (signature), в зависимости от версии транзакции.

          Правила генерации подписи и идентификатора транзакции рассмотрены в разделе Cryptographic practical details.

          Для всех строк используется кодировка UTF-8.

          # Protobuf-схема

          Бинарный формат старших версий транзакции соответствует protobuf-схеме transaction.proto . Использование Protobuf облегчает разработку клиентских библиотек для блокчейна Waves, поскольку позволяет избежать ошибок при сериализации и упрощает создание корректно подписанной транзакции.

          Как сгенерировать подпись транзакции с помощью Protobuf:

          1. Скачайте компилятор Protocol Buffers для вашего языка программирования и сгенерируйте класс Transaction на основе схемы transaction.proto.

          2. Заполните поля транзакции.

            ⚠️ Обратите внимание:

            • Идентификаторы ассетов нужно указывать в бинарном формате.

            • Адреса также нужно указывать в бинарном формате, в сжатом виде (без первых двух и последних четырех байт). См. раздел Бинарный формат адреса.

          3. Вызовите функцию сериализации, чтобы получить байты тела транзакции.

            Подробные инструкции для различных языков программирования приведены в разделе Tutorials документации Protocol Buffers.

          4. Сгенерируйте подпись байтов тела транзакции с помощью функции Curve25519 , используя байты закрытого ключа отправителя транзакции.

          ⚠️ Байтовое представление транзакции на основе protobuf-схемы должно содержать только значения, отличные от значений по умолчанию. Убедитесь, что используемый вами компилятор Protocol Buffers при сериализации не записывает значение поля, если оно равно значению по умолчанию для этого типа данных, иначе подпись транзакции получится невалидной. Значения по умолчанию приведены в разделе Default Values документации Protocol Buffers.

          Чтобы отправить подписанную транзакцию на ноду:

          • Если вы используете собственную ноду и gRPC-сервер, отправьте объект SignedTransaction.
          • Если вы используете Node REST API, сформируйте JSON-представление транзакции. Подпись укажите в массиве proofs в кодировке base58. Передайте подписанную транзакцию с помощью метода POST /transactions/broadcast.

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

          message SignedTransaction {
              oneof transaction {
                  Transaction waves_transaction = 1;
                  bytes ethereum_transaction = 3;
              }
          }
          
          message Transaction {
              int32 chain_id = 1;
              bytes sender_public_key = 2;
              Amount fee = 3;
              int64 timestamp = 4;
              int32 version = 5;
          
              oneof data {
                  GenesisTransactionData genesis = 101;
                  PaymentTransactionData payment = 102;
                  IssueTransactionData issue = 103;
                  TransferTransactionData transfer = 104;
                  ReissueTransactionData reissue = 105;
                  BurnTransactionData burn = 106;
                  ExchangeTransactionData exchange = 107;
                  LeaseTransactionData lease = 108;
                  LeaseCancelTransactionData lease_cancel = 109;
                  CreateAliasTransactionData create_alias = 110;
                  MassTransferTransactionData mass_transfer = 111;
                  DataTransactionData data_transaction = 112;
                  SetScriptTransactionData set_script = 113;
                  SponsorFeeTransactionData sponsor_fee = 114;
                  SetAssetScriptTransactionData set_asset_script = 115;
                  InvokeScriptTransactionData invoke_script = 116;
                  UpdateAssetInfoTransactionData update_asset_info = 117;
              };
          };
          
          message Amount {
              bytes asset_id = 1;
              int64 amount = 2;
          };
          
          Поле Размер Описание
          chain_id 1 байт Байт сети
          sender_public_key 32 байта Открытый ключ аккаунта отправителя транзакции
          fee.amount 8 байт Комиссия за транзакцию в минимальных единицах («копейках») ассета
          fee.asset_id • 32 байта, если комиссия в спонсорском ассете
          • 0, если комиссия в WAVES
          ID токена комиссии.
          Комиссия в спонсорском ассете доступна только для транзакций вызова скрипта и транзакций перевода. См. раздел Спонсирование комиссии
          timestamp 8 байт Временная метка транзакции: Unix-время в миллисекундах. Транзакция не будет добавлена в блокчейн, если значение временной метки транзакции отличается от временной метки текущего блока более чем на 2 часа назад или 1,5 часа вперед.
          version 1 байт Версия транзакции
          proofs Размер каждого подтверждения — до 64 байт,
          до 8 подтверждений
          Подтверждения транзакции, используемые для проверки валидности. Массив может содержать подписи транзакции (но не ограничивается только подписями)

          Описание полей, зависящих от типа транзакции, представлено в следующих разделах:

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

          Поле ethereum_transaction содержит байты Ethereum-like транзакции целиком. Подробнее в статье Бинарный формат Ethereum-like транзакции.

          Бинарный формат ордера
          Вызов скрипта
          Бинарный формат ордера
          Вызов скрипта