09 BTC-分叉

发布时间 2023-05-02 12:35:42作者: YangYi215

《区块链技术与应用》课程链接:https://www.bilibili.com/video/BV1Vt411X7JF/?spm_id_from=333.337.search-card.all.click


09 BTC-分叉

fork

挖矿会产生临时性的分叉,就做state fork。

forking attack

除了deliberate fork,还有一种情况,就是软件升级,在去中心化的系统中,没有办法保证所有节点都升级软件。有可能没有来得及升级,有可能不同意对协议的修改。

不同协议的分叉,就做protocol fork。根据协议内容的不同,可以分成硬分叉(hard fork)和软分叉(soft fork)。


前提:大多数算力掌握在软件升级之后的节点中

hard fork(旧节点不认新节点,新节点认旧的)

没有升级软件的旧节点,不认可这些新特性,认为新特性是非法的。

例子:block size limit,比特币 1M字节。

有人认为区块大小限制了交易的thoughtput,同时增加了交易的延迟(有些交易不得不等到下个区块,一等就是10分钟)。

比如软件更新:1M —> 4M。

旧区块不认可新区块,新区块认可旧区快。

这种分叉就是永久分叉的。(社区分裂)

区块的大小也不是越大越好,底层网络带宽是瓶颈。

以太坊:ETH 和 ETC

分叉之后,如果不采取措施的话,两条链之间会相互影响。

比如:ETH 和 ETC,用户的密钥,账户都是一样的,交易类型都是一样的(所以该交易在两条链上都合法),有人可能会在另一条链上进行交易的回放,收款人会在两个链上收到两笔钱。

所以,之后的解决措施,两条链各加一个chainID。


soft fork(新节点不认旧节点[旧节点奖励作废],旧节点认新节点)

一个去中心化的参数是很难改的,参数的修改,有可能是硬分叉,有可能是软分叉。


软分叉案例:

CoinBase中除了之前讲过的 8 Bytes 的extra nonce,还有很多的字节,有人提出将其作为UTXO集合的根hash值。

目前,UTXO是在全节点内存中维护的一个集合,主要是为了快速查找,判断交易是不是double spending,但是,集合的内容没有写到区块链中。

如果知道一个账户A有多少钱?全节点可以通过查找UTXO中的A相关的交易输出,来进行计算。如果是轻节点,需要询问全节点,全节点返回一个结果,怎么知道结果是不是对的?现在是没有办法证出来的。如果自己不维护一个UTXO集合,没有办法使用类似的Merkle Proof证明出来。

将UTXO集合中的内容,组织成一个Merkle tree,算出一个根hash值来,写到CoinBase域的某个位置中,这样的话,就可以通过Merkle Proof进行认证。

这个是软分叉。(旧节点认可新节点,新节点不认可旧节点[因为旧节点CoinBase域 没有按照要求写])


比特币历史上,一个比较著名的软分叉的例子,叫做P2SH(Pay to Script Hash)。该功能最后通过软分叉方式添加。

(因为P2SH有两阶段验证,旧节点只会做第一阶段的验证,新节点才会做第二阶段的验证,所以,旧节点认为合法的交易,新节点可能认为是非法的;而新节点认为合法的交易,旧节点肯定认为是合法的,因为旧节点只做第一阶段的验证)


soft fork:只要系统中拥有半数以上的节点更新了软件,那么系统就不会出现永久性的分叉,虽然可能会出现一些临时性的分叉。

hard fork:必须是所有的节点都要更新软件,系统才不会出现永久性的分叉。否则,系统会分成两条链。