前两天发文说见证人节点的block_log
莫名其妙地损坏,导致我又重新replay节点,而在replay之前,需要先对block_log
进行修复。
(图源 :pixabay)
我的方法
我采取的修复方式是将block_log
截短一小段,然后去和@gtg提供的block_log
同步,这样就得到一个完好的block_log
文件。
然后再去replay,不过因为block_log
与block_log.index
文件快高不一致,所以replay时要重新计算更新block_log.index
文件,要耗费很长时间。
当时我在想,如果我知道block_log
与block_log.index
文件文件的具体格式,或许可以直接修复block_log
,而不用去和别人同步。
A神的方法
和A神说了这个问题后,A神马上给我一套解决方案,大致思路就是通过block_log.index
计算出指定的区块在block_log
中的位置。
然后根据计算结果将block_log
截短到指定区块的前一区块,同理将block_log.index
截短到指定区块的前一区块。
比如说通过block_log.index
可以计算出最近的不可逆块(当然也可以根据实际情况再向前切5到10个块),然后在block_log
以及block_log.index
切除掉这个块对应的数据,这样就达到切除坏数据的目的了。
优劣对比
首先,A神的方法精准定位后仅需对block_log
的切除一点点,相比我不知道具体数据盲切一大块要好多了。
A神的方法有个好处就是无需依赖于别人提供的block_log来同步。尽管@gtg提供了靠谱的block_log文件,但是能不用同步别人的总比去同步别人的要好。
另一个好处就是因为都是依据同一区块高度处理,所以不会存在区块高度不一致的问题,replay时省却了重新计算block_log.index
的过程,大幅节省时间。
如果比较我和A神处理方法,那么我的方法大概是:病人手指尖有病灶,我直接把病入的手剁掉(截肢),然后移植一个新手过来,然后耗费大量的时间等病人的手长好。
而A神的方法,好比知道病人的手指间有病灶,那么通过微创手术直接切掉病灶部位,病人的手可以很快地长好恢复。
都能解决问题的情况下,截肢并移植 vs 微创手术,花销多少,孰优孰劣一目了然了吧?我不禁为我之前的处理故障时还觉得自己很厉害而感到惭愧不已。
(图源 :pixabay)
A神之所以如此厉害,是因为他对整个系统的代码都很熟悉而且有着深刻的理解,像我这样大把时间都用在游山玩水以及喝酒聚会上的人,几乎不用指望做到A神这种程度了。😓
其实每次和A神沟通都有很多收获,不过因为知晓他实在是太忙,不忍心打扰他,也不忍心浪费他的宝贵时间。我还是慢慢摸索吧出去喝酒吧。
什么?你不知道A神是谁?那你OUT了,A神YYDS!为了避免打扰到A神,我就不艾特他了,哈哈。
厉害!
+1
都厉害!都厉害!
赛利
哈哈,我知道A神是谁,算了,他太忙,我也就不@他了😂。自此我开始知道神也分等级啊😂。