Получение криптостойкого набора UTXO

Как получить список выходов неизрасходованных транзакций (UTXO) из локальных файлов?

Где хранятся эти данные? В каких файлах эти данные полностью присутствуют?

Я так понимаю, что этот список находится в "chainstate". Но, может быть, есть более безопасный способ получить его?

Я пытаюсь извлечь его из локальных файлов, которые биткойн-клиент сбрасывает на диск.

Я думаю, что будет «Криптозащищенный набор UTXO».

Ответы (2)

Я некоторое время работал над этим как над частью более крупной библиотеки Python 2 для биткойн-инструментов. Вы можете найти его на github .

Вы можете запустить код на ldb_parser.py , который выдаст txt со всеми UTXO из состояния цепочки, проанализированного в json. (Обратите внимание, что это огромный объем данных.)

Затем вы можете вызвать функцию decode_utxo , используя данные из json, и сохранить результат в файле для его анализа. (Этот файл будет еще больше!).

Вот пример (после запуска ldb_parser.py):

from bitcoin_tools.utils import load_conf_file, decode_utxo
from json import loads, dumps

fin_name = "utxos.txt"
fout_name = "parsed_utxos.txt"

# Load config file
cfg = load_conf_file()

fin = open(cfg.data_path + fin_name, 'r')
# Output file
fout = open(cfg.data_path + fout_name, 'w')

for line in fin:
    data = loads(line[:-1])
    utxo = decode_utxo(data["value"])

    fout.write(dumps(utxo) + '\n')

fout.close()

И каждая строка, которую вы получите в parsed_utxos.txt, будет выглядеть так:

{"coinbase": 0, "version": 1, "outs": [{"index": 1, "amount": 14250000, "out_type": 0, "data": "865e218ff25929eee880e0e3b6f95280b2d05443"}], "height": 468349}
{"coinbase": 0, "version": 1, "outs": [{"index": 0, "amount": 132000, "out_type": 1, "data": "0b2a00367244680f6da18acd861a08f0a89cb3b4"}], "height": 449294}
{"coinbase": 0, "version": 1, "outs": [{"index": 1, "amount": 2423800, "out_type": 1, "data": "7f172a63c49c5d03e3307d432bd6b784b69d0e0d"}, {"index": 2, "amount": 10000000, "out_type": 1, "data": "1d0c4b60e8270f9b6ca5f167f08a5466a0cee565"}], "height": 474328}
...

Где каждая запись в outsвыводе а, и dataсоответствует данным транзакции (хеш160 адреса для транзакций P2PKH).

Теперь вы должны принять во внимание некоторые соображения:

Не каждый отдельный UTXO является P2PKH, поэтому то, что вы найдете, dataзависит от out_typeобласти.

out_types 0и 1соответствуют P2PKH и P2SH соответственно и будут иметь 20 байт данных (hash160 открытого ключа для P2PKH и scriptHash для P2SH).

out_types 2,3,4и 5соответствуют выходным данным P2PK и будут содержать 33 байта данных (1 байт для типа открытого ключа и 32 байта для фактического ключа).

Наконец, любое другое out_typeбудет означать, что данные, хранящиеся в UTXO, не сжаты, а значение будет соответствовать размеру данных + количеству специальных скриптов ( nSpecialScripts), которое в настоящее время равно 6). Это относится к транзакциям P2MS и нестандартным транзакциям.

Все это было извлечено непосредственно из исходного кода Bitcoin Core.

Наконец, обратите внимание, что для использования библиотеки вам необходимо установить зависимости python в requeriments.txt и создать файл conf.py, чтобы указать путь к вашей цепочке и путь к данным (или изменить код, чтобы не использовать файл конфигурации).

Я работаю над объединением всего этого с основной веткой (в настоящее время она находится в разработке), поэтому в будущем ссылки могут измениться).
Обратите внимание, что формат базы данных для набора UTXO меняется в Bitcoin Core 0.15 (становится проще).
@PieterWuille Спасибо, что указали на это, я обновлю код.
@sr-gi, ты обновляешь код?
Пока нет, но это определенно должно работать для любой версии до 0.15.
@Denis, код был обновлен декодером для версии 015. Это часть ветки разработки, и на следующей неделе она будет объединена с основной веткой.
@ sr-gi, скажите, пожалуйста, где рассчитывается и хранится набор utxo в вашем последнем обновлении?
Вы можете найти его в ветке dev (на этой неделе он будет объединен с master). Функция декодирования для 0.15 находится здесь: github.com/sr-gi/bitcoin_tools/blob/dev/bitcoin_tools/analysis/…

Набор UTXO хранится в chainstateпапке. Он хранится в базах данных LevelDB, которые могут выполнять некоторые оптимизации, которые могут затруднить анализ фактических данных на диске (например, некоторое сжатие). Если вы хотите прочитать эти данные, вам следует модифицировать Bitcoin Core, чтобы они предоставлялись вам, а не пытаться прочитать их из файлов на диске. Вы также можете открыть базы данных в средстве просмотра LevelDB, но это может привести к повреждению ваших баз данных и в противном случае не рекомендуется.

не могли бы вы предложить какой-либо просмотрщик leveldb?