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