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