总是听到分叉币,今天来说说到底啥是分叉。

分叉

为什么叫分叉?因为Git中的Fork命令,在软件开发中的分叉指的是:在开源项目中如果有人Fork了一个项目(一个项目分叉为两个项目),然后开发者沿着这个Fork向另外一个不同的方向独立发展这个项目。

那么区块链里为什么会产生分叉?

假设在区块增长到 2 号的时候,此时软件升级了,增加了之前版本中不能识别的一些表结构,会怎么样?

在传统的中心化软件体系中,由于数据存储都是集中的,版本管理也是集中的,如果是重大的升级,完全可以设置为若不更新到最新版就不能进行登录操作,从而确保用户使用的总是正确的版本。

然而区块链先天是去中心的使用方式,一旦有新的软件版本发布后,并每个人都会去升级到新版本,这就可能导致如下图所示的问题:在 2 号区块生成的时候发布了新的版本,且新的版本增加了之前版本不能识别的数据结构,此时部分用户升级了新版,部分用户还没有升级,这些新旧版本的软件仍然在各自不停的挖矿、验证、打包区块,一段时间过后就会变成这样:

这个就叫分叉。

由于种种原因比特币协议发生改变,会有两个不同版本的比特币协议在同时使用,他们对其他区块的接受规则不同会导致区块链长期分叉,这两个不同的链都会被不同的网络认为是有效的。
链分叉也导致网络分叉。

先来说说硬分叉

A permanent divergence in the block chain, commonly occurs when non-upgraded nodes can’t validate blocks created by upgraded nodes that follow newer consensus rules.

区块链的永久性分裂。当没有升级的节点不能验证已升级的节点基于新的共识协议所创建的区块时,硬分叉产生。

硬分叉不向前兼容:


这个定义该如何解读呢?看一下下图:


Hard Fork

硬分叉中,新的版本定义了新的规则,并且与旧版本不兼容。

当协议发布后,并非所有节点都会选择升级;那些没有升级新协议的区块发布的交易将只能由运行旧版本软件的区块认证通过,而因此升级了新协议的区块发布的交易只能由运行新版本软件的区块认证通过;由于规则不兼容,因此矿工们工作在各自的最长链条上。于是产生了两条基于不同规则的、永远不会合并的区块链。

顺便说一下历史上最大的硬分叉事件:TheDao被黑客攻击的事件。
2016年6月区块链最大ICO项目TheDao遭黑客攻击,导致300多万以太币资产被分离出TheDAO 资产池,当前相当于20亿美元。
这时候V神站出来说,这个事情,我知道了,要不我们直接来个软分叉,重新算账。从块高度1760000开始把任何与The DAO和child DAO相关的交易认做无效交易,不就解决了吗?
然而,还是有人提出反对。他们认为这违反了区块链的不可篡改性以及智能合约的契约精神,哪怕TheDAO的钱被偷走了,但是只要数据被写在了区块上,就是不可篡改的,因此他们并不配合V神的分叉,依然使用老版本。
就这样,软分叉最后生生搞成了一次硬分叉,V神的新ETH依然获得了大多数矿工和开发者的认可,但是还是有少数人坚持试用老节点,这时挖出来的币被称为ethereum classic,也就是以太经典。

这就是ETH和ETC。
而分叉币中另一著名的则是BTC和BCC; BCC支持大区块(将区块大小提升至8M),不包含SegWit功能。


再说说软分叉

A softfork is a change to the bitcoin protocol wherein only previously valid blocks/transactions are made invalid. Since old nodes will recognise the new blocks as valid, a softfork is backward-compatible.

软分叉是对比特币协议的一次修改,只有先前有效验证的区块/交易将不再合规;由于旧节点依然可以验证新区块,软分叉被认为是向后兼容的。

软分叉是向前兼容的:

所有被新版本认为是合法的区块也会被以前旧版本认为是合法的。旧版本会接受新版本创建的区块。新版本和旧版本是兼容的。

Soft Fork

软分叉也是对原有软件协议的修改。
与硬分叉不同的是,新的软件版本所定义的新规则与旧版本兼容,但比旧版本更严格。
当新版本发布时,升级了新软件版本的节点发布的区块可以被所有节点验证通过。而没有升级新版本的节点发布的区块只能在运行旧版本软件的节点上验证通过。
此时,同样会产生两个区块链条,这种情况称为软分叉。

当网络中的大多数节点选择部署新软件版本后(更精确的说法是大多数算力),新链条将产生更多的区块,工作在旧版本节点上的矿工们将会逐步升级软件并转移到新链条上来工作,这里有两方面原因。

  1. 由于新链条成为最长链条,并且新链条上的区块被旧版本节点上的矿工们认可,所以他们会迁移到最长链上来。
  2. 由于软分叉对于节点是无感知的,旧版本节点发布的新区块会被新版本节点“莫名其妙”的拒绝,这会敦促他们升级新软件版本。

最终,并不会像硬分叉一样产生两个不相干的区块链,而是会产生一些临时性的分支。当然,只有当大多数算力支持软分叉时才会使新规则生效。

总结来说

硬分叉,是当比特币协议规则发生改变,旧节点拒绝接受由新节点创造的区块的情况。违反规则的区块将被忽视,矿工会按照他们的规则集,在他们最后见证的区块之后创建区块。

软分叉,是当比特币协议规则发生改变,旧的节点并不会意识到规则是不同的,它们将遵循改变后的规则集,继续接受由新节点创造的区块。矿工们可能会在他们完全没有理解,或者验证过的区块上进行工作。

协议一致性

在区块链中,能够让区块链保证数据唯一性的前提是:所有矿工都遵从同样的机制。即如果所有矿工都使用同一套协议,则不会出现分叉。

但是会有另一种情况导致短暂的“共存”:
默认大家已经了解什么是挖矿了,在比特币中使用工作量证明,当有矿工第一个计算出所需的数字,就大喊一声“我的工作量证明成功了你们快来看呀”,这时经过验证之后所有的矿工都会把那一页抄写一份,贴在自己账本的最后一页,然后开始新的记账过程。

但是会存在极小的概率下,有两个矿工同时计算出来,这该怎么办?
由于网络的亲疏远近,不同的节点听到两个矿工喊“我解出来了” 是有先后顺序的,一般大家会把先看到的区块复制过来,然后在这个区块后面开始新的挖矿工作,于是就出现了下面这种情况:

这种情况就是短暂共存;要怎么解决呢?

在以工作量证明为共识的区块链中,从分叉的区块开始,由于不同的矿工跟随了不同的区块,理论来说从分叉开始的两条链算力是有区别的,因此区块的增长速度也是不同的,在一段时间之后,总有一条链的长度会超过另一条,当矿工发现全网有一条更长的链时,他会放弃当前的链而把全网最长的链复制过来,在这条链的基础上继续挖矿工作,于是全网永远是只有一条最长的链为主链,分叉出来被放弃掉的链就会消失了。

最终,只有一条链会被保留下来,成为真正有效的账本,其他都是无效的,所以整个区块链仍然是唯一的。




欢迎留言