【ArchSummit架构师峰会】探讨数据与人工智能相互驱动的关系>>> 了解详情
写点什么

什么是区块链“分叉”?

  • 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:182871

评论

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

18.理智分析--人类离威胁还相当遥远

数据与智能

人工智能

架构训练营模块三作业

TIEDPAG

架构训练营 模块三

【LeetCode】从根到叶的二进制数之和Java题解

Albert

算法 LeetCode 9月日更

Nocode 进阶 | 迎接 Amazon Honeycode,敲开 NoCode 开发大门(上)

亚马逊云科技 (Amazon Web Services)

人工智能 大前端

Java字节码技术学习笔记

风翱

Java 9月日更

什么是数据驱动

奔向架构师

数据治理 9月日更

设定Docker容器日志的大小和轮询规则

耳东@Erdong

Docker log 9月日更

学生管理系统架构设计

一叶知秋

#架构实战营

GitHub上120K Stars!被誉为国内第一的Java多线程PDF到底有什么魅力?

Java GitHub 程序员 面试 计算机

国内独家首发版本!龙蜥操作系统(Anolis OS) 8.4 正式发行!

OpenAnolis小助手

Linux centos 开源 开源社区

计算机网络学习笔记 概述

Regan Yue

计算机网络 9月日更 计网

序列化与反序列化之Protostuff(一)

程序员架构进阶

架构 protobuf 9月日更 序列化与反序列化 protostuff

🏆(不要错过!)【CI/CD技术专题】「Jenkins实战系列」(4)总结归纳Jenkins的安装使用和配置流程介绍

洛神灬殇

maven jenkins git 学习 9月日更

玩转TypeScript工具类型(中)

有道技术团队

typescript 大前端 网易有道

10行代码集2000张美女图,Python爬虫120例,再上征途

梦想橡皮擦

9月日更

国足历届世界杯对战记录整理

6979阿强

图算法 GraphScope 2022年卡塔尔世界杯 中国国足

架构实战营 外包学生管理系统的架构文档

💤 ZZzz💤

架构实战营

Vue进阶(幺幺叁):element ui 表单验证 this.$refs[formName].validate()问题解决

No Silver Bullet

Vue 9月日更

【Flutter 专题】45 图解矩阵变换 Transform 类 (二)

阿策小和尚

Flutter 小菜 0 基础学习 Flutter Android 小菜鸟 9月日更

NoSQL-MongoDB

hanaper

linux之read命令

入门小站

工具

面试官让手写队列,差点挂了

bigsai

谈 C++17 里的 Observer 模式

hedzr

c++ 设计模式 Design Patterns c++17 observer pattern

跨语言编程的探索 | 龙蜥技术

OpenAnolis小助手

Java c++ 开源社区

人工智能计算中心,助力数字经济发展的算力“虫洞”

脑极体

在线JSON转typescript工具

入门小站

工具

Go 编码习惯

baiyutang

Go 语言 9月日更

GitHub上下载量突破100000+阿里巴巴的这份开源项目如此牛逼

Java 编程 架构 面试 计算机

如何提高开会效率?

石云升

项目管理 管理 引航计划 内容合集 9月日更

深入了解现代web浏览器(第四部分)

GKNick

固定QPS压测初试

FunTester

性能测试 测试框架 压力测试 QPS FunTester

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