您當前的位置:首頁 > 攝影

通往百萬TPS之路(四)——區塊鏈分級、分層、分片設計

作者:由 閃電 發表于 攝影時間:2018-06-28

第0章 引言

如果你關心區塊鏈的可擴充套件性設計,你可能會遇到分層設計和分片這兩個概念,我今天介紹這兩個概念,同時補充分級這個概念來修正社群討論分層設計時的一個誤區。

第1章 分級設計

在比特幣擴容爭議中,小區塊的支持者最常使用的一個支援小區塊的邏輯就是應該採用分層設計——主鏈承當結算層,閃電網路充當支付層,或者稱為大額交易走結算層,小額支付走閃電網路。

但我覺得

主鏈和閃電網路將這種行駛相同功能,按功能的規模設計分成“分層”,並不能真正稱為分層設計,這個應該稱為分級設計。

我以前做機械設計的,設計過過濾粉塵的機器,就經常會用到分級設計。使用一個粗孔濾芯,先過濾掉一些大顆粒粉塵,然後再用細孔濾芯,過濾小顆粒粉塵。處理同一類物件但“物理大小”不一樣,設計成多級。這樣設計的好處在於節省運營成本。如果過濾器不分級,直接按最小顆粒來設計濾芯,那很快就要換濾芯,越細孔的濾芯成本越高。但分級成,使用兩級來分擔過濾任務,粗孔濾芯更便宜,讓粗孔濾芯先過濾掉大粉塵,細孔濾芯壓力就小,這樣可以節省成本。

分級設計在我們生活中是非常常見的,我們家庭常用的飲用水過濾器就是分級的。

比特幣擴容方案選擇的時候,有人提出使用閃電網路來分流主鏈的壓力,這屬於分級設計。

因為這種提議,主鏈和閃電網路行駛的功能是完全一樣的,都是發交易的支付行為。雖然有人將主鏈的交易行為稱為“結算”,但這個叫法無法改變行為的功能。

因為比特幣主鏈上發交易的成本是最高的,對個人來說,需要支付礦工費,對比特幣系統來說需要所有節點來完整驗證交易,需要系統的CPU、頻寬、硬碟。而在閃電網路上發交易的成本是較低的,對個人來說,閃電網路裡的手續費更低,速度更快,對比特幣系統來說,並不需要所有節點去驗證閃電網路內的交易,只需要驗證進出閃電網路的交易。

同樣的,使用offchain錢包來完整同錢包內的轉賬,也屬於分級設計。因為offchain錢包,只是錢包公司自己完整資料的調整就可以了,這和在比特幣網路上發交易是完全不一樣的成本。

分級設計中,第一級(主鏈)是根本就不需要關心第二級是什麼樣子的,但第二級(閃電網路和offchain等)是需要關心主鏈的。

比如閃電網路就需要監視主鏈,以保證不會出現支付通道的人做廣播欺詐。

分級設計中,第二級出了問題,並不會傷害第一級主鏈。

比如offchain錢包被盜了,跟主鏈毛關係都沒有。但反過來則不一樣。

分級設計其實是人對成本的考量而催生出來的,並不需要頂層設計,讓市場自由博弈就能湧現出來分級解決方案。

第2章 分層設計

網際網路最成功的分層設計應該是網路協議分層,就是我們熟知的七層網路結構,什麼物理層、鏈路層、網路層……

分層的基本設計原則是:

各層是獨立的,各自層做好自己的事即可。

層和層之間的功能是不一樣的。

層和層之間的交流都是透過介面通訊,只要介面保持不變,層內部的設計可以改變,且不會影響別的層。

目前各種區塊鏈的設計,各種宣稱說自己是分層設計的,往往都是不符合上述原理。

比特幣比較接近分層設計的思想是側鏈的設計原理。

側鏈可以完整獨立設計成和主鏈完全不一樣的功能,比如RSK目標是實現智慧合約。而比特幣主鏈實現的核心功能就是UTXO的轉賬和賬本的更新維護。側鏈和主鏈只是透過特定的交易來充當介面。但側鏈往往需要關心主鏈在幹嗎,主鏈是不需要關心側鏈的。這就是側鏈和主鏈並不是相互獨立的。

比特幣(包括BTC和BCH),尤其是BCH的OP_Return就是一個將來非常好的擴充套件為分層的設計。

比特幣主鏈對OP_Return裡的資料只關心是否為真,並不關心具體的資料。那OP_Return就可以在裡面設計出一整套新的功能,只要這裡面的程式碼最後在BCH主鏈的交易裡為真。而主鏈和OP_Return設計出來的新層是不需要相互關心的。

很早之前,以太坊的V神就想在OP_Return上實現他的以太坊的智慧合約設想,可惜當時被Core開發組限制了。

位元現金BCH的開發正在拿OP_Return大做文章。

其實比特幣的元幣協議,就是一個很好的分層設計,只是一直沒有被廣泛使用起來。但現在我還沒有充值理解元幣協議,以後搞懂了再來講。

以太坊並不是分層設計,所有的功能都是在同一層上。以太坊所有的Dapp都是在同一套賬本層裡做事,並沒有分層處理。

第3章 分片設計

分片設計目前還沒有做完,無論是在比特幣還是在以太坊上,都沒有實現。但我可以簡單講下原理。

現在比特幣網路處理交易是這樣的,一個節點收到一波交易,比如1萬筆,節點會先將這些交易序列化,即給這些交易編個號排隊,然後一筆一筆去驗證。如果碰到某一筆驗證無法透過,比如需要前置零確認的交易,那就先快取起來。如果碰到有非法的交易,則直接丟棄。

比特幣現在的這種處理交易方式就是序列的,即一個時間點,只能處理一筆交易。

這樣做就會有很大的瓶頸,單一電腦再牛逼,處理能力也會有上限。

那能不能分成兩臺電腦,比如將1萬筆交易,分成兩波,5000筆一波,分別發給一臺伺服器去驗證呢?不能!

目前比特幣還不支援這種並行驗證。

如何要做到並行驗證呢?那就是要講到分片設計了。

比特幣的UTXO的“物理實體”是這樣的,一筆UTXO在電腦裡存的主要資料是以下四個部分:

1生成這筆UTXO的交易的txid;

2生成這筆UTXO的交易的輸出序列號index。因為大部分交易是一個或多個輸入,多個輸出,第一個輸入序列號是0,第二個是1。

3鎖定指令碼lockscript。

4是金額value

其中txid是16進製表達,即使用0到F來表達,如果將首字元來分類,0歸一類,1歸一類……F歸一類,就可以分為16類。如果使用首兩個字元來分類,00一類,01一類……FF一類,那就可以分為256類……如果使用4個字元呢?16^4類。

我們將

上述的一類稱為一個片,這就是分片。

分片後,將一類分給一臺電腦去處理,另一類分給另一臺去處理……,256片就可以分成256臺電腦來處理。

而UTXO的txid就是交易的txid,則打包交易的區塊,也可以按這種分類來打包,比如分成256片,則同一區塊裡,可以設成256個分割槽,一個分割槽打包一個片。

也就是說,UTXO、交易、和區塊都可以按同樣的規則分片。

這樣比特幣全網就可以實現節點可選擇處理哪一個分片,比如我執行一個節點,我只收、驗證和廣播特定分片的UTXO、交易和區塊。

這樣就實現了比特幣網路的並行擴充套件。

但這種分片還是很複雜的,我上面講的只是基本的原理,要完成設計是非常複雜的。比如一個UTXO去花費兩次,是可以實現不同的txid,然後發到不同的分片,如果分片之間沒有機制來通訊,則可能會雙花成功,但如果分片之間還要為這種攻擊大量通訊,則還不如不分片呢。

但如果實現了分片,那比特幣網路則是可以實現無限擴充套件,什麼百萬TPS,都不在話下,什麼1M、8M、32M根本就不是事,至少1G區塊。

因為一臺電腦處理不了,可以搞16^n臺來處理好了,一個人買不起16^n臺電腦(中心化)的話,那就找16^n個人每人買一臺好了。

以太坊的分片更復雜,我暫時講不明白。

BCH的開發正在全力開發UTXO分片,我也在努力學習這些知識,以求能貢獻一點知識。

第4章 結束語

位元現金BCH遲早實現1G以上的區塊,為5億人服務。

另請閱讀:

《比特幣和以太坊的記賬方式——UTXO和賬戶餘額》

《通往百萬TPS之路——BCH的UTXO證明和分片技術(一)》

《通往百萬TPS之路——BCH網路的各類節點如何參與UTXO證明(二)》

《通往百萬TPS之路(三)——提高SPV節點的安全、高效和可擴充套件》

https://

t。zsxq。com/UvZfyrv

(二維碼自動識別)

通往百萬TPS之路(四)——區塊鏈分級、分層、分片設計

標簽: 位元  設計  分片  主鏈  UTXO