解读区块链,软分叉和硬分叉

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