什么是硬分叉,什么是软分叉,什么是共识?_巴比特_服 …

比特币是一套软件,对软件代码进行修改升级就经常会涉及到两个概念,一个叫硬分叉,一个叫软分叉。这到底是什么意思呢?社区里最常见的定义说是对共识的修改。但“共识”具体指的是什么,很难理解。我们还是多实际的修改代码层面来看下它们的定义吧。在理解什么是硬分叉和软分叉之前,我们先要知道这两者要修改的东西是什么。比特币交易在汉语中有双重意思,这是硬分叉和软分叉经常被误解的一个关键。比特币交易其中一个含义指的是我们发送比特币统一使用的数据结构,这是一套规则,我们所有人发送比特币,不论你使用什么钱包软件都得遵守这一套规则。它被定义成一个数据结构,其中的每一个字段代表着什么意思。所有钱包软件都能理解这个意思。比特币交易的另一个含义是指使用比特币的人相互之间发送比特币的事件。就比如我发了0.12345BTC给你,这是一次交易。所有这些发送比特币的事件,构成了比特币交易历史记录,这就是目前组成比特币完整节点的80多G的数据的主要内容。所有这些记录都可以在区块链浏览器上可以查的到,你只要在区块链浏览器上键入你的比特币地址就可以查到你所有的交易记录。做个比喻来说明。交易格式就类似于我们去银行给别人汇款填写的那张汇款单,汇款单上明确定义了汇款人的姓名、身份证、手机号、账号、金额、收款人姓名、账号……等信息。比特币的交易格式也规定了汇款人的信息和收款人的信息,不过这些信息与人的身份信息无关,比特币交易规定的要填写的具体信息请看下一章。比特币的交易历史记录这个概念大家都容易懂,就不展开说了,也没啥好说的。但比特币的交易格式,也就是交易的数据结构需要重点解释,否则无法理解什么叫硬分叉和软分叉。一笔比特币交易是一个含有输入值和输出值的数据结构,该数据结构植入了将一笔资金从初始点(输入值)转移至目标地址(输出值)的代码信息。这个数据结构包含一些字段,我们详细来看下这些字段,摘自《精通比特币》第5章。所有的比特币钱包的都得按照这个表格规定的方式来发送比特币,否则在比特币网络上就不会被识别,也就是无效的交易。这就像是你去银行汇款,你不按照汇款单填写,银行就不接受一样。比特币网络会在平均10分钟内,收集各个节点发出的交易然后打成一个包,叫区块,盖上时间戳,然后添加到区块链上。区块是什么呢?区块就是聚合了交易信息(也就是平均十分钟内网络上各个节点发出的比特币交易)的容器数据结构。它由一个包含元数据的区块头和紧跟其后的构成区块主体的一长串交易组成。区块的数据结构被定义成下面这个样子。所有的挖矿节点钱包都得按照这个表格规定的方式来打包区块,否则在比特币网络上就不会被别的完整节点识别(SPV节点不算),也就是会被认为是无效的交易。还有一个对区块变相扩容的方案是隔离见证,这个方案修改的是比特币交易数据结构,我们还是来看图。图中红色的字段就是隔离见证主要动手的地方,这是要将这部分数据移出交易定义的数据结构,并且还要移出区块定义的数据结构。因此交易就少了一部分数据,这样每一笔交易的体积就会小,而整个区块1M空间内就能够容纳更多的交易。但这样移走这个字段,也会造成没有升级的节点的拒绝验证这些升级的节点生产的区块。但是有办法让他们不拒绝,但代码写起来就非常非常复杂,反正这个代码写了一年多了,到现在还没有搞出来。代码越复杂,势必潜在的漏洞就越多,想想Bip 66都由软分叉导致了硬分叉,而这个隔离见证更复杂。到这里,再一次验证了,所谓的软分叉需要修改的“共识”就是指修改区块数据结构格式,或修改交易数据结构格式。现在我们可以对软分叉和硬分叉到底要做什么工作做个总结,特别是软分叉和硬分叉之间到底有什么区别,以免得被那些定义不准确的“共识”弄晕了。软分叉修改的“共识”具体是指修改了比特币交易数据结构,或修改了比特币区块数据结构。硬分叉修改的“共识”具体是指修改了比特币交易数据结构,或修改了比特币区块数据结构。在具体修改的对象层面上,软分叉和硬分叉是完全没有区别的,就目前止我们看到的所有的已经发生的,和计划发生的分叉都是这样子,它们都修改或试图修改交易数据结构,或区块数据结构。目前发生的,或计划发生的硬分叉和软分叉都绝对不会去修改交易历史记录。哪怕是2010年8月15日发生的刷出天量币的漏洞,那一次修改的也是交易数据结构,但附带的作用就是将一个区块里的交易作废了,因为那笔交易在新交易数据结构的定义下是非法的。所以说软分叉和硬分叉在修改“共识”层面上本质上是没有区别的。那软分叉和硬分叉的区别在哪呢?区别是对新旧节点的兼容方面。软分叉修改数据结构后,新节点生产的交易和区块能够被旧节点验证并接受,硬分叉就不能。正因为硬分叉修改数据结构后,新节点生产的区块会被旧节点拒绝掉,如果旧节点拒绝升级软件而坚持按照旧数据结构继续挖矿,那比特币就会产生两条链。而软分叉因为没有升级的节点能接受新节点生产的新数据,所以不会出现两条链。但软分叉为了做到新节点和旧节点生产的数据完全兼容,那是非常难的,因为本质上是不一样的数据结构大家要相互认,一旦出现有节点拒绝验证不一样的交易或区块,那就会变成硬分叉。这也就是Bip 66软分叉最终变成硬分叉的原因。从第4章我们看到具体的软分叉的修改办法是将原来定义好的字段进行重新定义,如多重签名软分叉。或者是对原本是留在的字段做定义,如CSV软分叉。但是现在从交易的数据结构来看,所有的字段都已经被占用,并且准确而详细地定义了,如果你还要再做软分叉,那就只能将部分字段原有的定义擦除掉,再重新定义。这样就会导致原有的功能可能会丧失,如果这个功能是不可或缺的,那就会导致硬分叉,新旧节点相互拒绝。所以软分叉要特别小心。这也就是隔离见证的做法。隔离见证是直接将某个字段删除掉,但为了保证新旧节点之间的相互兼容,那个是废了牛劲了。便硬分叉则不考虑没有升级的节点会不会拒绝已经升级的节点生产的数据和代码的情况,情况要简单许多。让我们来看看这种为了实现软分叉和硬分叉要做的兼容性有什么区别。软分叉和硬分叉要实现新旧节点生产的新旧数据涉及到的主要变化量一共有六个:软分叉可以保证不想升级的人不去升级,这种不想升级的需求在现实生活中其实是很常见的。硬分叉必须要求所有旧节点进行升级,否则旧节点就无法识别新节点生产的交易和区块,导致区块链分成两条链。软分叉的升级空间有限,因为目前的比特币交易数据结构和区块数据结构所有字段都已经详细定义好了,你想保证向前兼容,就不可能增加新的字段,否则旧节点就会拒绝你。所以软分叉的升级空间补束缚在对现有字段的重新定义。就包括软分叉就无法重新定义区块数据结构里的“区块大小”这个字段,也就是软分叉永远实现不了对1M区块的突破。而且这种极端复杂的兼容性稍微出点错,就会新旧节点不兼容,即导致硬分叉。这个事情已经发生过一次了。硬分叉的升级空间则要大很多,因为硬分叉只要考虑能够接受以前旧节点生产的交易和区块就可以了,硬分叉不需要考虑旧节点是否会接受新节点生产的交易和区块。那硬分叉就可以对交易数据结构和区块数据结构更大胆的修改。最后,比特币交易数据结构和区块数据结构都有一个字段叫“版本号”,意义是“明确这笔交易或区块参照的规则”。这意味着中本聪是希望使用硬分叉来修改这些规则,就是说如果我们要修改规则,那就重新定义版本号。但软分叉在不修改“版本号”的前提下,却修改了规则。“共识”这个词忽悠了太多的人了。其实在“不破坏共识”包装下的软分叉,本质上和硬分叉是一样要修改相同的对象的,而且更可怕的代价是向前兼容,即要求不升级的软件去忽视升级过的软件生产的数据和代码,冒这种风险得来的好处仅仅是懒得升级软件。我想任何理智的人都是不愿意接受这种风险收益比的。(这个主题我一直想写,但又诚惶诚恐,怕自己写不好。今天鼓起勇气写出来了。写了整整一天。请各位过目。有写错的地方请您一定指出,如果觉得对您有用,欢迎打赏点币给我。) 发文时比特币价格: ¥4117.00 版权信息 作者:黄世亮(微博@闪电HSL 微信tan90d 微信公众号 闪电)币需APP客户端包含,会员注册,登录可以直接将比特币兑换外网的其他虚拟币(目前上线16种国外的虚拟币) 不需要会员翻墙去国外网站购买,APP 包含一键兑换,各虚拟币钱包 币需APP国内首款比特币与国外交易平台的中转站,用户可以自行选择。1: 众筹的比特币数量 直接充值到会员APP,用户可以参与内测体验,兑换外币,交易,提现等一系列的体验,收益年利率达48%(以等值比特币方式发放)。就媒体热度来说,近两周各类媒体对通证的关注度都在大幅下跌。以自媒体平台为例,8 月 6 日当天有 4000 余篇相关新闻,到 8 月 19 日只剩下不足千篇,缩水至 1/4 左右。此外,本次数据的选择范围相当广,囊括了国内外众多媒体的信息,因此不仅能够很好地反映国内媒体对于通证话题的关注度,也在一定程度上综合考虑了海外媒体的“情绪”。