解读区块链,软分叉和硬分叉
最近在交流群和论坛中经常听到软分叉和硬分叉,起初对这个概念只是简单认为是区块链软件升级后新旧协议造成新旧节点对新的区块认可时的一种分歧,软分叉一般不会产生永久性分叉的链,而硬分叉则会产生两条链,如果大多数节点升级到新版本,则旧链存活就看算力的大小的。
查询了些资料,再次明确下软硬分叉的概念。
软硬分叉涉及的问题是去中心化节点软件、协议、版本升级的问题,所有在区块链中运行的节点有一样的软件,遵守一样的共识机制、维护同一条链,但是一旦软件、协议、版本升级后,所有节点不可能同一时间都更新到同一版本,这就造成了一部分节点拥有新的共识协议机制,这时候会网络中出现新、老、两种节点。那么在区块生成的时候,新节点产生的区块,老节点就会认为合法或者不合法,老节点产生的区块,新节点也会认为合法或者不合法。在区块链中一直有一个51%算力的临界点,那么我们这里认为新节点的算力是大于50%的。

首先再对软硬分叉做一个解释:
软分叉:官方定义:A temporary fork in the block chain which commonly occurs when miners using non-upgraded nodes violate a new consensus rule their nodes don’t know about.(当新共识规则发布后,没有升级的节点会因为不知道新共识规则下,而生产不合法的区块,就会产生临时性分叉。)说实话官方定义感觉有点模糊。
当整个区块链网络中,系统版本或协议升级后,且和老版本协议不兼容,那么升级后的新节点就无法接受老节点挖出来的全部或者部分区块,因为新节点的算力较大,所以老的节点挖出来的区块没有机会得到认可,老节点产生的区块最终会被认为是短链而被放弃,新老节点始终还是在同一条链上工作,这种情况称作软分叉。新节点要求比老节点严格多。
硬分叉:官方定义:A permanent divergence in the the block chain, commonly occurs when non-upgraded nodes can’t validate blocks created by upgraded nodes that follow newer consensus rules.(区块链发生永久性分歧,在新共识规则发布后,部分没有升级的节点无法验证已经升级的节点生产的区块,通常硬分叉就会发生。)
当整个区块链网络中,系统版本或协议升级后,且和老版本协议不兼容,未升级的老节点无法接受新节点挖出的全部或者部分区块,导致出现了两条链,假设新节点的算力较大,新节点们在维护一条链,老节点也始终在维护一条他认可的链,如果这时候大多数的节点都开始升级为新版本,那么老节点维护的链能不能存活就看算力有多少了,这就称作硬分叉。
很明显,最粗浅的理解就是软分叉还是一条链,硬分叉就会分成两条链。
以太坊和比特币中都出现过分叉的问题,针对现实应用,软分叉和硬分叉在实际应用中有什么优缺点:
软分叉只有一条链(最简单明了),开始不要求区块链中所有节点统一时间升级,可以允许逐步升级,并且在软分叉过程中不影响系统的稳定性和有效性。但是软分叉又有个前提就是老的未升级节点要能接受新节点产生的区块,这就要求系统要向前兼容(forward compatible,这个和一般我们在用的软件向下兼容是相反的方式,要求新出现的区块对老系统留一个余地,确保兼容),其实让老节点承认新的区块,实际是一种欺骗,让老节点没法察觉实际上发生的变化,这也违背了单点完整性验证。
以太坊和比特币中都曾出现过软硬分叉的事件:
The DAO在2016年黑客通过splitDAO函数递归发送模式上的漏洞曾经窃取了360万个以太币,splitDAO函数在执行时最后才修改用户的结余和交易额,如果能够在返回splitDAO处理运算之前,进行多次以太币的操作调用,那么多次递归来持续转移以太币到别的账户。(具体代码分析查看邹均大神的区块链技术指南P210或者网上http://blog.csdn.net/sportshark/article/details/51820008),由于代码漏洞发布后无法修改,DAO求助以太坊,以太坊最初采用软分叉的方式,锁定the DAO账号,不允许发生交易,冻结以太币,这里可以发现软分叉实际上是在以太坊软件上加了约束规则,使得黑客的以太币无法交易,这样不影响以太坊其余的正常交易,不要回滚区块链的数据(回滚影响之大难以想象)。在实施软分叉方案时,在以太坊的每个交易上都会检查DAO相关的地址,如果和DAO有关联就拒绝这个交易,从而锁定所有资金,但是这个方案没有收取交易GAS费用,攻击者一旦以零成本发起大量无效交易,那么这个网络就面临瘫痪,最终各个节点回退了软件版本,软分叉失败,随后实施了硬分叉,下图:

硬分叉方案在1880000区块把DAO的合约归在另外一个L列表中,在1920000区块,设计一个非常规的状态变更,强行把L所有地址余额转到一个退款地址中,这样众筹的DAO币就可以换回以太币,最终硬分叉成功,上图中1920000区块后面,左边为区块编号,右边为hash值,直线代表新链,节点升级后都在新链上记账,没有升级的节点在旧链记账。

现在以太坊上为了区分新链-ETH,旧链ETC,两个链除了DAO涉及部分软件代码相同,历史账号分叉前相同,地址和私钥也相同,故都为合法。(当然还有重放攻击,同样参考邹均大神P216)。
同样在比特币中,出现过软分叉(http://ns2.btckan.com/news/topic/29027 谈国鹏,这位大神还有视频讲解,youku和巴比特都有,可以搜索下。这个文章中写的很详细明,笔者就直接拷贝过来了。)P2SH软分叉升级,P2SH包含在BIP16中,通过软分叉进行升级比特币系统,让比特币在支持P2PKH基础上,再支持一种叫P2SH的标准交易类型。在此之前,比特币已经支持如下的脚本:”OP_HASH160 [20-byte-hash-value] OP_EQUAL”。要花费这样的脚本你只需要把hash值的原数据(preimage)推到(push data)栈上即可。
P2SH是对以上条件的一种更严格限制,在P2SH模式(新节点)下,你不但需要提供该hash值的原数据,还要保证:
该原数据是一个可执行的脚本;
该脚本执行结果返回:true;
该脚本中不能含有”push data”的操作;
以及其它的一些限制;
当支持P2SH的新节点被部署时,新节点的算力>50%(P2SH升级时要求>=55%),系统将处于下面的运行状态中:P2SH交易被转发到老节点时,会被老节点认定为非标准交易(有了新的,或不能理解的OP_CODE),老节点不接受、不打包、不转发;当包含有P2SH交易的区块广播到老节点时,老节点接受区块,并按原有规则验证该P2SH交易,结果通过,因为老的规则只要验证原数据的hash是否相等(显然是相等的);老的节点创建了一个原数据为:123456的脚本输出,并花费该输出。老节点们能够接受。但是广播到新节点时,按新规则(必须是脚本…)则不通过,新节点拒绝接受,认定为非法,不会打包该交易。即使该交易被老节点打包,也会被新节点拒绝。因为新节点控制多数算力,这样的交易将永远无法生效;系统同时维护一条链。
P2SH的升级细节:
要求支持P2SH的矿工在其coinbase交易里包含“/P2SH/” 字样;
2012年2月1日检查之前1个星期内的所有区块(约1000个),如果超过550个包含(约55%)则激活P2SH。
SegWit软分叉升级
SegWit主要包含在BIP141-144中,通过软分叉进行升级比特币系统,让比特币支持一系列SegWit的功能集。关于隔离见证的具体内容详见《谈谈区块连(21):比特币之隔离见证》。
通过软分叉升级需要让老的节点认定新的交易为非标准交易,但同时是合法的。隔离见证是如何做到的呢?答案是:anyone-can-spend的输出交易。
anyone-can-spend:
下面是一个anyone-can-spend的例子:
scriptPubKey: (empty)
要花费这样的输出,你只需要提供这样的签名脚本:
scriptSig: OP_TRUE
隔离见证中将脚本版本(script versioning)和anyone-can-spend完美结合。一个标准的P2WPKH的输出如下:
scriptPubKey: 0 <20-byte-key-hash> (0x0014{20-byte-key-hash})
这开头的0在新节点中将是脚本的版本号,在老节点中是一个anyone-can-spend的输出。
当支持SegWit的新节点被部署时,新节点的算力>50%(SegWit升级时要求>=95%),系统将处于下面的运行状态中:
SegWit交易被转发到老节点时,会被老节点认定为非标准交易(anyone-can-spend),老节点不接受、不打包、不转发;
当包含有SegWit交易的区块广播到老节点时,老节点接受区块,并按原有规则验证该SegWit交易,结果通过(因为它是谁都可以花费的);
老的节点尝试花费SegWit交易,因为它是谁都可以花费的。老节点们能够接受。但是广播到新节点时,按新规则(隔离见证的验证规则)则不通过,新节点拒绝接受,认定为非法,不会打包该交易。即使该交易被老节点打包,也会被新节点拒绝。因为新节点控制多数算力,这样的交易将永远无法生效;
系统同时维护一条链。
SegWit的升级细节:
升级到core 0.13.1及以上的支持SegWit;
2017年11月如果95%算力支持,则激活SegWit。

参考网络和区块链技术指南上的讲解,分析了软分叉和硬分叉,期间也看到另外一篇文章,http://www.8btc.com/tan90d97有兴趣的读者可以了解下,这个具体对乱硬分叉交易数据结构作了分析。

转载来自:https://blog.csdn.net/sxjinmingjie/article/details/77621311

解读区块链,软分叉和硬分叉相关推荐

  1. 区块链学习笔记:硬分叉和软分叉

    分叉分叉,从一条主链中像叉子一样分成了两条或多条的子链叫分叉.在区块链中,主链的分叉分为两种:硬分叉和软分叉. 一.硬分叉.软分叉是什么 1)软分叉 在比特币官网上对硬分叉和软分叉的官方定义是这样的, ...

  2. 科普解析区块链里的软分叉和硬分叉是什么,为什么要分叉

    欢迎来到懒区块(ID:lanqukuai),人人都能看懂的区块链技术解读,深入浅出的解剖整个区块链系统.本文由懒区块整理撰写,不经过允许,切勿转载. 今天懒区块来跟大家聊一聊区块链中分叉的问题,经常在 ...

  3. 区块链 软分叉和硬分叉 简介

    1.硬分叉是什么 硬分叉是指当区块链代码发生改变后旧节点拒绝接受由新节点创建的区块,不符合原规则的区块将会被忽略,矿工会按照原规则在他们最后验证的区块之后创建新的区块,区块链领域最有名的硬分叉案例,便 ...

  4. 转载:区块链:关于软分叉与硬分叉以及什么是共识

    第0章 引言 比特币是一套软件,对软件代码进行修改升级就经常会涉及到两个概念,一个叫硬分叉,一个叫软分叉.这到底是什么意思呢?社区里最常见的定义说是对共识的修改.但"共识"具体指的 ...

  5. 谈谈区块链:深入理解软硬分叉

    比特币社区正在用软分叉(soft-fork)的方式升级隔离见证(SegWit),目前存在着很多争议,一方面是隔离见证本身存在的争议,另一方面是软分叉而引起的争议(一部分人认为该用硬分叉的方式升级隔离见 ...

  6. 软分叉和硬分叉的区别

    1. 软分叉:软分叉是区块链中的一个短暂分叉,通常是由于矿工在不知道新共识规则的情况下,未对其使用节点进行升级而产生的.软分叉是与共识规则的前向兼容并作些变化,允许未升级的客户端程序继续与新规则同时工 ...

  7. 什么是软分叉与硬分叉?

    什么是软分叉与硬分叉? 发布者: 币学院 发表于: 2018-5-10 15:12 来自: BitarkCommunity 1203 0 分享 经常在新闻和论坛里看到某某币将要进行分叉,到底分叉是什么 ...

  8. 9.1 两个哭泣的婴儿:软分叉与硬分叉

    我们知道,所谓区块链,就是一个个的区块数据,通过区块的哈希值(相当于区块的身份证号)串联起来,如此而形成一个链条般的账本数据. 在这里先问大家一个问题,假设在区块增长到2号的时候,此时软件升级了,增加 ...

  9. 万字长文:解读区块链7类共识算法

    摘要:本文将对区块链中常见的七类共识算法进行介绍,希望对读者探索区块链有所帮助. 区块链技术起源于比特币,最初是比特币等数字货币的一种底层技术,区块链融合了密码学.组网技术.共识算法.智能合约等多种技 ...

最新文章

  1. CocoStudio 0.2.4.0 UI编辑器下根Panel控件设置背景图片时一个BUG
  2. [Python正则表达式] 字符串中xml标签的匹配
  3. android dtb文件位置_android MSM8974 上DeviceTree简介
  4. 【爬蟲】使用 httpclient进行get请求
  5. 使用 plot 绘制折线图,关于如何让坐标轴纵向显示和显示图例的一点技巧
  6. Android 应用开发(8)---语言和语言区域
  7. java jint_Android使用JNI实现Java与C之间传递数据
  8. Altium的原理图主题修改为Orcad的默认样式(Altium原理图样式更改)
  9. 简述 Linux 文件系统的目录结构
  10. 锐捷客户端linux登录密码忘记,锐捷S3760忘记密码的恢复方法
  11. 锁的等级:方法锁、对象锁、类锁
  12. 网络营销渠道有什么特点?
  13. 计算机做游戏软件视频,电脑录屏工具D3DGear录制游戏视频教程
  14. python语句用什么隔开_在python中使用字典时用什么隔开
  15. 关于手机使用中信号强弱 网速快慢 频段的相关常识
  16. 防火墙访问控制Access Control
  17. What's the AOP?
  18. python进阶学习路线(全)
  19. 二次元究竟招惹了谁?谣言煽动背后的文化迷思,警惕有可能发生的思想劫持【文明启示录#01】【补档】
  20. android网购功能,网购Android App购物车点击动画实现详解

热门文章

  1. Asp.net高级程序设计之服务器控件(4)
  2. jQuery工作原理解析以及源代码示例
  3. python input()与raw_input()
  4. 6.5 不同类型的数据集
  5. 最长重复子串(Rabin-Karp算法)
  6. C++输出变量类型、max报错原因
  7. caffe源码分析:softmax_layer.cpp softmax_loss_layer.cpp
  8. 【Python】matplotlib.pyplot 标题换行
  9. [云炬商业计划书阅读分享]
  10. 我的独白2017-12-20