在前面的文章《什么是“挖矿”?比特币“挖矿”原理解析》中,介绍了什么是挖矿,以及挖矿的原理,本文主要围绕着挖矿的过程产生的区块链的“分叉”现象,做个系统的介绍。
在介绍:什么是区块链“分叉”之前,先介绍下,比特币的交易打包过程以及底层的实现原理,见章节 2.
比特币“交易打包”底层原理
“挖矿”与“交易打包”
前文我们说到,所谓“挖矿”,就是生成一个最新“区块”的过程,“矿工”在该过程中,是为了获取比特币的奖励(经济驱动);
这部分奖励分为两部分:比特币网络系统的 CoinBase 奖励 和 所打包的所有交易的交易费(交易费的作用下文会介绍);
那么,交易打包的过程和底层原理是什么呢?下文我们将图文展示整个交易打包的细节;
“交易打包”过程?
每个比特币客户端节点自加入比特币网络开始,无时不刻不在做着创造新区块的操作;
而创造新区块的过程,即是打包每一笔“比特币交易”的过程;
下图是站在“比特币客户端节点”的角度,来描述一次区块生成过程中的交易打包过程。
每一步的详细说明
步骤 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)。
以上,即是交易的打包过程。
续谈“挖矿”,那么不同的“节点”同时广播“宣布”挖到最新区块的情况,会发生什么呢?
区块链“分叉”的产生“&”BestChain 选择准则
“分叉”现象的产生
非人为“分叉”的产生原因
在《什么是“挖矿”?比特币“挖矿”原理解析》一文中,我们讲述了“挖矿”的底层原理,由此我们知道,所谓“挖矿”,是计算一个 HASH 值<=TargetHash 的过程;
而符合计算规则的结果 Hash 有很多个,所以会出现同时好多个“矿工”同一时段(考虑到网络延迟)宣布“挖矿”成功;
所以,同一区块高度会出现多个区块的时候,由此就产生了区块链的 Fork,也就是“分叉”现象。(插一句,这就是为什么中本聪要规定均值 10 分钟产生一个区块,为的就是降低碰撞的频次,减少 fork 次数);
人为“分叉”的产生原因
这种人为分叉,要从区块链的共识机制说起。
区块链是由点对点的去中心化节点共同维护的,区块链的有序运转靠的就是大家的共识;
即对于哪些交易是可以接受的、哪些节点具有记账权等关键事宜,有一套公认的标准。
这套标准是部署在区块链底层协议中自动化执行的。
当不同节点运行的底层标准(即客户端软件版本不一致)不一致的时候,人为分叉自然而然就产生了。
PS:为什么会出现不同的客户端软件版本不一致呢?主要原因有以下几种
1)利益原因:不同的矿工因为利益关系,矿工个体本身有选择性的接受或者不接受新的升级版本
2)时延原因:不可能所有的客户端在同一时刻同时升级,即使所有节点都同意升级并立刻升级,也会有时延
3)区块链网络节点可自由动态加入或者离线,离线的那部分节点会感知不到升级,等再次入局升级的时候,这中间会有一段时间。
4)等
“分叉”之后,最佳链(bestChain)的选择准则?
那么,要保证区块链的 MainChain 唯一性,当出现多处分叉的时候,该用什么准则去选择最佳链(select the bestChain as mainChain)呢?
1)如果不同分支的区块高度不同,那么选择最长区块高度的分支为 MainChain(在 POW 共识机制下,最长工作量代表着最权威的说服力);
2)如果高度一致,则选择难度系数最大的分支为 MainChain(在 POW 共识机制下,difficulty 越大,则说明该区块被创造所需要的工作量越大,则权威说服力越大);
3)区块高度如果相同,并且难度系数也一样,那么选择接受时间最早的那个分支为 MainChain;
4)若所有的评判系数均相同,则等待各自某分支的区块高度+1 之后,重新重复上述 1~3 步骤选择出一个 BestChain。
区块链“分叉”种类之“软硬分叉”
上述 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.”
大概总结下,意思是说:硬分叉指的是改变了比特币底层协议,使得之前被验证无效的区块变得有效,而为了保持兼容性,会强制要求所有节点都更新协议版本至最新。(一句话就是:凡是霸王手段耍流氓式的要求所有节点必须升级,否则运行机制不兼容影响新生成区块和交易验证的分叉都是硬分叉)
什么是“软分叉”?“软分叉”真的“软”吗?
“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. .”
大概总结下,意思是说:软分叉指的是虽然改变了比特币底层协议,但是只会使之前被验证有效的区块变的无效,而且即使节点不升级(虽然官方 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 讨论~
作者介绍:
唐堂,平台技术中心百川研发部,15 年 11 月入职链家网,任职高级 JAVA 研发工程师,热衷于区块链底层技术研究。
本文转载自公众号贝壳产品技术(ID:gh_9afeb423f390)。
原文链接:
https://mp.weixin.qq.com/s/GHgJRVkU3hsrSLy-Rhviwg
评论