區塊鏈的分級、分層和分片設計

(一)區塊鏈的分級設計

在比特幣擴容爭議中,小區塊的支持者最常使用的一個邏輯就是,采 用分層設計:將主鏈充當結算層,閃電網路充當支付層,也可表述為,大 額交易走結算層,小額支付走閃電網路。但主鏈和閃電網路將這種行使相 同功能、按功能的規模設計「分層」,並不是真正意義上的分層設計,而 是分級設計。

機械設計人員會有這樣的體驗:設計過濾粉塵機器時,經常要使用到 分級設計。先用粗孔濾芯,過濾大顆粒粉塵;然後用細孔濾芯,過濾小顆 粒粉塵。處理同一類對象,但「物理大小」不一樣,為了節省運營成本, 設計就會體現出多級的特點;不對過濾器進行分級,直接按最小顆粒來設 計濾芯,很快需要更換濾芯。其實,為了節省成本,分完級後,完全可以 使用兩級來分擔過濾任務,使用更便宜的粗孔濾芯過濾掉大粉塵,減少細 孔濾芯的壓力。分級設計在日常生活中隨處可見,比如,飲用水過濾器就 是分級的。

選擇比特幣擴容方案的時候,使用閃電網路來分流主鏈壓力,就是一 種分級設計。因為這種方案,主鏈和閃電網路行使的功能完全一樣,都是 觸發交易的支付行為。雖然可以將主鏈的交易行為稱為「結算」,但無法 改變行為的功能。

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

同樣,使用offchain(去中心化)錢包完成錢包內的轉賬,也是分級 設計。因為使用offchain 錢包轉賬只要運用其公司自己的完整數據進行調 整即可,與在比特幣網路上進行交易需要的成本完全不同。

在分級設計中,第一級(主鏈)不用關心第二級是什麼樣子,但第二 級需要關心第一級是什麼樣子,比如,閃電網路就需要監視主鏈,以免 支付通道的人做廣播欺詐。第二級出現問題,並不會傷害第一級主鏈。比 如,offchain錢包被盜,跟主鏈一點關係都沒有,但反過來就完全不同了。

(二)區塊鏈的分層設計

區塊鏈的分層設計就是網路協議分層,即我們熟知的七層網路結構, 如物理層、鏈路層、網路層等。分層的基本設計原則是:各層獨立,做好 自己的事即可。

層和層之間的功能是不一樣的,層和層之間的交流都是通過接口通 信,只要接口保持不變,層內部的設計就能任意改變,且不會影響其他 層。目前,各種區塊鏈的設計,雖然都宣稱自己是分層設計的,但都不符 合上述原理。

比特幣比較接近分層設計的思想是側鏈的設計原理,側鏈可以完整獨 立地設計與主鏈完全不同的功能,比如:

RSK的目標是實現智能合約,而比特幣主鏈實現的核心功能是 UTXO的轉賬和賬本的更新維護。側鏈和主鏈僅僅通過特定的交易來充當 接口,而側鏈則需要關心主鏈在幹什麼,主鏈是不需要關心側鏈在幹什麼的。也就是說,側鏈和主鏈並不是相互獨立的。

比特幣(包括BTC和BCH)尤其是BCH的OP Return(相當于「備 注功能」)能很好地擴展為分層設計。對OP Retumn里的數據,比特幣主鏈 只關心其是否真實,根本不關心具體的數據,由此OP Return 就可以在里 面設計出一整套新功能,只要裡面的代碼在BCH主鏈的交易真實可信即 可,而主鏈和OPReturn 設計出來的新層是不需要相互關心的。

其實,比特幣的元幣協議就是一個很好的分層設計,只是一直沒有被 廣泛使用罷了。以太坊並不是分層設計,所有功能都在同一層上,所有 Dapp(一種去中心化應用程式)都在同一套賬本層里做事,沒有進行分層 處理。

(三)區塊鏈的分片設計

目前,無論是在比特幣還是以太坊上,分片設計都沒有做完。這裡, 先簡單介紹一下基本原理。

比特幣網路處理交易往往是這樣的:一個節點收到一波交易,比如 1萬筆,節點先將交易序列化,即給這些交易編號排隊,然後一筆一筆地 去驗證。遇到某筆驗證無法通過,比如需要前置零確認的交易,就先緩存 起來;碰到非法交易,則直接丟棄。

比特幣對這類交易的處理是串行進行的,即一個時間點只能處理一筆 交易。即使電腦功能很強,處理能力也有限,比如將1萬筆交易分成兩 波,5000筆一波,分別發給一臺電腦去驗證。目前,比特幣並不支持這種 並行驗證,因為會涉及分片設計。

比特幣的UTXO(Unspent Transaction Outputs的縮寫,即未使用的交 易輸出)的物理實體就是如此。一筆UTXO在電腦里存儲的數據主要包括 4個部分:

(1)生成這筆UTXO交易的TXID(Transaction ID的簡稱,即交易 哈希)。

(2)生成這筆UTXO交易的輸出序列號index。多數交易都是一個或 多個輸入和輸出,第一個輸入序列號是「0」,第二個輸入序列號是「1」。

(3)鎖定腳本lockscript

(4)金額value(價值)。其中,TXID是16進製表達,即使用0—F來 表達。如果將首字元進行分類,0歸一類,1歸一類···F歸一類,就可以 分為16類;使用首兩個字元來分類,00歸一類,01歸一類······FF歸一 類,就可以分為256類····—如果使用4個字元呢?答案可想而知。

上述的一類可以稱為一個片,就是分片。分片後,將一類分給一臺電 腦去處理,另一類分給另一臺去處理,如此,256片就可以分給256臺電 腦來處理。而UTXO的TXID就是交易的TXID,打包交易的區塊也可以 使用這種分類進行打包,比如,分成256片,則在一區塊里可以設成256 個分區,一個分區打包一個片。也就是說,UTXO、交易和區塊都可以按 同樣的規則分片。如此,就實現了比特幣網路的並行擴展。

但上面講的只是基本原理,設計過程非常複雜。比如,一個UTXO需 要進行兩次,要實現不同的TXID,然後將其發到不同的分片上。如果分 片之間沒有通信機制,就可能成功;但如果分片之間還要為這種攻擊進行 大量通信,那麼不如不分。一旦實現了分片,比特幣網路可以無限擴展。 一臺電腦處理不了,就需要使用多臺電腦來處理;如果一個人買不起多臺 電腦,就需要多人每人買一臺。