群内分享
群内讨论
天天讲分叉,分叉到底是个啥?
磨链输出计划
最近在交流群和论坛中经常听到软分叉和硬分叉,起初对这个概念只是简单认为是区块链软件升级后新旧协议造成新旧节点对新的区块认可时的一种分歧,软分叉一般不会产生永久性分叉的链,而硬分叉则会产生两条链,如果大多数节点升级到新版本,则旧链存活就看算力的大小的。
查询了些资料,再次明确下软硬分叉的概念。
软硬分叉涉及的问题是去中心化节点软件、协议、版本升级的问题,所有在区块链中运行的节点有一样的软件,遵守一样的共识机制、维护同一条链,但是一旦软件、协议、版本升级后,所有节点不可能同一时间都更新到同一版本,这就造成了一部分节点拥有新的共识协议机制,这时候会网络中出现新、老、两种节点。那么在区块生成的时候,新节点产生的区块,老节点就会认为合法或者不合法,老节点产生的区块,新节点也会认为合法或者不合法。在区块链中一直有一个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处理运算之前,进行多次以太币的操作调用,那么多次递归来持续转移以太币到别的账户。由于代码漏洞发布后无法修改,DAO求助以太坊,以太坊最初采用软分叉的方式,锁定the DAO账号,不允许发生交易,冻结以太币,这里可以发现软分叉实际上是在以太坊软件上加了约束规则,使得黑客的以太币无法交易,这样不影响以太坊其余的正常交易,不要回滚区块链的数据(回滚影响之大难以想象)。在实施软分叉方案时,在以太坊的每个交易上都会检查DAO相关的地址,如果和DAO有关联就拒绝这个交易,从而锁定所有资金,但是这个方案没有收取交易GAS费用,攻击者一旦以零成本发起大量无效交易,那么这个网络就面临瘫痪,最终各个节点回退了软件版本,软分叉失败,随后实施了硬分叉。
硬分叉方案在1880000区块把DAO的合约归在另外一个L列表中,在1920000区块,设计一个非常规的状态变更,强行把L所有地址余额转到一个退款地址中,这样众筹的DAO币就可以换回以太币,最终硬分叉成功,上图中1920000区块后面,左边为区块编号,右边为hash值,直线代表新链,节点升级后都在新链上记账,没有升级的节点在旧链记账。
现在以太坊上为了区分新链-ETH,旧链ETC,两个链除了DAO涉及部分软件代码相同,历史账号分叉前相同,地址和私钥也相同,故都为合法。(当然还有重放攻击,同样参考邹均大神P216)。
同样在比特币中,软分叉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的脚本输出,并花费该输出。老节点们能够接受。但是广播到新节点时,按新规则(必须是脚本…)则不通过,新节点拒绝接受,认定为非法,不会打包该交易。即使该交易被老节点打包,也会被新节点拒绝。因为新节点控制多数算力,这样的交易将永远无法生效;系统同时维护一条链。
群内工作
磨链(mochain)社区输出计划
招募条件:
1.需要一定的区块链基础。
2.对上述任何一方面有较为深入理解。
3.每周能保证一定的空余时间来折腾。
4.了解github相关
5.人员进行筛选,时间周期比较长。
有意向联系我。
磨链在线课程
对自己擅长方面有一定的沉淀,愿意开设在线课程,会考虑和一些专业培训机构合作,要求有一定的一线经验,实实在在分享课程。有兴趣的联系,有偿工作。
磨链(mochain)社区内容输出计划
磨链社区内容输出计划,社区内划分6个模块,针对各模块细化分解,社区成员领取任务进行写作内容输出。审核通过后发布,整个过程中即是自己的一个学习提高,同时也有交流分享,模块如下:
1.区块链基础(包括密码学、共识机制、分布式、P2P网络等)
2.以太坊(入门到精通,循序渐进学习以太坊)
3.比特币(入门到精通,比特币相关内容深入琢磨)
4.超级账本(架构、运行原理、共识机制、环境搭建配置开发相关)
5.EOS(概念介绍,由浅入深,持续学习)
6.DAG(DAG的概念、原理机制、项目技术解读)
PS:想加入磨链的,或者具体参与到磨链社区内容输出计划的,请加磨链组织者微信(jackyjin09)。欢迎每一位区块链技术爱好者加入磨链,一块琢磨区块链技术。
关于磨链和相关合作
磨链”---取磨炼之意,旨在普及区块链技术,磨炼技术,更好投身区块链行业。有兴趣一块琢磨区块链技术,联系笔者微信(jackyjin09)。
磨链社区是一个纯粹的技术社区,欢迎相关技术合作,在不违反原则的前提下,积极参与合作。
你可以在这里找到我们:
磨链社区公众号:
1. 磨链社区:http://mochain.info
2. Github : https://github.com/mochain
3. Gitter 聊天: https://gitter.im/mochain
4. 知识星球: https://t.zsxq.com/M3BMVZN
5. 知乎:https://www.zhihu.com/people/mochain
(持续更新中)
合作社区
网友评论