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