В далёком 2015 году, когда криптовалютам ещё не уделялось такое внимание широкой общественности как сейчас, мне пришла в голову мысль узнать в подробностях — что такое блокчейн, криптовалюты и Биткоин, в частности.
Попытки провести детальный анализ исходного кода проекта Bitcoin Core не увенчались особым успехом, ввиду достаточно строгих начальных условий, которые были мною поставлены перед собой, для того, чтобы сказать «да, теперь я знаю что это и как оно работает» и огромного количества строк исходного кода, которые необходимо было осмыслить, чтобы считать результат достигнутым.
Пришлось искать другие пути. Тем более, к моменту принятия данного решения блокчейн уже полностью загрузился на мой локальный компьютер. А сегодня это уже не так быстро как было тогда :)
И так. Официальный клиент Bitcoin Core загрузил весь блокчейн в папку на локальной машине, это были какие-то файлы, которые, как говорилось в официальных документах, содержали всё то, что называется Bitcoin. Самым интересным для меня являлись файлы так называемой RAW Blockchain Data (blk00000.dat… blk01234.dat и т.д. из папки Bitcoin/blocks), а именно файлы базы данных блокчейн как они есть, в исходном виде.
Остальное содержимое каталога — это индекс «сырой» базы данных, данные для корректного учёта непотраченных выходов, настройки и персональный кошелёк.
Дабы проникнуть в суть, очевидным показалось разобраться в том, что в себе хранит исходная база данных, на основании которой система и производит всё дальнейшее необходимое действо для обеспечения функционирования блокчейна данной криптовалюты.
Спецификация формата блоков и транзакций доступна в открытых источниках, в виде разрозненных описаний данных структур. Но ничего не удалось найти того, что в полной мере могло бы дать представление о том, как интерпретировать данные, хранящиеся в файлах этой самой «сырой» базы данных блокчейн (RAW Blockchain Database).
Единственным, на мой взгляд, вариантом было разобрать линейную структуру файлов и представить её в виде некой читаемой структуры, которая и должна дать полное понимание что это за фрукт такой Биткоин.
Результатом является написанный на Python скрипт в ~300 строк, который преобразует локально хранящиеся «сырые» файлы blkXXXXX.dat в обычный текстовый формат с указанием того, что там содержится, и какой смысл имеет каждое поле данных. Полученные текстовые файлы подходят для дальнейшей их обработки и извлечения из них, к примеру, всех хэшей блоков, хэшей транзакций, адресов, сумм транзакций и т.п. с целью анализа, да и много ещё для каких целей…
Также можно составить базу непотраченных выходов, отследить набор определённых адресов или транзакций. В общем, всё ограничивается только фантазией. К тому же, всё происходит локально, без необходимости использовать какие-то API удалённых интернет-сервисов и тому подобные third-parties services, так сказать. Нужен только Питон, из коробки и всё.
Удобство и прозрачность начального уровня обеспечено, на мой взгляд, с максимальной наглядностью, за счёт реализации через последовательное побайтное чтение-преобразование данных.
Существующие в природе парсеры блокчейна, имеют множество фич, но ни один не работает напрямую с файлами самой базы данных непосредственно. Именно поэтому я не стал заострять внимание на реализации каких-либо интересностей, таких как получение списка адресов с баллансами или тому подобном, а ограничился максимально наглядной и простой реализацией непосредственного преобразования файлов из внутреннего формата в универсальный текстовый вид. Тем более, множество плюшек, таких как формирование UTXO Set (набор непотраченных выходов) или формирование списка адресов с баллансами уже мною реализовано для ряда некоммерческих проектов, и вскоре будут опубликованы их исходные коды.
Неотъемлемой частью данной работы является помощь заинтересованным лицам в изучении технологии блокчейн. О чём свидетельствуют поступающие вопросы по использованию скрипта от различной аудитории, которые приходят мне на почту с момента релиза в 2015 году. Быть может это и явилось поводом для написания статьи на Хабр, дабы те, кто интересуются могли получить знания о данной технологии в понятном и доступном для изучения виде.
Да, как оказалось, скрипт подходит также и для большинства других криптовалют, таких как Dash, Dogecoin, Bitcoin Cash, Litecoin и прочих альткоинов, правда для этого необходимо сделать пару хитростей. В рамках данной статьи не планировалось раскрывать эти трюки, быть может в следующий раз, да простит меня уважаемый читатель.
Ну и сам парсер блокчейна (blockchain parser) вы можете загрузить по ссылке с Гитхаба.
Автор: d3n1s