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