目录

一、分叉的种类

1.State Fork

2.Protocol Fork

二、硬分叉和软分叉

1.硬分叉

2.软分叉

3.实际情形中可能出现软分叉的情况

4.总结

一、分叉的种类

1.State Fork

区块链原来是一条链,现在变成了两条,这样的情况就叫做分叉。分叉可能是多种原因造成的,如挖矿的时候有两个结点差不多同时挖到矿,这时两个结点都可以发布区块,就可能出现临时性的分叉,我们把这样的分叉叫State Fork:由于对区块链当前的状态有意见分歧而产生的分叉。分叉攻击(Forking Attack)也属于这样的State Fork,只不过这种意见分歧是人为造成的,这种情况也称为Deliberate Fork。

2.Protocol Fork

在比特币系统中,如果要修改比特币协议需要软件升级,在去中心化的系统中,没办法要求所有的节点都升级软件。假设大部分节点升级了软件,少部分节点因为某些原因(如没来得及升级或不同意协议的修改)没有升级,这种情况也会产生分叉,我们将这种分叉称为Protocol Fork,即对比特币协议产生了分歧,使用不同版本的协议而产生的分叉。根据对协议修改的内容不同,可以进一步分成硬分叉(Hard Fork)和软分叉(Soft Fork)。

二、硬分叉和软分叉

1.硬分叉

什么是硬分叉

如果对比特币协议增添一些新特性、扩展一些新的功能,这时还没有升级软件的这些节点不认可这些新特性,认为这些新的特性是非法的,这个时候就属于我们对比特币协议的内容产生了意见分歧,也就会导致分叉。硬分叉的一个典型的例子就是比特币中的区块大小限制(Block Size Limit),比特币协议中规定区块大小限制是1M字节(平均每十分钟产生一个1M大小的区块,约能容纳4000个交易左右,即每秒钟大约7笔交易),就是说每个区块不能超过1M大小,有些人认为这个限制太小,影响了比特币的吞吐量(Thoughput),限制了交易上链的速度,增加了延迟。

假设软件更新了,将区块大小限制从1M提高到4M,假设大多节点更新了软件将区块大小限制调整至4M,少数节点不更新(这里所说的大多数节点和少数节点都是依照节点的算力来计算的,而不是传统意义上的节点个数)。也就是说,假设系统中拥有大多算力的节点都更新了软件,承认这项协议。

当系统运行起来,假设有一个区块链,如图1-1所示;新节点沿着它挖出一个新的区块,这个区块是比较大的假设其大小为4M,如图1-2所示;新节点挖出第二个区块,假设其大小为4M,如图1-3所示;新节点​​​​​​​挖出第三个区块,假设其大小为1M,如图1-4所示;无论新节点​​​​​​​挖矿的链有多长,旧节点​​​​​​​认为他包含非法内容,所以他沿着之前的链往下挖,下方是旧节点​​​​​​​挖到的区块,假设其大小为1M,如图1-5所示;新节点​​​​​​​虽然不会认为旧节点​​​​​​​挖出的区块属于非法区块,但是由于它不在最长合法链上,所以新节点也不会沿着它继续往下挖,如图1-6所示。

图1-1

图1-2

图1-3

图1-4

图1-5

图1-6

整个过程如图1-7所示。新节点:认可旧节点挖出的区块,但是由于新旧节点的算力悬殊较大,新节点挖矿的链始终是最长合法链。旧节点认为:新节点挖矿的链上包含非法区块,所以无论多长都没有意义。这种分叉是永久性的,只要这部分旧节点不更新软件,这个分叉就不会消失。比特币网络中,会有部分很保守的人,像这样提高区块大小限制的协议,势必会有一些节点不同意,而且区块的大小也并不是越大越好(比特币系统底层(工作原理)是P2P Overlay Network,它传播主要采用的是flooding的方式,对带宽的消耗是很大的,带宽是瓶颈),所以会产生硬分叉。

那么出现硬分叉之后挖到的区块还是否有用,出块奖励还有吗?其实,在出现硬分叉之后,出现了两条平行运行的链,两条链上的比特币互不相干的,各挖各的矿。在某条链上的出块奖励,对于认可这条链为最长合法链的节点来说是有效的,对认可另一条链的则是无效的,而分裂之前产生的BTC则是在两条链上都认可的。(这就像是ETH和ETC的关系)从这个意义上讲,硬分叉可以认为是产生了新的一种加密货币。为避免双花操作或交易回滚操作,一般会在硬分叉后设置Chain ID,来标识这两条链为两条独立的链。

2.软分叉

如果对比特币协议加了一些限制,使得原本某些合法的交易或区块,在限制后的新协议中变成不合法,那么形成的分叉是软分叉。

假设对软件进行更新:使区块大小限制从1M变为0.5M。这里仍然假设被分为了旧节点和新节点,大多算力的是新节点,也就是已经更新了协议的节点,区块限制为0.5M;少部分为旧节点,仍然认定区块限制为1M。这时,新节点挖出的区块,旧节点会认为是合法的;但旧节点挖出的区块,新节点很可能认为它是不合法的(因为很可能它会超过新节点的区块限度,即区块大小在0.5M内)。

假设还是那条区块链,如图2-1所示;新节点挖出区块,假设其大小为0.5M,如图2-2所示;旧节点认为新节点挖出的区块是合法区块,所以他沿着这个区块继续挖,挖出一个区块,假设其大小为1M,如图2-3所示;旧节点产生的新区块超过新节点区块限制,新节点认为它不合法,所以会沿着上一个合法区块继续挖,假设现在新节点挖到区块,大小为0.5M,如图2-4所示;新节点对于现在分叉只认为下面的分叉是合法的所以它继续发布新的区块在下面的链上,假设其大小为0.5M,如图2-5所示;旧节点认可所有节点,但是由于下方的链是最长合法链,所以它会继续往后扩展,如图2-6所示。

图2-1

图2-2

图2-3

图2-4

图2-5

图2-6

整个过程如图2-7所示。在这种情况下,会持续出现软分叉,只要旧节点不更新协议,挖出的区块就一直无法上链,相当于一直白挖。相比硬分叉,软分叉即是非永久存在的分叉,只会临时存在一段时间

图2-7

3.实际情形中可能出现软分叉的情况

(1)给某些目前协议中没有规定的域增加新的含义,赋予他们一些新的规则。

典型的就是在铸币交易中有个CoinBase域,它的作用没有明确规定,也没有人检查,我们之前讲过,可以把它的前八个字节作为Extra Nonce和Nonce一起调整,增大挖矿的搜索空间。但是,它后面的空间用来做什么并没有明确规定。有人提出可以把它作为UTXO(当前还没花掉的交易的输出)的根哈希值的存放处。目前UTXO用作记录当前还没花掉的交易的输出,目前只是每个全节点自己在维护,目的就是实现快速查找,防止双花操作,判断交易合法性,这个集合的内容并没有写到区块链里。

Merkle Proof可以证明某个交易存在于某个给定的区块中。假设存在一个轻节点,没有维护整个区块链的内容,只知道Block Header,那么他询问一个全节点,该交易是否在区块中,全节点可以返回一个Merkle Proof,作为证明,轻节点就可以验证这个是不是真的,可以验证全节点返回结果的正确性。如何证明某个账户A中有多少钱?全节点可以在本地的UTXO集合里算一下,即找到UTXO中所有转账给A的交易的输出一共有多少比特币,加在一起,就是A账户中一共有多少钱。但是,如果说像“比特币钱包”这样的APP,维护的是一个轻节点,想知道账户余额就要询问其他全节点,全节点返回一个结果,轻节点是没办法验证这个结果是否正确的。

所以有人提议,将UTXO集合中的内容也组织成一共Merkle Tree,这个Merkle Tree有一个根哈希值,将这个根哈希值写在CoinBase域中,因为Block Header没办法再修改了,但是修改CoinBase域的内容,Block Header里的根哈希值也会跟着改,这样就可以根据Merkle Proof证出来正确性了。

(2)P2SH(Pay to Script Hash)

这个功能在最开始的比特币版本中是没有的,是后来通过软分叉的方式加进去的。交易的时候不是付给Public Key的哈希,而是付给RedeemScripts赎回脚本的哈希。具体原理:点这里。新节点需要验证第一阶段和第二阶段均合法,而旧节点只需要验证第一阶段合法,所以说旧节点认为合法的交易,新节点不一定认为是合法的;但是,新节点认为是合法的交易,旧节点一定认为是合法的。

4.总结

软分叉特点:只要系统中半数以上算力的节点更新了软件,就不会出现永久性的分叉。

        硬分叉特点:只有当系统中所有算力的节点都更新了软件,才不会出现永久性的分叉,如果有少部分节点不愿意更新,系统则会分成两条链。

北大肖臻老师《区块链技术与应用》系列课程学习笔记[7]比特币-分叉相关推荐

  1. 肖臻老师区块链公开课笔记

    前段时间,区块链大火,出现了很多种基于区块链技术的政务应用.之前通过零散的网页信息和讲座,自我感觉理解了block chain原理,当看到各种区块链技术广泛应用时,自己以技术理解,反而对之不屑.当然, ...

  2. 北大肖甄《区块链技术与应用》

    知识点总结二 1.Uncle block: 如上图所示,其中的叔父区块是block 7.他的叔父区块就是block 4 同一级别的block 5和block 6.最长合法连上面的区块招安叔父区块,可以 ...

  3. 《区块链技术与应用》北大肖臻老师——课程笔记【21-23】

    <区块链技术与应用>北大肖臻老师--课程笔记[21-23] 一.权益证明 二.ETH-TheDAO 提示:以下内容只是个人在学习过程中记录的笔记,图片均是肖老师课程的截图,可供参考.如有错 ...

  4. 《区块链技术与应用》北大肖臻老师——课程笔记【4-5】

    <区块链技术与应用>北大肖臻老师--课程笔记[4-5] 一.比特币协议 比特币脚本(BitCoin Script) Paxos协议 比特币 中的共识协议 (consensus in Bit ...

  5. 《区块链技术与应用》北大肖臻老师——课程笔记【6-8】

    <区块链技术与应用>北大肖臻老师--课程笔记[6-8] 一.BTC网络 二.BTC-挖矿难度 三.BTC-挖矿 提示:以下内容只是个人在学习过程中记录的笔记,图片均是肖老师课程的截图,可供 ...

  6. 《区块链技术与应用》北大肖臻老师——课程笔记【1-3】

    <区块链技术与应用>北大肖臻老师--课程笔记[1-3] 一.课程介绍 二.密码学原理 1.哈希 1.哈希碰撞(cryptographic hash function) 2.不可逆性(hid ...

  7. 《区块链技术与应用》北大肖臻老师——课程笔记【11-12】

    <区块链技术与应用>北大肖臻老师--课程笔记[11-12] 一.BTC-问答 二.BTC-匿名性 1.匿名性 2.零知识证明 提示:以下内容只是个人在学习过程中记录的笔记,图片均是肖老师课 ...

  8. 《区块链技术与应用》北大肖臻老师——课程笔记【13-18】

    <区块链技术与应用>北大肖臻老师--课程笔记[13-18] 一.BTC-思考 1.哈希指针 2.区块恋 3.分布式共识 4.比特币的稀缺性 5.量子计算 二.ETH-以太坊概述 1.以太坊 ...

  9. 《区块链技术与应用》北大肖臻老师——课程笔记【19-20】

    <区块链技术与应用>北大肖臻老师--课程笔记[19-20] 一.ETH-挖矿算法 二.ETH-难度调整 提示:以下内容只是个人在学习过程中记录的笔记,图片均是肖老师课程的截图,可供参考.如 ...

最新文章

  1. 【GStreamer】gstreamer工具详解之:ges-launch-1.0
  2. Mr Big [To be with you]
  3. STK 卫星覆盖分析笔记
  4. .net移动端开发_移动端开发1(前端一)
  5. python和django中的常见错误
  6. 机器学习接口和代码之 KNN
  7. 云主机挂载硬盘 - 开机自动挂载
  8. FMEA软件之旧版FMEA导入及快速转换为新版FMEA(FMEAHunter)
  9. 分析微信聊天记录(2)——分析单人的微信聊天记录
  10. 百度地图api 在3D地图中设置自定义样式
  11. Markdown文章排版
  12. 在微型计算机中,ram的特点是___.,2017计算机基础模拟试题「附答案」
  13. 亚信安全:发挥MSS托管安全运营服务优势 让你真正“减负”
  14. 小白的python学习之路-turtle画不同大小的五角星
  15. php excel水印图片大小,PHPExcel:如何在第一页标题中插入图像并将其放大以适合其内容?...
  16. HarmonyOS应用开发实战 | 开发运动手表小游戏
  17. 为什么cfg文件打开是乱码
  18. Auto Encoder(AE),Denoising Auto Encoder(DAE), Variational Auto Encoder(VAE) 区别
  19. cpu空载50度_高性价比6热管全镀镍CPU散热器来了 超频三东海风云GI-R66U体验
  20. 数字信号处理--加窗

热门文章

  1. namesilo修改域名服务器,Namesilo域名解析教程
  2. 微信公众号抓取 所需环境及部分业务代码(基于windows 系统 和 安卓手机)①
  3. 数学辨异 —— 泰勒展开与等比数列求和
  4. 勤哲服务器 网页填报,勤哲excel服务器按条件提示必填|必填条件_勤哲App应用之家...
  5. Linux系列教程——Linux基本权限、Linux特殊权限、LinuxACL控制、Linux输入输出
  6. 寻找拉马努金数(Python实现)
  7. 使用openlayers加载离线地图
  8. flume=》kafka=》hbase
  9. CentOS编译安装subversion 1.9.7
  10. 计算机班级的简介,简短的班级介绍,50字的班级简介