主页 > 创建imtoken钱包流程 > 区块链学习笔记 9 - 比特币分叉

区块链学习笔记 9 - 比特币分叉

创建imtoken钱包流程 2023-01-17 03:35:34

九、比特币分叉

什么是分叉?

以前是一条链,现在分成两条链,叫做分叉。

分叉可能由多种原因引起。比如前面提到,在挖矿的时候,如果大约同时有两个节点,那么这个时候,两个节点都可以发布zone,这个时候就会有一个临时的分叉,叫做状态分叉,因对比特币现状的不同意见而产生的分叉。

前面也提到了分叉攻击的例子。分叉攻击也是状态分叉,也是对比特币当前状态的分歧造成的分叉,但这是分叉攻击的一个例子。意见分歧是故意的和人为的,所以有时这被称为故意分叉。除了意见分歧造成的这一点外,比特币协议也发生了变化。要修改比特币协议,需要软件。升级,在去中心化系统中,升级软件时,无法保证所有节点都升级软件。假设大部分节点都升级了自己的软件,那么可能有少数节点由于各种原因没有升级,也可能是没有时间升级。升级也可能意味着您不同意对本协议的修改。如果你想把协议改成这个,社区里有些人可能不支持。那么这个时候也会有一个分叉,叫做协议分叉,因为需要比特币协议的差异,不同版本的协议造成的分叉。根据协议修改的内容,又可以分为硬分叉和软分叉。

硬分叉

情况

如果在比特币协议中增加了一个新特性,扩展了一些新的功能,此时,没有软件升级这些老节点不承认这些新特性,认为这些特性是非法的,这是对比特币协议的内容,会导致分叉

例子

块大小限制,块大小限制。

比特币分叉时间_比特币最新分叉情况_比特币有几个分叉币

比特币规定哪个区块最多为一兆字节。有人认为一兆的限制太小了,也增加了交易延迟。也可以计算一下,1M = 1,000,000字节,一个A交易可以认为是250字节,1000000字节/250字节=大约4000个交易,也就是一个区块,平均十分钟就有这么一个区块,所以4000 笔交易需要分散在 10 分钟内,每分钟 60 秒,4000 /(69x10) 大约是 7,也就是每秒约 7 笔交易。这个很低。

在这里插入图片描述

就像用信用卡买东西时,信用卡公司可以处理的交易数量可能比这多几个数量级。例如,一家大型信用卡公司每秒可以处理与此不同数量级的交易。差了好几个数量级,很多电商网站每秒的交易量远不止这些,所以有人认为这个区块太小,限制了比特币,也增加了延迟,因为区块可以持有这么多Transaction,如果交易太多,有些交易可能要等到下一个区块才能写入,平均十分钟。

假设有人发布软件更新,将块大小限制从1M增加到4M,假设大部分节点都更新了软件,将块大小限制更新为4M,少数节点没有更新,大部分节点而且这里提到的几个节点不是按照账户数来计算的,no 谁拥有的账户最多就是多数。它是根据计算能力计算的。系统中哈希计算能力最强的节点已经更新了软件。

在这里插入图片描述

此时,系统正在运行。

这是当前的区块链,然后软件被替换,更新后。

在这里插入图片描述

一个新节点挖一个区块,这个区块比较大,老节点不会识别这个区块,老节点不会继续往下挖,他会按照原区块链挖矿,挖矿这种社区是快速地。这种小块新节点被识别出来了。

在这里插入图片描述

比特币有几个分叉币_比特币最新分叉情况_比特币分叉时间

一个新节点挖了一个大区块,假设大部分节点都更新了软件,所以大部分新节点都认出了这个区块,他们会沿着这个继续挖,只有少数老节点不认这个区块,会挖沿着下面的链条往下走,就会有这种情况。

在这里插入图片描述

新节点认为上下链都是合法的,但是上面是最长的合法链,所以新节点会继续按照上面的链去挖,而且因为有足够的算力,这条链会变得越来越长。老节点认为下面的链是合法的,上面的链再长也没用,因为对于老节点来说,都是非法链。将沿着下面的链条挖掘。当然,在上面的链中,可能会有一些小块,新节点也可能挖出一个小于1M的块。这个区块被新旧节点都认可了,但是没用,因为这条链上的老节点有问题。节点不会识别非法块。这个分叉是永久性的。只要老节点不更新软件,分叉就不会消失。这就是为什么它被称为硬分叉。在比特币社区,有些人比较保守,喜欢提高区块大小限制,有些人真的不同意,而且区块大小并不是越大越好,因为比特币系统的底层是P2P Overlay网络,并且泛滥主要用于通信,因此带宽消耗非常大,带宽是瓶颈。

硬分叉后,变成两条平行运行的链。并行运行的链有自己的加密货币。本节列出以下链的挖矿奖励。如果链被识别,它就变成了社区分裂。社区里有人认为,下面是正统的,不被篡改,根是红色的,上面是非法的。这是一个实际发生过的例子。社区里两个人吵架,对于比特币协议的修改,彼此之间产生了些许分歧。最后,他们分手了。你遵守你的规则,我遵守我的规则。这枚币在旧链上被识别,而新链上还有新币,所以分叉前的原币应该被上下链都识别,只是一枚硬币分成两枚硬币是的,当我后面讲以太坊,有一个经典的例子。以太坊被称为 ETH。我们现在看到的 ETH 实际上是一个分叉。它是 ETC(以太经典)。这是真正的原始协议。 “回滚”协议是有人攻击了一个名为 TheDAO 的 ETH 智能合约。 TheDAO 是众筹,然后投资于投资基金之类的东西。在他受到攻击后,包括原开发者在内的以太坊社区,决定使用硬分叉的方式重新入账,而被黑客窃取的钱,实际上是整个 TheDAO 的钱被重新分配到了另一个智能合约中,然后又回到了原来的投资人那里,但有人不同意这样做,认为这是胡说八道。所以 ETH 实际上是一条没有协议变化的旧链。分裂之后,就出现了。一个以太,在分裂之后,实际上变成了两个。 ETC也是交易所交易的加密货币,不计算在内。小众,他没有ETH那么受欢迎,但他也是一个比较主流的加密货币,而且还是有人在用,所以和我的变得不一样了。

如果一个账户A->B在分叉前转账,然后B拿到钱,分叉后两个都可以花掉,基本上是可以的,但是如果不采取措施,这两条链会有一个影响。比如ETH和ETC分叉后,因为原链是一样的,所以账户和私钥是一样的。如果拆分后不采取任何措施,两条链上,其他都一样,只是运行的协议不同。如果上链有转账交易,比如B->C,下链也会出现B→C,因为账户和私钥是一样的。原来上面的链是把B的以太币转给C,变成了下面的链,B的ETC币也转给了C,有人采取了比较激进的措施。比如上面的链C希望他们中的一个把钱转给他,然后下面的链重放,想要接收上下链的转账。如果没有人把钱转给 C 怎么办。

B去购物,向C支付了一笔钱,然后想取消交易。有的网站允许注销,C把钱转给B,在这个转账交易之后,在后面的链上回放,然后B在下面又赚了一笔。 B 这样做似乎有风险。

首先 B->C,然后 C->B,然后 C->B 在底部播放。当B->C时,C会在底部打B->C吗?好像是有风险的,因为B的账户可能在底部,他没钱,所以他可能先把钱花掉。 ,然后对其执行 B->C 。在这种情况下,C 可以转给 B。C 底下有钱,但 B 底下没有钱。这些都是以前发生过的案例。

所以后来又加了一个措施,用一个链ID把两条链分开,所以现在以太坊的拆分链没有问题,是两条独立的链。 .

软分叉

情况

比特币最新分叉情况_比特币分叉时间_比特币有几个分叉币

如果对比特币协议增加了一些限制,在增加之后,原来合法的交易或者区块会在新的协议中改变,可能会变成非法的,导致软分叉。

例子

假设有人发布了一个软件更新,把block size变小了,1M——>0.5M,不明白的人可能会认为调整block size只是为了改变一个参数。事实上,事实并非如此。在去中心化系统中,更改参数可能会导致分叉,根据更改参数的方式,它可能是硬分叉或软分叉。分叉,这里的例子只是为了解释软分叉的概念。实际中不会做,因为1M已经比较小了,不会真的改成0.5M。假设有新节点和旧节点,其中大部分是新节点。新节点被认为是0.5M,旧节点被认为是1M。这个时候会发生什么?

下图是当前区块链

在这里插入图片描述

现在,它被分叉了。分叉后,新节点开始挖矿。如果小块超过0.5M,旧节点会识别这个小块。然后旧节点可能会挖掘一个大块。新节点不认识这个大块,认为挖到了非法块

在这里插入图片描述

根据比特币协议,扩展应该是最长的合法链,新节点会沿着上面的链挖掘。这个时候会发生什么?

发生了什么:

下面的链被老节点挖出来了,老节点也认可上面的链,所以上面的链成为最长的合法链,之后会放弃当前的分叉,切换到上面的链去挖矿为什么叫软分叉,因为这个分叉是临时的,如果老节点不更新软件,他们挖的区块可能是白挖的放弃了

比特币分叉时间_比特币最新分叉情况_比特币有几个分叉币

在这里插入图片描述

而当他切换到上面的链时,问题又会出现,可能又挖了一大块,然后新的节点就认不出来了,新的节点就会变成沿着下图挖,然后,在上述链中挖出的大块将再次被挖掘。如果老节点不更新软件,他们可能会过着更加郁闷的生活,因为他们一直在挖,但挖是白挖,但系统不会有永久分叉,也就是软分叉。

在这里插入图片描述

在实践中可能会发生软分叉

为协议中目前未指定的一些字段添加一些新的含义,赋予它们一些新的规则。

例如,在 coinbase 域中,每个已发布的区块中都可以有一个铸币交易 coinbase tx。 coinbase tx 中有一个名为 coinbase 的域。没有人规定该域的用途。检查,我之前提到过它的一种用途。挖矿难度时,可以作为额外的nonce使用。挖矿时是不是需要调整块头中的nonce比特币最新分叉情况,但是块头中的nonce只有四个字节。啊调,最大是2的32次方,搜索空间不够大,所以coinbase的前8个字节可以用来做多余的nonce,两者加起来就是2的96次方,如目前的挖矿难度已经足够了。但是coinbase字段不止8个字节,还有很多。

后者有什么用,雇主提出用它作为UTXO的根哈希值。

UTXO:当前未花费的交易的输出。

目前这个集合只是每个全节点在内存中维护的一个集合,主要是为了快速搜索,能不能判断这个交易是不是双花,但是这个集合的内容并没有写在区块链中,这个是与上面提到的 Merkcle 证明相同(可以证明交易是否在给定的区块中)。例如,轻节点不维护整个区块链的内容,而只知道区块头。只要问全节点,交易是否在这个区块中,全节点可以返回一个Merkcle proof作为证明,轻节点可以验证。是否真的如此,可以验证全节点响应的正确性。

但如果是另一种情况,就需要证明一个账户里有多少钱。这目前无法在比特币系统中证明。如果是全节点,怎么知道账户里有多少?钱,A的账户里有多少钱,看A在这个UTXO中对应的输出,一共收到了多少币,账户里有多少钱,如果是全节点,可以计算,但是有很多区块链钱包,比如手机上的比特币钱包,他不可能在手机上维护一个完整的区块链。他其实是一个轻节点。要知道账户的余额,需要询问其他全节点,全节点如果返回结果,怎么知道结果是否正确?现在无法证明。如果您不维护 UTXO 集,则无法使用 Merkcle 证明来证明它。

比特币分叉时间_比特币最新分叉情况_比特币有几个分叉币

有人提议将UTXO集合的内容组织成一棵Merkcle树。这棵 Merkcle 树有一个根哈希值,这个根哈希值写入 coinbase 域,因为无法使用块头。又改了一遍,区块头改的太多了,正好coinbase域没用,所以写了一个UTXO根哈希值。当这个域中的内容最终被传递上去时,它会被传递给区块头。在根哈希值中,如果该字段的内容发生变化,根哈希值也会相应改变。

所以这个提议是把UTXO集合的内容组织成一棵Merkcle树,计算一个根哈希值写入coinbase域的某个位置,然后coinbase域本身的内容也会被哈希, 计算区块头的根哈希值,这种情况下可以用 Merkcle proof 来证明。假设有人发布了一个软件更新,规定coinbase字段要按照这个要求填写。大部分节点都升级了软甲,也有少数节点没有更新。这是一个软分叉,因为新节点释放区块比特币最新分叉情况,而旧节点认为它是合法的。是的,因为老节点不管你写什么,但是新节点可能无法识别老节点发布的区块,因为如果没有按要求写coinbase域他是不会识别的,这个是软的叉子。

在比特币的历史上,一个著名的软分叉例子是 P2SH

P2SH:支付脚本哈希

这个功能是在比特币原始版本中引入的,版本中没有,后来通过软分叉添加的。

含义:支付时不是Public Key Hash,而是兑换脚本(redeem Script)的哈希。

在花钱的时候,本次交易的输入脚本要与上一个币源的输出脚本一起拼接执行。验证在执行过程中分为两个步骤。第一步是验证输入脚本给出的赎回脚本与前面输出脚本给出的 Scirpt 的哈希值匹配,证明输入脚本提供的赎回脚本是正确的。第二步,验证并执行redeem Script,验证输入脚本中给出的签名是否合法。对于老节点,他不知道P2SH的特点,只会做第一步验证,老节点还没有更新软件。新节点会做第二阶段验证,所以,老节点认为交易合法,新节点可能认为不合法,如果第二阶段验证失败,新节点认为交易合法,则节点绝对被认为是合法的。

总结:

软分叉特性:只要系统中超过一半的节点更新软件,系统就不会出现永久分叉,可能会出现临时分叉。

硬分叉特性:所有节点都必须更新软件,这样系统才不会有永久分叉。如果少数节点不愿意更新,那么系统中就会出现两条链。