01开始吧 不使用术语还能把事情说明白,那就是真明白了。
比特币是大型网络生物的始祖,可以存续,却不能自我迭代和繁衍。
区块链是比特币的基因,它设定了比特币的内部运行、存续法则。
中本聪说要有光,一个新世界诞生了。比特币的基因经过复制和升级,产生了区块链世界。
煤炭的故事 鳕鱼的故事 西部往事 革命往事 史记 糖史 未来简史,历史有着各种各样的记录方式和理解角度。记账法的历史记录着人类社会生产力的发展历史。区块链就是一个存放在网络上的公共账本,它是进化程度最高的一种记账法。
比特币交易有两重意思。这是理解软分叉和硬分叉的关键。
比特币交易其中一个含义指的是我们遵守共同的规则在账本上记账。不论你用什么记账窗口(钱包软件)都必须遵守这套规则,这样才会通用通行。
另外一个含义是指转账(发送和接收)。所有的转账记录构成了历史记录,到目前为止其数据量大约80多个G。你可以在你的记账窗口(钱包软件)上查看你的所有交易记录。
02 怎样记账和怎样保存账本
一笔交易包含着转出和转入两笔数据
所有的窗口(钱包)都必须统一的规则记账,否则就无法记录到总账本上,交易也就不能成立。
总账本会每隔十分钟刷新整理打包一次,标记一下时间之后摞在旧账本上面,也就是加盖时间戳之后添加到区块链上。所以,你现在应该能明白了,区块链就是10分钟一本10分钟一本摞起来的大账本。这个10分钟的小账本就是一个区块。
03 分叉后谁软?谁硬?
什么是分叉?就是区块链这个软件运行时间长了,数据量大了,跑不动了,需要修改升级。中本聪在喊:“要有光”的时候,忘记设计比特币成长和繁衍的规则了。
硬分叉:
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.
https://bitcoin.org/en/glossary/hard-fork
新国家的人民改花新币了,一部分不能也不想一起过的人去了桃花源,花他们原来的钱,改名叫桃花币。
软分叉:
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.
https://bitcoin.org/en/glossary/soft-fork
新国家宣告成立,部分前朝遗老遗少看不懂新世界,(只能)于桃花源中自给自足。
本来在新国家新世界一起生活挺好的,可惜,一定会有一部分人无法走到这边来。
04 真的分过叉吗
分过。2016年6月分过。那次史称csv软分叉,其实就是改变了记账规则。所有用户个人的记账规则都一样,csv软分叉把账本规则中不是很重要且不具有验证时一票否决权的一条改写了。之后,账本还能将就着用。
2012年也有一次类似分叉。
问题是,下次升级咋办?
。
比特币在2012年还有一次重要的升级,叫P2SH,被社区称之为多重签名软分叉。这是对比特币交易签名脚本的一次修改,使得比特币可以很方便的通过多重签名的方式来发送交易。那一次修改了什么呢?
6
图中的红字加粗的那个字段就是多重签名软分叉主要修改的地方。一开始中本聪定义这个字段是叫P2PKH(Pay-to-Public-Key-Hash,支付给公钥),目前这个字段可以有5种脚本。
因为多重签名软分叉之后,没有升级的节点在验证已经升级过的节点产生的区块时,它们对这种新的P2SH锁定脚本也可以通过验证,所以这也是一个软分叉。
以上两个软分叉都是对比特币交易数据结构的修改。软分叉还能变相修改比特币的交易历史。
在2010年8月15日,有一个黑客利用比特币代码的一个漏洞,在第74638高度区块上刷出一笔交易包含了1844亿个比特币。随后在半天时间内被开发人员发现,并且发布了补丁,将这笔交易的输出变为无效。但这并不是简单地将这笔交易本身定义为无效,而将一类叫“负值输出”的交易定义为无效,刚才那笔交易就是利用比特币之前没有禁止输出值为负值这个漏洞,只是定义了只要输出总金额不能高于输入总金额就可以了。在补丁(应该是中本聪发布的)修正了这个漏洞,具体修改的是什么呢?
7
图中的红字加粗的那个字段就是这个漏洞补丁主要修改的地方。修改之前的规则是“总量”不能高于“交易”,修改之后的规则是添加了“总量”不能是负值。这种修改未升级的节点能够验证已经升级的节点产生的区块,所以也是软分叉。
现在我们对这三个案例进行抽象化,给出一个软分叉的定义:软分叉是指比特币交易的数据结构(这就是被广泛流传的“共识”)发生改变时,未升级的节点可以验证已经升级的节点生产出的区块,而且已经升级的节点也可以验证未升级的节点生产出的区块。
软分叉对“共识”的修改肯定还包括对区块格式的修改,但这里的三个案例均是对交易格式的修改。
下面我们来看硬分叉案例。
第5章 比特币区块链上执行硬分叉的具体案例
在2013年3月12日,当时是bitcoin qt 0.8.0版本软件发布了,0.8版本采用了一种新的数据库level db。有的矿工节点升级了bitcoin qt 0.8版本,有的矿工还继续使用bitcoin qt0.7版本的软件。双方各自生产区块,但bitcoin qt 0.8采用的新数据库生产出的区块被被qt0.7版本节点拒绝掉。具体的原因是旧的数据库对超过800Kb的区块有时不接受。因此在区块高度225430比特币区块链分成了两条链,结果导致了比特币区块链产生两条链,一条是包含大于800kb区块的链,另一条是拒绝承认这些包含更大区块的链,这就发生了硬分叉。
当时是采用bitcoin qt 0.8版本的矿工放弃了他们挖的链,退回到bitcoin qt 0.7版本上继续挖矿。
这次硬分叉是一次意外,是bitcoin qt 0.8版本的软件出了bug,导致采用旧软件的节点拒绝验证新软件节点生产的区块。但硬分叉的成因就是采用旧软件版本的节点拒绝验证采用新软件版本的节点生产的区块,然后双方各自挖矿。
在2015年7月4日比特币区块链在区块高度363731发生一次硬分叉。当时是Bitcoin Core 开发者往新版本的Bitcoin Core 0.10.0添加了BIP 66。这本来是一起软分叉的修改,在比特币网络上主要矿池都使用了0.10版本的软件时,但有一个矿池BTC Nuggets没有升级,导致BTC Nuggets挖出来的两个区块其他矿工拒绝掉,然后双方就各自挖矿延续自己认为是正确的区块链,由此产生硬分叉,分成了两条链。
随后bitcoin.org发布公告,呼吁矿工升级到bitcoin core 0.10.2版本来消灭分叉。
这也是一次意外,硬分叉的成因是采用新软件版本的节点拒绝验证采用旧软件版本的节点生产的区块,然后双方各自挖矿。
到目前为止这两次硬分叉都是意外,但硬分叉的成因前一个是因为对新产生的区块格式在不同节点上产生分歧,后一个是因为对交易格式在不同节点上产生分歧。但因为是意外,社区没有讨论出足够多的资料,我也搞不清楚具体是区块或交易的哪个字段被修改而导致的分叉。
到了这里,我们可以对这两个案例进行抽象化,给出一个硬分叉的定义:硬分叉是指比特币区块格式或交易格式(这就是广泛流传的“共识”)发生改变时,未升级的节点拒绝验证已经升级的节点生产出的区块,不过已经升级的节点可以验证未升级节点生产出的区块,然后大家各自延续自己认为正确的链,所以分成两条链。
下面我们来看社区正在策划,但还没被激活的软分叉和硬分叉。
第6章 正在策划的区块扩容硬分叉
目前比特币社区正在策划一次硬分叉,来由是目前的区块被塞满了交易,为了能在十分钟一个区块里容纳更多的交易,就需要对区块的数据结构做修改。那我们先再来看下区块的数据结构。
9
目前比特币网络主要的完整节点软件是bitcoin core 0.12,这个软件规定表6里的“区块大小”这个字段最大值为1M。这就导致最后一个字段“交易”能够容纳的比特币交易数据有限,一笔交易至少是250字节,1Mb只能装下4000多笔交易,平均每秒最多只能处理7笔交易。而因为实际的交易往往会达到500字节的大小,实际上平均每秒往往只能容纳3笔交易。
所以有人就提出将这个字段的最大值调高,比如Bitcoin Classic这个软件就将这个字段的最大值调到2M,并且以后有计划取前2016个区块大小的中位数再乘一个约定好的倍数来决定下一批区块的大小上限。而Bitcoin XT则将这个值修改为20M,并且每两年翻一倍,直到上限值达到8.3G。而Bitcoin Unlimited则直接将这个字段修改为由矿池决定自己打包多大。
问题是,使用这些修改了这个字段的软件的节点生产出的区块就会和没有升级的节点不兼容,没升级的会拒绝验证这些新节点生产的区块。这就会导致硬分叉。
到这里,我们基本知道了,所谓的硬分叉需要修改的“共识”就是指的是修改区块数据结构格式,或修改交易数据结构格式。
第7章 隔离见证软分叉
还有一个对区块变相扩容的方案是隔离见证,这个方案修改的是比特币交易数据结构,我们还是来看图。
10
图中红色的字段就是隔离见证主要动手的地方,这是要将这部分数据移出交易定义的数据结构,并且还要移出区块定义的数据结构。因此交易就少了一部分数据,这样每一笔交易的体积就会小,而整个区块1M空间内就能够容纳更多的交易。
但这样移走这个字段,也会造成没有升级的节点的拒绝验证这些升级的节点生产的区块。但是有办法让他们不拒绝,但代码写起来就非常非常复杂,反正这个代码写了一年多了,到现在还没有搞出来。代码越复杂,势必潜在的漏洞就越多,想想Bip 66都由软分叉导致了硬分叉,而这个隔离见证更复杂。
到这里,再一次验证了,所谓的软分叉需要修改的“共识”就是指修改区块数据结构格式,或修改交易数据结构格式。
第8章 软分叉和硬分叉要修改的“共识”都是对数据结构的修改
现在我们可以对软分叉和硬分叉到底要做什么工作做个总结,特别是软分叉和硬分叉之间到底有什么区别,以免得被那些定义不准确的“共识”弄晕了。
软分叉修改的“共识”具体是指修改了比特币交易数据结构,或修改了比特币区块数据结构。
硬分叉修改的“共识”具体是指修改了比特币交易数据结构,或修改了比特币区块数据结构。
在具体修改的对象层面上,软分叉和硬分叉是完全没有区别的,就目前止我们看到的所有的已经发生的,和计划发生的分叉都是这样子,它们都修改或试图修改交易数据结构,或区块数据结构。
目前发生的,或计划发生的硬分叉和软分叉都绝对不会去修改交易历史记录。哪怕是2010年8月15日发生的刷出天量币的漏洞,那一次修改的也是交易数据结构,但附带的作用就是将一个区块里的交易作废了,因为那笔交易在新交易数据结构的定义下是非法的。
所以说软分叉和硬分叉在修改“共识”层面上本质上是没有区别的。
那软分叉和硬分叉的区别在哪呢?
第9章 软分叉和硬分叉主要区别是新旧节点相互兼容性
区别是对新旧节点的兼容方面。软分叉修改数据结构后,新节点生产的交易和区块能够被旧节点验证并接受,硬分叉就不能。
正因为硬分叉修改数据结构后,新节点生产的区块会被旧节点拒绝掉,如果旧节点拒绝升级软件而坚持按照旧数据结构继续挖矿,那比特币就会产生两条链。
而软分叉因为没有升级的节点能接受新节点生产的新数据,所以不会出现两条链。但软分叉为了做到新节点和旧节点生产的数据完全兼容,那是非常难的,因为本质上是不一样的数据结构大家要相互认,一旦出现有节点拒绝验证不一样的交易或区块,那就会变成硬分叉。这也就是Bip 66软分叉最终变成硬分叉的原因。
从第4章我们看到具体的软分叉的修改办法是将原来定义好的字段进行重新定义,如多重签名软分叉。或者是对原本是留在的字段做定义,如CSV软分叉。
但是现在从交易的数据结构来看,所有的字段都已经被占用,并且准确而详细地定义了,如果你还要再做软分叉,那就只能将部分字段原有的定义擦除掉,再重新定义。这样就会导致原有的功能可能会丧失,如果这个功能是不可或缺的,那就会导致硬分叉,新旧节点相互拒绝。所以软分叉要特别小心。这也就是隔离见证的做法。隔离见证是直接将某个字段删除掉,但为了保证新旧节点之间的相互兼容,那个是废了牛劲了。
便硬分叉则不考虑没有升级的节点会不会拒绝已经升级的节点生产的数据和代码的情况,情况要简单许多。
让我们来看看这种为了实现软分叉和硬分叉要做的兼容性有什么区别。
软分叉和硬分叉要实现新旧节点生产的新旧数据涉及到的主要变化量一共有六个:
1.没有升级的旧节点;
2.升级了的新节点;
3.旧节点发生的旧交易格式的交易;
4.新节点发生的新交易格式的交易;
5.旧节点生产出的只含旧区块格式的旧区块;
6.新节点生产出的含新区块格式的新区块。
实际上还要考虑更复杂的其他因素,包括完整节点;SPV节点;新旧节点算力占比;SPV挖矿节点;未确认交易和多个确认交易;CSV交易;RBF交易……。所有这些都是兼容性要考虑的因素。但为了简化,我这里只考虑上面6个主要变化量,我们先来列个表。
11
软分叉需要保证完美的兼容性就要求达到以下两种情况:
1.升级过的节点接受没有升级的节点生产的交易和区块(向后兼容);
2.没有升级的节点接受升级过的节点生产的交易和区块(向前兼容)。
硬分叉需要保证的兼容性只需要达到上面的第1种情况,也就是新节点需要从0高度区块开始验证整个区块链就可以了。
我们打个比方来说明这两种兼容性吧:
向后兼容其实是我们最好理解的,就是我们使用word 2013可以打开word 2010版的文件。向前兼容的意思是旧版本软件要无条件接受自己所不能理解的新版本软件生产的数据。就像是你用word 2010去打开word2013版的文件。这种难度不知道有多高啊,旧版软件怎么会知道还没有定义过的数据呢?它唯一能做的就是忽略这些新功能。
而硬分叉是不考虑这么复杂的兼容性的,首先是拒绝向前兼容。硬分叉就不会理会没有升级的节点拒绝验证升级过的节点生产的区块这会事,你受验证不验证,你不升级我就不跟你玩了。
第10章 对比软分叉和硬分叉的优缺点
软分叉可以保证不想升级的人不去升级,这种不想升级的需求在现实生活中其实是很常见的。
硬分叉必须要求所有旧节点进行升级,否则旧节点就无法识别新节点生产的交易和区块,导致区块链分成两条链。
软分叉的升级空间有限,因为目前的比特币交易数据结构和区块数据结构所有字段都已经详细定义好了,你想保证向前兼容,就不可能增加新的字段,否则旧节点就会拒绝你。所以软分叉的升级空间补束缚在对现有字段的重新定义。就包括软分叉就无法重新定义区块数据结构里的“区块大小”这个字段,也就是软分叉永远实现不了对1M区块的突破。而且这种极端复杂的兼容性稍微出点错,就会新旧节点不兼容,即导致硬分叉。这个事情已经发生过一次了。
硬分叉的升级空间则要大很多,因为硬分叉只要考虑能够接受以前旧节点生产的交易和区块就可以了,硬分叉不需要考虑旧节点是否会接受新节点生产的交易和区块。那硬分叉就可以对交易数据结构和区块数据结构更大胆的修改。
最后,比特币交易数据结构和区块数据结构都有一个字段叫“版本号”,意义是“明确这笔交易或区块参照的规则”。这意味着中本聪是希望使用硬分叉来修改这些规则,就是说如果我们要修改规则,那就重新定义版本号。但软分叉在不修改“版本号”的前提下,却修改了规则。
第11章 结束语
“共识”这个词忽悠了太多的人了。其实在“不破坏共识”包装下的软分叉,本质上和硬分叉是一样要修改相同的对象的,而且更可怕的代价是向前兼容,即要求不升级的软件去忽视升级过的软件生产的数据和代码,冒这种风险得来的好处仅仅是懒得升级软件。我想任何理智的人都是不愿意接受这种风险收益比的。
(这个主题我一直想写,但又诚惶诚恐,怕自己写不好。今天鼓起勇气写出来了。写了整整一天。请各位过目。有写错的地方请您一定指出,如果觉得对您有用,欢迎打赏点币给我。)
发文时比特币标准价格 买价:¥4117.00 卖价:¥4112.00
作者:黄世亮(微博@闪电HSL 微信tan90d 微信公众号 闪电)
我的BTC地址:14mhzjkJ71oMAMkKu3dy98dnUpkyQBHL1r
版权声明: by nc" sa 作者保留权利。文章为作者独立观点,不代表巴比特立场。
来自: 巴比特
评论:13
您需要登录后才可以回复 登录|注册
用新浪微博登录
Author Image libra17951 5 天前
除了感谢没有别的,迄今为止最好的一篇关于分叉的说明文。没有之一!
+1 +1
0 0
我要点评
Author Image bitdot 35 天前
一篇好文!
+1 +1
0 0
我要点评
Author Image xmenx 37 天前
写得很详细!!
+1 +1
0 0
我要点评
Author Image zimeng0110 116 天前
今天算是看明白了,以前看了不知道多少遍,但还是不知道什么是硬分叉,什么是软分叉
+1 +1
0 0
我要点评
Author Image merry 284 天前
感谢
https://blockmeta.com/btc-tx/89e7f8854c2458b6c0f67e2d3b92d3c4cc54be5e73847323d07595a4f57e5c57
赞助0.0766 BTC
+1 +1
0 0
我要点评
Author Image cndx 286 天前
《什么是共识,什么是分叉,什么是兼容性》
http://www.8btc.com/compatibility-and-fork
+1 +1
0 0
我要点评
YichenTANG_不会Java YichenTANG_不会Java 287 天前
是时候推荐你地摊文学 货币战争 了。。。上下班路上可以听。。
+1 +1
0 0
我要点评
我是来围观你们炒比特币的 我是来围观你们炒比特币的 287 天前
最近软分叉的呼声越来越高了啊
+1 +1
0 0
我要点评
长铗 长铗 287 天前
歧路之中又有歧焉,吾不知所之,所以反也
+1 +1
0 0
我要点评
Author Image cndx 287 天前
说得很详细。但有点太多,看看这个投票贴吧:
http://8btc.com/thread-40509-1-1.html
向前兼容的重要性,尤其是在金融领域的,闪电可能有点忽视了。能软分叉实现的情况下,尽量不要硬分叉。金融是要求稳定的,你下载了个电子钱包,存了些钱,过了段时间再打开钱包时,发现不能用了,必须要升级才能用,而升级的过程可能存在风险。像这样的钱包软件会有人用会有人信任吗?因此“向前兼容”就算再复杂,也是要尽量实现的。
+1 +1
0 0
我要点评
Author Image 面神护法 287 天前
还没看完,先给个大大的赞
+1 +1
0 0
我要点评
晨风思以自娱 晨风思以自娱 287 天前
系统详尽的介绍了软硬分叉,有利于打破人们对硬分叉的恐惧症。2015年的363731的两个块,应该不算硬分叉,最多只是双方矿工由于规则不同,各自认为自己是合法的最长链,但普通的用户节点,还是只会认一条。//@闪电HSL: 写这篇文章,我有点诚惶诚恐,如果发现有错误,一定记得告诉我。谢谢
+1 +1
0 0
我要点评
Author Image bixu 287 天前
币需APP 项目众筹正式开始
币需APP客户端包含,会员注册,登录可以直接将比特币兑换外网的其他虚拟币(目前上线16种国外的虚拟币) 不需要会员翻墙去国外网站购买,APP 包含一键兑换,各虚拟币钱包 币需APP国内首款比特币与国外交易平台的中转站,用户可以自行选择。
目前属于内部众筹, 众筹比特币地址 19YxeEuBiNJUtxzJegscsTtkwEX6xrioKt 最低0.1BTC,时间截至到10.30日。
众筹会员享有:
1: 众筹的比特币数量 直接充值到会员APP,用户可以参与内测体验,兑换外币,交易,提现等一系列的体验,收益年利率达48%(以等值比特币方式发放)。
2:众筹会员 享受币需股权分配, APP软件将开通股权积分的交易(股权积分也可以兑换比特币等虚拟币)
3:参与众筹的会员,请将打款的比特币地址,以及参与众筹的比特币数量,以及个人联系方式 发送到1991999002@qq.com,我们将有专人一对一电话。
+1 +1
0 0
我要点评
专栏作者
Author Image
tan90d
机械神教和比特神教信徒。前者给我生活,后者给我理想。(希望你们留有一个钱包,存上少量的比特币并长期持有——私房钱总是在最关键的时候能帮上大忙。)
Ta的专栏 Ta的评论 新浪微博 微信号
Copyright©2011-2020 · 巴比特 · 署名-非商业性使用-相同方式共享(BY-NC-SA 3.0 CN) · 沪ICP备11034946号-1 浙公网安备 33010602002085号 站长统计