Перейти к содержимому
buybitcoinsmart

Глоссарий / Справочник разработчика

Внутренний порядок байтов

Что такое Внутренний порядок байтов?
Внутренний порядок байтов представляет собой порядок, который биткоин использует внутри сериализованных структур: целые числа записываются начиная с младшего байта, а хеш-дайджесты записываются в том порядке, в каком их создал SHA-256.

Под одним названием скрываются два соглашения. Каждое целочисленное поле транзакции или заголовка блока записано в порядке little endian, поэтому номер версии 2 записывается как 02000000, а каждый хеш в 32 байта находится в необработанных данных ровно в том виде, в каком его выдала хеш-функция. Инструменты, ориентированные на человека, переворачивают эти хеши перед выводом, и это самая частая причина расхождения написанного вручную парсера с обозревателем блоков.

Как это работает

Внутренний порядок байтов проще всего освоить, разобрав заголовок блока генезиса размером 80 байт, поскольку каждое поле в нем достаточно мало, чтобы проверить его на глаз.

Он начинается с 01000000, номера версии 1 в четырех байтах little endian. Затем идут 32 нулевых байта, потому что у первого блока нет родителя. Затем корень дерева Меркла, хранящийся как 3ba3edfd7a7b12b27ac72c3e67768f617fc81bc3888a51323a9fb8aa4b1e5e4a, то есть дайджест, который каждый обозреватель печатает как 4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b, записанный байт за байтом в обратном порядке. Затем 29ab5f49, метка времени 1231006505, то есть 18:15:05 UTC 3 января 2009 года. Затем ffff001d, поле сложности, логическое значение которого равно 0x1d00ffff. Затем 1dac2b7c, нонс 2083236893.

К суммам применяется то же правило. Один биткоин равен 100 000 000 сатоши, и выход, выплачивающий ровно столько, содержит восемь байт 00e1f50500000000.

Причина носит исторический и довольно обыденный характер. Биткоин писали для машин x86, которые хранят целые числа начиная с младшего байта, и самый ранний код выводил структуры в том порядке, в каком их уже держал процессор. Хеши не переворачивались никогда. Изменился вывод, потому что Bitcoin Core хранит дайджест в классе, который трактует его как одно огромное число, а числа печатаются со старшей частью слева.

Где это встречается

Внутренний порядок байтов получается всякий раз, когда инструмент выдает необработанные байты вместо отформатированного ответа.

Запросите транзакцию с помощью getrawtransaction без флага verbose или заголовок с помощью getblockheader с verbose, равным false, и все внутри придет в этом порядке. То же касается PSBT, экспортированного аппаратным кошельком, шестнадцатеричной строки за вкладкой необработанных данных в обозревателе и файлов блоков в каталоге blocks узла.

Чаще всего спотыкаются на поле outpoint в начале каждого входа. Оно называет расходуемую транзакцию 32 байтами, которые читаются как перевернутый идентификатор, показанный обозревателем. Ничего не повреждено, если эти две строки не совпадают: переверните одну, и они совпадут.

Внутренний порядок байтов vs порядок байтов RPC

Внутренний порядок байтов и порядок байтов RPC описывают одни и те же 32 байта в противоположных направлениях, и правило перевода между ними содержит одно важное исключение. Хеш-дайджесты переворачиваются на пути к человеку и переворачиваются снова на пути обратно. Целые числа не переворачиваются. Высота блока, метка времени и сумма в сатоши выводятся как обычные десятичные числа, и переворот любого из них на входе или на выходе дает просто неверное значение, а не иначе записанное. Переворачивайте хеши и ничего больше, и большинство ошибок порядка байтов исчезнет.

Не путать с

Часто задаваемые вопросы

Почему хеши выглядят перевернутыми внутри необработанной транзакции?

Они не перевернуты, перевернута печатная версия. Дайджест хранится в том порядке, в каком его создал SHA-256, а инструменты отображения переворачивают его, потому что Bitcoin Core трактует хеш как одно большое число и печатает старшую часть первой.

Переворачивать ли каждое поле при разборе необработанных данных биткоина?

Нет. Целые числа записаны в порядке little endian и читаются как таковые, а хеши в 32 байта являются единственными значениями, которые переворачиваются, и только тогда, когда их нужно сравнить с тем, что показывает обозреватель блоков или вызов RPC.

Читайте далее

Связанные термины

Еще в разделе «Справочник разработчика»

Читать эту страницу на английском