写点什么

什么是区块链“分叉”?

  • 2019-09-22
  • 本文字数:4358 字

    阅读完需:约 14 分钟

什么是区块链“分叉”?

在前面的文章《什么是“挖矿”?比特币“挖矿”原理解析》中,介绍了什么是挖矿,以及挖矿的原理,本文主要围绕着挖矿的过程产生的区块链的“分叉”现象,做个系统的介绍。


在介绍:什么是区块链“分叉”之前,先介绍下,比特币的交易打包过程以及底层的实现原理,见章节 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.”


                                                                                                                                     ---《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 讨论~


作者介绍:


唐堂,平台技术中心百川研发部,15 年 11 月入职链家网,任职高级 JAVA 研发工程师,热衷于区块链底层技术研究。


本文转载自公众号贝壳产品技术(ID:gh_9afeb423f390)。


原文链接:


https://mp.weixin.qq.com/s/GHgJRVkU3hsrSLy-Rhviwg


2019-09-22 23:182855

评论

发布
暂无评论
发现更多内容

技术解析+代码实战,带你入门华为云政务区块链平台

创意时空

【算法实践】一天路走到黑--手把手带你实现坚持不懈的线性查找

迷彩

Python 数据结构 算法实践 8月月更 线性查找

低代码是什么?国内排名前 5 的低代码开发平台对比

蒋川

低代码 开发工具 开发平台

一起学习设计模式:责任链模式

宇宙之一粟

设计模式 8月月更

玩转KubeEdge保姆级攻略

乌龟哥哥

8月月更

阿里云高性能计算负责人何万青:阿里云大计算加速HPC与AI融合

阿里云弹性计算

AI HPC 高性能计算 无影云电脑 计算巢

【JVM】HotspotJVM精通垃圾回收器原理

小明Java问道之路

8月月更

C/CPP基础练习题多维数组,矩阵转置,杨辉三角详解

CtrlX

c c++ 基础 8月月更

【案例回顾】春节一次较波折的MySQL调优

京东科技开发者

MySQL 数据库 索引 RDS 调优

web前端培训入门难吗?

小谷哥

【JVM】HotspotJVM 分代回收机制

小明Java问道之路

8月月更

iofod导入任意前端资产,以 Element UI 为例

iofod jude

小程序 前端 低代码 网页

金融科技创新者的困境

木风

金融科技 数字化转型 科技创新

[教你做小游戏] 展示斗地主扑克牌,支持按出牌规则排序!支持按大小排序!

HullQin

CSS JavaScript html 前端 9月月更

Java进阶(一)内存解析

No Silver Bullet

Java 9月月更 内存解析

web前端培训程序员学习什么呢

小谷哥

私有化部署的企业IM:实现工作消息、文件的全面可控

WorkPlus

架构师的十八般武艺:合规架构

agnostic

企业架构 合规

构建万物可信的基石:解密区块链跨链技术

创意时空

每日一R「21」Unsafe Rust

Samson

学习笔记 8月月更 ​Rust

IDEA配置tomcat

楠羽

#开源

基于Vue3常用代码块

青柚1943

typescript Vue3 Element Plus Pinia sortablejs

移动办公平台如何在企业中发挥数字化优势?

WorkPlus

从Core Dump中提取CUDA的报错信息

OneFlow

深度学习 报错 cuda

这些智能合约漏洞,可能会影响你的账户安全!

创意时空

【编程实践】认识爬虫并手把手带手实现新闻网站的爬取

迷彩

记录 Python爬虫 8月月更 网络爬虫

艺术收藏NFT系统开发:NFT功能搭建

开源直播系统源码

数字藏品 数字藏品系统软件开发 数字藏品开发

区块链交易隐私如何保证?华为零知识证明技术实战解析

创意时空

自然语言处理--神经网络的复习

IT蜗壳-Tango

自然语言处理 nlp 9月月更

微服务网关Gateway实践总结

Java 架构

如何在保护用户隐私的同时实现精准广告投放?

HMS Core

广告sdk

什么是区块链“分叉”?_区块链_唐堂_InfoQ精选文章