比特币分叉

比特币分叉是指当比特币区块链网络上的节点在共识算法上出现分歧,导致整个网络分裂成两个或更多个独立的区块链网络时发生的现象。 比特币分叉通常分为硬分叉(Hard Fork)和软分叉(Soft Fork)两种类型。

欧易
欧易(OKX)

全球三大交易所之一,注册领50U数币盲盒,币圈常用的交易平台!

币安
币安(Binance)

币安交易所是世界领先的数字货币交易平台,注册领100U。



比特币分叉的原因

原来的一条链分成了两条链,就是分叉。

分叉有多种原因造成:

●state fork:有两个矿工差不多同时挖到了区块进行发布,这时候就会产生一个临时性的分叉,叫做state fork。这种分叉是对比特币区块链当前的状态产生了分歧。

forking attack(分叉攻击)也属于state fork,只是分叉攻击中的意见分歧是由恶意节点故意人为造成的,所以也叫deliberate fork。

●protocol fork:要修改比特币协议时需要软件升级,但是在一个去中心化的系统里升级软件无法保证所有软件同时都升级了软件。假设大部分节点升级了软件,少数节点因为一些原因没有升级,这时候也会产生分叉,这种分叉称为protocol fork。这种分叉是因为使用不同版本的比特币协议造成的分叉。

根据对协议修改的内容的不同,又可以进一步划分硬分叉(hard fork)和软分叉(soft fork)。

比特币硬分叉

比特币硬分叉原因

如果对比特币协议增加一些新的特性、扩展一些新的功能,那么那些还未升级的节点是不认可这些新特性的,会认为这些特性是非法的。

假设有些人认为比特币区块大小限制为1Mb太小了,发布了一个软件更新,把block store limit从1 Mb增加到4Mb,假设大多数节点更新了这个特性,少数节点没有更新(这里的多数节点是指的算力的大多数,不是按账户数)。

更新了的节点发布一个大于1Mb的区块后,未更新的节点会认为该区块是非法的,而造成分叉,而且这个分叉是永久性的,只要未更新的节点一直不更新,那么这个分叉就会一直存在。

比特币分叉

比特币系统中,有些用户比较保守,对于增大区块大小这类的升级,有些用户确实会一直不同意升级。

比特币硬分叉影响

硬分叉是永久性的,只要未更新的节点一直不更新,那么这个分叉就会一直存在。

出现硬分叉之后,就等于比特币社区分裂了,分成了两拨人。一拨人认可区块2/3/4这条链,另一个拨人认可区块5/6这条链。一条链变成了两条链,一个币种变成了两个币种,例如以太坊分裂的两条链分别成了ETC币和ETH币。

出现硬分叉之后,分出去的两条链上的交易可能会互相影响,例如出现以下情况(以太坊真实发生过的案例):

以下为了描述简单,将分叉前的币称为origin币,将第一条链上使用的币称为x币,将第二条链上的币称为y币

情况1:分叉前的区块上拥有的n个origin币,分叉后变成了同时拥有n个x币和n个y币。

比特币分叉

情况2:分叉前A给B转了n个origin币。分叉后B给C在第一条链上转了n个x币。C将这笔交易在第二条链上进行了回放。最后C同时拥有了n个x币和n个y币。

比特币分叉

情况3:分叉前A给B转了n个origin币。分叉后B购买C的产品,给C在第一条链上转了n个x币。同时B在第二条链上给D转了n个y币。此时C如果在第二条链上回放B给C的交易则会失败。然后B进行退货,要求C转回给B花费的n个x币。B再将C给B转账的交易在第二条链上进行回放,则B又可以多得到n个y币。

比特币分叉

后来,以太坊增加了一个措施,将两条链各加一个ChainID区分是哪个链的交易,防止了交易被另一条链重放。最终成为了两条独立运行的链。

比特币软分叉

比特币软分叉原因

软分叉是将原来的比特币协议增加了一些限制。增加限制后,比特币链上原来合法的区块可能变得不合法了,从而引起的分叉称为软分叉。

假设有些人认为比特币区块大小限制为1Mb太大了,发布了一个软件更新,把block store limit从1 Mb增加到0.5 Mb,假设大多数节点更新了这个特性,少数节点没有更新(这里的多数节点是指的算力的大多数,不是按账户数)。

该例子仅为解释软分叉的概念,实际中不会将区块大小改小,因为1Mb就已经很小了。

未更新了的节点发布一个大于0.5 Mb的区块后,已经更新的节点会认为该区块是非法的,而造成分叉。但是已经更新的节点发布的小于0.5 Mb的区块,未更新的节点也是认可的。当小于0.5 Mb的分叉链称为最长合法链时,未更新的节点也会接着这条最长合法链向后扩展。

比特币分叉

比特币软分叉影响

所以软分叉都是临时性的,慢慢的也会改到最长合法链。

如果未更新的节点一直不更新,那么只要其发布了一个大于0.5 Mb的区块,就会被分叉,最终导致挖出来的这个大于0.5 Mb的区块白白浪费掉。所以未更新的节点也就会进行版本更新。

实际中出现软分叉的常见情况:给某些协议中没有规定的域增加一些新的含义、增加一些新的规则。

例如CoinBase Transaction(铸币交易)的CoinBase域,这个域可以写什么没有规定,一般会将CoinBase域的前8 byte作为extra nonce,用于配合nonce计算哈希。但是CoinBase域不止8 byte,后面还有很长,有人就提出来将后面的字节用于存储UTXO集合的根哈希值。目前这个集合只是每个全节点自己在内存中维护这个集合,主要为了快速查找判断这个交易是否是double spending,但是这个集合内容并没有被写入区块链中。

一个全节点会在自己内存中维护UTXO集合,但是轻节点并没有维护。所以全节点如果想知道某个账户的余额,只需要查自己的UTXO集合中该账户的可用输出即可,轻节点如果想要知道某个账户余额只能向全节点请求。但是,轻节点因为没有UTXO,它无法证明全节点返回的结果是否是对的。

所以有人提出,将这个UTXO集合内容也组织成一个Merkle Tree,将这个Merkle Tree的根哈希值写入CoinBase域后面的可用字节里。这样轻节点就可以通过Merkle proof来验证接收到的UTXO是否正确。

比特币历史上比较著名的一个软分叉是P2SH。该功能在以前的比特币协议中不存在,后来通过软分叉形式加了进来。

P2SH分为两阶段验证:第一部分验证输入脚本中的redeemScript和输出脚本中的redeemScriptHash是可以对应上的,第二部分再执行该redeemScript验证给出的签名是合法的。

对于旧节点不知道redeemScript的特性,但是也可以正常进行第一部分的验证。因为旧节点不能进行第二部分的验证,所以旧节点认为合法的交易可能新节点认为是非法的,新节点认为合法的交易旧节点也是认可的。

© 版权声明

相关文章

暂无评论

您必须登录才能参与评论!
立即登录
暂无评论...