通告:
本专栏系列原创文章同步发布在【简亿区块链@简书】,微信公众号【简亿区块链】以及【开发者头条独家号:简亿区块链】上。

1.前言
在前面的文章《什么是“挖矿”?比特币“挖矿”原理解析》中,介绍了什么是挖矿,以及挖矿的原理,本文主要围绕着挖矿的过程产生的区块链的“分叉”现象,做个系统的介绍。
在介绍:什么是区块链“分叉”之前,先介绍下,比特币的交易打包过程以及底层的实现原理,见章节2.
2.比特币“交易打包”底层原理
2.1“挖矿”与“交易打包”
前文我们说到,所谓“挖矿”,就是生成一个最新“区块”的过程,“矿工”在该过程中,是为了获取比特币的奖励(经济驱动);
这部分奖励分为两部分:比特币网络系统的CoinBase奖励 和 所打包的所有交易的交易费(交易费的作用下文会介绍);
那么,交易打包的过程和底层原理是什么呢?下文我们将图文展示整个交易打包的细节;
2.2“交易打包”过程?
每个比特币客户端节点自加入比特币网络开始,无时不刻不在做着创造新区块的操作;
而创造新区块的过程,即是打包每一笔“比特币交易”的过程;
下图是站在“比特币客户端节点”的角度,来描述一次区块生成过程中的交易打包过程。

2.3每一步的详细说明
步骤1)
监听比特币网络中的其他所有节点的广播,最新区块是否被Relayed(中继,转发);
如果没有,则继续手头的“挖矿”步骤:接受新比特币交易,并验证该笔交易,无论验证结果,中继转发该交易到其他节点;
如果有,则意味着本次的“挖矿”失败,并保留清理现场,结束本次挖矿,立即开始新的“挖矿”步骤;(基于理性的考虑,矿工会在上一次区块验证之后,立马开始下一个区块的创建,目的是为了获得更多的比特币coinBase奖励)
步骤2)
将步骤1中被验证成功的交易放入本地内存交易池中(Local Memory Tx Pool,交易池是存储在本地内存中,并不是存储在硬盘里,因此不同节点的两池内容可能有很大差别。);
如果在此过程中,监听到新区块被Relayed,则该节点将已打包的交易放回到本地内存交易池中,并且需将新区块中的对应交易,从本地内存交易池中剔除;
原则是:要保证任何在本地内存交易池中的交易均是未确认的。(比特币交易频率是有限制的,原因是区块大小限制,所以会导致内存交易池中的交易有堆积,详见PS2)
PS2:最理想状态下,平均每笔交易225 字节。在1M区块限制下,一般平均10分钟可以打包大约 4400 笔交易。每秒大约7.3笔交易,实际交易平均大小是这个的一倍,那么容量减半,也就是每秒大约 3.6 笔交易。
步骤3)
按照“交易权重”将权重从高到低(交易的权重计算规则见PS1),挨个打包进入到区块体中;优先处理权重最高的交易;
(所以,我们在使用交易软件比如ImToken时候,偶尔会出现如下提醒:"当前网路交易拥堵,建议提高交易费用",正是因为按照优先级处理,所以在网络交易拥堵的时候,有可能造成低优先级的交易“永远”不会被打包)
PS1:交易的权重大小取决于三个因素:1)交易创建时间越早;2)交易UTXO大小越大;3)交易费用越高,则权重越大。
步骤4)
填充区块头字段值,创建区块头信息,先装入block meta信息,然后是交易数据,Nonce值设为0;
PS:具体的区块结构见《比特币的“区块”中藏有什么秘密:区块链区块结构解析》
步骤5)
穷举Nonce(从0开始),计算Hash值是否<=targetHash;
如果本次所得的哈希值<=target,则“挖矿”成功;反之,Nonce+1,重复计算过程;
步骤6)
接步骤5)如果挖矿成功,则开始向相邻比特币客户端节点传播;
经过相邻节点的接受和验证确认之后,相邻节点会尝试将该区块链接到本地的最长链之后,主链高度加一,然后切换至新block后面继续挖矿,重复上述步骤1)。
以上,即是交易的打包过程。
续谈“挖矿”,那么不同的“节点”同时广播“宣布”挖到最新区块的情况,会发生什么呢?
3.区块链“分叉”的产生“ & ”BestChain选择准则

3.1“分叉”现象的产生
非人为“分叉”的产生原因
在《什么是“挖矿”?比特币“挖矿”原理解析》一文中,我们讲述了“挖矿”的底层原理,由此我们知道,所谓“挖矿”,是计算一个HASH值<=TargetHash的过程;
而符合计算规则的结果Hash有很多个,所以会出现同时好多个“矿工”同一时段(考虑到网络延迟)宣布“挖矿”成功;
所以,同一区块高度会出现多个区块的时候,由此就产生了区块链的Fork,也就是“分叉”现象。(插一句,这就是为什么中本聪要规定均值10分钟产生一个区块,为的就是降低碰撞的频次,减少fork次数);
人为“分叉”的产生原因
这种人为分叉,要从区块链的共识机制说起。
区块链是由点对点的去中心化节点共同维护的,区块链的有序运转靠的就是大家的共识;
即对于哪些交易是可以接受的、哪些节点具有记账权等关键事宜,有一套公认的标准。
这套标准是部署在区块链底层协议中自动化执行的。
当不同节点运行的底层标准(即客户端软件版本不一致)不一致的时候,人为分叉自然而然就产生了。
PS:为什么会出现不同的客户端软件版本不一致呢?主要原因有以下几种
1)利益原因:不同的矿工因为利益关系,矿工个体本身有选择性的接受或者不接受新的升级版本
2)时延原因:不可能所有的客户端在同一时刻同时升级,即使所有节点都同意升级并立刻升级,也会有时延
3)区块链网络节点可自由动态加入或者离线,离线的那部分节点会感知不到升级,等再次入局升级的时候,这中间会有一段时间。
4)等
3.2“分叉”之后,最佳链(bestChain)的选择准则?
那么,要保证区块链的MainChain唯一性,当出现多处分叉的时候,该用什么准则去选择最佳链(select the bestChain as mainChain)呢?
1)如果不同分支的区块高度不同,那么选择最长区块高度的分支为MainChain(在POW共识机制下,最长工作量代表着最权威的说服力);
2)如果高度一致,则选择难度系数最大的分支为MainChain(在POW共识机制下,difficulty越大,则说明该区块被创造所需要的工作量越大,则权威说服力越大);
3)区块高度如果相同,并且难度系数也一样,那么选择接受时间最早的那个分支为MainChain;
4)若所有的评判系数均相同,则等待各自某分支的区块高度+1之后,重新重复上述1~3步骤选择出一个BestChain。
3.3区块链“分叉”种类之“软硬分叉”
上述3.2章节中,描述的“分叉”是比特币网络正常运行出现的“分叉”,是非人为干扰的系统“自分叉”,系统的筛选逻辑可解决该种分叉;
所以,也会存在人为“分叉”,人为“分叉”分为:软分叉和硬分叉;
什么是“硬分叉”?
“A hardfork is a change to the bitcoin protocol that makes previously invalid blocks/transactions valid, and therefore requires all users to upgrade. Any alteration to bitcoin which changes the block structure (including block hash), difficulty rules, or increases the set of valid transactions is a hardfork.”
---《BitcoinWiki # Hardfork》
大概总结下,意思是说:硬分叉指的是改变了比特币底层协议,使得之前被验证无效的区块变得有效,而为了保持兼容性,会强制要求所有节点都更新协议版本至最新。(一句话就是:凡是霸王手段耍流氓式的要求所有节点必须升级,否则运行机制不兼容影响新生成区块和交易验证的分叉都是硬分叉)
什么是“软分叉”?“软分叉”真的“软”吗?
“A softfork is a change to the bitcoin protocol wherein only previously valid blocks/transactions are made invalid. Since old nodes will recognize the new blocks as valid, a softfork is backward-compatible. .”
---《BitcoinWiki # Softfork》
大概总结下,意思是说:软分叉指的是虽然改变了比特币底层协议,但是只会使之前被验证有效的区块变的无效,而且即使节点不升级(虽然官方WIKI是这么描述的,但是是有具体的实施机制的,下文中会详细说明,暂不提),也不会影响新生成区块和交易被验证接受。软分叉是“向后兼容”的。
新的交易类型可以以软分叉的方式被无缝加入到区块链网络中,只需要交易的参与者(sender和receiver)和矿工节点能辨识交易类型内容即可。至于其他older客户端节点,把新的交易类型的交易当做“pay 2 anybody”即可,无需关注交易细节的真实含义。
比如:比特币比较出名的升级(版本2升级到版本3)
1)加入了新的交易类型:Segregated Witness(隔离见证,主要是为了区块扩容和交易延展性) 代号SegWit。
SegWit交易模式下,区块头中增加一个新字段“witness”,使得在非硬分叉方式下,进行了技术扩容。
所谓技术扩容,意思是物理大小并没有扩容,而是通过交易信息和验证信息的分离,使得当部分数据被移除后,就为更多的交易腾出了空间;
这样一来整个比特币网络的交易吞吐量也随之提高,变相达到区块扩容的效果。
2)加入了新的交易类型:Pay to script hash (P2SH)
在P2SH之前,只允许交易的接收者地址为公钥地址(Public Key Hash Address,以1开头的Hash地址);
在P2SH之后,允许交易的接收者地址为脚本地址(Script Hash Address,以3开头的Hash地址),允许了多重签名。
“软分叉”的分类
软分叉分为两类:
1)miner-activated softfork (MASF)
大部分的矿工节点升级了新版本,激活了新协议,这种软分叉被称为“MASF”;
2)user-activated softfork (UASF)
全部节点(Full Nodes)都升级了新版本,激活了新协议,这种软分叉被称为“UASF”;
“软分叉”真的“软”吗?
(个人理解)虽然“软分叉”向后兼容,但是不代表“软分叉”真的很软。只不过是可以暂时不升级也不影响新区块被介绍和验证,但是迟早是需要升级的。下文讲详细介绍软分叉的升级更新机制(Mechanism)。
“硬分叉”很流氓,没什么需要细说的,下面详细介绍下比特币软分叉的实施机制
以比特币版本2升级到版本3为例:
背景介绍:
版本2与版本3的区别:BIP66,即限定签名的DER编码,不再接受DER派生编码,只接受DER标准编码;
BIP66生效方法:最近1000个区块中有750个区块的版本为3,则该规则生效;
基本准则,最新生成的1000个区块中,计算版本3的区块的占比,程序自动来控制是否向后兼容版本2;
(1)当[0-75%)的区块采用了新版本3,则兼容2和3版本;
(2)当>=75%的区块采用了版本3,则开始启用BIP66,但同时兼容版本2;
(3)当>=95%的区块采用了版本3,则不再兼容版本2,只允许版本3的存在。
以上即是本次有关区块链分叉的介绍,欢迎diss讨论~
欢迎关注微信公众号:【简亿区块链】,新鲜出炉的文章会同时发布!

网友评论