第
0
章
引言
在比特币行业里老会出现“分叉”这个概念,不明其理的人特别怕这玩意,往往会将被词等同于“分裂”。其实这个词的深层含义多了呢,我详细分析下。
第
1
章
代码层面的“分叉”叫“
fork”
“分叉”这个词最经常出现的场所是
g
ithub
这个代码托管平台,是多个程序员共同管理和协同开发项目的一种办法。
为了便于理解,我先举一个类比。
你在一家公司的一个部门,比如研发部,部门一共
5
个同事,其中一个部门经理。现在部门要向公司提交下个月的办公用品采购计划。部门经理先用
wrod
文档写了一份采购申请单,并且在申请单上填上了自己计划要买的东西。然后经理将文件上传到部门的共享文档上。
同事
A
将文档复制了一份,然后在后面添加了自己想要采购的东西,然后上传到共享文档申请经理审批。同事
B
、
C
、
D
也分别复制了一份,分别添加了自己想要买的东东,并且申请审批。
部门经理审批了
A
的采购计划,认为合理,他就将
A
的需求合并到自己的那份申请单后面。审批了
B
的计划,他认为不合理,他就拒绝了
B
的需求,直接丢弃了
B
的计划单。然后继续审批
C
和
D
的。要么合并,要么丢弃。
然后
B
很生气,认为这不合理,他就越过部门经理,直接向公司提交了一份采购申请单。
如果把以上这个例子中的“采购申请单”,换成一个“程序开发项目”,上述过程就是一个
典型的“立项”、“分支”、“请求”、“合并”、“分叉”的过程。
部门经理立了一个项,要写一份采购申请单,他写好自己的部分之后,将文档上传到共享云,形成一个
主代码仓库
。
然后
ABCD
四位同事分别对这份文档进行
“
b
ranch
”(中文译成分支)
,在分支上加上自己想要的特性
,然后向主代码提交申请,叫
“
pu
ll reques
t
”,中文叫“请求”。申请将自己的修改部分合并到主代码库里。
然后经理这个主开发者会审批这个“
p
ull request
”,如果合格了,他就会将这部分代码合并到主代码库,这个过程叫
“
merge
”,中文译成“合并”
。
如果主开发者认为这个“
p
ull request
”不合理,
他就会拒绝,英文叫“
C
lose
”。
但如果提这个“
pull request
”的人觉得他是对的,他可以独立出去,不和这个经理玩了,自己立个项,取个别的名字,然后自己合并代码。这样就形成了一个
“
f
or
k
”,中文译成分叉。
以上是所有参与者都是有开发权限的流程,但如果是一个项目组外的人,看到了这个项目,并且想提交一份特性的代码“
pull request
”,那他就得先对这个主代码仓库进行“
for
k
”,然后再提交“
pull request
”。这个
没有开发权限的人叫没有提交代码权,提交代码权英文叫
commit
权限。
这就是开源软件管理的过程。开源软件的代码更新,和漏洞修复都是使用这一套流程。
比特币就是一套开源软件,一开始有只有一个代码仓库,是中本聪建立的,叫
B
itcoin
,后来有很多人
"fork"
了
Bitcoin
,并提交了“
p
ull request
s
”,有些人干脆自己“
fo
rk
”并独立出去,形成新的分叉。
现在
比特币这套开源软件有非常多的分叉,最著名的就是
bitcoin
co
re
、
bit
coin
unlimited
、
bitcoin classic
、
bi
tcoin
XT
、
B
coin
……
第
2
章
软件版本上的“分叉”又叫“开发去中心化”
比特币有这么多版本,有这么多分叉,所有
这些不同的版本是可以在比特币网络实际运行过程中相互兼容的,同时运行这些软件并不会造成比特币网络的分裂。我们管这些不同的相互兼容的版本叫竞争性实现。
多个版本的软件实现相同的功能,各个版本有各自的用户,这就是软件版本之间的竞争。
这些多种版本也可以有一些额外的独特功能,只要不影响和其他版本的兼容性就好。
这种多版本运行在同一个网络里有很多好处。那些最重要的软件特性的更改和协议,因为需要多个版本的兼容性开发,所有的相竞争的开发者都要相互查阅和测试所有的实现代码,代码质量会更高。而且因为全网多个版本实现存在,单一版本出现漏洞,并不会导致全网崩溃。
比特币网络就是多版本版本实现同时共存,开发者们相互竞争,这就是开发去中心化。
第
3
章
比特币区块链“协议升级”常被误称为“分叉”
比特币网络要部署一个新的特性,这就叫“协议升级”。
我们将手机和电脑上的软件进行版本更新,这是很简单的过程,直接下载一个新版本软件,然后覆盖安装就好了。
因为
比特币网络要实现的目标是全网众多节点达成共识
,所以比特币网络要实现新的重大版本升级,并且在全网将新的重大特性激活,那就需要一些特别的措施。
所有那些会影响达成共识的新特性都必须采取特别的措施,以防止升级过程中共识失败。其中比特币区块链最重要的共识就是矿工广播区块和交易格式必须是达成共识,即所有矿工节点都能对区块的格式和交易的格式相互认可和相互接受。
最重要的措施就是保证全网绝大多数节点都准备好,然后同时激活新功能。
这就要求各个节点所使用的软件具有向全网发送和接收某种特定信号的能力。
但这个过程并不是非常简单的,绝大多数重大升级都存在共识失败的风险。甚至因为各方的利益不一样,有人会恶意在升级过程促成共识失败。
如果共识失败,比特币区块链就可能产生两条甚至多条链。这就是“分裂”,也被人称为“分叉”。
比特币重大协议升级有两种思路,一种叫“
H
ard
For
k
(硬分叉)”,一种叫“
S
oft Fork
(软分叉)”。
硬分叉和软分叉都是比特币协议升级的办法,并不一定会造成比特币分裂成两条链,分裂只是升级失败的结果。
大家经常说的“比特币分叉”,在绝大多数意义都不是指代“比特币分裂”,而是指代“比特币协议升级”。
第
4
章
比特币区块链“协议升级”失败才有可能导致“分裂”
再次强调,
硬分叉和软分叉都是比特币协议升级的办法,并不一定会造成比特币分裂成两条链,分裂只是升级失败的结果。
硬分叉和软分叉都有可能会失败,也都有可能导致分裂。但只要管理的好,大家统一升级,就不会出问题。