BigBang icon indicating copy to clipboard operation
BigBang copied to clipboard

分支名字唯一功能,可能存在同名分支在不同节点中存在的问题

Open cchanm opened this issue 6 years ago • 2 comments

分支名字唯一功能,只是在添加起源块时,判断本地是否有该名字的分支,判断是否成功,没有影响区块及交易的有效性,当以下情况发生时,会在不同节点存在同名分支的情况。 1)当两个节点(A节点、B节点)在同一时间(不完全一个时间点,只要在一个区块时间内就可以),分别创建名字相同的分支,将产生两条创建分支的交易,这两条交易分别在两个节点上打包,并且产生分叉,两个块中,两条交易的顺序相反,即A节点的块是AB顺序,B节点的块是BA顺序; 2)其它节点接收到A节点的块时,会生成A分支,而排斥B分支,接收到B节点的块时,会生成B分支,而排斥A分支; 3)当分叉回滚时,也不能将改变这个情况,分支创建后,没有删除功能,并且也不能删除,由于分支上产生的价值,无法删除。

cchanm avatar Oct 16 '19 02:10 cchanm

可以考虑这个办法:

  1. 在一个分叉上块的打包与验证过程中,保证fork不重名,要么有A、要么有B
  2. 在长短链切换时,可以切换A、B订阅关系

sunhantao avatar Oct 17 '19 07:10 sunhantao

测试链存在两个重名分支:

"fork" : "00003841577cb3b48afe04eceb328bad1a697cf86619b87b7df8f74fcb942a1f",
"name" : "BigBangCoreCamera"

"fork" : "00001195d2d0771094ec8459f0b375bab1e0dd75f179cf6f93e678ac86e8bd32",
"name" : "BigBangCoreCamera",

forkdb将两个分支都存起来了,导致forkmanager有两个分支。但AddNewOrigin判断了重名分支,所以blockbase实际存在的分支只有一个。

在RPC listfork的时候,有-a参数从forkmanager获取数据,没有-a参数从blockbase获取数据导致了不一致的情况。

临时修复办法是都从forkmanager获取数据,在返回RPC结果时去重。

彻底修复应在fork抵押赎回PR #572 中考虑db中不存重名分支

sunhantao avatar Sep 14 '20 03:09 sunhantao