主页 > imtoken钱包最新版下载不能 > 【北大肖震-区块链技术与应用笔记】第八课-BTC分叉

【北大肖震-区块链技术与应用笔记】第八课-BTC分叉

文章目录

【北大肖震-区块链技术与应用笔记】第八课-BTC分叉状态分叉

如果两个节点几乎同时挖出一个区块,则这两个区块挂在当前区块上,不同节点收到的区块是不同的,各自会跟随先收到的区块。 这时候会出现一个临时的分叉,称为状态分叉,即由于对区块链当前状态的不同看法而导致的分叉。

分叉攻击也是状态分叉,但这种分歧是人为造成的。 这种情况也称为故意分叉。

协议叉

修改比特币协议需要软件升级。 在去中心化系统中,没有办法要求所有节点都升级软件

假设大部分节点都升级了软件,少数节点没有升级(可能还没来得及升级,也可能不同意协议的修改),这种分叉称为协议分叉,即比特币协议存在分歧,使用不同版本协议产生的分叉。

在协议分叉中,根据协议修改的内容,可以分为硬分叉和软分叉。

硬分叉

如果比特币协议增加了一些新特性,扩展了一些新功能,此时那些没有升级协议的节点将无法识别这些新特性,并认为它们是非法的。

块大小限制

硬分叉的一个例子是比特币的区块大小限制。

比特币限制每个区块不超过 1M,因此最多可以容纳 4000 笔交易。 平均每 10 分钟产生一个区块,平均每秒只能写入 7 笔交易。

有人认为区块太小,限制了链上交易的速度。

假设更新软件将块大小限制从 1M 增加到 4M,假设大多数节点更新软件以支持该协议。 节点的“多数”和“少数”不是按照账户数量计算的,而是按照算力计算的。 上面这句话假设系统中算力最多的节点已经更新了软件。

系统运行时。 假设新节点挖出一个区块,这个区块比较大,但是老节点不认识这个区块,不会沿着这个区块继续挖下去,而是继续跟在前一个区块的后面。 向下挖掘到下一个块。

image-20220613213831987

旧节点不识别大块,但新旧节点都识别小块。

假设大部分节点都是新节点,即软件已经更新支持新协议,因为“最多”意味着他们的算力更强,新节点新区块的分叉很快比旧节点的分叉长

image-20220613213953100

对于新节点来说,上下链都是合法链,但是因为只扩展最长的合法链,所以还是会沿着上链向下挖。因为只限于小于4M的大小,新节点也可能挖出一些小于1M的块

image-20220613214026729

这样的区块新老节点都认可,但是上链有老节点认为非法的区块,所以老节点永远不会扩充这条链,继续沿着下链往下挖

image-20220613214103361

这样的分叉是永久性的,只要这些老节点不更新软件,这样的分叉就不会消失。 在比特币网络中,会有一些非常保守的人,一些节点难免不同意这样的协议更新,导致硬分叉。

硬分叉后,出现了两条并行运行的链,两条链上的BTC也不相干,各自挖自己的矿。 某条链上的区块奖励对承认这条链为最长合法链的节点有效,但对承认另一条链的节点无效,分裂前产生的BTC介于两条承认的链上。 从这个意义上说,硬分叉可以被视为一种新的加密货币。

设置硬分叉后的链ID如果比特币分叉最大的风险是什么,将两条链标识为两条独立的链

软分叉

如果在比特币协议中加入一些限制,使得一些合法的交易或区块在限制后在新的协议中变得不合法,那么形成的分叉就是软分叉。

假设软件更新:使块大小更小,从 1M 到 0.5M。 假设大部分节点为新节点,即协议已更新如果比特币分叉最大的风险是什么,区块上限为0.5M; 少量节点为老节点,出块上限仍被认为是1M。

这时老节点会认为新节点挖出的区块是合法的(因为在1M以内); 但是老节点挖出的区块可能被新节点认为是不合法的(因为很可能不在0.5M以内):

image-20220613215146577

因为新节点占了大部分算力,所以很有可能先挖到某个区块,就会出现上面的情况。 这时候老节点观察到上链是最长的合法链,就会放弃自己的分叉,然后继续挖上链。

在某个时候,旧节点在新节点之前挖出一个块并将其放在链上:

image-20220613215219191

这个块大于0.5M,新节点不会承认,会继续扩充之前的合法块。

image-20220613215334270

因此,在这种情况下,软分叉还会不断发生。 只要旧节点不更新协议,挖出的区块就无法上传到链上。 与硬分叉相比,软分叉是非永久性的分叉,只是暂时存在一段时间。

实际情况为一些当前协议没有规定的字段增加了新的含义

在这种情况下,一些不受当前协议限制的域将被赋予新规则。 一个示例是用于铸造交易的 CoinBase 域,既未指定也未检查。 在学习挖矿难度的时候,提到这个字段可以作为一个额外的nonce,比如把前8个字节拿出来和nonce一起调整,增加挖矿的搜索空间。

CoinBase即使把前8个字节拿出来,也还有很长的调整空间。 有人提出将其作为UTXO(未花费的交易输出)的根哈希值,因为当前的UTXO集合仅由每个全节点维护,目的是快速查找和判断交易的合法性,这个集合的内容没有写入区块链。

Merkle证明可以证明某笔交易存在于某个区块中,那么如何证明某个账户A中有多少钱呢? 全节点可以在本地UTXO集合中进行计算,即在UTXO中找到所有转给A的交易的输出,并将它们相加。

但是轻节点呢? 比如手机上的比特币钱包。 轻节点要请求全节点,全节点返回结果给它。 如何证明返回给轻节点的全节点是正确的? 轻节点本身不维护 UTXO 集合,因此无法证明。

因此,有人提出将UTXO中的交易组织成一棵Merkle Tree,并将其根哈希值写入铸币交易的CoinBase域中,而铸币交易中的这个内容也会影响交易Merkle Tree的根哈希. 值,保存在轻节点中。 所以通过这种方式,你可以像Merkle证明一样证明账户里有多少钱,需要提供UTXO的Merkle Tree对应位置的hash。

添加新功能

P2SH(Pay to Script Hash)形式的交易脚本在最初的比特币系统中并不存在,但后来通过软分叉加入。

总结

硬分叉特点:只要系统中超过一半的节点(算力)更新软件,就不会出现永久分叉。这种分叉是软分叉

软分叉的特点:系统中的所有(算力)节点都必须更新自己的软件,这样才不会出现永久分叉。

参考

1.【区块链学习笔记】10:比特币系统中的分叉