Bitcoin Forum

Local => Oбcyждeниe Bitcoin => Topic started by: zasad@ on October 23, 2019, 02:01:00 PM



Title: методы представления целых чисел в BTC
Post by: zasad@ on October 23, 2019, 02:01:00 PM
 Это перевод, оригинал статьи принадлежит Coding Enthusiast. Спасибо за полезную информацию! (https://bitcointalk.org/index.php?topic=5190244)

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

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

Вот пример транзакции из  BIP-143, (https://github.com/bitcoin/bips/blob/master/bip-0143.mediawiki) содержащей 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 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



Title: Re: методы представления целых чисел в BTC
Post by: witcher_sense on October 25, 2019, 10:58:44 AM
Биткоин может представлять целые числа разными методами, но мы можем представлять целые числа желтым цветом на белом фоне, делая их абсолютно нечитаемыми.  :D

Честно сказать, данная статья будет полезна только программистам и разработчикам биткойна, которых здесь крайне мало. Мне вот например будут интересны отдельные вопросы, касающееся данной темы (представления чисел, например), поэтому будет нелишним добавить комментарии и объяснения более простым языком для непрограммистов. А так эта статья выглядит не к месту, тут обсуждаются более общие вопросы, касающееся биткойна. Возможно, что стоит перенести ее в более специфичный раздел?


Title: Re: методы представления целых чисел в BTC
Post by: zasad@ on October 25, 2019, 12:16:09 PM
Считаю что информацию Coding Enthusiast подобрал очень полезно и кратко, поэтому его труд нужно распространять.
Из уважения к автору сначала не стал менять желтый цвет, но согласен что этот читабельнее.

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

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