dat⽂件读取_⽐特币blk.dat区块⽂件格式和读取⼯具
⽐特币节点(Bitcoin Core)的~/.bitcoin/blocks/⽬录中的blk.dat ⽂件中包含了节点接收到的原始区块数据,这些数据⽂件构成了⽐特币区块链的基础,同时也是区块链数据分析获取⽐特币区块和交易数据的最⾼效的途径。本⽂将介绍⽐特币区块数据⽂件的格式、数据结构以及读取⽅法原理,并介绍三种常⽤的⼯具软件。
1、blk.dat⼯作机制
⽐特币节点(Bitcoin Core)接收到的每个区块都会写⼊⼀个blk.dat⽂件。出于性能考虑,节点不会把所有区块写⼊单⼀巨型⽂件,⽽是拆分为多个blk*.dat⽂件。
~/.bitcoin/blocksblk00000.datblk00001.datblk00002.dat…
节点⾸先将收到的区块写⼊blk00000.dat,然后如果这个⽂件满了(⼤约128MB)就会写⼊blk00001.dat,然后是,依次类推。
2、blk.dat⽂件内容⽰例
在blk.dat⽂件中的数据以⼆进制格式存储,节点收到的新区块会追加到⽂件末尾。我们可以看⼀下创世区块的内容。读取blk00000.dat的开头293个字节:
f9beb4d91d01000001000000000000000000000000000000000000000000000000 00000000000000000000003ba3edfd7a7b12b27ac72c3e67768f617fc8
3、blk⽂件结构
上⾯的数据可以分为五个部分:
magic bytes(魔术字节)和size(数据尺⼨)可以⽤来出来每个区块的起⽌位置
block header(区块头)包含了区块的头部信息
tx count 表⽰区块中的交易数量,后⾯的transaction data部分就是逐条交易的数据
数据结构如下:
[ magic bytes ][ size ][ block header ][ tx count ][ transaction data ]
利⽤size字段分析上⾯的数据,我们就知道要读取整个区块需要293个字节:size的⼆进制编码为1d010000,按如下步骤进⾏处理:
1. 转换字节顺序,得到0000011d
2. 转换为10进制,得到285
因此我们再加上magic bytes的4个字节和size的4个字节,就得到了这个区块 的字节数为293。
4、注意事项
4.1 区块不是按顺序下载
如果你在解析blk.dat⽂件,⼀定要记得区块不⼀定是按先后顺序排列的。例如在你处理⽂件时可能会读到以下顺序排列的区块:
python怎么读取dat文件
A B C E F D
这是因为出于性能的考虑,⽐特币节点是并⾏下载区块的。
4.2 blk.dat⽂件最⼤128MB
这个限制是在源代码中由宏MAX_BLOCKFILE_SIZE控制的。
5、区块⽂件读取⼯具
正如之前所⾔,blk.dat⽂件中的数据是⼆进制编码的,因此如果你直接在⽂本编辑器⾥打开⽂件,可能看不出来太多有价值的信息。有⼏个⼯具可以帮助你。
5.1 od - 16进制查看⼯具
od是⼀个简单的⼯具,它将⽂件内容导出为你选择的格式。例如:
od -x --endian=big -N 293 -An blk00000.dat
其中:
-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 blk00000.dat00000008 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 blk00000.dat | cut -c 11-58 | tr '' ' ' | tr -d ' '
其中:
cut -c 11-58 :仅保留每⾏的11到58列
tr '' ' ' :将换⾏翻译为空格
tr -d ' ' :删除所有空格
hexdump通常内置于各种linux发⾏版中。
5.3 BlockETL - 将区块及交易数据加载到SQL数据库
与前两种简单⼯具不同,BlockETL软件包⽤于⽐特币区块链数据分析中的数据抽取、转换和加载,也
就是说,BlockETL是更⼤的区块链数据分析⽣态中的⼀个基础⼯具,当你读取⽐特币blk.dat⽂件的⽬的是要进⼀步分析数据时,这个⼯具最有价值。
BlockETL的主要特性如下:
直接读取原始区块⽂件,抽取速度快
将原始区块和交易数据加载⾄SQL数据库,便于后续的区块链数据分析
⽀持多流⽔线并⾏处理,可⾃⼰控制并发流⽔线数量
结构设计清晰,代码便于扩展
BlockETL是⼀个Java应⽤,同时也是⼀个开发包,⽀持Windows、OSX和Linux等多种操作系统。配置数据⽬录、数据库连接等基本信息并启动后,就可以看到将blk⽂件中的区块和交易数据加载到SQL数据库的进度了:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。