Это перевод, оригинал статьи принадлежит Coding Enthusiast. Спасибо за полезную информацию!6 различных методов представления целых чисел в блокчейне BTCВозможно вы знайте, что в блокчейне биткойна используется много числовых значений, каждое из которых представляет разные данные: версию, длину скрипта, время блокировки, ... и поскольку блок - это просто последовательность байтов) которая передается между узлами. Узлы должны преобразовать эти целочисленные значения в строки (байтовые массивы) и обратно.
Возможно, никогда не замечали, что в биткойне в зависимости от того, что представляет собой целое число, выбирается другой подход для его преобразования в байты, что приводит к 6 различным способам кодирования целых чисел!
Вот пример транзакции из
BIP-143, содержащей 5 из 6 методов, перечисленных ниже, каждый из которых выделен в соответствии с их типом:
01000000000102fff7f7881a8099afa6940d42d1e7f6362bec38171ea3edf433541db4e4ad969f
00000000494830450221008b9d1dc26ba6a9cb62127b02742fa9d754cd3bebf337f7a55d114c8e
5cdd30be022040529b194ba3f9281a99f2b1c0a19c0489bc22ede944ccf4ecbab4cc618ef3ed01
eeffffffef51e1b804cc89d182d279655c3aa89e815b1b309fe287d9b2b55d57b90ec68a010000
0000ffffffff02202cb206000000001976a9148280b37df378db99f66f85c95a783a76ac7a6d59
88ac9093510d000000001976a9143bde42dbee7e4dbe6a21b2d50ce2f0167faa815988ac000247
304402203609e17b84f6a7d30c80bfa610b5b4542f32a8a0d5447a12fb1366d7f01cc44a022057
3a954c4518331561406f90300e8f3358f51928d43c212a8caed02de67eebee0121025476c2e831
88368da1ff3e292e7acafcdb3566bb0ad253f62fc70f07aeee635711000000
1. Фиксированная длина little endianЭто самый простой и распространенный способ. Он используется для версии блока / транзакции, времени блока, цели блока, одноразового номера блока, TxIn.Outpoint.Index, TxIn.Sequence и TxOut.Amount и времени блокировки.Целое число будет преобразовано в байтовый массив с прямым порядком байтов с фиксированной длиной 4 байта, за исключением TxOut.Amount, который составляет 8 байтов.
2. Переменная длина с прямым порядком байтовИспользуется только для больших значений в сигнатурах (R и S) с использованием знаковых обозначений (самый значащий бит указывает знак) и открытых ключей (координаты X и Y). Им всегда предшествует их длина в формате StackInt (scripts) или CompactInt (witnesses).
3. CompactIntЭто специальный формат, используемый только в блокчейне биткоина, который может кодировать от 0 to 2
64-1 значения Он используется для длины сценария, количества ввода / вывода, количества элементов-свидетелей и длины элементов-свидетелей.
4. DerInt(не официальное название) Этот метод используется в кодировании DER и может кодировать от 0 до 2
1008 длинных целых чисел. Это используется только для кодирования подписей (используется только длина до 33 байтов). Он указывает часть длины в схеме кодирования тега-длины-значения DER.
5. StackInt(не официальное название) Этот метод используется в блокчейне биткоина только для указания длины данных, которые предполагается поместить в стек. Может кодировать от 0 до 2
32-1.
6. Короткие целые числа в скриптахНа языке биткойн-скриптов стек представляет собой массив байтов. Иногда эти байты могут быть интерпретированы как целые числа, или целое число может быть помещено в стек. Для этого используется специальный формат:
если для значения есть OP-код (OP_0, OP_NegativeOne, ...), то используется один байт.
если код OP отсутствует, целое число преобразуется в байтовый массив в порядке с прямым порядком байтов в кратчайшей форме (без дополнительных нулей), и знак определяется на основе старшего значащего бита.
Пример: как 254 (0b11111110) выглядит в каждой кодировке?
Спойлер (выберите / выделите, чтобы увидеть текст):
1. 0xfe000000
3. 0xfdfe00
4. 0x81fe
5. 0x4cfe
6. 0xfe00