區塊鏈分片(Blockchain Sharding)是為區塊鏈進行擴容的一種重要技術,以通過改變網絡驗證的方式,增加吞吐量。這是區塊鏈技術走向商業化實踐必須要解決的問題之一。
如何用Go實現區塊鏈分片
1. 區塊鏈分片要解決的問題
2. 區塊鏈分片項目對比
3. 玻色子共識
4. go語言特點
5. go實現區塊鏈分片
6. TPS大賽介紹
1.區塊鏈分片要解決的問題
公鏈的挑戰
眾所周知,公共區塊鏈平臺今天面臨的最大問題之一就是可擴展性。所有主流的平臺都在努力提高每秒的交易量。比特幣網絡平均每秒可以處理7筆交易,以太坊網絡15筆每秒。緩慢的交易處理造成了一個主要問題,因為大量的未完成交易阻塞了網絡,使得那些諸如實時支付這樣的應用程序很難在區塊鏈上一展身手。隨著確認支付的時間拉長,最終就會給用戶帶來諸多不便;這也是為什么像PayPal和Visa這樣的信用卡支付方式仍然更具吸引力的主要原因之一。Visa每秒能處理約5.6萬筆交易。
垂直擴容與水平擴容
最早很多公鏈使用垂直擴容,比如修改出塊的速度、出塊的大小,試圖通過調整參數增加單條鏈的性能來擴容。這類似于在中心化的系統里想要擴容,就去用最快的CPU、更大的磁盤。垂直擴容的缺點是參數調整對性能提高很容易達到上限,例如由于全球P2P網絡傳播速度的限制,進一步減少出塊間隔或增加塊大小會增加孤塊產生概率,從而浪費哈希算力。另一種類似垂直擴容的方案是采用權益證明(POS)和委托權益證明(DPOS),例如EOS的DPOS共識,只允許21個節點產生區塊,損害了網絡的去中心化程度。
區塊鏈水平擴容的基本思想是分而治之,來源于傳統概念的數據庫分片,它將數據庫分割成多個碎片并將這些碎片放置在不同的服務器上。在公鏈的情境中,分片就是把數據或者流量,分割成不同的碎片放在不同的地方并行處理。通過增加網絡中分片的數量,整個區塊鏈網絡的吞吐量將會線性增加。分片技術被認為是在不損失去中心化程度和安全性的條件下可實現擴容的方案。
分片類型
分片(Sharding)是區塊鏈擴容的鏈上解決方案之一。
區塊鏈分片的層級由下到上分別為:網絡分片(Network Sharding)、交易分片(Transaction Sharding)和計算分片(Computational Sharding)以及狀態分片(State Sharding)。
· 網絡分片
網絡分片是最基礎的一種分片方式,就是將整個區塊鏈網絡劃分成多個子網絡,也就是一個分片。網絡中的所有分片并行處理網絡中不同的交易。開發者需要開發一種機制來確定哪些節點可以按照安全的方式保留在哪些分片中,這樣就能避免那些控制大量特定分片的人所發起的攻擊。
· 交易分片
交易分片的前提是先進行網絡分片,再將全網交易劃分到不同分片中進行驗證和打包。主要涉及的問題是哪些交易應該按照特定的屬性被分配到哪些片當中。
· 計算分片
只有網絡的一個子集(如一個分片)執行計算,從而高效執行運算密集的任務。
· 狀態分片
狀態分片是將完整的賬本信息分別存儲在各個分片當中,也就是把整個區塊鏈的狀態劃分為多條區塊鏈狀態,每個可以相對獨立的處理交易,并且可以無縫的和另一個分片交互。
實際上,在狀態分片中,每個片區中的節點就是在搭建自己的一條分片鏈,這條鏈中包含的交易只會影響這條分片鏈本地的狀態。因此,分片中的驗證者只需要存儲本地的狀態,并且只需執行和中繼那些影響本地狀態的交易。這種拆分減少了節點對計算能力、存儲和網絡帶寬的需求。但也引入了新的問題,如數據可用性和跨分片交易。
· 各種分片類型的對比:
網絡分片、交易分片可以解決計算能力瓶頸,而狀態分片則一方面能夠解決計算能力、網絡帶寬和存儲能力瓶頸,另一方面降低了需要驗證事務的節點的數量。因此狀態分片是最為理想化的分片方式。
2. 區塊鏈分片項目對比
當前使用區塊鏈分片技術的公鏈已有不少。我們把主流做分片/跨鏈的公鏈平臺做了以下對比:
從上圖看,分片項目的TPS都比較高,基本上已經可以滿足大部分的需求。但從拓展性看,除了QuarkChain外,其他分片項目對共識、虛擬機、賬本模型、代幣經濟學的支持都比較單一。
我們把最近非常熱門的Polkadot,Cosmos與QuarkChain也進行比較,看看有何不同?這三個項目都涉及到鏈之間的交互,如果把以太坊升級到2.0(信標鏈,有多個分片也涉及到跨片交互)算上,我們可以把這4個放在一起做個簡單的對比。
從靈活性上看,Cosmos和QuarkChain上的子鏈(分片鏈)最為靈活,可以使用多種共識機制。Polkadot還是非常依賴于PoS的共識模型,包括parachain根據現在代碼是不能隨意配置共識的,靈活性方面相對于夸克鏈來說,約束多一些。
從安全性上看,Cosmos的思路是每個鏈自己負責自己的安全,這里面我們認為安全問題還是會發生。Polkadot跟我們QuarkChain一樣,會共享安全。
從交互性上看,四個項目都是由一個中間人鏈來協調子鏈(分片鏈)之間的交互:以太坊2.0——信標鏈;QuarkChain——根鏈;Polkadot——RelayChain;Cosmos——Hub。
從開發進度上看,QuarkChain和Cosmos已經上線,以太坊2.0和Polkadot則還在開發中。
我們把上面的討論總結在一張表里便于觀看:
3. 玻色子共識
共識機制是區塊鏈的根本,引入分片后,區塊鏈的共識機制也有了相應的變化。這里我介紹一個非常重要的分片共識機制--玻色子共識。
玻色子共識是QuarkChain首次提出的通用分片共識框架,可以描述QuarkChain, Polkadot甚至eth2.0(還在設計中),并且在QuarkChain主網生產環境中運行良好。
具體而言,玻色子共識是一個基于單鏈共識基礎上的多分鏈(片)共識。他是一個雙層結構,分為根鏈(root chain)和分片(shard chains)。分片塊與單鏈相同,用于保存交易數據,提高TPS和拓展性。根鏈塊中只保存各個分片的區塊頭,用于做分片權威塊確認,保障整個系統(生態)的安全。
根鏈本身使用的共識機制可以根據需求進行選擇,如PoW/PoS/dPoS等。分片上的共識為根鏈優先原則+該分片自身的共識PoW/PoS/dPoS。不同分片所使用的分片自身共識可以不一樣。比如說分片1中使用了PoW,而分片2中使用DPoS。
什么是根鏈優先原則?根鏈優先原則指的是當分片鏈出現分叉,系統需要在分叉中挑選最優分叉時,需要先對比兩個分叉對應的根鏈哪個更優(與根鏈共識相關),根鏈最優的分叉會勝出(不會關心分片區塊的優劣)。在根鏈優劣相同的情況下,再用分片自身的共識來比較分叉的優劣,選擇最優分叉。
根據上面的描述,如果要攻擊使用玻色子共識,必須要同時攻擊根鏈和分片才能起到作用。這使得攻擊難度大大增加。我們可以通過激勵機制(公鏈)或者根鏈保護機制(只允許部分可信節點出塊,聯盟鏈)來增加根鏈的安全,從而進一步保障整個系統的安全性。
玻色子共識有許多的優點:
1. 拓展性好,支持異構分片
2. 支持跨鏈、跨片交易
3. 安全復用,所有的分片都收到根鏈的保護,使得整個系統中每一個分片的安全性都很高,即使新加入的分片也會立即受到根鏈的保護。
對玻色子共識感興趣的朋友可以看看我們玻色子共識介紹文章:
http://kuaibao.qq.com/s/20180927G1JM1P00?refer=spider
玻色子共識如何對抗黑客攻擊,可以看看這篇文章:
https://zhuanlan.zhihu.com/p/55842744
比較喜歡研究的朋友可以看看我們發的論文:
https://github.com/QuarkChain/pyQuarkChain/blob/master/papers/boson.pdf
該論文是借用數學的語言來描述玻色子共識,以及現有的單鏈共識。非常值得一看。
4. Go語言開發區塊鏈的優勢
區塊鏈首先需要非常高效的運行,主要是由于哈希及加密算法計算和大量的交易數據處理,傳播以及存儲等。區塊鏈需要網絡編程,多平臺支持,代碼復雜性高,需要高的可維護性和安全性保證。而go語言無論在執行和開發效率上都滿足了實現區塊鏈的技術要求。
首先,從執行效率上來說,go比解釋型語言的JavaScript和Python執行效率更高。Go可以直接在OS上運行,自然比Java等虛擬機上運行的編譯型語言運行得更快,因此被用作開發Docker和EVM的語言。Go為分布式而生。使用Go構建的微服務可輕松擴展至數百萬個請求。Goroutine使得Go在語言層面支持并發,goroutine分配的初始棧大小為2k,比其他語言的線程輕量級得多,同時會根據運行狀況動態擴展或收縮。Go的runtime采用協作式調度,最大限度的發揮了多核機器的能力。
其次,從語言特性上來說,Go作為編譯型語言,錯誤會在編譯時出現并得到處理,避免運行中突然出現的錯誤,多人協作開發和維護更加安全可靠。編譯成可執行文件后,部署非常方便,甚至支持跨平臺編譯運行。另一方面,Go兼具解釋性語言的優點:編譯時間短,啟動時間短,對于測試,部署和其他腳本的開發和使用也很方便。Go的語法表達能力很強大,例如支持指針,閉包,面向對象,垃圾回收等,比同樣是編譯型語言的C開發效率更高,實現同樣功能的代碼量少,維護更容易。
最后,從社群生態來看,go的谷歌背景和開源屬性吸引了越來越多的開發者:Go語法簡潔,易于開發人員學習和掌握,積累了越來越豐富的標準庫,特別是網絡庫非常強大,如rpc,grpc等。Go內置強大的工具,如go fmt,go get, go build, go doc等, 其中go fmt使得代碼格式統一,交流和維護方便。Go內嵌C支持,go代碼也可以直接包含C代碼,利用現有的豐富的C庫。
使用golang的區塊鏈項目如Hyperledger Fabric,go-ethereum為后來者提供了良好的架構范式和底層模塊,如rlp,rlpx,libp2p等,是被實踐檢驗過的開源代碼。使得用Go開發區塊鏈項目更加簡單。
使用go語言作為實現技術的還有Cosmos,Polkadot,Loom Network,Dero,GoChain,以及將go作為智能合約語言的Hyperledger Fabric chaincode等。
5. Go實現區塊鏈分片
用go開發的分片項目有幾個,這里我們以QuarkChain的go版本為例,講講QuarkChain是如何用go實現分片的。
· QuarkChain 的簡介
QuarkChain 是第一個成功實現狀態分片的公鏈,具有每秒十萬次以上的鏈上交易處理能力(100,000+TPS),依靠對于分片功能的完善設計,在實現高吞吐能力的同時,實現了不同分片共識機制、賬本模型、交易模型和代幣經濟四個維度的可定制化,成為安全、去中心化、效率集于一身的靈活、高擴展性且方便使用的區塊鏈底層架構。整體設計除了性能還考慮到了特性上的延伸,支持跨鏈交易,多原生代幣,安全復用,協同挖礦和算力復用,以及含有權益的工作量證明(PoSW)等特性。
QuarkChain使用我們剛剛講的玻色子共識,使得每個分片都能能復用根鏈安全能力,并引入交稅機制,吸引大于50%全網算力來保證根鏈安全。QuarkChain還依靠獨創的帶有權益的工作量證明(PoSW)-- 融合了PoW和PoS的兩大特點,需要質押匹配挖礦算力的代幣作為保證金,拉高攻擊者成本,避免分片在開設早期因算力不足而遭到攻擊。
執行交易的分片層具有無限的擴展性和動態添加分片的能力,新加入的分片可以立即得到根鏈算力的保護。每個分片可以有自己的共識,也能夠在分片上發行自己的原生代幣,定義自己的智能合約。也就是說我們現在看到的所謂“跨鏈、PoS、Defi”等等新概念,QuarkChain在設計之初就兼容了這些功能。
· QuarkChain的架構
QuarkChain借鑒了中心化世界中大型分布式系統解決方案中常用到的cluster的概念,每個節點都是一個cluster。每個cluster中有一個master 服務和一個或多個Slave服務。master 服務中包含根鏈,并對外提供對外服務的JsonRPC接口和節點間通訊的P2P接口;Slave 服務中包含一個或多個分片。Master 服務和Slave 服務間、Slave服務與Slave服務間(跨鏈交易)通過GRPC接口進行通訊。
當前代碼已經開源,可以從我們的Github(https://github.com/QuarkChain/goquarkchain)下載。
在代碼中,cluster目錄下,master、slave服務以及他們共同需要的config、service和rpc模塊。
· 分片間通信
在區塊鏈中不同的節點通過P2P協議進行通訊,達成共識。在QuarkChain中,不同節點間的分片并不會建立P2P連接,因為當前P2P協議的連接并未到瓶頸,而那樣做會引入較高的復雜度。當前分片間的通訊是通過根鏈P2P層進行轉發。以下根鏈P2P消息的結構體:
在消息結構體中,我們添加了Metadata屬性,來表示消息要發送到的鏈(根鏈或者某個分片)。當根鏈收到消息并確認要轉發的分片后,就直接轉發給對應的分片。在收到分片返回結果后將結果直接轉發給發送該P2P請求消息的節點(cluster)。整個過程中,根鏈不會對發送內容(data)進行encode、decode以及驗證操作,消耗很低,因此能夠滿足大量分片的轉發工作。
為了完成相應的分片間同步,我們也相應的增加了分片操作碼:
· 異構分片的支持
在區塊鏈中最重要的幾個object便是交易(transaction),區塊頭(header),區塊(block),區塊鏈(block chain)。而異構分片意味著這些object的定義以及對應的處理邏輯都有可能不同。但與此同時,區塊鏈要處理流程都是大同小異的。因此我們給這些object定義了相應的接口。
以下定義了IHeader, IBlock, IHashable:
以下是交易的定義,在交易的定義中,通過TxType字段標明該交易的類型是Evm類型還是UTXO類型等,并在編解碼時根據不同的類型做相應的操作。
在區塊鏈的操作同步(sync)、交易執行(process)、驗證(verification)、共識(consensus)都定義了相應的接口,而這些接口方法都會接收IHeader/IBlock作為參數。這使得添加新的異構分片、交易類型(account、utxo),共識算法、VM變得模塊化,靈活可拓展。
· 跨片交易
QuarkChain特性使得用戶在每個分片中都有一個地址,因此跨片交易的流程分為簡單的兩步:
1. 余額提取:此操作從用戶A的余額中提取代幣,代幣數量等于轉賬金額+預留交易費(gasPrice*startGas)。此操作發生在分片X中。
2. 執行/退款:對于余額轉賬,執行操作會增加用戶B的余額;或者對于訪問智能合約交易,執行操作會運行智能合約C的代碼。完成轉賬/智能合約調用后,計算實際的交易費用,并將剩余的交易費用(預留-實際)退還給用戶A在Y分片的地址。這個操作發生在Y分片。
代碼實現方面,當from shard 部分執行結束后,跨鏈交易會被發送到本cluster中的to 分片上,to 分片會將其保存。當包含該交易from部分的區塊被root block確認后,to分片對余額進行轉移,或者調用智能合約。
責任編輯;zl
評論
查看更多