SCAR:Scalable Consensus Algorithm一種可伸縮共識算法


   Yi                                                   Qihtml

zhengyi@qtum.org                                    qi.li@qtum.orggit

August 23, 2018github

1、背景介紹算法

諸如PoW(Proof of Work)、PoS(Proof of Stake)等傳統的區塊鏈公式算法,爲了減小分叉保證網絡的穩定性,一般區塊的間隔在10秒以上。例如Ethereum的區塊間隔時間是15秒,Qtum是144秒,Bitcoin是10分鐘。太高的區塊間隔時間,致使了用戶等待交易確認的時間較長,不利於實時支付等應用。網絡

而一些聯盟鏈的共識算法,例如EOS的DPoS [1](Delegated Proof of Stake)、Parity的Aura [2](Authority Round)等,經過投票選出超級節點來執行共識算法,能夠將區塊間隔時間降到甚至1秒之內。但這樣帶來的問題就是block的數量過多,對網絡帶寬和數據存儲都帶來了很大的壓力。運行一個全節點,甚至僅下載block header的輕節點,都對節點設備的性能有較高的要求。ide

對於區塊鏈的大多數商業應用而言,如徵信上鍊、商品溯源等,對於區塊鏈的寫操做一般是週期性的。即天天的部分時間交易量較大,其他時間交易量小。對於這樣的場景,若是始終維持高速的區塊產出,對於網絡和存儲資源都是較大的浪費,而僅須要保證在網絡高峯時段系統有較高的性能便可。性能

所以,咱們提出了 SCAR(Scalable Consensus Algorithm)可伸縮共識算法。SCAR的思想是根據區塊鏈網絡的負載,動態地調節參數,在高性能和低負載之間找到平衡,從而實現性能可伸縮。區塊鏈

2、相關共識算法介紹ui

PoW,Bitcoin爲表明。節點提供算力,經過大量的計算,產生新的block。算力越高,產生block的速度越快。計算難度每2016個block調整一次,保證在全網算力變化的狀況下,block時間間隔保持在10分鐘左右。因爲block間隔時間長,且每一個block的大小限制在 1 MB,因此當交易量大的時候,網絡會發生嚴重擁堵。加密

PoS,Qtum爲表明。節點提供token,經過少許計算,產生新的block。token數額越大,產生block的速度越快。計算難度也會按期調整,保證block時間間隔在144秒左右。PoS相對PoW而言,下降了對算力的要求,節省了能源。可是因爲block間隔和block大小限制仍然是固定的,網絡的負載固定,沒法避免交易量大時候的擁堵。雖然Qtum目前可使用DGP [3](Decentralized Governance Protocol)協議手動地去調整block大小限制,可是這種方式略微繁瑣。

PoW和PoS中,全網的全部節點都會參與到共識的競爭中來,因此區塊間隔不能設置得太小。若是太小,則很容易產生分叉。即,若是計算難度設置得太低,則很容易出現多個節點在同一時刻產出新的block的狀況。

DPoS、Tendermint等聯盟鏈共識算法,則經過投票獲得的超級節點來執行共識。因爲參與共識的節點數較少,則區塊間隔能夠設置得很小。好比EOS的block間隔就設置成了0.5s。太短的區塊間隔對帶寬和硬盤都是很大的壓力,在交易量少的時候也是一種資源浪費。EOS從今年6月9日上線以來,block數量至今已達1200萬,而9年前開始的Bitcoin至今也才50萬個block。

3、SCAR共識算法描述

如下將介紹SCAR算法的一種實現方式。這種實現方式在聯盟鏈的基礎上,經過交易量來動態地更新區塊間隔,從而實現了區塊鏈性能的可升縮。須要注意的是,SCAR算法的核心思想是根據負載動態地調整區塊鏈的性能,因此實現方式並不侷限於本文所提出的這種,更多的實現有待進一步地探索。

SCAR共識算法由三個步驟組成:

1. 統計投票獲得全部超級節點。

2. 根據網絡負載計算block間隔。

3. 間隔時間到後,超級節點按照優先級產出block,一旦一個新的block產出,回到步驟1。

SCAR共識算法的優勢在於:

1. 由超級節點執行共識,block間隔能夠極大程度縮短,交易確認快。

2. block間隔根據網絡負載動態調整,空閒時候間隔變長,下降帶寬和硬盤壓力。

3. 當低於半數的超級節點出現故障的時候,新的block仍然可以產出,系統魯棒性強。

如下將分別描述SCAR算法的三個步驟。

3.1 節點投票

投票選出超級節點能夠有多種設計。好比EOS是全部用戶都能參與投票,Aura是當前的超級節點能夠投票選出下一輪的超級節點。這裏咱們提出一種基於Qtum DGP協議的投票策略。

區塊鏈初始化時在鏈上部署 DGP 的智能合約,在合約內初始化了管理席位 admin 和治理席位 gov,均以地址的形式存儲。DGP 協議支持在鏈上經過管理席位 admin 和治理席位 gov的投票,來決定超級節點是否改變。

首先咱們對管理席位和治理席位的權限和修改策略作個介紹。管理席位 admin 在決定權限時具備最多的權力,它能夠參與投票增長和刪除 admin,同時能夠投票任命 gov;而 gov只能參與到超級節點的修改投票中。即全部提案只有具有管理席位的 admin地址才能設置,具備治理席位的 gov地址僅可參與超級節點投票。

投票的具體流程以下:

1. 收集新的超級節點的提案,向社區公佈並收集反饋;

2. 根據社區反饋調整超級節點列表,並經過智能合約存儲到區塊鏈中,做爲新的提案;

3. 經過調用 DGP 合約的相應方法,將該提案設置爲待投票的提案,此時即開啓投票;

4. 擁有管理admin和治理gov權限的地址經過向投票合約發送一筆交易來對提案進行投票;

5. 若提案未得到足夠投票則被否決,不執行修改;

6. 若提案經過,新超級節點列表的存儲地址會記錄進DGP合約,並在必定數量的區塊後生效,以防止出現沒必要要的分叉。

7. 節點能夠經過 DGP 合約來獲取最新的超級節點列表。

綜上所述,咱們能夠在鏈上設置 DGP 合約,經過 DGP 投票的方式來決定超級節點,並動態地存儲和更新受權礦工列表。

3.2 block間隔

block的間隔須要根據網絡的負載狀況動態調整,網絡空閒時候間隔變長,網絡繁忙時候間隔變短,從而實現動態可伸縮。這裏咱們提出一種block間隔的計算方法,根據近期的交易數量來進行計算,交易多則間隔變短,交易少則間隔變長。

block間隔的計算公式以下:


公式1:計算block 間隔

其中,min_interval 爲最小的block時間間隔,max_interval 爲最大的block時間間隔。transaction_num 爲最近 m 個區塊內的平均交易數,這裏 m 能夠爲大於等於1的整數。 m、min_interval 以及 max_interval 經過共識算法預先設定或者智能合約設置。

這樣設計公式的意義在於:

1. 當交易量 transaction_num 爲0時,block間隔將調整爲 max_interval,此時將用系統設置的最長間隔時間來儘可能在一個區塊內打包更多交易,避免了存儲空間的浪費;

2. 當鏈上交易量 transaction_num 趨向於無窮大時,block間隔將無限趨近於 min_interval,此時將用系統設置的最短間隔時間來儘量緩解區塊鏈網絡的交易擁塞,使得交易更快地被打包進區塊;

3. max_interval 和 min_interval 能夠根據實際狀況進行設置(例如用戶容忍的交易延遲、超級節點的網絡環境和存儲性能等)

採用這種根據網絡狀態動態調節區塊出塊時間的共識算法 SCAR,能夠有效的避免在交易量小時浪費存儲空間,也能夠在交易量大時增大區塊產生速率,及時將交易打包進區塊鏈上,保證交易更快地被確認。鏈上參數的動態調整也使得區塊鏈系統變得更加靈活,提升治理效率,下降治理難度和代價。

3.3 block產出

當超級節點和block間隔都肯定以後,節點就能夠在間隔時間以後輪流產出新的block。

在某一區塊鏈高度上,若超級節點的數量爲 n 個,則 SCAR 會爲每一個超級節點分配不一樣的出塊時間 block_time以下:


公式2:計算block time

其中,parent_block_time 爲上一個block的出塊時間,block_interval 爲動態計算出的區塊間隔。timeout 爲超時時間,用來防止某些超級節點出現故障長時間沒法出塊,miner_index 爲索引值,在同一區塊高度下,不一樣的受權節點miner_index 不一樣。下面將對具體的參數設置緣由和用途作出解釋。

如圖1所示,假定有5個被受權的超級節點 A、B、C、D、E,他們的公鑰被存儲在有序列表中,即上文說起的由 DGP 投票選出並可動態維護的超級節點列表(也即礦工列表)。假定在區塊鏈高度h1時,有序礦工列表是 [pubkey_A, pubkey_B, pubkey_C, pubkey_D, pubkey_E] ,這五個超級節點會輪流建立新的區塊。


圖1:超級節點列表

當建立新區塊時,礦工會經過加密算法簽名這個區塊,而後將簽名結果附加到區塊中。經過這種方式,其餘節點能夠經過解密從區塊中恢復出礦工的公鑰來,從而經過和超級節點列表進行比對來驗證該礦工是否有權建立區塊。當一條鏈被大多數礦工簽名以後,這條鏈能夠被視做爲一條永久的鏈。例如在上圖中,從創世區塊到h3高度的鏈是一條永久的鏈,由於它已經被它接下來的幾位礦工D、E和A簽名了。若是任何礦工想要在高度h3下面製造分叉,這一分叉則沒法被絕大多數礦工所認同。

共識算法能夠有效地避免分叉的發生,但至少須要 n/2+1 位超級節點保持公式算法的正常運行(n 是超級節點數量,n/2 是整數除法)。共識算法對容許建立下一個區塊的礦工作出瞭如下定義:

一個礦工在如下狀況能夠建立新的區塊:

1. 它當前是被受權的;

2. 最近的n/2個塊不是由它建立的。

由上述定義可獲得真正被容許建立下一區塊的超級節點的方式:從當前礦工列表中去掉爲最近 n/2 個塊簽名的節點便可。例如,在區塊高度 h2 上,下一區塊的礦工列表如圖計算獲得。


圖2:選擇當前礦工列表

由圖2過程選出了 B、C、D 三個可建立下一區塊的節點後,咱們只須要將超級節點列表設置爲有序列表,指定它們的優先級前後,就能夠避免它們爲產出下一區塊而競爭。公式中的 miner_index 即爲排序後的礦工列表的優先級索引,排序更前的超級節點將被分配更早的 block_time,每一個超級節點使用被分配的 block_time 建立新的區塊,並在 block_time 到來前保持等待狀態。

但超級節點模式的聯盟鏈也面臨着一個問題:部分節點的故障會致使網絡效率驟降甚至癱瘓。爲了不部分節點的故障致使系統中止運行,共識加入如下策略來確保正常出塊。咱們在系統參數中設置了 timeout ,若一個超級節點因爲故障未能成功廣播新的區塊,則下一個超級節點會在 timeout 時間以後取代它並正常產出區塊。如圖三所示,在上述5個超級節點的狀況下,礦工 B 在產出高度爲 h2+1 的區塊時發生故障。隨後,B 在超級節點列表中的下一位C ,將會在其 parent_block_time 的 block_interval+timeout 時間以後,廣播其建立的新區塊。


圖3:部分節點故障應對策略

4、總結

SCAR在保證區塊鏈性能的同時,儘量節省了帶寬和硬盤的消耗,並支持動態調整鏈上參數,相比其餘共識算法更加的高效和靈活,在大規模的商業應用中會有更大的優點。

參考文獻

[1] EOS.IO Technical White Paper v2: Consensus Algorithm (BFT-DPOS). https://github.com/EOSIO/Documentation/blob/master/TechnicalWhitePaper.md, March 16, 2018

[2] Aura - Authority Round - Wiki. https://wiki.parity.io/Aura

[3] Qtum區塊鏈指南. https://docs.qtum.site/zh/Qtum-Blockchain-Guide.html

相關文章
相關標籤/搜索