比特币节点(Bitcoin Core)的~/.bitcoin/blocks/目录中的blk.dat 文件中包含了节点接收到的原始区块数据,这些数据文件构成了比特币区块链的基础,同时也是区块链数据分析获取比特币区块和交易数据的最高效的途径。本文将介绍比特币区块数据文件的格式、数据结构以及读取方法原理,并介绍三种常用的工具软件。

1、blk.dat工作机制

比特币节点(Bitcoin Core)接收到的每个区块都会写入一个blk.dat文件。出于性能考虑,节点不会把所有区块写入单一巨型文件,而是拆分为多个blk*.dat文件。

~/.bitcoin/blocks
blk00000.dat
blk00001.dat
blk00002.dat
…

节点首先将收到的区块写入blk00000.dat,然后如果这个文件满了(大约128MB)就会写入blk00001.dat,然后是blk00002.dat...,依次类推。

2、blk.dat文件内容示例

在blk.dat文件中的数据以二进制格式存储,节点收到的新区块会追加到文件末尾。我们可以看一下创世区块的内容。读取blk00000.dat的开头293个字节:

f9beb4d91d01000001000000000000000000000000000000000000000000000000
00000000000000000000003ba3edfd7a7b12b27ac72c3e67768f617fc81bc3888a
51323a9fb8aa4b1e5e4a29ab5f49ffff001d1dac2b7c0101000000010000000000
000000000000000000000000000000000000000000000000000000ffffffff4d04
ffff001d0104455468652054696d65732030332f4a616e2f32303039204368616e
63656c6c6f72206f6e206272696e6b206f66207365636f6e64206261696c6f7574
20666f722062616e6b73ffffffff0100f2052a01000000434104678afdb0fe5548
271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4
f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5fac00000000

3、blk文件结构

上面的数据可以分为五个部分:

  • magic bytes(魔术字节)和size(数据尺寸)可以用来找出来每个区块的起止位置
  • block header(区块头)包含了区块的头部信息
  • tx count 表示区块中的交易数量,后面的transaction data部分就是逐条交易的数据

数据结构如下:

[ magic bytes ][    size     ][   block header ][  tx count  ][  transaction data  ]<- 4 bytes ->  <- 4 bytes ->  <- 80 bytes   ->  <- varint ->  <- remainder      ->

利用size字段分析上面的数据,我们就知道要读取整个区块需要293个字节:size的二进制编码为1d010000,按如下步骤进行处理:

  1. 转换字节顺序,得到0000011d
  2. 转换为10进制,得到285

因此我们再加上magic bytes的4个字节和size的4个字节,就得到了这个区块 的字节数为293。

4、注意事项

4.1 区块不是按顺序下载

如果你在解析blk.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 00 00 00 00 00 00  |................|
00000028  00 00 00 00 3b a3 ed fd  7a 7b 12 b2 7a c7 2c 3e  |....;...z{..z.,>|
00000038  67 76 8f 61 7f c8 1b c3  88 8a 51 32 3a 9f b8 aa  |gv.a......Q2:...|
00000048  4b 1e 5e 4a 29 ab 5f 49  ff ff 00 1d 1d ac 2b 7c  |K.^J}._I......+||
00000058  01 01 00 00 00 01 00 00  00 00 00 00 00 00 00 00  |................|
00000068  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000078  00 00 00 00 00 00 ff ff  ff ff 4d 04 ff ff 00 1d  |..........M.....|
00000088  01 04 45 54 68 65 20 54  69 6d 65 73 20 30 33 2f  |..EThe Times 03/|
00000098  4a 61 6e 2f 32 30 30 39  20 43 68 61 6e 63 65 6c  |Jan/2009 Chancel|
000000a8  6c 6f 72 20 6f 6e 20 62  72 69 6e 6b 20 6f 66 20  |lor on brink of |
000000b8  73 65 63 6f 6e 64 20 62  61 69 6c 6f 75 74 20 66  |second bailout f|
000000c8  6f 72 20 62 61 6e 6b 73  ff ff ff ff 01 00 f2 05  |or banks........|
000000d8  2a 01 00 00 00 43 41 04  67 8a fd b0 fe 55 48 27  |*....CA.g....UH'|
000000e8  19 67 f1 a6 71 30 b7 10  5c d6 a8 28 e0 39 09 a6  |.g..q0....(.9..|
000000f8  79 62 e0 ea 1f 61 de b6  49 f6 bc 3f 4c ef 38 c4  |yb...a..I..?L.8.|
00000108  f3 55 04 e5 1e c1 12 de  5c 38 4d f7 ba 0b 8d 57  |.U......8M....W|
00000118  8a 4c 70 2b 6b f1 1d 5f  ac 00 00 00 00           |.Lp+k.._.....|)
0000125

其中:

  • -C:显示字节及ascii文本
  • -s:声明要显示数据的偏移位置
  • -n:声明要读取的字节数

也可以指显示原始的16进制数据:

$ hexdump -C -s 8 -n 285 blk00000.dat | cut -c 11-58 | tr 'n' ' ' | tr -d ' '

其中:

  • cut -c 11-58 :仅保留每行的11到58列
  • tr 'n' ' ' :将换行翻译为空格
  • tr -d ' ' :删除所有空格

hexdump通常内置于各种linux发行版中。

5.3 BlockETL - 将区块及交易数据加载到SQL数据库

与前两种简单工具不同,BlockETL软件包用于比特币区块链数据分析中的数据抽取、转换和加载,也就是说,BlockETL是更大的区块链数据分析生态中的一个基础工具,当你读取比特币blk.dat文件的目的是要进一步分析数据时,这个工具最有价值。

BlockETL的主要特性如下:

  • 直接读取原始区块文件,抽取速度快
  • 将原始区块和交易数据加载至SQL数据库,便于后续的区块链数据分析
  • 支持多流水线并行处理,可自己控制并发流水线数量
  • 结构设计清晰,代码便于扩展

BlockETL是一个Java应用,同时也是一个开发包,支持Windows、OSX和Linux等多种操作系统。配置数据目录、数据库连接等基本信息并启动后,就可以看到将blk文件中的区块和交易数据加载到SQL数据库的进度了:

BlockETL官网:http://sc.hubwiz.com/codebag/blocketl-java/。


原文链接:比特币数据文件格式及读取方法 - 汇智网

dat文件读取_比特币blk.dat文件结构及读取软件相关推荐

  1. 怎么python把dat文件生成_如何在Python中编辑*.txt或*.dat文件信息?

    我是Python的初学者,有下一个"问题".如果你能帮助我,我会很高兴的) 我有一个*.dat文件(我们把它命名为file-1,第一行只是一个标题,我只在这里用来标记列),它看起来 ...

  2. php dat文件,window_Win7系统怎么打开Dat文件 Win7系统打开Dat文件的方法,  在电脑中的Dat文件是很常 - phpStudy...

    Win7系统怎么打开Dat文件 Win7系统打开Dat文件的方法 在电脑中的Dat文件是很常见的,但是怎样打开这个Dat文件,还是有很多人不是很了解.如果用户在使用Win7系统时,当点击保存的时候,那 ...

  3. linux删除dat文件内容,使用python删除.dat文件中的行和列

    我想知道是否有一种简单的方法可以在python中删除特定的行和列.如果这是一个微不足道的问题,道歉.在 为了提供一些上下文,我目前正在编写一个脚本来自动执行一系列linux命令(特别是ciao-Cha ...

  4. python读取dat文件经纬度_自动提取kml文件中的经纬度

    1.问题描述 工程设计中,经常需要提取奥维地图或者谷歌地图中标记图形的边界点经纬度,如果图形较多,手动提取非常繁琐,因此自动提取这些信息就非常有必要. 2.解决思路 奥维地图和谷歌地图的转化文件是km ...

  5. python读取dat文件经纬度_如何为实时性应用存取经纬度?

    不需要用到redis作经纬度查询,当然你做缓存除外.实际上我们在黑客马拉松就做过一个类似的项目,它的核心思想就是取出当前用户所在地点附近的用户. 但是我注意到你使用的是mysql,虽然MongoDB能 ...

  6. ios dat 文件读写_树莓派安装Samba服务,实现家庭文件共享

    前言 Samba是一种局域网文件共享系统,安装上Samba后,在局域网内任何设备都可以共享(读写)树莓派内的资源文件,使树莓派成为家庭文件共享的中心. 注意:安装Samba需要将apt-get更新到最 ...

  7. python如何将生成的随机数存入文件中_用python在excel中读取与生成随机数写入excel中...

    今天是我第一次发博客,就关于python在excel中的应用作为我的第一篇吧. 具体要求是:在一份已知的excel表格中读取学生的学号与姓名,再将这些数据放到新的excel表中的第一列与第二列,最后再 ...

  8. matlab 处理dat文件画图,matlab_DAT_processing matlab处理dat文件并进行绘图 - 下载 - 搜珍网...

    matlab实验2/11.txt matlab实验2/B00001.dat matlab实验2/B00002.dat matlab实验2/B00003.dat matlab实验2/B00004.dat ...

  9. python大神读取_大神教你python 读取文件并把矩阵转成numpy的两种方法

    导读 今天小编就为大家分享一篇python 读取文件并把矩阵转成numpy的两种方法,具有很好的参考价值,希望对大家有所帮助.一起跟随小编过来看看吧 在当前目录下: 方法1: file = open( ...

最新文章

  1. bat命令 修改ini文件内容_Linux文件内容查看相关命令
  2. ARC内存管理机制详解
  3. linux下调用python脚本,Linux下QT调用Python脚本的解决方案,Qt,python,一种,解决办法
  4. readline库实现命令行自动补全
  5. cad中填充的剖面线不能被修剪_在模具行业中CAD二维制图的相关绘图规范
  6. Unity C#代码小技巧
  7. 杭电acm 4282 A very hard mathematic problem
  8. jeesit1.27(4)-数据权限控制
  9. html5做一个动画qq彩贝,HTML 第九章 作业
  10. 机器学习案例(十):新闻分类
  11. 方兴东:让曲线告诉创业的痛楚和狂喜
  12. linux选was清除缓存,Linux清除缓存操作
  13. HDU 5058 So easy (set容器大法好)
  14. Sublime Text 3 使用心得(转)
  15. LeetCode/LintCode 题解丨一周爆刷字符串:简化路径
  16. 4个基本不等式的公式高中_高中数学基本不等式知识点
  17. 远程计算机桌面登录拒绝访问,win7远程界面显示拒绝访问
  18. 几种简单方法找回丢失的IE图标
  19. Python实战之提取豆瓣华语新碟榜数据
  20. 监听web服务器状态,处理监听fd的流程 - web服务器lighttpd1.4.18代码详细分析_Linux编程_Linux公社-Linux系统门户网站...

热门文章

  1. 苹果6s强制删除id锁_回收宝:苹果6S手机从细节查真假
  2. mysql数据库乱码检查项
  3. 贴吧用html标签,html标签3(转载)
  4. docker php伪静态无效,解决Docker network Create加--subnet后遇到问题
  5. excel小写转大写公式_喂!这边居然有演示的Excel快捷键!
  6. Missing artifact com.oracle:ojdbc6:jar:11.2.0.1.0问题解决 ojdbc包pom.xml出错
  7. idea新增文件自动添加到版本控制
  8. java 怎么从date取得年份
  9. MinIO环境搭建及使用
  10. CentOS7.X中使用yum安装nginx的方法