主页 > imtoken钱包最新下载 > 深入解析什么是硬分叉、什么是软分叉、什么是共识?小白看得懂

深入解析什么是硬分叉、什么是软分叉、什么是共识?小白看得懂

imtoken钱包最新下载 2023-01-18 19:22:48

原作者 tan90d 来自 Babbitt

第0章介绍

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

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

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

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

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

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

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

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

比特币交易历史的概念很容易理解,我就不赘述了,也没什么好说的。但是比特币的交易格式,也就是交易的数据结构,需要说明一下btc何时硬分叉,否则就无法理解什么是硬分叉和软分叉。

比特币交易是一种数据结构,其输入和输出值嵌入在数据结构中btc何时硬分叉,将资金从初始点(输入值)转移到目的地址(输出值)。代码信息。这个数据结构包含一些字段,我们从精通比特币的第 5 章仔细研究。

所有比特币钱包必须按照本表格指定的方式发送比特币,否则在比特币网络上将无法识别。即无效交易。就像你去银行汇款,不填汇款单,银行是不会接受的。

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

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

所有挖矿节点钱包必须按照本表规定的方式打包区块,否则不会被比特币网络上的其他人使用。全节点识别(不计SPV节点),即会被视为无效的交易。

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

btc何时硬分叉

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

硬分叉定义如下:

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

bitcoin.org/en/glossary/hard-fork

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

软分叉的定义如下:

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

bitcoin.org/en/glossary/soft-fork

当新的共识规则发布时,由于不知道新的共识规则,尚未升级的节点将投入生产。非法区块会导致临时分叉。

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

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

bitcoin.org/en/glossary/consensus-rules

完整节点跟随以与其他节点保持一致。

bitcoin.org/en/glossary/consensus-rules

共识遵循的区块验证规则。

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

其他两个定义将硬分叉定义为“永久分歧”,将软分叉定义为“临时分叉”。几乎是文字游戏的定义,让社区里很多人都害怕硬分叉。想到硬分叉是一件非常可怕的事情。

说实话,这篇文章的大纲已经在我的脑海里写了很久,但我一直不敢写,因为我怀疑的是圣地bitcoin.org上的定义。我搜索了 bitcoin.org 对比特币协议升级的定义,但找不到让我信服的描述。我在中国问过很多大V,都没有得到完整的答案。这几天,社区里的软分叉爱好者纷纷发文宣传软分叉,呼吁抵制硬分叉。读完之后,我推理,在我的知识体系中,我确信他们是错的。他们错误的根源在于,对“共识”的理解是一种虚幻的描述,他们不知道它指的是什么。似乎只要提到“共识”,就是神圣不可侵犯的。所有的逻辑和推理在达成“共识”时停止。

由于没有软分叉和硬分叉的抽象定义,我们先来分析一下它们的作用。

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

btc何时硬分叉

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

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

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

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

这显然不是一个长期的解决方案,因为只有一个这样的领域。你使用一次,它就会消失。

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

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

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

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

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

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

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

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

让我们看看硬分叉案例。

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

2013年3月12日,比特币qt0.8.0版本软件发布,0.8版本采用新的数据库级db。部分矿工节点升级了bitcoin qt0.8版本,部分矿工继续使用bitcoin qt0.7版本软件。双方分别出块,但比特币qt0.8采用的新数据库出块被qt0.7版本节点拒绝。具体原因是旧数据库有时不接受大于 800Kb 的块。因此,在区块高度 225430 处,比特币区块链被分成两条链,导致比特币区块链中有两条链,一条是包含大于 800kb 区块的链,另一条是拒绝承认这些包含更大区块的链块,这发生在硬分叉上。

btc何时硬分叉

当时使用比特币qt0.8的矿工放弃了自己的矿链,回到比特币qt0.7继续挖矿。

这次硬分叉是个意外。这是bitcoin qt 0.8版本软件的一个bug,导致使用旧软件的节点拒绝验证新软件节点产生的区块。但是,硬分叉是由于使用旧软件版本的节点拒绝验证使用新软件版本的节点产生的块,然后双方分别挖矿造成的。

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

随后bitcoin.org发布公告,呼吁矿工升级到比特币核心0.10.2版本以消除分叉。

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

到目前为止的两次硬分叉都是意外,但第一次是因为不同节点上新生成的块的格式不同,而后一次是因为交易不同。格式在不同的节点上存在差异。但是因为一次意外,社区没有讨论足够的信息,我也搞不清是哪个区块或交易的字段被修改导致了分叉。

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

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

第 6 章计划进行区块扩展硬分叉

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

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

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

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

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

第 7 章隔离见证软分叉

还有另一种阻止变相扩展的解决方案,隔离见证。该解决方案修改了比特币交易数据结构。看图。

图中的红色区域是隔离见证主要工作的地方。这是把这部分数据移出事务定义的数据结构,也就是把它移出块定义的数据结构。因此,交易的数据较少,这样每笔交易的体积就会很小,整个区块1M的空间可以容纳更多的交易。

但是以这种方式删除该字段也会导致非升级节点拒绝验证这些升级节点产生的块。但是有一种方法可以让他们不拒绝,但是代码写起来非常非常复杂。反正这段代码写了一年多,还没出来。代码越复杂,它必然存在的潜在漏洞就越多。考虑到 Bip 66 是由软分叉引起的硬分叉,而这种隔离见证更加复杂。

btc何时硬分叉

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

第8章软分叉和硬分叉中要修改的“共识”都是对数据结构的修改

现在我们可以决定究竟应该是什么软分叉和硬分叉。总结一下什么可行,特别是软分叉和硬分叉有什么区别,以免被那些定义不准确的“共识”搞糊涂。

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

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

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

当前或计划中的硬分叉和软分叉永远不会修改交易历史。即使是2010年8月15日发生的漏洞,修改了交易数据结构,但副作用是使一个区块中的交易无效,因为该交易在新的交易数据中。在struct的定义下是非法的。

所以在修改“共识”级别方面,软分叉和硬分叉本质上没有区别。

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

第9章软分叉和硬分叉的主要区别在于新旧节点的兼容性

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

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

在软分叉中,不会有两条链,因为升级后的节点不能接受新节点产生的新数据。但是,要让新节点和旧节点产生的数据与软分叉完全兼容,难度很大,因为数据结构本质上是不同的,需要大家互相认识。一旦一个节点出现,它拒绝验证不同的交易或区域块,它就变成了一个硬分叉。这就是为什么 Bip 66 软分叉最终变成了硬分叉的原因。

从第四章我们看到,具体的软分叉修改方法是重新定义原来定义的字段,比如多签软分叉。或者定义一个最初留下的字段,例如 CSV 软分叉。

但是现在从事务的数据结构来看,所有的字段都已经被准确详细的占用和定义了。如果你想再做一次软分叉,你只能改变一些字段。原始定义被删除并重新定义。这样一来,原有的功能可能会丢失。如果这个功能缺一不可,就会导致硬分叉,新老节点互相排斥。所以要小心软叉。这就是隔离见证所做的。隔离见证是直接删除一个字段,但是为了保证新旧节点相互兼容,太浪费了。

在硬分叉的情况下,情况就简单多了,无需考虑未升级节点是否会拒绝已升级节点产生的数据和代码。

让我们看看这种兼容性有什么区别才能实现软分叉和硬分叉。

软分叉和硬分叉主要涉及六大变化,以实现新旧节点产生的新旧数据:

1.未升级的老节点;

2.升级新节点;

btc何时硬分叉

3.旧节点上旧交易格式的交易;

4.新节点生成的新交易格式的交易;

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

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

其实还有其他更复杂的因素需要考虑,包括全节点; SPV 节点;新旧节点算力比; SPV挖矿节点;未确认交易和多次确认交易; CSV 交易; RBF 贸易……。所有这些都是兼容性的考虑。但为了简化,我这里只考虑上面的6个主要变化,我们先做个表格。

软分叉需要保证完美兼容,需要满足以下两个条件:

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

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

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

让我们用一个类比来说明这两种兼容性:

向后兼容是我们最了解的,也就是我们可以用word 2013打开word 2010版本的文件。前向兼容是指旧版软件必须无条件接受新版软件产生的无法理解的数据。这就像您使用word 2010打开文件的word 2013版本一样。我不知道这有多难。老软件怎么知道还没有定义的数据?它唯一能做的就是忽略这些新功能。

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

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

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

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

软分叉的升级空间是有限的,因为当前比特币交易数据结构和区块数据结构的所有字段都已经被详细定义。如果要确保前向兼容性,则无法添加新的。字段,否则旧节点将拒绝您。因此,软分叉的升级空间受限于对现有字段的重新定义。包括软分叉无法重新定义区块数据结构中的“区块大小”字段,即软分叉永远不会突破1M区块。而这个极其复杂的兼容性如果稍有不妥,就会导致新旧节点不兼容,从而导致硬分叉。这已经发生过一次了。

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

最后,比特币交易数据结构和区块数据结构都有一个名为“版本号”的字段,意思是“清除本次交易或区块引用的规则”。这意味着中本聪想用硬分叉来修改这些规则,也就是说,如果我们想修改规则,那么重新定义版本号。但是软分叉在不改变“版本号”的情况下改变了规则。

第 11 章结论

“共识”这个词愚弄了太多人。事实上,“不破坏共识”包下的软分叉,本质上和硬分叉修改相同对象是一样的,而且更可怕的代价是前向兼容,也就是需要不升级的软件忽略升级的软件。软件产生的数据和代码,冒这个险的好处就是不偷懒升级软件。我认为没有任何理智的人愿意接受这种风险收益比。