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