報告正文
1.背景介紹
2018年10月6日,在東京舉辦的第五次比特幣擴容大會(Scaling bitcoin)上,比特幣開發者Mark Friedenbach提出了一種比特幣鏈上擴容軟分叉方案“Forward Blocks” [1],在社區引起了廣泛討論。Mark Friedenbach不但是一名比特幣開發者,而且是區塊鏈技術公司Blockstream公司聯合創始人和研究工程師。Blockstream公司在業界較為知名,是比特幣的閃電網絡(lightning Network)方案的奠定和重要開發機構之一。同時,Blockstream也是比特幣隔離見證(Segwit)升級上的推動者之一。因此,Forward Blocks的提出廣受關注。
在Forward Blocks論文中,Mark Friedenbach聲稱通過這種方案能夠實現以下特性:
-提供一種鏈上擴容方式,使比特幣的交易處理量提高3584倍,并以軟分叉實現;
-提供一種PoW的升級(可選),并以軟分叉實現;
-限制驗證成本的增加;
-通過類似分片(sharding)的方式降低中心化風險;
-提供一種未來的賬本架構的擴展,包括:降低費率、保密轉賬、環簽名和側鏈轉換等。
2.Forward Blocks的軟分叉方案
在了解Forward Blocks的軟分叉之前,我們必須了解什么是硬分叉,什么是軟分叉。在比特幣區塊鏈中,無論是挖礦和轉賬都要通過客戶端參與。最初中本聰開發的比特幣客戶端是bitcoin-qt(現在名為bitcoin core)。本質上,分叉就是客戶端的升級。軟硬分叉的定義涉及到新老節點對新老節點發出的區塊的認可度問題,同時和新老節點的算力之比也有關,因此細分之后較為復雜。為了文章篇幅簡潔和便于理解,本文將硬分叉和軟分叉的模型做了一定程度的簡化。
參考bitcoin.org上的定義,硬分叉是指老節點無法接受新節點發出的區塊。軟分叉則是指老節點仍然能夠接受新節點發出的區塊。其中,升級了客戶端的節點就是新節點,反之則是老節點。比如說,比特幣現金(BCH)是一種硬分叉,因為它修改了比特幣的交易數據結構。導致在兩個區塊鏈之間,BCH節點無法接受BTC節點發出的區塊,BTC節點也無法接受BCH節點發出的區塊,但雙方都接受分叉之前的區塊。而隔離見證(Segwit)則是一種軟分叉,雖然隔離見證也修改了交易數據結構(解鎖腳本字段),但是通過一種方式讓老節點仍然能接受新節點發出的區塊。因此在比特幣區塊鏈中,無論你的客戶端(節點)是否升級了隔離見證的版本,都能接受雙方節點發出的區塊。
但是需要注意得是,并非所有硬分叉都會誕生兩條區塊鏈。如果全網都能達成一致,共同升級客戶端,區塊鏈仍然是一條,只是無法用老客戶端參與了。比如說以太坊曾多次以硬分叉的方式進行“升級版本”,如通過硬分叉升級到“家園”版本,“大都會”版本等,都沒有產生兩條區塊鏈。BCH社區在特定的主導下,也經過了多次“升級”,其實也都是通過硬分叉完成的。
然而,在一個分布式的網絡中,想要達成全網共識一致是一件非常困難的事。BCH、ETC等分叉的誕生都是一次次社區共識的分裂。由于以太坊和BCH社區都有明確的領導,以太坊還有明確的升級規劃,因此通過硬分叉“升級“較為容易。而相比于以太坊社區和BCH社區,比特幣社區的升級則顯得非常謹慎。迄今為止,比特幣的絕大部分升級都是通過軟分叉完成的。在中本聰還活躍的2010年時,曾有一次修復刷幣漏洞是通過硬分叉完成的。
正因如此,Forward Blocks的擴容方案也竭力強調希望通過軟分叉的方式來實現。同時,由于軟分叉非常強調先前兼容,即老節點(客戶端)仍然能夠接受新節點發出的區塊。為了能讓老節點仍然能接受新區塊,新節點常常會采用一些“欺騙”的方式騙過老客戶端接受新區塊,Forward Blocks也采用了這種思路的設計,我們在后文會討論。
在Forward Blocks的設計中,一部分節點升級Forward Blocks客戶端成為新節點之后,會形成松耦合形式的鏈,一條是名為兼容鏈(即比特幣原鏈),一條是名為forward block鏈。PoW可能稍作修改,但本質上還是基于雙sha-256的。
新節點礦工在forward block鏈上挖出的區塊需要同時向兩條鏈提交,這樣老節點也能看到所有的交易。為了不被老節點拒絕,新節點的coinbase獎勵也是從兼容鏈的UTXO中發出的。并且設計了難度過渡方案,讓未升級的客戶端在非強制的情況下,主動升級成新節點。
3.Forward Blocks的擴容方式
那Forward Blocks方案的擴容方式又是如何完成的呢?在了解它的擴容方案之前,我們還需要了解三個概念,一是比特幣的難度調整機制,二是比特幣時間戳確定機制,三是比特幣的時間扭曲攻擊。
1.比特幣的難度調整機制
比特幣在設計時,預計到了全網算力的不斷變化,為了能讓比特幣在全網算力不斷變化時,仍然能夠確保每個區塊的產生時間平均約10分鐘,因此特別設計了難度調整機制。我們都知道,比特幣新區塊的尋找實際是礦工不斷在做哈希運算,通過哈希運算,第一個計算出來的礦工可以發出新區塊。假如算力不斷上漲,計算能力越來越強,那么理論上區塊就會被更快地計算出來。為了防止這種情況發生,比特幣協議中規定每2016個區塊產生之后,比特幣就需要進行難度調整,即:如果上個2016區塊周期(大約2016*10/60/24=14天)中,算力上漲,反映為礦工能用更短時間找到新區塊,則增加難度;如果算力下降,則降低難度,來確保下一個2016區塊的周期內,比特幣的出塊速度仍然保持約10分鐘。
2.比特幣時間戳確定機制
我們生活在中心化世界,因此找一個權威機構確定時間并非什么難事。然而,比特幣是一個完全分布式的網絡,沒有辦法找一個權威機構來敲定時間。因此比特幣的時間戳的時間實際上是一個世界協調時的分布式升級版。在比特幣網絡中,每個礦工節點都有自己的本機時間(需要折算為Unix時間),同時每個節點鏈接多個其他節點,時間戳的選取來自于該節點所有鏈接節點(大于某值為合法)的中位數,并且該時間需要與本機時間相差不超過70分鐘,且不小于前11個區塊的中位數時間,同時別的節點會拒絕時間與自己相差2小時的區塊。
3.比特幣的時間扭曲攻擊
比特幣的時間扭曲攻擊(time warp attack)則是一種通過“玩弄“比特幣時間戳和難度調整機制的一種攻擊方式。比特幣的難度調整是以每個周期的第1個和第2016個區塊的時間之差調整的。如果2016個區塊的時間長于14天,則系統降低難度。因為時間戳沒有一個權威的機構來確認,假如一部分礦工節點聯手,將新區塊的時間戳不斷往前調整,比特幣系統會誤判斷該2016區塊周期太長,而降低難度。然而,雖然難度降低,礦工的算力并沒有減少,因此,礦工能以短于10分鐘的間隔時間大量出塊。當然,進行時間扭曲(time warp)對礦工節點的算力有要求,而且攻擊方式還包括讓目標節點脫機等。更詳細的討論可以參考附錄文章[2] [3]。
因為比特幣的算力基數很大,目前尚未觀察過任何對比特幣的時間扭曲攻擊。但是,在2018年5月,有攻擊者曾成功使用時間扭曲的方式攻擊了加密貨幣Verge[4]。此外,有報道表示有節點在比特幣的測試網絡上亦成功嘗試過時間扭曲攻擊。
在了解了上述概念后,讓我們回到Forward Blocks方案。我們上文提到,軟分叉之后,會形成松耦合形式的鏈,一條是兼容鏈(即比特幣原鏈),一條是forward block鏈。它的擴容方案比較簡單,就是直接提升forward block鏈的上區塊大小(Block Weight),但不提升兼容鏈(即比特幣原鏈)上的區塊大小。在forward block鏈上,每個2016區塊周期按照3.125%的速度增加區塊大小,最終增加到每個區塊大小為768 MWe*。同時,為了抗拒中心化審查,forward block鏈上的比特幣區塊間隔會提高至15分鐘,因此初始區塊體積為6MWe。
提升區塊大小來擴容的方式我們并不陌生,但是提升區塊大小會破壞交易信息的數據結構,因此老節點無法認可擴容后的新節點發出的區塊,從而導致硬分叉。因此Forward Blocks提出,在兼容鏈(即比特幣原鏈)上進行時間扭曲操作,來騙過老節點。
在時間扭曲操作之后,兼容鏈上會產生大量新區塊,時間間隔也會降低,這樣兼容鏈上也可以達到和forward block鏈(即新鏈)同樣數量的交易處理。換句話說,假如forward block鏈上額外處理了15 MB的交易信息,那么就讓兼容鏈通過時間扭曲操作額外多爆15個1 MB新區塊來處理這些額外的交易。這樣的話,就能保證老節點能夠看到所有交易,而不至于導致硬分叉。