柯平教你區塊鏈分片(Blockchain Sharding)

買賣虛擬貨幣
區塊鏈分片(Blockchain Sharding)是為區塊鏈進行擴容的一種重要技術,以透過改變網路驗證的方式,增加吞吐量。這是區塊鏈技術走向商業化實踐必須要解決的問題之一。本期Hacker Speaker,我們邀請技術大咖柯平為大家繼續深入講解Go語言,以及區塊鏈分片的相關知識。本篇推送乾貨十足,閱讀全篇需約20分鐘,建議新增收藏,以便隨時溫故知新,加深理解哦!如何用Go實現區塊鏈分片1. 區塊鏈分片要解決的問題2. 區塊鏈分片專案對比
3. 玻色子共識4. go語言特點5. go實現區塊鏈分片

6. TPS大賽介紹

Speaker:柯平  研發技術資深專家   夸克鏈研發負責人
北京郵電大學網路研究院碩士,在微軟搜尋技術研發中心、AI技術研發中心工作近10年,任資深研發經理。現任夸克鏈北京研發負責人。對大型高效能分散式系統、區塊鏈等研發工作有非常豐富的經驗。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分片對餘額進行轉移,或者呼叫智慧合約。

目前我們的go版本已經開源,歡迎大家去下載體驗我們的程式碼,給我提建議。

免責聲明:

  1. 本文版權歸原作者所有,僅代表作者本人觀點,不代表鏈報觀點或立場。
  2. 如發現文章、圖片等侵權行爲,侵權責任將由作者本人承擔。
  3. 鏈報僅提供相關項目信息,不構成任何投資建議

推荐阅读

;