古人常说一句话,叫做“知易行难”,就好比之前一篇文章中,我已经大致搞懂了如何从block_log中获取区块并取出区块号,但是理论上懂了是一码事,实际上能读出来才算成功。
(图源 :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
所以解读的时候我们也要按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
和我读出的完全一致哦,成功。果然是为之,则难者亦易!,话说,之前这个问题正经八百地困扰我好长时间呢。
通过之前的一系列学习,我们也应该能读出区块数据中的时间戳信息,见证人信息,不过限于篇幅,就不在赘言了,感兴趣的自己实践就好。
其实这些信息都可以通过阅读HIVE的源码来获取,不过对我这种半吊子水平的程序员,完全靠读代码来理解实在是太难啦,只好一边读代码,一边实践。
(图源 :pixabay)
这有点像盲人摸象,今天摸摸象头,明天摸摸象腿,后天摸摸象尾巴,摸得时间长了,总能想象出大概大象长啥样,嗯,就是这么回事,就不提自己水平太洼这回事啦。
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语言的感觉