Pull to refresh

Парсер Блокчейна в 300 строчек на Python

Reading time 3 min
Views 17K
image

В далёком 2015 году, когда криптовалютам ещё не уделялось такое внимание широкой общественности как сейчас, мне пришла в голову мысль узнать в подробностях — что такое блокчейн, криптовалюты и Биткоин, в частности.

Попытки провести детальный анализ исходного кода проекта Bitcoin Core не увенчались особым успехом, ввиду достаточно строгих начальных условий, которые были мною поставлены перед собой, для того, чтобы сказать «да, теперь я знаю что это и как оно работает» и огромного количества строк исходного кода, которые необходимо было осмыслить, чтобы считать результат достигнутым.

Пришлось искать другие пути. Тем более, к моменту принятия данного решения блокчейн уже полностью загрузился на мой локальный компьютер. А сегодня это уже не так быстро как было тогда.

И так. Официальный клиент Bitcoin Core загрузил весь блокчейн в папку на локальной машине, это были какие-то файлы, которые, как говорилось в официальных документах, содержали всё то, что называется Bitcoin. Самым интересным для меня являлись файлы так называемой RAW Blockchain Data (blk00000.dat… blk01234.dat и т.д. из папки Bitcoin/blocks), а именно файлы базы данных блокчейн как они есть, в исходном виде.

Остальное содержимое каталога — это индекс «сырой» базы данных, данные для корректного учёта непотраченных выходов, настройки и персональный кошелёк.

Дабы проникнуть в суть, очевидным показалось разобраться в том, что в себе хранит исходная база данных, на основании которой локальная система производит всё дальнейшее необходимое действо для обеспечения функционирования блокчейна данной криптовалюты. Часть технологии, касающаяся сетевых взаимодействий не рассматривалась в данной статье. Намеренно я ограничился именно локальной частью, и именно файлами хранящими блоки.

Спецификация формата блоков и транзакций доступна в открытых источниках, в виде разрозненных описаний данных структур. Но ничего не удалось найти того, что в полной мере могло бы дать представление о том, как интерпретировать данные, хранящиеся в файлах этой самой «сырой» базы данных блокчейн (RAW Blockchain Database).

Единственным, на мой взгляд, вариантом было разобрать линейную структуру файлов и представить её в виде некой читаемой структуры, которая и должна дать полное понимание что это за фрукт такой Биткоин.

Результатом является написанный на Python скрипт в ~300 строк, который преобразует локально хранящиеся «сырые» файлы данных blkXXXXX.dat в обычный текстовый формат с указанием того, что там содержится, и какой смысл имеет каждое поле данных. Полученные текстовые файлы подходят для дальнейшей их обработки и извлечения из них, к примеру, всех хэшей блоков, хэшей транзакций, адресов, сумм транзакций и т.п. с целью анализа, да и много ещё для каких целей…

Удобство и прозрачность использования парсера обеспечено, на мой взгляд, с максимальной наглядностью, за счёт реализации через последовательное побайтное чтение-преобразование данных.

Существующие в природе парсеры блокчейна, имеют множество фич, но ни один не работает напрямую с файлами самой базы данных непосредственно. Именно поэтому я не стал заострять внимание на реализации каких-либо интересностей, таких как получение списка адресов с баллансами или тому подобном, а ограничился максимально наглядной и простой реализацией непосредственного преобразования файлов из внутреннего формата в универсальный текстовый вид. Тем более, множество плюшек, таких как формирование UTXO Set (набор непотраченных выходов) или формирование списка адресов с баллансами уже мною реализованы для ряда проектов.

Неотъемлемой частью данной работы является помощь заинтересованным лицам в изучении технологии блокчейн.

Да, как оказалось, скрипт подходит также и для большинства других криптовалют, таких как Dash, Dogecoin, Bitcoin Cash, Litecoin и прочих альткоинов, правда для этого необходимо сделать пару хитростей. В рамках данной статьи не планировалось раскрывать эти трюки.

Сам парсер блокчейна (blockchain parser) вы можете загрузить по ссылке с Гитхаба.
Tags:
Hubs:
+6
Comments 35
Comments Comments 35

Articles