Найти в Дзене
Norman Volt

Bitcoin blockchain parser в 300 строк.

blkXXXXX.dat to text
blkXXXXX.dat to text

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

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

Пришлось искать другие пути. Тем более, к моменту принятия решения блокчейн уже полностью загрузился на мой локальный компьютер (на март 2023 это уже ~500 Гигабайт данных).

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

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

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

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

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

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

Удобство и прозрачность использования парсера обеспечено, на мой взгляд, с максимальной наглядностью, за счёт реализации через последовательное побайтное чтение-преобразование данных. Примитивное с виду представление результатов в виде обычного текста сделано для наглядности и обеспечения "human-readable". Нет никакой проблемы сделать преобразование Blockchain-to-MySQL, Blockchain-to-PostgreSQL или тому подобное.

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

Неотъемлемой частью данной работы является помощь заинтересованным лицам в изучении технологии блокчейн. С момента публикации скрипта в открытом доступе, мне пришло множество сообщений от студентов ВУЗов из разных стран, которым их преподаватели по Computer Science и Cyber Security рекомендуют изучение блокчейн с помощью моей простой программы. Blockchain parser подтверждённо используют в следующих университетах (чего же не похвастаться):

  1. Cornell University
  2. City University of Hong Kong
  3. Open University of Catalonia
  4. University of Piraeus
  5. Kennesaw State University
  6. Reykjavik University
  7. University College Dublin
  8. University of Milan
  9. Paris Sciences et Lettres University
  10. University of Turin
  11. Chuka University (Nairobi Kenya)
  12. Worcester Polytechnic Institute (Massachusetts, United States)
  13. University of Matanzas (Cuba)
  14. University of Havana (Cuba)
  15. Saint Petersburg State Electrotechnical University (Russia)
  16. Higher School of Economics (Russia)
  17. Hamburg University of Applied Sciences
  18. University of the Republic (Uruguay)
  19. Simon Fraser University (Canada)
  20. University of Waterloo (Canada)
  21. Aristotle University of Thessaloniki (Greece)
  22. Anhembi Morumbi University (Brazil)
  23. University of Nicosia (Cyprus)
  24. Gwangju Institute of Science and Technology (South Korea)
  25. Monash University (Australia)
  26. Queen's University at Kingston (Canada)

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

Некоторое время назад, мне посоветовали монетизировать данный проект в различных направлениях, таких как:

Blockchain deep search - поиск закодированных в блокчейне сообщений (да, можно записывать в блокчейн всё что угодно)

Blockchain advanced stats - предоставление расширенной статистики (объёмы движения монет по времени, анализ различных взаимосвязей между транзакциями и т.д.)

Blockchain security monitoring - поиск повторяющихся сигнатур и предсказуемых ключей

Подобные и иные направления являются весьма перспективными. К тому же, все наработки давно пылятся в черновиках.

Спойлер: предсказуемые ключи и повторяющиеся подписи постоянно и с переменным успехом ищут неутомимые блокчейн сталкеры (blockchain stalkers). Но, на данный момент (июль 2024) все известные вектора атак в блокчейне уже не актуальны, пожалуйста, не пишите мне с подобными вопросами.

Сам парсер блокчейна (blockchain parser) вы можете загрузить по этой ссылке.