Я искал компактное представление целых чисел для целочисленных операций на языке Script. Кажется, что большинство операций создают или помещают массивы байтов, но когда выполняются операции с целыми числами, эти массивы интерпретируются с использованием компактного формата со знаком. Определен ли этот формат где-либо или он строго специфичен для биткойнов?
Насколько я понимаю, вы можете обрабатывать до 4 байтов как целое число, отрицательное целое число является двоичным или с 0x80
. У меня возникли проблемы с декодированием 1-4-байтовых отрицательных целых чисел в правильную кодировку битовой строки.
Есть ли у кого-нибудь примеры или может указать мне правильное направление?
общий формат MPI с обратным порядком байтов специфичный для биткойнов формат с прямым порядком байтов с неявным размером
реализация питона
https://github.com/petertodd/python-bitcoinlib/blob/master/bitcoin/core/_bignum.py
Компактные целые числа без знака не используются в Script, они используются в протоколе Биткойн для обозначения количества байтов, которые содержит следующая структура данных.
Вы путаете их с ScriptNumbers, которые интерпретируются для арифметических операций внутри Script Interpreter .
Следует отметить, что на самом деле это может быть 5 байтов, однако, если вы выполните другую операцию над этим 5-байтовым целым числом, вы получите сообщение об ошибке в интерпретаторе.
Если вы хотите увидеть, как обрабатываются отрицательные числа, вы можете посмотреть на реализацию CScriptNum, базовым числовым типом которой является int64_t.
Я не уверен, где вы нашли отрицательные целые числа. Но в большинстве мест в биткойн-протоколе для целых чисел используется компактная переменная длины. См. ссылку здесь https://en.bitcoin.it/wiki/Protocol_documentation#Variable_length_integer
морсекодер