Компактное целое число в скриптах

Я искал компактное представление целых чисел для целочисленных операций на языке Script. Кажется, что большинство операций создают или помещают массивы байтов, но когда выполняются операции с целыми числами, эти массивы интерпретируются с использованием компактного формата со знаком. Определен ли этот формат где-либо или он строго специфичен для биткойнов?

Насколько я понимаю, вы можете обрабатывать до 4 байтов как целое число, отрицательное целое число является двоичным или с 0x80. У меня возникли проблемы с декодированием 1-4-байтовых отрицательных целых чисел в правильную кодировку битовой строки.

Есть ли у кого-нибудь примеры или может указать мне правильное направление?

Связанный: биткойн.stackexchange.com/q/37415/ 18196

Ответы (3)

общий формат MPI с обратным порядком байтов специфичный для биткойнов формат с прямым порядком байтов с неявным размером

реализация питона

https://github.com/petertodd/python-bitcoinlib/blob/master/bitcoin/core/_bignum.py

Это правильное направление. Я нашел соответствующий исходный код в Bitcoind, но я надеялся на краткое объяснение формата, если он был задокументирован где-либо вне кода.

Компактные целые числа без знака не используются в Script, они используются в протоколе Биткойн для обозначения количества байтов, которые содержит следующая структура данных.

Вы путаете их с ScriptNumbers, которые интерпретируются для арифметических операций внутри Script Interpreter .

Следует отметить, что на самом деле это может быть 5 байтов, однако, если вы выполните другую операцию над этим 5-байтовым целым числом, вы получите сообщение об ошибке в интерпретаторе.

Если вы хотите увидеть, как обрабатываются отрицательные числа, вы можете посмотреть на реализацию CScriptNum, базовым числовым типом которой является int64_t.

Я не уверен, где вы нашли отрицательные целые числа. Но в большинстве мест в биткойн-протоколе для целых чисел используется компактная переменная длины. См. ссылку здесь https://en.bitcoin.it/wiki/Protocol_documentation#Variable_length_integer

Целые числа переменной длины используются в форматах протокола и сериализации. Компактное целое число используется в языке Script для представления целочисленных значений во время операций. Так, например, расшифруйте «4f01e40164» { «asm»: «-1 -100 100», «type»: «нестандартный», «p2sh»: «2N8BQEfUK2Q1e6Svt9ro9LkjVeB5tXQJnBh»}
@Matt, не смешивайте Variable_length_integer_encoding (количество входов/выходов в транзакции) и кодирование операций push в сценариях. Это разные вещи.
Я не путаю, мой вопрос касается целочисленного кодирования для операций push.
Этот ответ неверен. Целые числа переменной длины в протоколе P2P отличаются от целочисленного кодирования чисел внутри Script.