6. TPS大賽介紹
網路分片、交易分片可以解決計算能力瓶頸,而狀態分片則一方面能夠解決計算能力、網路頻寬和儲存能力瓶頸,另一方面降低了需要驗證事務的節點的數量。因此狀態分片是最為理想化的分片方式。
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分片對餘額進行轉移,或者呼叫智慧合約。
目前我們的go版本已經開源,歡迎大家去下載體驗我們的程式碼,給我提建議。