區塊鏈相關論文研讀7:通過分片(Sharding)擴展區塊鏈

本文首發在https://zhuanlan.zhihu.com/p/89933683

 

這篇論文發表在頂會SIGMOD 2019上,題目爲《Towards Scaling Blockchain Systems via Sharding》,作者信息爲Hung Dang, Tien Tuan Anh Dinh, Dumitrel Loghin Ee-Chien Chang, Qian Lin, Beng Chin Ooi,National University of Singapore

本文章不是論文的直接翻譯。本人通過閱讀和理解上面論文原文,結合參考其它資料,提取出論文的主體內容,用自己的語言,希望以通俗易懂的方式跟讀者分享和交流區塊鏈技術。

讀懂這篇論文需要一點基礎知識,所以本人先介紹這些基礎知識,再進入論文的主要部分。儘量幫忙讀者減少閱讀障礙。

爲什麼要分片(Sharding)?

打個比方,如果把所有的商品存放在一個倉庫內,該倉庫只有一個門用來搬運商品,當有很多工人同時要搬運商品的時候,需要排隊。爲了提高搬運效率,我們把商品分到十個倉庫中,工人分散到這些倉庫中搬運商品。

在傳統數據庫系統中,如下圖所示,通過把一個主機上的一個數據庫表分片成保存在兩個不同主機上的片,來減少數據讀寫的網絡負擔和IO負擔,來從整體上提高體統的吞吐量。

同樣道理,在區塊鏈中,把一個碎片(shard)比作一個倉庫,以提高系統的性能。更小的碎片導致更好的整體系統性能,因爲(1)一個碎片內節點的通信開銷減少,從而提高這個碎片的吞吐量。(2)因爲整個系統網絡的節點個數一定,那麼更小的碎片意味着更多的碎片,因此能夠減輕整個系統的壓力。(如果N表示整個網絡的節點個數;n表示一個碎片內的節點個數,那麼整個網絡的碎片的個數爲k=N/n。所以n表示碎片的大小;k表示碎片的多少。應注意區分)

上圖便是傳統數據庫管理系統和區塊鏈管理系統分片上的區別了。其中一個紅圈表示一個碎片,在論文中表示爲委員會(committee)。一個委員會包含多個節點,通過拜占庭容錯算法來決定這個委員會的共識。共識的作用就是統一意見。這裏,可以把一個委員會理解爲一個區塊鏈系統。當有一個交易產生時,只需要讓一個或者幾個委員會來處理這個交易。不同的委員會有時候需要通信,因此我們需要考慮委員會之間通信的問題。

上面便是區塊鏈分片系統的架構了。在該架構之下,有哪一些問題和挑戰呢?

(1)一個委員會內的共識算法如何設計?在節點數很多的情況下(>100)拜占庭容錯算法速度慢。如下圖,當系統節點個數大於67的時候,系統吞吐量下降到了很小的數值。我們是否可以在保證安全共識的情況下儘可能減少一個委員會內的節點個數呢?

(2)需要一個有效且安全的方式來分配節點到各個委員會,避免在一個委員會內有過多的惡意節點。假設整個區塊鏈網絡有100個節點,分爲5個委員會,每一個委員會有20個節點,且使用的是拜占庭容錯共識算法。假設其中惡意節點有10個,並且它們之間相互竄通。如果這些惡意節點全部被分配到一個委員會里面,就會有大問題,它們就能夠控着這個委員會的共識結果。解決這個問題的一個方法是將這些惡意節點分散到各個委員會里面,使得每一個委員會所包含惡意節點的數量儘可能少。所以,我們需要解決這個分配問題。在第一次分配好之後,攻擊者可能會慢慢把一個委員會內的節點一個一個攻破,使之變成惡意節點,導致這個委員會不再安全。因此需要週期性地重新調整或者說洗牌各個委員會的成員,讓惡意節點儘可能均勻分散到各個委員會中。

(3)不同的委員會之間有時候是需要通信的,也就是數據讀取或者說跨委員會的交易,我們希望委員會之間的通信具有隔離性和原子性。

本論文針對這三個問題和挑戰提出瞭解決方案,也就是本論文的貢獻點了。下面講解如何解決這三個問題的。根據第一個挑戰,提出了:

改進的PBFT算法

論文使用了TEE+PBFT來改進共識算法(TEE,可信執行環境,可參考本人這篇文章)。PBFT算法的安全假設爲惡意節點的個數不大於f,其中N=3f+1,N表示一個網絡的節點個數,也即是f<N/3。如果使用了TEE+PBFT,可以讓f<N/2的前提下實現安全的共識(具體可以查看論文引用17)。這樣的好處就是使得這個網絡抵抗惡意節點竄通攻擊的能力提高了。比如網絡中有10個惡意節點,爲了實現安全的共識,使用PBFT算法,網絡至少需要31個節點,其中包含21個誠信節點;而現在結合TEE,網絡至少需要21個節點來實現安全共識,其中包含11個誠信節點。這樣子,在一個委會會內,更少節點個數就能實現安全的拜占庭容錯共識

爲了避免大的可信計算基(TCB,trusted computing base)導致的系統安全隱患,系統沒有把整個共識協議放到TEE中執行,而是使用論文17的方式,結合日誌、消息摘要和TEE密鑰加密來實現安全。這裏不深入講解。

在一個委員會里面的所有節點的通信方面,論文給出了一個小改進。超級賬本Hyperledger的共識消息和請求消息共用一個消息隊列,導致大量的共識消息被丟棄,特別是在委員會節點數增加的時候,使得吞吐量下降。所以,論文使用兩種隊列來分別處理共識消息和請求消息。

針對第二個挑戰,提出瞭如下思路:

委員會成員的分配

SGX(一種TEE產品)有兩個函數用於在Enclave處理:sgx_read_randsgx_get_trusted_time,分別用來產生無偏見的隨機數和產生一個時間戳。論文借用這兩個函數來實現委員會成員分配。

總體思路:假設每一個節點都獲取到了一個相同的隨機數rnd,那麼每一個節點都可以使用rnd作爲種子(seed)來獲得元素爲[1:N]的一個隨機全排列[公式]。因爲種子是一樣的,所以每一個節點的隨機全排列[公式]是一樣的。再將[公式]劃分爲k份,每一份便是一個委員會了。

現在問題是,如何讓每一個節點都獲取到一個相同rnd呢?

本系統是分時期工作的(比如一個時期長24h),每一個時期開始的時候就動態洗牌各個委員會。使用e來表示當前是第幾個時期。爲了避免攻擊者選擇性丟棄TEE的enclave的輸出結果,導致隨機數生成出現偏見,因此每一個時期TEE的enclave只能被調用一次。在每一個時期e開始的時候,執行下列步驟生成一個全網統一的隨機數rnd。

  • 1. 生成兩個隨機數q和rnd,
  • 2. 如果q=0,那麼該節點就生成一個包含<e,rnd>的簽名證書,廣播該證書到其它所有節點
  • 3. 所有節點等待 [公式] 時間之後,鎖定所獲收集到的最小的rnd
  • 4. 使用3中的最小rnd來作爲當前時期的委員會分配的隨機種子seed。

每一個節點擁有一個相同的隨機數rnd之後,就可以根據上述的總體思路來確定一個節點屬於哪個委員會了,也就是委員會分配問題的解決。

如果所有節點生成的q都不等於0,那所有的節點都不能生成上述步驟2的證書,也收不到被廣播的證書,那當前時期就無法重新調整委員會了, 怎麼辦?

解決思路爲,所有節點的e增加,重新執行上面步驟。

另一個問題是,攻擊者可能會慢慢一個一個攻破一個委員會中的節點,使得該委員會的惡意節點個數超過安全共識的臨界值。所以我們需要每隔一段時期就要根據rnd重新調整委員會的成員。所有的節點同時調整是不可行的,因爲會導致系統在這段時間不可用,因此採用分批調整的方式。在調整的過程中,每一個委員會最多有B個節點調整到其它委員會,這B個節點在這期間不參加共識工作。B的的大小設置需要權衡,更大的B值導致更低的系統安全性。

針對第三個挑戰,提出了下面思路:

兩階段鎖和兩階段提交

論文使用兩階段鎖和兩階段提交來解決委員會之間通信的問題,並且滿足隔離性和原子性。總體思路如下圖所示,委員會之間的通信分爲三個階段,分別是準備,準備提交,提交。R表示參考委員會(Reference Committee),S1,S2,S3便是涉及到本次的transaction的委員會了。參考委員會在構造上面跟其它委員會沒有區別,只是它是一個協調者的身份。“協調者”這個角色來自兩階段提交協議,即兩階段裏面的協調者和這裏的協調者的工作基本是一樣的。只是這裏的協調者是一個委員會,由很多個節點構成,使用拜占庭容錯共識。

傳統的兩階段提交和本論文中的兩階段提交算法對比

一個Transaction可能有多個輸入和多個輸出,這些輸入和輸出可能涉及到多個委員會,這些委員會在下圖表示爲S1,S2和S3。

具體的跨委員會交易執行流程是什麼呢?

參考委員會自身有一個狀態機,如上圖所示,用戶發送一個交易Tx給參考委員會,這裏使用R來表示參考委員會,R就進入Started狀態,它向相關的委員會發送PrepareTx,同時等待收集各個委員會的回覆,如果所有的回覆都爲PrepareOk, 那麼就進入committed狀態,R正式提交交易。如果有任何一個委員會回覆PrepareNotOK,參考委員會進入Aborted狀態。如果任何一個委員會回覆消息過時或者不回覆,那麼R進入Aborted狀態。

參考委員會會成爲系統性能的瓶頸嗎?論文說不會,通過運行多個參考委員會來並行計算。

R是否會存在可用性問題呢?因爲論文的假設是一個委員會的惡意節點數量小於安全共識的閾值,因此R總是能夠執行誠信的共識來完成作爲協調者的工作。

總結:

這篇論文針對上面三個問題和挑戰,借用TEE提出了自己的解決方案。這篇論文包含的信息量比較大,閱讀和理解這篇論文有一定的難度,因爲作者假設讀者已經清楚了一些基本概念,比如區塊鏈分片,參考委員會的構造和管理,拜占庭容錯算法,TEE,兩階段提交和兩階段鎖等等。論文使用了RapidChain和OmniLeger作爲對比來敘述跨委員會交易的原子性和隔離性問題。在閱讀這篇論文之前,瞭解RapidChain和OmniLedger這兩篇論文有助於理解這篇論文。

論文中涉及到一些定量的計算問題,比如如何設置合適的委員會大小,這裏不給予講解了。

對於區塊鏈分片的方案,可以參考:

  1. ELASTICO

http://people.cs.georgetown.edu/~cnewport/teaching/cosc841-spring19/papers/new/sharding.pdf​people.cs.georgetown.edu

 

2. Near Protocol,在油管有專門的視頻講解

NEAR Protocol​github.com

3.Monoxide

SweetCandy:區塊鏈相關論文研讀4: Monoxide異步共識組​zhuanlan.zhihu.com

4. RapidChain, OmniLeger,Zilliqa,Cosmos,Harmoney,具體百度或者google一下就可以找到相關的論文。

 

謝謝!點個讚唄 = =

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章