每天进步一点点:从block_log中获取区块并取出区块号 (实践篇)

古人常说一句话,叫做“知易行难”,就好比之前一篇文章中,我已经大致搞懂了如何从block_log中获取区块并取出区块号,但是理论上懂了是一码事,实际上能读出来才算成功。

image.png
(图源 :pixabay)

尽管知易行难,但是古人还说:

天下事有难易乎? 为之,则难者亦易;不为,则易者亦难矣。之为学有难易乎?学之,则难者亦易矣;不学,则易者亦难矣。

所以撸起袖子加油干就对了,之前我们说过,block_log文件结构是这个样子:

+---------+----------------+---------+----------------+-----+------------+-------------------+
| Block 1 | Pos of Block 1 | Block 2 | Pos of Block 2 | ... | Head Block | Pos of Head Block |
+---------+----------------+---------+----------------+-----+------------+-------------------+

所以我要读出最新的区块亦即Head Block,那么我首先要读这个文件最后8个字节。定义好block_log的文件路径后,使用如下代码就可以读出block_log文件的最后8个字节了:

f = open(block_log, 'rb')
f.seek(-8, 2)
data = f.read(8)

这里说要说明的有两点,一个是文件打开模式,因为我们只读取而并不写入信息,所以用rb模式,这样可以避免不小心破坏文件。

第二个是seek()的第二个参数,这个代表开始查找的位置:

0:代表从文件开头开始移动文件指针
1:代表从文件当前位置开始移动文件指针
2:代表从文件末尾开始移动文件指针

我们使用f.seek(-8, 2)就是将文件指针从文件末尾向前移动8个字节,再用data = f.read(8)读出这8个字节。

正常情况我们要读取这个区块的话,要记录f.seek(-8, 2)这个位置,代表区块最后一个区块的尾部。不过我们这里只演示读出区块号,就不记录啦。

好,现在我们已经读出最后一个区块的位置信息,如何解读可以参考每天进步一点点:使用Python获取指定区块在block_log中的位置信息

在这里我们直接拿代码来用就好:

pos = struct.unpack_from("<Q", data)[0]

这个pos,就是block_log中最后一个区块数据的起始写入位置啦。如果我们从这个位置读起一直读到f.seek(-8, 2)这个位置,就可以读出整个区块数据的字节流啦。

但是如何解读整个区块数据牵涉到老多内容啦,所以,我们只读取区块号就好了。通过之前的文章,我们知道区块数据的前20个字节就是区块的Previous ID。而Previous ID最低位的四个字节就是前一个区块的区块号了。

所以我们直接从开始地址读四个字节就可以啦:

f.seek(pos, 0)
data = f.read(4)

这个数据和pos有些不一样,pos存储时使用的是little-endian也就是说:低位字节排放在内存的低地址端,高位字节排放在内存的高地址端,而这里区块号数据是按big-endian放置的。

所以,第二个区块的Previous区块号(1),以及第三个区块的Previous 区块号(2),是按图中方式存储的:

Reveal spoiler

image.png

所以解读的时候我们也要按big-endian的方式:

previous_block_num = struct.unpack_from(">I", data)[0]

最后,我们读出的是前一块的区块号,所以要在这个基础上加一,得出当前区块号:

block_num = previous_block_num + 1
print(block_num)

最后我们读出的结果为:61555539

直接来用没有block_log.index的方式replay一下:

Reveal spoiler

image.png

和我读出的完全一致哦,成功。果然是为之,则难者亦易!,话说,之前这个问题正经八百地困扰我好长时间呢。

通过之前的一系列学习,我们也应该能读出区块数据中的时间戳信息,见证人信息,不过限于篇幅,就不在赘言了,感兴趣的自己实践就好。

其实这些信息都可以通过阅读HIVE的源码来获取,不过对我这种半吊子水平的程序员,完全靠读代码来理解实在是太难啦,只好一边读代码,一边实践。

image.png
(图源 :pixabay)

这有点像盲人摸象,今天摸摸象头,明天摸摸象腿,后天摸摸象尾巴,摸得时间长了,总能想象出大概大象长啥样,嗯,就是这么回事,就不提自己水平太洼这回事啦。

相关链接

Sort:  

Your content has been voted as a part of Encouragement program. Keep up the good work!

Use Ecency daily to boost your growth on platform!

Support Ecency
Vote for new Proposal
Delegate HP and earn more

让我想起了毕业设计了,实验原理,电路模拟都没问题,真正做出来又是另外一回事,这也可以说是“知易行难”吧。

就不提自己水平太洼这回事啦😅😅这句话好适合我!

看着咋有点像大学C语言的感觉