BigBang
BigBang copied to clipboard
分支名字唯一功能,可能存在同名分支在不同节点中存在的问题
分支名字唯一功能,只是在添加起源块时,判断本地是否有该名字的分支,判断是否成功,没有影响区块及交易的有效性,当以下情况发生时,会在不同节点存在同名分支的情况。 1)当两个节点(A节点、B节点)在同一时间(不完全一个时间点,只要在一个区块时间内就可以),分别创建名字相同的分支,将产生两条创建分支的交易,这两条交易分别在两个节点上打包,并且产生分叉,两个块中,两条交易的顺序相反,即A节点的块是AB顺序,B节点的块是BA顺序; 2)其它节点接收到A节点的块时,会生成A分支,而排斥B分支,接收到B节点的块时,会生成B分支,而排斥A分支; 3)当分叉回滚时,也不能将改变这个情况,分支创建后,没有删除功能,并且也不能删除,由于分支上产生的价值,无法删除。
可以考虑这个办法:
- 在一个分叉上块的打包与验证过程中,保证fork不重名,要么有A、要么有B
- 在长短链切换时,可以切换A、B订阅关系
测试链存在两个重名分支:
"fork" : "00003841577cb3b48afe04eceb328bad1a697cf86619b87b7df8f74fcb942a1f",
"name" : "BigBangCoreCamera"
和
"fork" : "00001195d2d0771094ec8459f0b375bab1e0dd75f179cf6f93e678ac86e8bd32",
"name" : "BigBangCoreCamera",
forkdb将两个分支都存起来了,导致forkmanager有两个分支。但AddNewOrigin判断了重名分支,所以blockbase实际存在的分支只有一个。
在RPC listfork的时候,有-a参数从forkmanager获取数据,没有-a参数从blockbase获取数据导致了不一致的情况。
临时修复办法是都从forkmanager获取数据,在返回RPC结果时去重。
彻底修复应在fork抵押赎回PR #572 中考虑db中不存重名分支