当前位置:  首页 →区块链百科 →正文

一文看懂区块链分叉是怎么回事

2018-11-26 22:39:18 区块链百科

原标题:一文看懂区块链分叉是怎么回事

本文从技术角度分析一下,在区块链节点软件升级的过程中会发生什么情况,为什么会出现分叉,以及出现分叉之后区块链的走向。

区块链分叉是怎么回事

 

区块链为什么会分叉?

节点软件承载着共识算法,当部分节点的软件升级到新版之后,由于互相之间的共识算法不完全一致,在面对新挖出的区块时,会按照各自共识算法的要求做出取舍,把自己认为合法的区块纳入主链。于是在区块链网路里就会出现不同的主链,各自被一部分矿工节点所拥护并在其上开挖新块,这就是分叉。

本文只讨论这种由于共识算法差异所产生的分叉,至于因网络传播速度差异等原因导致的分叉则不在讨论范围内。

不一致的共识算法之间可能存在着一定的兼容性,不同的组合情况决定了分叉最后的归宿。

新旧版本软件之间兼容性的各种情况

以下内容可能会比较拗口,为了方便表达,先定义两个简称——

旧版块:旧版软件挖出的新区块

新版块:新版软件挖出的新区块

区块链分叉后的推演

区块链分叉后的推演

YA:任何版本都会承认版本升级前的历史

YB:任何版本都会承认自己挖出的新区块

YC:旧版软件接受新版块(具有前向兼容性)

ND:旧版软件不接受新版块(不具有前向兼容性)

YE:新版软件接受旧版块

NF:新版软件不接受旧版块

注:前向兼容性(forward compatibility)是指当一个软件推出新版本之后,以前的旧版软件仍然能够接受并处理新版软件输出的数据。比如用Word 2013保存的文件能够用Word 2011打开并继续编辑。

 

为什么有时候兼容有时候不兼容?

旧版软件对新版块的兼容性(YC/ND)往往是版本升级本身的内容决定的,比如扩容(区块尺寸从8M调整为32M),这时候新版块在旧版软件看来就是非法的(ND);而像升级后禁用某个操作码,这时候新版块在旧版软件看来是合法的(YC)。

新版软件对旧版块的兼容性(YE/NF)有可能是版本升级本身的内容所决定,比如扩容,这时候旧版块在新版软件看来就是合法的(YE);而像升级后禁用某个操作码,这时候旧版块在新版软件看来是非法的(NF)。但NF也可能只是一种升级策略上的选择,比如希望强制升级,这一点后文会有论述。

4种升级场景中不同软件版本所面临的局面

这4种场景对比着看,是有对称性的:

S1和S4正好是相反的场景。S1是两个版本互相接受,一起愉快地玩耍;S4是两个版本互相不接受,各玩各的。

S2和S3这一对,如果抛开新版/旧版之间的传承关系,就当作是甲、乙两个独立的版本来看待,其实是同一种情形,一个版本单向地接受另一个版本。

设甲接受乙,而乙不接受甲,那么:

◉ 使用甲版本的矿工节点

两个分叉对于他来说都是合法的,他会接受最长链作为自己工作的新起点。

挖出的新区块只能被同类矿工节点(同样使用甲版本)接受。如果网络内同类节点数量(不是算力!)不占优势,则挖出来的新区块无法有效传播,就无效了。

◉ 使用乙版本的矿工节点

两个分叉中只能接受其中一个作为自己工作的起点。所有同类矿工节点只能顽固地坚守在这一个分叉上。

如果网络内同类矿工节点算力占优势,最终会替掉另一叉。

只要自己不放弃,无论如何自己这叉不会消失,已付出的工作量会保持有效。

 

硬分叉与软分叉的区别

S2和S3同样是产生了分叉,为什么一个软一个硬呢?可以这么理解,正是因为有了“新/旧”的对比,才导致了这种区别,旧版软件的前向兼容性是两者的分水岭。当部分节点升级到新版之后,产生了分叉,分叉的软和硬是站在旧版节点的立场上来说的。

S2场景下,旧版节点会认为两个分叉都是合法的,按照以往的逻辑同等看待两个分叉,哪个长就接受哪个,所以这个分叉是“软”的。

S3场景下,有一个分叉是不合法的,旧版节点肯定不会接受它,所以这个分叉是“硬”的。

当使用旧版软件的矿工节点面临硬分叉的时候,他就不得不做一个艰难的决定:是坚守自己的版本还是更新到新版本。比如当初BCH与BTC分道扬镳的时候,一部分矿工选择了坚守在原来那条链上,继续运行BTC;而另一部分则选择更新到新版本,转而接受另一条链,这意味着进入了一个新的分叉币世界。

当然,硬分叉之后,哪一条链能够继续享有原来的名字,这就不是技术问题了,而是社区的认可(交易所的认可)决定的。比如BCH从BTC分叉出来的时候,BTC这个名字被原来的那条链继续享有,分叉出来的就是BCH;而BCH历史上几次重要的硬分叉,都是分叉出来的链沿用BCH这个名字,原本的链则被弃用了;BCH刚刚完成的这次硬分叉,目前看基本结论是吴忌寒阵营ABC版本产生的新链能够继续享有BCH这个名字,而CSW阵营的BSV版本则坚守在原链上,反倒沦为分叉币,那个分叉币发展如何还有待观察,但大概率是不会享有BCH这个名字了。

 

两种硬分叉的区别

S3与S4两种场景,站在旧版节点的立场上来说,都是不接受新版块,所以都是硬分叉。但对于新版节点而言,是否能够接受旧版块,结果是不同的。

作为硬分叉的主导者,他的目的是推广新版软件,希望尽快结束过渡期。基于这种诉求,ND+NF(新版软件不接受旧版块)会比ND+YE(新版软件接受旧版块)更有优势。

NF还是YE(新版软件是否接受旧版块)?前面提到,这个事情可能取决于软件升级本身所涉及的内容,但有时候升级所发生的改变并不排斥旧版块(比如扩容),那么是否接受旧版块就可以是一个策略选择。升级(硬分叉)的主导者往往与新版软件的提供者是一体的,他们可以在新版软件中设置对自己有利的安排。

设想一种极端情况,假定吴忌寒希望支持ABC团队完成一次硬分叉升级,吴控制的矿池调集了占BCH全网50%的算力启用了新版软件,其他所有矿工节点暂时停留在旧版软件上。

如果新版软件选择了YE方式,吴矿池虽然有50%的概率率先挖出新块,但没有人替他传播,只有他自己在这个叉上工作,而其他节点都在挖另一个叉,一旦那个叉长度占优,吴矿池会接受那个叉继续工作,实际上就是把自己前面的工作报废掉了。

为了保证不浪费,就要确保自己的独特叉永远长度占优(保持超过全网50%的算力),等待局势发生变化(更多的矿工节点升级到新版)。

而如果新版软件选择NF方式,就简单很多了,吴矿池不会接受另一个分叉,一心一意挖自己的叉,其算力占全网算力的比重低一些也不会导致自己这个叉被吃掉,可以更从容地等待变化来临。

所以,从主导者的角度来看,尤其是投入算力支持的主导者,选择NF会让升级过程更简单,更干脆,减少变数,避免经济损失。当然,这也是一条不归路,虽然自己在这个叉上投入的工作量会一直保持有效,但如果这个分叉最终被市场抛弃,那么一切投入都会归零。

BCH在2018年11月16日实施的这次升级包含两项更新:

1)对区块内交易增加规范交易排序(CTOR);

2)增加两个操作码(OP_CHECKDATASIG和OP_CHECKDATASIGVERIFY)。

简单分析不难判断,第1条是YC+NF的,第2条是ND+YE的,综合下来就是ND+NF的,所以这是一次属于S4场景的硬分叉。

既然这样,分叉后两条链各行其道,谁也不会“吃掉”谁,为什么还要不惜血本调集大量算力进行这种隔空搏杀呢?我想这里面可能有两个原因:

一个是要争夺BCH的冠名权。分叉之后,哪条链才是正宗的BCH,哪条是分叉币?一般惯例是“最长链”胜出。目前看吴阵营已经达到了预期的目的。(注:这里的最长链指的是最大累积难度,而不是单纯指区块链的高度)

另一个就是“护法”。这次硬分叉的反对方CSW来势汹汹,放言要对新链进行攻击。新链初生,江湖地位不稳,所以调集算力进行保护是有必要的。不过截至目前,据称在新链上并未发现明显的被攻击迹象。随着新BCH地位稳固,被社区广泛接受,CSW再要实名发起攻击就要承担更多的社会压力了。

 

延伸阅读:极客_BCH分叉(Fork)在即,分叉到底解决了什么问题?

BB财经原创,作者区块链百科,转载请注明出处:http://www.bbcaijing.cn/baike/29979.html