# Бинарный формат транзакции
Подробнее о транзакции.
Транзакции хранятся на блокчейне в бинарном формате (байтовом представлении). Расширения ноды, в частности gRPC-сервер, могут работать непосредственно с данными в бинарном формате.
Подпись транзакции и ее идентификатор также формируются на основе бинарного формата, а именно байтов тела транзакции. Состав байтов тела транзакции приведен в описании бинарного формата каждого типа и версии транзакции. Как правило, к байтам тела транзакции относятся все поля транзакции, за исключением:
- идентификатора транзакции (он не хранится на блокчейне),
- флага версии,
- подтверждений (
proofs
) или подписи (signature
), в зависимости от версии транзакции.
Правила генерации подписи и идентификатора транзакции рассмотрены в разделе Cryptographic practical details.
Для всех строк используется кодировка UTF-8.
# Protobuf-схема
Бинарный формат старших версий транзакции соответствует protobuf-схеме transaction.proto. Использование Protobuf облегчает разработку клиентских библиотек для блокчейна Waves, поскольку позволяет избежать ошибок при сериализации и упрощает создание корректно подписанной транзакции.
Как сгенерировать подпись транзакции с помощью Protobuf:
Скачайте компилятор Protocol Buffers для вашего языка программирования и сгенерируйте класс
Transaction
на основе схемыtransaction.proto
.Заполните поля транзакции.
⚠️ Обратите внимание:
• Идентификаторы ассетов нужно указывать в бинарном формате.
• Адреса также нужно указывать в бинарном формате, в сжатом виде (без первых двух и последних четырех байт). См. раздел Бинарный формат адреса.
Вызовите функцию сериализации, чтобы получить байты тела транзакции.
Подробные инструкции для различных языков программирования приведены в разделе Tutorials документации Protocol Buffers.
Сгенерируйте подпись байтов тела транзакции с помощью функции 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 транзакции.