Author

Topic: методы представления целых чисел в BTC (Read 211 times)

legendary
Activity: 1974
Merit: 4715
Считаю что информацию Coding Enthusiast подобрал очень полезно и кратко, поэтому его труд нужно распространять.
Из уважения к автору сначала не стал менять желтый цвет, но согласен что этот читабельнее.

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

Я искал информацию, для меня она оказалась сложной, и  не уверен что ее правильно переведу.
Если ктото сможет написать это "на пальцах" публикуйте и не стесняйтесь писать в ЛС, я обязательно отправлю заслуги автору

legendary
Activity: 2464
Merit: 4415
🔐BitcoinMessage.Tools🔑
Биткоин может представлять целые числа разными методами, но мы можем представлять целые числа желтым цветом на белом фоне, делая их абсолютно нечитаемыми.  Cheesy

Честно сказать, данная статья будет полезна только программистам и разработчикам биткойна, которых здесь крайне мало. Мне вот например будут интересны отдельные вопросы, касающееся данной темы (представления чисел, например), поэтому будет нелишним добавить комментарии и объяснения более простым языком для непрограммистов. А так эта статья выглядит не к месту, тут обсуждаются более общие вопросы, касающееся биткойна. Возможно, что стоит перенести ее в более специфичный раздел?
legendary
Activity: 1974
Merit: 4715
Это перевод, оригинал статьи принадлежит Coding Enthusiast. Спасибо за полезную информацию!

6 различных методов представления целых чисел в блокчейне BTC

Возможно вы знайте, что в блокчейне биткойна используется много числовых значений, каждое из которых представляет разные данные: версию, длину скрипта, время блокировки, ... и поскольку блок - это просто последовательность байтов) которая передается между узлами.  Узлы должны преобразовать эти целочисленные значения в строки (байтовые массивы) и обратно.
Возможно, никогда не замечали, что в биткойне в зависимости от того, что представляет собой целое число, выбирается другой подход для его преобразования в байты, что приводит к 6 различным способам кодирования целых чисел!

Вот пример транзакции из  BIP-143, содержащей 5 из 6 методов, перечисленных ниже, каждый из которых выделен в соответствии с их типом:

01000000000102fff7f7881a8099afa6940d42d1e7f6362bec38171ea3edf433541db4e4ad969f
00000000494830450221008b9d1dc26ba6a9cb62127b02742fa9d754cd3bebf337f7a55d114c8e
5cdd30be
022040529b194ba3f9281a99f2b1c0a19c0489bc22ede944ccf4ecbab4cc618ef3ed01
eeffffffef51e1b804cc89d182d279655c3aa89e815b1b309fe287d9b2b55d57b90ec68a010000
00
00ffffffff02202cb206000000001976a9148280b37df378db99f66f85c95a783a76ac7a6d59
88ac9093510d000000001976a9143bde42dbee7e4dbe6a21b2d50ce2f0167faa815988ac000247
304402203609e17b84f6a7d30c80bfa610b5b4542f32a8a0d5447a12fb1366d7f01cc44a022057
3a954c4518331561406f90300e8f3358f51928d43c212a8caed02de67eebee
0121025476c2e831
88368da1ff3e292e7acafcdb3566bb0ad253f62fc70f07aeee6357
11000000





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 264-1 значения Он используется для длины сценария, количества ввода / вывода, количества элементов-свидетелей и длины элементов-свидетелей.

4. DerInt
(не официальное название) Этот метод используется в кодировании DER и может кодировать от 0 до 21008 длинных целых чисел. Это используется только для кодирования подписей (используется только длина до 33 байтов). Он указывает часть длины в схеме кодирования тега-длины-значения DER.

5. StackInt
(не официальное название)  Этот метод используется в блокчейне биткоина только для указания длины данных, которые предполагается поместить в стек. Может кодировать от 0 до 232-1.

6. Короткие целые числа в скриптах
На языке биткойн-скриптов стек представляет собой массив байтов. Иногда эти байты могут быть интерпретированы как целые числа, или целое число может быть помещено в стек. Для этого используется специальный формат:
если для значения есть OP-код (OP_0, OP_NegativeOne, ...), то используется один байт.
если код OP отсутствует, целое число преобразуется в байтовый массив в порядке с прямым порядком байтов в кратчайшей форме (без дополнительных нулей), и знак определяется на основе старшего значащего бита.

Пример: как 254 (0b11111110) выглядит в каждой кодировке?
Спойлер (выберите / выделите, чтобы увидеть текст):
1. 0xfe000000
3. 0xfdfe00
4. 0x81fe
5. 0x4cfe
6. 0xfe00

Jump to: