2023年12月3日发(作者:)

dat文件读取_比特币区块文件格式和读取工具比特币节点(Bitcoin Core)的~/.bitcoin/blocks/目录中的 文件中包含了节点接收到的原始区块数据,这些数据文件构成了比特币区块链的基础,同时也是区块链数据分析获取比特币区块和交易数据的最高效的途径。本文将介绍比特币区块数据文件的格式、数据结构以及读取方法原理,并介绍三种常用的工具软件。1、工作机制比特币节点(Bitcoin Core)接收到的每个区块都会写入一个文件。出于性能考虑,节点不会把所有区块写入单一巨型文件,而是拆分为多个blk*.dat文件。~/.bitcoin/…节点首先将收到的区块写入,然后如果这个文件满了(大约128MB)就会写入,然后是...,依次类推。2、文件内容示例在文件中的数据以二进制格式存储,节点收到的新区块会追加到文件末尾。我们可以看一下创世区块的内容。读取的开头293个字节:f9beb4d91d00000000 ba3edfd7a7b12b27ac72c3e67768f617fc83、blk文件结构上面的数据可以分为五个部分:magic bytes(魔术字节)和size(数据尺寸)可以用来找出来每个区块的起止位置block header(区块头)包含了区块的头部信息tx count 表示区块中的交易数量,后面的transaction data部分就是逐条交易的数据数据结构如下:[ magic bytes ][ size ][ block header ][ tx count ][ transaction data ]

利用size字段分析上面的数据,我们就知道要读取整个区块需要293个字节:size的二进制编码为1d010000,按如下步骤进行处理:1. 转换字节顺序,得到0000011d2. 转换为10进制,得到285因此我们再加上magic bytes的4个字节和size的4个字节,就得到了这个区块 的字节数为293。4、注意事项4.1 区块不是按顺序下载如果你在解析文件,一定要记得区块不一定是按先后顺序排列的。例如在你处理文件时可能会读到以下顺序排列的区块:A B C E F D这是因为出于性能的考虑,比特币节点是并行下载区块的。4.2 文件最大128MB这个限制是在源代码中由宏MAX_BLOCKFILE_SIZE控制的。5、区块文件读取工具正如之前所言,文件中的数据是二进制编码的,因此如果你直接在文本编辑器里打开文件,可能看不出来太多有价值的信息。有几个工具可以帮助你。5.1 od - 16进制查看工具od是一个简单的工具,它将文件内容导出为你选择的格式。例如:od -x --endian=big -N 293 -An 其中:-x: 显示为16进制--endian=big: 按big endian顺序显示字节-N 293 : 声明要读取的字节数-An:不显示文件偏移量od通常内置于各种linux发行版中。5.2 hexdump - 16进制及ascii查看工具类似于od,不过hexdump可以显示数据的ascii文本,这对于快速查看交易中包含的信息会很方便。例如:$ hexdump -C -s 8 -n 285 00000008 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|00000018 00 00 00 00 00 00 00 00 00 00其中:-C:显示字节及ascii文本-s:声明要显示数据的偏移位置-n:声明要读取的字节数也可以指显示原始的16进制数据:$ hexdump -C -s 8 -n 285 | cut -c 11-58 | tr '' ' ' | tr -d ' '其中:cut -c 11-58 :仅保留每行的11到58列tr '' ' ' :将换行翻译为空格tr -d ' ' :删除所有空格hexdump通常内置于各种linux发行版中。5.3 BlockETL - 将区块及交易数据加载到SQL数据库与前两种简单工具不同,BlockETL软件包用于比特币区块链数据分析中的数据抽取、转换和加载,也就是说,BlockETL是更大的区块链数据分析生态中的一个基础工具,当你读取比特币文件的目的是要进一步分析数据时,这个工具最有价值。BlockETL的主要特性如下:直接读取原始区块文件,抽取速度快将原始区块和交易数据加载至SQL数据库,便于后续的区块链数据分析支持多流水线并行处理,可自己控制并发流水线数量结构设计清晰,代码便于扩展BlockETL是一个Java应用,同时也是一个开发包,支持Windows、OSX和Linux等多种操作系统。配置数据目录、数据库连接等基本信息并启动后,就可以看到将blk文件中的区块和交易数据加载到SQL数据库的进度了: