主页 > imtoken钱包app下载 > 转载:区块链:关于软分叉和硬分叉以及什么是共识

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

imtoken钱包app下载 2023-04-06 07:29:36

第0章介绍

比特币是一套软件。 修改和升级软件代码往往涉及两个概念,一个叫硬分叉,一个叫软分叉。 这到底是什么意思? 社区中最常见的定义是修改共识。 但“共识”究竟指的是什么,就很难理解了。 让我们实际修改代码级别以查看它们的定义。

第一章 比特币交易形式和交易历史

在了解什么是硬分叉和软分叉之前,我们首先要知道他们要修改什么。

比特币交易在中文里有双重含义,这是硬分叉和软分叉经常被误解的关键点。

比特币交易的含义之一是指我们用来发送比特币的统一数据结构。 这是一套规则。 我们所有人发送比特币,无论你使用什么钱包软件,都必须遵守这套规则。 它被定义为一种数据结构,其中每个字段代表其含义。 所有钱包软件都明白这一点。

比特币交易的另一个含义是使用比特币的人互相发送比特币的事件。 比如我给你发0.12345 BTC,这就是一笔交易。 所有这些比特币发送事件构成了比特币交易历史,这是目前构成比特币全节点的80多GB数据的主要内容。 所有这些记录都可以在区块链浏览器上找到。 你只需要在区块链浏览器上输入你的比特币地址,就可以找到你所有的交易记录。

打个比喻来说明。 交易格式类似于我们去银行给别人汇款时填写的汇款单。 汇款单上明确写明汇款人姓名、身份证、手机号码、账号、金额、收款人姓名、账号……等信息。 比特币交易格式也规定了汇款人信息和收款人信息,但这些信息与本人身份信息无关。 比特币交易需要填写的具体信息请参考下一章节。

第二章 比特币交易格式和区块格式

比特币的交易历史这个概念大家都很容易理解,就不说了,也没什么好说的。 但是比特币的交易格式,也就是交易的数据结构是需要解释的,否则无法理解什么叫硬分叉和软分叉。

比特币交易是一种包含输入值和输出值的数据结构,它体现了将一笔钱从起点(输入值)转移到目的地址(输出值)的代码信息。 这个数据结构包含了一些字段,我们详细看一下这些字段,摘自《精通比特币》第5章。

2

所有比特币钱包必须按照本表规定的方式发送比特币,否则在比特币网络上不被认可,即无效交易。 就像你去银行转账,如果你不按照汇款单填写,银行是不会受理的。

比特币网络会收集每个节点在平均 10 分钟内发送的交易,然后将它们打包成一个称为区块的包比特币历史记录,打上时间戳,然后将其添加到区块链中。 什么是块?

区块是聚合交易信息(即网络上每个节点平均十分钟内发送的比特币交易)的容器数据结构。 它由一个包含元数据的块头组成,后跟一长串构成块体的交易。 块数据结构定义如下。

3

所有挖矿节点钱包必须按照本表格规定的方式打包区块,否则将无法被比特币网络上的其他全节点(SPV节点不算)认可,即视为无效交易。

第 3 章硬分叉和软分叉的“官方”定义

硬分叉和软分叉在bitcoin.org上都有定义,但是定义其实很模糊。 为了不让我胡说八道(质疑bitcoin.org上的定义真是让我毛骨悚然。),我摘录原文:

比特币历史记录_比特币价格历史_2009年比特币历史价格

硬分叉定义如下:

区块链中的永久分歧通常发生在未升级节点无法验证由升级节点创建的遵循较新共识规则的区块时。

区块链中存在永久性分歧。 新共识规则发布后,部分未升级节点无法验证升级节点出块。 通常,会发生硬分叉。

软分叉的定义如下:

区块链中的临时分叉通常发生在使用未升级节点的矿工违反他们的节点不知道的新共识规则时。

当新的共识规则发布时,没有升级的节点会因为不知道新的共识规则而产生非法区块,从而出现临时分叉。

社区关于区块扩展是硬分叉还是软分叉的争论,我猜应该是bitcoin.org上这两个模糊定义的主要原因。 最大的责任在于原文中“共识规则”的定义不明确。 如果我们去bitcoin.org查一下“共识规则”是什么意思,原文如下:

全节点遵循的块验证规则与其他节点保持一致。

全节点为了与其他节点保持共识而遵循的区块验证规则。

这种共识的定义在逻辑上犯了循环证明的谬误。 这个定义意味着“共识是维持共识的规则”。 这和许三多说的一样:“有意义,就是活得好。” “那什么是好好活着?” “好好活着,就是做有意义的事。” 是有意义的。

在另外两个定义中,硬分叉被定义为“永久分叉”,软分叉被定义为“临时分叉”。 ,使社区中的许多人害怕硬分叉。 将硬分叉视为一件非常可怕的事情。

说实话,这篇文章在脑海里勾勒了很久,但一直不敢写,因为我怀疑的是圣地bitcoin.org上的定义。 我在 bitcoin.org 上费力地阅读了比特币协议升级的定义,但我找不到能消除我疑虑的描述。 问了很多国内的大V,都没有得到完整的回答。 这几天,社区里的软分叉爱好者纷纷发文宣传软分叉,呼吁抵制硬分叉。 经过我的阅读和推理,在我的知识体系内比特币历史记录,我确信他们是错误的。 他们错误的根源都来自于把“共识”理解为一种虚幻的描述,根本不知道它指的是什么。 似乎只要提到“共识”,就是神圣不可侵犯的。 所有逻辑和推理在“共识”时停止。

既然没有软分叉和硬分叉的抽象定义,那我们先分析一下他们做了什么。

第四章比特币区块链实施软分叉升级的具体案例

比特币区块链最近几个月前进行了一次软分叉升级,使得BIP68/112/113在比特币协议中正式生效,被社区称为CSV软分叉。 2016年6月左右完成升级,这次软分叉修改了比特币代码在哪里? 要回答这个问题,我们需要从比特币交易数据结构中寻找答案。

CSV软分叉前后比特币交易数据结构发生了什么变化?

4

图中红色粗体字段为CSV软分叉的主要修改。 在CSV软分叉之前,该字段为“序列号(目前未使用的交易替换功能)”,如下图:

5

2009年比特币历史价格_比特币历史记录_比特币价格历史

正是因为原始比特币交易数据结构中的这个字段没有被使用,或者当时定义模糊,所以可以重新定义。 这个未定义的字段不会在旧版本的比特币全节点上仔细验证。 新版本节点根据定义的规则产生新的区块,也可以被旧版本节点验证和接受。 这就是软分叉的具体过程。

但这显然不是长久之计,因为这样的领域只有一个,用过一次,后面就会消失。

比特币在2012年还有一次重要升级,叫做P2SH,被社区称为多重签名软分叉。 这是对比特币交易签名脚本的修改,可以方便比特币通过多重签名发送交易。 当时有什么变化?

6

图中红色粗体字段为多重签名软分叉的主要修改。 一开始,中本聪将这个字段定义为P2PKH(Pay-to-Public-Key-Hash,支付给公钥)。 目前,该字段可以有 5 个脚本。

因为在多重签名软分叉之后,非升级节点在验证升级节点产生的区块时,也可以通过这个新的P2SH锁定脚本的验证,所以这也是一个软分叉。

以上两个软分叉是对比特币交易数据结构的修改。 软分叉还可以变相修改比特币的交易历史。

2010年8月15日,黑客利用比特币代码漏洞在74638区块生成了一笔包含1844亿比特币的交易,半天之内就被开发者发现,并发布了一个补丁让这个输出无效交易。 但这并不是简单地将交易本身定义为无效,而是将一种叫做“负值输出”的交易定义为无效。 刚才的交易利用了比特币之前没有禁止输出值为负的漏洞。 它只是定义了只要输出总量不能高于输入总量。 该漏洞已在补丁中修复(应由中本聪发布)。 具体修改了什么?

7

图中红色粗体字段为本次漏洞补丁的主要修改内容。 修改前的规则是“总金额”不能高于“交易金额”,修改后的规则是“总金额”不能为负数。 这个修改后的非升级节点可以验证升级节点产生的区块,所以也是软分叉。

现在我们将这三种情况抽象出来,给出一个软分叉的定义:软分叉是指当比特币交易的数据结构(这就是广为流传的“共识”)发生变化时,非升级节点升级节点产生的区块可以被验证,升级后的节点也可以验证非升级节点产生的区块。

软分叉对“共识”的修改也必然包括对区块格式的修改,但这里的三种情况都是对交易格式的修改。

让我们看看硬分叉的情况。

第五章比特币区块链硬分叉具体案例

2013年3月12日,比特币qt 0.8.0版本发布,0.8版本采用了全新的数据库级别db。 部分矿工节点升级到bitcoin qt 0.8,部分矿工继续使用bitcoin qt0.7软件。 双方分别出块,但比特币qt 0.8采用的新数据库出块被qt0.7版本节点拒绝。 具体原因是旧数据库有时不接受大于800Kb的块。 因此,在区块高度225430处,比特币区块链被分为两条链。 结果,比特币区块链产生了两条链,一条包含大于 800kb 的块,另一条拒绝识别包含更大块的块。 一连串的区块,出现硬分叉。

当时使用比特币qt 0.8版本的矿工放弃了自己挖的链,回到比特币qt 0.7版本继续挖矿。

这次硬分叉是个意外。 比特币qt 0.8软件存在一个bug,导致使用旧软件的节点拒绝验证新软件节点产生的区块。 但硬分叉的原因是使用旧软件版本的节点拒绝验证使用新软件版本的节点产生的区块,然后双方各自独立挖矿。

2015 年 7 月 4 日,比特币区块链在区块高度 363731 处发生硬分叉,是比特币核心开发者在新版比特币核心 0.10.0 中添加了 BIP 66。 这最初是对软分叉的修改。 当比特币网络上的主要矿池使用0.10版本的软件时,一个矿池BTC Nuggets没有升级,导致BTC Nuggets挖出的两个区块被其他矿工拒绝。 然后双方将继续挖掘他们认为正确的区块链,导致硬分叉并分裂成两条链。

随后bitcoin.org发布公告,呼吁矿工升级至bitcoin core 0.10.2以消除分叉。

2009年比特币历史价格_比特币历史记录_比特币价格历史

这也是个意外,硬分叉的起因是新版本节点拒绝验证旧版本节点出块,然后双方各自独立挖矿。

到目前为止的两次硬分叉都是意外,但硬分叉的原因是,第一次硬分叉是不同节点对新生成的区块格式不一致造成的,而后一次是因为不同节点对交易格式不一致造成的。节点。 但是因为是意外,社区没有讨论足够的信息,也不知道修改了区块或者交易的哪个字段导致了分叉。

至此,我们可以将这两种情况抽象出来,给出硬分叉的定义:硬分叉是指当比特币区块格式或交易格式(这是广为流传的“共识”)发生变化时,未升级的节点拒绝验证区块由升级节点产生,但升级节点可以验证非升级节点产生的区块,然后大家继续自己认为正确的链,所以分为两条链。

让我们看看社区正在计划但尚未激活的软分叉和硬分叉。

第六章 计划中的区块扩展硬分叉

目前,比特币社区正在筹划硬分叉。 原因是当前区块充满了交易。 为了在一个十分钟的区块中容纳更多的交易,需要修改区块的数据结构。 那我们先看看block的数据结构。

9

目前比特币网络主要的全节点软件是bitcoin core 0.12。 本软件规定表6中“块大小”字段的最大值为1M。 这导致最后一个字段“transaction”可以容纳的比特币交易数据有限。 一个交易至少250字节,1Mb只能容纳4000多笔交易,平均每秒最多只能处理7笔交易。 而且由于实际交易往往达到500字节大小,实际上平均每秒只能容纳3笔交易。

于是有人提出增加这个字段的最大值。 例如Bitcoin Classic软件会将该字段的最大值调整为2M,未来有计划取之前2016年区块大小的中位数乘以一个约定的倍数来确定大小的上限下一批块。 Bitcoin XT将这个值修改为20M,每两年翻一番,直到上限达到8.3G。 但是Bitcoin Unlimited直接修改这个字段,让矿池决定打包多少。

问题在于,节点使用修改该字段的软件产生的区块将与未升级的节点不兼容,而未升级的节点将拒绝验证这些新节点产生的区块。 这导致硬分叉。

至此,我们基本知道,所谓硬分叉需要修改的“共识”,是指修改区块数据结构格式,或者说修改交易数据结构格式。

第 7 章 隔离见证软分叉

还有一种变相扩容区块的方案,就是隔离见证。 该方案修改了比特币交易数据结构。 让我们看一下图片。

10

图中红色区域是Segregated Witness的主要部分,就是将这部分数据移出交易定义的数据结构,也移出区块定义的数据结构。 因此,部分交易数据缺失,这样每笔交易的体积就会变小,整个区块的1M空间可以容纳更多的交易。

但是,以这种方式移除该字段也会导致未升级的节点拒绝验证这些升级的节点产生的区块。 但是有办法让他们不拒绝,但是代码写起来非常非常复杂。 反正这段代码已经写了一年多了,还没搞出来。 代码越复杂,潜在的漏洞就越多。 将 Bip 66 视为由软分叉引起的硬分叉,而这种隔离见证更加复杂。

至此再次验证,所谓软分叉需要修改的“共识”是指修改区块数据结构格式,或者说修改交易数据结构格式。

Chapter 8 软分叉和硬分叉要修改的“共识”是数据结构的修改

现在我们可以总结一下软分叉和硬分叉是做什么的,特别是软分叉和硬分叉有什么区别,以免被那些定义不明确的“共识”所迷惑。

2009年比特币历史价格_比特币价格历史_比特币历史记录

软分叉修改的“共识”具体是指修改比特币交易数据结构,或者说修改比特币区块数据结构。

硬分叉修改的“共识”具体是指修改比特币交易数据结构,或者说修改比特币区块数据结构。

在具体的修改对象层面,软分叉和硬分叉没有区别。 就目前我们所看到的,所有已经发生和计划发生的分叉都是这样的。 他们都修改或试图修改交易数据结构,或区块数据结构。

当前或计划中的硬分叉和软分叉都不会修改交易历史。 即便是2010年8月15日刷出天亮币的漏洞,当时修改了交易数据结构,但附带的效果是让区块中的交易失效,因为新交易数据下的交易是非法的结构体的定义。

因此,软分叉和硬分叉在修改“共识”层面上本质上没有区别。

软分叉和硬分叉有什么区别?

第九章 软分叉和硬分叉的主要区别在于新旧节点之间的相互兼容

区别在于与旧节点和新节点的兼容性。 软分叉修改数据结构后,新节点产生的交易和区块可以被老节点验证和接受,而硬分叉则不能。

只是因为硬分叉修改了数据结构,新节点产生的区块会被老节点拒绝。 如果旧节点拒绝升级软件,坚持按照旧数据结构继续挖矿,那么比特币就会产生两条链。

软分叉没有两条链,因为没有升级的节点可以接受新节点产生的新数据。 但是软分叉很难做到新旧节点产生的数据完全兼容,因为数据结构有本质的不同,大家需要互相认可。 一旦一个节点拒绝验证不同的交易或区域块,它就变成了硬分叉。 这就是 Bip 66 软分叉最终变成硬分叉的原因。

从第四章可以看出,软分叉的具体修改方式是重新定义原来定义的字段,比如多重签名软分叉。 或者定义原本保留的字段,比如 CSV 软分叉。

但是现在从交易的数据结构来看,所有的字段都已经被占用,定义的很准确,很详细。 如果要做软分叉,只能把一些字段原来的定义抹掉,然后重新定义。 这将导致原有功能的丧失。 如果这个功能不可或缺,就会导致硬分叉,新旧节点相互排斥。 所以要小心软分叉。 这就是隔离见证所做的。 Segregated Witness就是直接删除某个字段,但是为了保证新旧节点的兼容性,那是没有用的。

硬分叉不考虑未升级节点是否会拒绝升级节点产生的数据和代码。 情况要简单得多。

让我们看看这种兼容性对软分叉和硬分叉的区别。

软分叉和硬分叉实现新旧节点产生的新旧数据主要有六点变化:

1. 没有升级的老节点;

2.升级新节点;

3. 旧节点发生的旧交易格式的交易;

4、在新节点发生的新交易格式的交易;

比特币价格历史_2009年比特币历史价格_比特币历史记录

5、老节点产生的老区块只包含老区块格式;

6. 新节点产生的具有新区块格式的新区块。

其实还需要考虑其他更复杂的因素,包括完整的节点; SPV 节点; 新旧节点的算力比例; SPV挖矿节点; 未确认的交易和多次确认的交易; CSV 交易; RBF transactions... 所有这些都是兼容性需要考虑的因素。 但为了简单起见,我这里只考虑以上6个主要变量,先做个表吧。

11

软分叉需要保证完美的兼容性,需要满足以下两种情况:

1. 升级后的节点接受非升级后节点产生的交易和区块(向后兼容);

2. 非升级节点接受升级节点产生的交易和区块(向前兼容)。

硬分叉需要保证的兼容性只需要达到上面的第一种情况,即新节点需要从0高度区块开始验证整个区块链。

下面用一个类比来说明这两种兼容:

向后兼容其实是我们最好的理解,也就是我们可以用word 2013打开word 2010的文件。向前兼容就是老版本的软件必须无条件的接受新版本软件产生的它无法理解的数据。 就好比你用word 2010打开word2013版本的文件。 我不知道这有多难。 老版本的软件怎么知道还没有定义的数据呢? 它唯一能做的就是忽略这些新特性。

硬分叉不考虑这么复杂的兼容性,首先拒绝向前兼容。 硬分叉将忽略未升级节点拒绝验证升级节点产生的块这一事实。 验证不验证,不升级我就不跟你玩了。

第10章比较软分叉和硬分叉的优缺点

软分叉可以保证不想升级的不升级。 这种不想升级的需求在现实生活中其实很常见。

硬分叉必须要求所有旧节点都升级,否则旧节点将无法识别新节点产生的交易和区块,导致区块链分裂成两条链。

软分叉的升级空间有限,因为目前比特币交易数据结构和区块数据结构的所有字段都已经被详细定义。 如果要保证向前兼容,就不可能增加新的字段,否则老节点会拒绝你。 因此,软分叉的升级空间仅限于对已有字段的重新定义。 包括软分叉,也不可能重新定义区块数据结构中的“区块大小”字段,即软分叉永远不会突破到1M区块。 而且,如果这种极其复杂的兼容性稍有差错,就会导致新旧节点不兼容,从而导致硬分叉。 这已经发生过一次了。

硬分叉的升级空间要大很多,因为硬分叉只需要考虑老节点产生的交易和区块,硬分叉不需要考虑老节点是否会接受老节点产生的交易和区块新节点。 片。 那么硬分叉可以对交易数据结构和区块数据结构进行更大胆的改动。

最后,无论是比特币交易数据结构还是区块数据结构,都有一个字段叫做“版本号”,意思是“明确本次交易或区块引用的规则”。 这意味着中本聪要用硬分叉来修改这些规则,也就是说,如果我们要修改规则,那么就重新定义版本号。 但是软分叉修改了规则,没有修改“版本号”。

第十一章结论

“共识”二字,忽悠了太多人。 事实上,“不破坏共识”包下的软分叉,本质上修改的是和硬分叉一样的对象,更可怕的代价是向前兼容,要求未升级的软件忽略升级的软件。 软件产生的数据和代码,冒这个险的好处就是懒得升级软件了。 我想任何一个有理智的人都不愿意接受这个风险收益比。