Глоссарий / Транзакции и комиссии
Сериализованная транзакция
Другие названия: Сырая транзакция.
- Что такое Сериализованная транзакция?
- Сериализованная транзакция представляет собой точную последовательность байтов, которую кошелек передает в сеть: шестнадцатеричную форму, которую каждый узел разбирает, хеширует и ретранслирует, не изменяя ни одного байта.
Определено в BIP-144.
Все удобное в транзакции, адреса, суммы в вашей местной валюте, метки, является оформлением, которое добавляет ваш кошелек. На самом деле по сети передается компактный двоичный блок данных, обычно от 200 до 250 байт для простого платежа, и он полностью самодостаточен. Скопируйте эти шестнадцатеричные данные с компьютера без подключения к сети на любой компьютер с подключением, и платеж можно будет отправить в сеть оттуда.
Как это работает
Сериализация представляет собой фиксированный порядок без имен полей, поэтому программы разбора полагаются исключительно на позицию и на префиксы длины.
Блок данных начинается с четырехбайтовой версии. Затем транзакции Segregated witness вставляют два байта-флага, 0x00 и 0x01, которые старые программы разбора прочитали бы как транзакцию с нулем входов и поэтому отклонили бы; это намеренная уловка, позволившая новому формату сосуществовать со старым. Далее идет число входов в виде целого числа compactSize, затем каждый вход: 36 байт с указанием расходуемой монеты, скрипт разблокировки с префиксом длины и четырехбайтовый порядковый номер. Затем следует число выходов, а после него каждый выход как восьмибайтовая сумма в сатоши плюс скрипт блокировки с префиксом длины. Данные свидетеля, когда они есть, находятся ближе к концу, а последние четыре байта всегда являются locktime.
Числа хранятся в порядке little endian, первым идет младший байт, поэтому сумма в 100 000 сатоши выглядит в шестнадцатеричной записи как a0 86 01 00 00 00 00 00. Хеши хранятся во внутреннем порядке байтов, обратном тому, который показывает вам обозреватель блоков, поэтому идентификаторы транзакций внутри необработанного блока данных выглядят перевернутыми.
Из этой одной структуры получаются два хеша. Идентификатор транзакции представляет собой двойной SHA-256 по сериализации без маркера, флага и свидетеля, и именно это делает подписи защищенными от искажения после подписания. Идентификатор транзакции со свидетелем, определенный в BIP141, хеширует все целиком, включая свидетеля, и узлы используют его для учета ретрансляции. Платеж native SegWit с одним входом и двумя выходами сериализуется примерно в 222 необработанных байта и считается примерно как 141 виртуальный байт, потому что часть свидетеля учитывается со скидкой.
Где это встречается
Необработанная форма появляется, как только вы выходите за пределы одного приложения, что для большинства людей означает подписание без подключения к сети или спасение платежа.
Аппаратные кошельки и изолированные от сети конфигурации экспортируют готовую транзакцию в виде шестнадцатеричных данных или QR-кода с теми же байтами, и вы вставляете их в форму отправки в сеть в обозревателе блоков, чтобы отправить платеж. Командная строка Bitcoin Core использует ее в обоих направлениях: createrawtransaction и signrawtransactionwithwallet создают шестнадцатеричные данные, decoderawtransaction превращает шестнадцатеричные данные обратно в читаемый JSON, а sendrawtransaction отправляет их в сеть. В обращениях в поддержку часто просят необработанные шестнадцатеричные данные, а не идентификатор транзакции, потому что шестнадцатеричные данные доказывают, что содержит транзакция, а не просто называют ее.
Одно замечание о безопасности. Подписанная необработанная транзакция является предъявительской информацией: любой, у кого есть шестнадцатеричные данные, может отправить ее в сеть, и ничего в ней не является конфиденциальным. Не вставляйте ее на публичный форум, прося о помощи, если только вы не согласны с тем, что платеж будет совершен.
Сериализованная транзакция vs идентификатор транзакции
Сериализованная транзакция является документом; идентификатор транзакции является ее именем файла. Одна представляет собой несколько сотен байт шестнадцатеричных данных, которые на экране могут занимать до пятисот символов, а другой всегда состоит ровно из 64 шестнадцатеричных символов.
Люди их путают, потому что оба выглядят как длинные строки шестнадцатеричных символов. Проверка состоит в длине и в том, что строка может сделать. Строку из 64 символов можно найти в обозревателе блоков и ничего больше. Более длинную строку можно декодировать в поля, и если она полностью подписана, ее может отправить в сеть любой, у кого она есть, включая незнакомца, которому вы ее отправили.