[北大肖臻-区块链技术与应用笔记]第八节课——BTC 分叉
文章目錄
- [北大肖臻-區(qū)塊鏈技術(shù)與應(yīng)用筆記](méi)第八節(jié)課——BTC 分叉
- state fork
- protocol fork
- 硬分叉(hard fork)
- block size limit
- 軟分叉(soft fork)
- 實(shí)際中情形
- 給某些目前協(xié)議中沒(méi)有規(guī)定的域增加新的含義
- 增加新的功能
- 總結(jié)
- 參考資料
[北大肖臻-區(qū)塊鏈技術(shù)與應(yīng)用筆記](méi)第八節(jié)課——BTC 分叉
state fork
如果兩個(gè)節(jié)點(diǎn)差不多同時(shí)挖到一個(gè)區(qū)塊,這兩個(gè)區(qū)塊都是掛在當(dāng)前的區(qū)塊上的,不同節(jié)點(diǎn)先收到的區(qū)塊不同,就會(huì)各自沿著先收到的區(qū)塊往下擴(kuò)展,這種時(shí)候就會(huì)出現(xiàn)臨時(shí)性的分叉,稱為state fork,即由于對(duì)區(qū)塊鏈當(dāng)前的狀態(tài)有意見(jiàn)分歧而產(chǎn)生的分叉。
分叉攻擊(forking attack)也屬于state fork,只不過(guò)這種意見(jiàn)分歧是人為造成的,這種情況也稱為deliberate fork。
protocol fork
要修改比特幣協(xié)議需要軟件升級(jí),在去中心化的系統(tǒng)中,沒(méi)辦法要求所有的結(jié)點(diǎn)都升級(jí)軟件
假設(shè)大部分節(jié)點(diǎn)升級(jí)了軟件,少部分節(jié)點(diǎn)沒(méi)有升級(jí)(可能是沒(méi)來(lái)得及升級(jí),也可能是不同意協(xié)議的修改),這種分叉稱為protocol fork,即對(duì)比特幣協(xié)議產(chǎn)生了分歧,使用不同版本的協(xié)議而產(chǎn)生的分叉。
在protocol fork中,根據(jù)對(duì)協(xié)議修改的內(nèi)容的不同,又可以分為硬分叉和軟分叉。
硬分叉(hard fork)
如果對(duì)比特幣協(xié)議增加一些新的特性,擴(kuò)展一些新的功能,這時(shí)候沒(méi)有升級(jí)協(xié)議的那些結(jié)點(diǎn)是不認(rèn)可這些新特性的,認(rèn)為它們是非法的。
block size limit
硬分叉的一個(gè)例子就是比特幣中的區(qū)塊大小限制。
比特幣限制每個(gè)區(qū)塊不超過(guò)1M,這樣算下來(lái)大約最多能容納4000個(gè)交易。而平均10分鐘產(chǎn)生一個(gè)區(qū)塊,算下來(lái)大約平均每秒只能寫(xiě)入7個(gè)交易。
有的人就認(rèn)為區(qū)塊太小了,限制了交易上鏈的速度。
假設(shè)軟件更新了,將區(qū)塊大小的限制從1M提高到4M,假設(shè)大多節(jié)點(diǎn)更新了軟件以支持這個(gè)協(xié)議。節(jié)點(diǎn)的“多數(shù)”和“少數(shù)”不是按照賬戶數(shù)目來(lái)算的,而是根據(jù)算力來(lái)算的,上面那句話是假設(shè)系統(tǒng)中擁有大多哈希算力的節(jié)點(diǎn)都更新了軟件。
當(dāng)系統(tǒng)運(yùn)行起來(lái)。假設(shè)新節(jié)點(diǎn)挖出一個(gè)區(qū)塊,這個(gè)區(qū)塊是比較大的,但舊節(jié)點(diǎn)是不認(rèn)可這個(gè)區(qū)塊的,不會(huì)沿著這個(gè)區(qū)塊繼續(xù)往下挖,而是繼續(xù)沿著之前的區(qū)塊往下挖下一個(gè)區(qū)塊。
舊的節(jié)點(diǎn)不認(rèn)可大的區(qū)塊,小的區(qū)塊新舊節(jié)點(diǎn)都認(rèn)可。
假定大多節(jié)點(diǎn)都是新節(jié)點(diǎn),即更新了軟件支持新的協(xié)議,因?yàn)椤按蠖鄶?shù)”即是其算力更強(qiáng),新節(jié)點(diǎn)的新區(qū)塊的分叉很快就比舊節(jié)點(diǎn)的分叉長(zhǎng)了
對(duì)新節(jié)點(diǎn)而言,上下兩條鏈都是合法鏈,但因?yàn)橹粫?huì)去擴(kuò)展最長(zhǎng)合法鏈,所以還是會(huì)沿著上面的鏈往下挖。因?yàn)橹皇羌s束了大小不到4M就可以,新節(jié)點(diǎn)也可能挖出一些大小不到1M的區(qū)塊
這樣的區(qū)塊是新舊節(jié)點(diǎn)都承認(rèn)的,但上面這條鏈上有舊節(jié)點(diǎn)認(rèn)為不合法的區(qū)塊,所以舊節(jié)點(diǎn)始終不會(huì)去擴(kuò)展這條鏈,還是繼續(xù)沿著下面這條鏈往下挖
這樣的分叉是永久性的,只要這些舊節(jié)點(diǎn)不更新軟件,這樣的分叉就不會(huì)消失。比特幣網(wǎng)絡(luò)中,會(huì)有部分很保守的人,像這樣的協(xié)議更新勢(shì)必會(huì)有一些節(jié)點(diǎn)不同意,產(chǎn)生硬分叉。
出現(xiàn)硬分叉之后,出現(xiàn)了兩條平行運(yùn)行的鏈,兩條鏈上的BTC也是不相干的,各挖各的礦。在某條鏈上的出塊獎(jiǎng)勵(lì),對(duì)于認(rèn)可這條鏈為最長(zhǎng)合法鏈的節(jié)點(diǎn)而言是有效的,對(duì)認(rèn)可另一條鏈的則是無(wú)效的,而分裂之前產(chǎn)生的BTC則是在兩條鏈上都認(rèn)可的。從這個(gè)意義上來(lái)看,硬分叉可以認(rèn)為是產(chǎn)生了新的一種加密貨幣。
在硬分叉后設(shè)置chain ID,來(lái)標(biāo)識(shí)這兩條鏈為兩條獨(dú)立的鏈
軟分叉(soft fork)
如果對(duì)比特幣協(xié)議加了一些限制,使得原本某些合法的交易或區(qū)塊,在限制后的新協(xié)議中變得不合法,那么形成的分叉是軟分叉。
假設(shè)對(duì)軟件進(jìn)行更新:使區(qū)塊大小變小,從1M變?yōu)?.5M。假設(shè)大多節(jié)點(diǎn)是新節(jié)點(diǎn),即已經(jīng)更新了協(xié)議,區(qū)塊限制為0.5M;少部分節(jié)點(diǎn)是舊節(jié)點(diǎn),仍然認(rèn)定區(qū)塊限制為1M。
這時(shí),新節(jié)點(diǎn)挖出的區(qū)塊,舊節(jié)點(diǎn)會(huì)認(rèn)為是合法的(因?yàn)樵?M以內(nèi));但是舊節(jié)點(diǎn)挖出的區(qū)塊,新節(jié)點(diǎn)很可能不認(rèn)為是合法的(因?yàn)楹芸赡懿辉?.5M內(nèi)):
因?yàn)樾鹿?jié)點(diǎn)占了大部分算力,所以很可能先挖到某個(gè)區(qū)塊,出現(xiàn)上圖的情況。這時(shí)舊節(jié)點(diǎn)觀察到上面那條是最長(zhǎng)合法鏈,就會(huì)放棄自己的分叉,接著上面的鏈繼續(xù)挖。
某個(gè)時(shí)刻,舊節(jié)點(diǎn)先于新節(jié)點(diǎn)挖出一個(gè)區(qū)塊,將其上鏈:
這個(gè)區(qū)塊大于0.5M,新節(jié)點(diǎn)不認(rèn),會(huì)繼續(xù)擴(kuò)展上一個(gè)合法的區(qū)塊。
所以在這種情況下,會(huì)持續(xù)出現(xiàn)軟分叉,只要舊節(jié)點(diǎn)不更新協(xié)議,挖出的區(qū)塊就一直無(wú)法上鏈。相比硬分叉,軟分叉即是非永久存在的分叉,只會(huì)臨時(shí)存在一段時(shí)間。
實(shí)際中情形
給某些目前協(xié)議中沒(méi)有規(guī)定的域增加新的含義
這種情況下即是當(dāng)前協(xié)議中未限制的一些域,被賦予了新的規(guī)則。一個(gè)例子就是鑄幣交易的CoinBase域,沒(méi)人規(guī)定也沒(méi)人檢查。前面學(xué)習(xí)挖礦難度時(shí),提到這個(gè)域可以作為extra nonce來(lái)使用,比如拿出前8個(gè)字節(jié)來(lái)和nonce一起調(diào)整,以增大挖礦的搜索空間。
CoinBase即便拿出了前8個(gè)字節(jié),后面還是有很長(zhǎng)的可調(diào)整空間。有人就提出將其作為UTXO(未花費(fèi)的交易輸出)的根哈希值,因?yàn)槟壳斑@個(gè)UTXO集合只是每個(gè)全節(jié)點(diǎn)自己在維護(hù),目的就是快速查找,判斷交易合法性,這個(gè)集合的內(nèi)容沒(méi)有寫(xiě)到區(qū)塊鏈里。
Merkle proof可以證明某個(gè)交易存在于某個(gè)區(qū)塊中,那么如何證明某個(gè)賬戶A中有多少錢(qián)?全節(jié)點(diǎn)可以在本地的UTXO集合里算一下,即找到UTXO中所有轉(zhuǎn)賬給A的交易的輸出,加在一起。
但如果是輕節(jié)點(diǎn)呢?例如手機(jī)上的比特幣錢(qián)包。輕節(jié)點(diǎn)要去請(qǐng)求全節(jié)點(diǎn),全節(jié)點(diǎn)返回結(jié)果給它,如何證明全節(jié)點(diǎn)返回給輕節(jié)點(diǎn)的是正確的呢?輕節(jié)點(diǎn)自己沒(méi)有維護(hù)一個(gè)UTXO集合,所以是證明不出來(lái)的。
因此有人提出將UTXO中的交易也組織成一個(gè)Merkle Tree,將其根哈希值寫(xiě)在鑄幣交易的CoinBase域里面,而鑄幣交易中的此內(nèi)容也會(huì)隨著影響交易的Merkle Tree的根哈希值,這在輕節(jié)點(diǎn)里是保存了的。所以在這種方式下就可以像Merkle proof的方式一樣證明賬戶里有多少錢(qián),需要提供UTXO的Merkle Tree對(duì)應(yīng)位置的哈希。
增加新的功能
P2SH(Pay to Script Hash)形式的交易腳本,最開(kāi)始的比特幣系統(tǒng)中是沒(méi)有的,是后來(lái)通過(guò)軟分叉的方式加進(jìn)去的。
總結(jié)
硬分叉特點(diǎn):只要系統(tǒng)中半數(shù)以上(算力)的節(jié)點(diǎn)更新了軟件,就不會(huì)出現(xiàn)永久性的分叉。這類分叉為軟分叉
軟分叉特點(diǎn):必須系統(tǒng)中所有(算力)的節(jié)點(diǎn)都更新了軟件,才不會(huì)出現(xiàn)永久性的分叉。
參考資料
1、【區(qū)塊鏈學(xué)習(xí)筆記】10:比特幣系統(tǒng)中的分叉
總結(jié)
以上是生活随笔為你收集整理的[北大肖臻-区块链技术与应用笔记]第八节课——BTC 分叉的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 富士胶片电视电影镜头及记录媒体解决方案亮
- 下一篇: 【矩阵论】4. 矩阵运算——广义逆——加