潘業達 ,陳恭亮 ,郭乃網
(1.上海交通大學,上海 200240;2.國網上海電科院,上海 200232)
隨著數字貨幣的火熱,區塊鏈技術逐步進入公眾的視野,并引起了廣泛的討論和研究。目前,雖然區塊鏈各個方面的研究火熱,但是距離真正投入使用、影響并改變人類現有的生活生產方式還很長的路需要探索。影響區塊鏈投入使用的一個重要原因在于目前的區塊鏈系統性能無法滿足日常生產生活需求,其中最重要的瓶頸在于其低下的吞吐率。因此,本文分析限制區塊鏈吞吐率的因素,分別舉例說明如何突破這些瓶頸以提升區塊鏈吞吐率,以期區塊鏈更早投入生產。
區塊鏈技術是中本聰[1]構建比特幣系統的底層技術,隨著密碼貨幣市場的火熱,逐漸被學術界所關注和研究。區塊鏈技術是集分布式系統、點對點網絡、密碼學于一體的新興技術,主要解決了在沒有引入可信第三方的基礎上,在相互不信任的節點之間達成共識的問題。突出貢獻在于,能夠在擁有大量參與者的情況下(比特幣十幾萬個節點),無準入且可以隨時退出的情況下達成共識。這相較于傳統的基于投票的BA類共識協議有了巨大的突破(在PBFT中,參與節點不能超過100個,且所有的節點需要引入可信第三方對節點身份進行認證,同時在協議開始運行后不能有新的節點加入)。
同時,區塊鏈通過使用Hash函數、Merkle Tree、數字簽名等密碼學方法,構造出了一條證據鏈,使得上鏈的數據在經過有限的時間等待后無法被篡改,在各個節點之間形成一個公共的賬本。區塊鏈技術通過其開創性的共識協議,為互不信任的節點提供了一種信任機制,即由對傳統意義上人、企業、政府等實體的信任,轉移到對點對點網絡、密碼學等技術的信任,可能帶來下一次的信息技術等革命。
雖然區塊鏈技術的前景十分廣闊,但目前技術發展并不成熟,無法支撐現階段業務的正常運行,其中區塊鏈的低擴吞吐率是最大的瓶頸。相較于比特幣理論上的7 TPS和以太坊的15 TPS,日常系統可能每秒轉賬(交易)量需要上千上萬。如此低的吞吐率,在實際應用中杯水車薪。
如圖1所示,區塊鏈可以根據功能由低到高劃分為密碼基礎層、網絡層、共識層和應用層四個層次,分別對應于數字簽名、Merkle樹等密碼算法,點對點網絡,POW、POS、PBFT等共識協議,智能合約等上層應用。其中,密碼基礎層對于區塊鏈的性能等影響主要體現在簽名和驗簽過程,可以使用更加輕便的簽名算法如BLS短簽名;網絡層性能瓶頸主要在于點對點網絡的性能瓶頸,其突破需要點對點網絡的進一步發展;應用層是構建在底層區塊鏈網絡上的具體應用,因此暫時不予考慮其對吞吐率的影響;而相較于其他三層,共識層是目前吞吐率的短板,限制了區塊鏈性能的提升。因此,本文在主要討論共識層提高吞吐率的模型,并舉例分析如何實現吞吐率的提升。

圖1 區塊鏈層次結構
共識層中,限制區塊鏈吞吐率的主要因素是其鏈狀的結構,因為只有被記錄到區塊鏈上的交易才是有效交易。決定交易吞吐量的因素有三點——出塊速率、塊的大小以及是否可以通過并行提高系統的吞吐率。因此,如果想要提高區塊鏈的擴展性,要從這三個方面入手。但是,由于區塊鏈的安全性限制,如果過度提高出塊的速率或者區塊的大小,會導致安全性的下降。同時,由于區塊鏈的鏈式結構,通過并行來提高吞吐率十分困難。后續章節中,本文分析了限制上述三點的主要因素,提出了可能的解決辦法,并且通過例舉現存項目分析比較其優缺點。
由于區塊鏈的鏈式結構,如果出塊速率過快,會導致產生過多分叉,進而影響系統的安全性,如圖2所示。從直覺上看,如果兩個區塊之間的時間間隔短于整個網絡的網絡延遲,會出現這種情況。假設將所有的節點進行線性排列,當第一個節點在高度i發出一個區塊,然后逐個向后面的區塊進行傳遞。如果在到達所有節點前,最后一個節點在同一高度也產生了一個區塊,并且向前傳播。這樣前一部分節點在高度i的區塊為,剩余的節點在高度i的區塊為,區塊鏈產生了分叉。此外,隨著出塊速率的提高,分叉的可能性也在提高,其安全性呈指數下降,無法提供50%的安全性,攻擊者可以用更少的資源攻陷區塊鏈系統。如圖2所示,隨著出塊速率的增加,安全系數呈指數下降,這在文獻[2]中有具體說明。
如果想要提高出塊速率而不影響吞吐率,則需要解決分叉問題。這里主要提出兩種解決分叉的方法:一是通過改進傳統的拜占庭共識協議,二是通過改變區塊鏈的結構,從傳統的鏈式結構轉換為有向無環圖結構(DAG)[3]。

圖2 安全性與出快速率關系
首先,區塊鏈產生分叉的原因在于,節點可以在區塊鏈的任意位置向后延伸,即在區塊鏈的同一高度可以產生多個區塊,而哪一個區塊被最終確認是概率性事件。如果在區塊鏈的相同高度只能產生一個區塊,那么就不會產生分叉。而傳統的共識協議對于一個事件的共識只有達成共識和不達成共識兩種狀態,因此如果使用基于傳統拜占庭共識協議,并不會因為出塊速率的提高而導致分叉的產生。但是,傳統的共識協議并不支持大規模共識。例如,PBFT[4]參與的節點數理論上不能超過100,這在公鏈系統要求全網參與的情況下杯水車薪。因此,基于拜占庭共識的協議通常做法是通過某種算法,均勻采樣產生一個委員會和一個備選區塊。在委員會中對備選區塊進行投票,如果投票成功產生區塊,如果投票失敗,這一輪不產生區塊。需要注意的是,為了委員會中好人占的比例大致同整個網絡中好人的比例相等,要求委員會的大小不能太小,需要遠大于100,這樣傳統的拜占庭共識協議無法滿足需求,需要對現有的拜占庭類協議進行改進,以支持更大的參與者。這類協議中較優秀的是Micali教授提出的Algorand[5]算法,通過VRF[6]隨機產生備選區塊和委員會,并通過一個其稱為BA*的二元輸出的拜占庭共識產生一個一致的輸出。Algorand算法的公平性體現在每一輪都會產生一個新的委員會,以保證委員會的代表性。
Algorand在實驗環境下50 000個節點參與,區塊大小為2 MB的情況下,出塊的時間間隔約為12 s,吞吐率約為327 MB/h,相較于比特幣的6 MB/h提升了50倍以上。同時,實驗表明,區塊的大小在Algorand中對確認時間幾乎沒有影響,因此可以通過提高區塊的大小進一步提高吞吐率。例如,在區塊大小為10 MB的情況下,Algorand的吞吐率大約為750 MB/h,是比特幣吞吐率的125倍。
通過使用改進的拜占庭共識的問題在于,為了使委員會中的壞人比例大致等于全網中的壞人,委員會的大小需要得到保證。在Algorand實驗中,委員會的大小為5 000個節點,在委員會中需要進行多輪投票,導致網絡會產生大量的投票信息而出現網絡擁塞。
傳統的區塊鏈中,同時有多個參與者在區塊鏈的不同位置向后擴展,但是最終只有一條鏈會被接受,即從全局來看,全網生成的是一棵樹狀的結構,但為了能夠為其中的區塊提供一個不可篡改的順序,即抽象出一個公共賬本,區塊鏈選擇只接受其中一條鏈,其余分支將被舍棄。因此,不管用何種方法選取這條鏈,都會不斷產生分叉。如果分叉的速率和數量太多,會影響系統的安全性。DAG(有向無環圖)的思想是,如果將網絡中的所有的區塊全部包含到最終的狀態圖中,那么將不存在分叉。此外,還可以從兩個方面提高系統的擴展性。第一,出塊的速率可以更高,因為系統存在分叉,出塊速率的加快不會帶來安全性的降低。第二,在鏈式結構中,部分產生的區塊被忽略了。在DAG結構中,所有的合法區塊最終都會被包含在最終的系統中,所有參與者對于打包交易的貢獻最終會體現在最后的系統狀態中,實現了某種意義上的并行。
有向無環圖同傳統鏈式結構的主要區別在于,每個區塊中不僅包含一個父區塊的Hash值。有向無環圖應當包含多個區塊的Hash值,從而構成一個有向無環圖的結構,且其包含的區塊的Hash值應為在其本地視圖下最新的沒有子區塊的區塊。DAG的結構如圖3所示。

圖3 DAG結構
如果使用DAG結構,其主要的挑戰在于如何在一個有向無環圖中提取出一個公共賬本,或者說如何比較任意兩個區塊之間的先后順序。目前,有兩種方式。一種方式是對任意兩個區塊,通過直接或者間接連接到或被其連接的區塊進行投票,獲得票數多的區塊被認為順序更靠前。這里,計票過程在各個節點根據本地的視圖中進行的。投票的原則在SPECTRE[7]中有具體描述,這里不再贅述。第二種方式是,在DAG中通過某種方法提取一條主鏈來為全視圖中所有的區塊給出一個唯一的序列號,進而構造出一個公共賬本。這種方式在文獻[3]中提出,假設有一個算法能夠在DAG的視圖中提取出一條主鏈,這條鏈需要滿足區塊鏈的安全屬性,即鏈的增長性,公共前綴和鏈的質量[8]。通過這條主鏈為全視圖中的所有區塊提供一個全視圖唯一的序列號。目前,較為可行的辦法是通過Ghost[9]方法進行主鏈的選擇Conflux[10]。Conflux在構造有向無環圖時,將連接前向區塊分為父節點和叔節點,連接父節點的邊為主邊,連接叔節點的邊為從邊,父節點的選擇是根據Ghost中的最重鏈原則進行選擇。首先,去掉所有的從邊,將視圖從一個圖退化成一棵樹,在這棵樹中使用GHOST算法,選擇出一條主鏈。在Conflux中,在網絡節點個數為20 000、區塊大小為4 MB、出塊速率為0.4個/s、網絡帶寬為40 Mb/s的情況下,吞吐率為6 400 TPS。
需要注意,目前DAG還處于基于POW階段,使用POS的協議多存在安全性隱患,失去了區塊鏈去中心化的意義。同時,由于POS的DAG不需要消耗資源,它可以在DAG的任何節點后產生區塊,并且最終都會被包含在所有參與者的視圖中,這樣DAG的視圖可能無法收斂。因此,目前DAG并不適合使用POS一類的不需要消耗資源的協議選取主鏈。同時,由于所有的合法區塊都會被包含,區塊中的數據有大量重復,造成了大量的數據冗余,其對擴展性的提高無法達到預期效果,且增大了存儲負載。
一昧地擴大塊的大小會帶來兩種問題。一是隨著塊的增大,其廣播到全網中所有節點的時間(網絡延遲)會線性增長,如圖4所示。出塊速率是相對于網絡延遲而言的,在出塊速率不變的前提下,增加網絡延遲變相地提高了出塊速率,導致了更加頻繁的分叉,進而影響了系統的安全性。二是當區塊大小增大,則出塊的節點所擁有的權利(打包交易的數量)隨之增大,會導致某種意義上的中心化。可以想像,如果塊大小無限大,那么這就是一個中心化系統。單純提高區塊的大小,會導致網絡延遲的增加,因此可以將一個大區塊拆分成許多小區塊。小區塊的確認獨立于大區塊,即小區塊的接收可以隨時停止,且全網都會同步到相同的小區塊上。在現有的協議中,康奈爾大學博士后Ittay Eyal等人提出的bitcoin-ng[11]協議最具代表性。

圖4 區塊大小同網絡時延關系

圖5 bitcoin-ng結構
Bitcoin-ng將區塊分為主區塊和微區塊兩種角色。主區塊中包含工作量證明信息,微區塊中包含具體交易信息和產生主區塊的節點簽名。主區塊之間的時間間隔需足夠長,防止出現過多的分叉。從創世區塊開始,所有的節點基于創世區塊進行POW。成功算出POW的nonce值的節點首先產生一個主區塊,其中包含POW的驗證信息和自己的簽名,廣播到整個網絡中。收到這個主區塊的其他節點停止基于創世區塊的POW工作。產生主區塊的節點不斷打包網絡中的交易成為一個個微區塊,將微區塊廣播到網絡中去;其他的節點選擇基于某個微區塊進行下一輪的POW,產生新的主區塊,結構圖如圖5所示。
理論上,bitcoin-ng的吞吐率只受單個節點處理速度的限制,因為高的吞吐率不會產生分叉。雖然微區塊之間的時間間隔可以遠小于主區塊,但是其時間間隔不能夠無限小。微區塊的出塊速率非常快時,會導致在主區塊出塊附近出現非常多的分叉,分散了算力,嚴重影響系統的安全性。
另一種拆分區塊的方法是首先選出一個領導者,領導者不斷打包交易直到產生新的領導者。這種協議中具有代表性的是康奈爾大學的Elaine教授提出的Thunderella[12]協議,主要過程為:
(1)選出一個加速節點;
(2)選出一個委員會;
(3)加速節點收集網絡中的交易信息,將交易的信息進行排序后簽名發送給委員會;
(4)委員會對交易進行投票,如果一條交易收到的票數超過了3/4,那么這筆交易就被確認;
(5)否則,交易進入底層的區塊鏈系統,等待足夠長的時間,進行確認。
相較于bitcoin-ng在微區塊之間需要有一定的時間間隔,Thunderella中的領導者在兩個交易之間不需要等待,可以連續向委員會發送交易,這樣在領導者為誠實的且委員會中超過3/4是誠實的情況下,系統的性能瓶頸被限制在領導者的單節點處理速度和委員會投票的通信復雜度上。同Algorand一樣,這種使用投票的共識協議會大大增加網絡中路由交易信息的數量,造成網絡擁塞。
區塊鏈單條鏈的結構使得打包交易過程只能夠串行進行,串行的模式導致難以通過并行提升效率。在串行模式下,吞吐率的上界被單節點的網絡速度和處理性能從物理上被限制,且隨著網絡規模的增大,系統的性能不能同比上升,甚至會有所下降。為了使得區塊鏈能夠實現并行,可以有兩種方法。一是將區塊鏈系統分層,底層是區塊鏈網絡,只存儲關鍵信息,上層負責具體交易的處理,上層之間相互獨立,可以并行處理數據;二是借助分片技術,拆分系統中的資源,各個分片單獨處理各自的交易。
區塊鏈的主要優勢在于能夠在互不信任的網絡中提供一個較可信的環境,并且將所有的交互信息進行存儲。但是,在實際的生產生活中,交易完整的處理過程不需要都在可信環境下,所有的數據也無需無差別存貯。事實上,只要在交易的重要過程能夠提供一個安全環境,且對關鍵數據進行存儲,就可以滿足日常生產生活的需求。分層的思想是關鍵的交易和信息在底層的區塊鏈執行和存儲,非關鍵交易的具體執行和中間結果由參與方線下執行,線下的交易可以并行處理。從全局來看,這大大提高了系統吞吐率。
在分層的解決方案中,較具代表性的是閃電網絡[13]。在閃電網絡中,需要進行交易的雙方需要向區塊鏈提交一個智能合約來創建交易通道,在智能合約中需要將一定量的代幣鎖定。在創建好支付通道后,交易雙方在線下進行交易,交易的安全性通過多方簽名來保證。交易結束后,將最后的狀態提交到主鏈上,并且釋放通道關閉交易。主要流程如圖6所示。

圖6 閃電網絡交易過程
雖然閃電網絡將多個交易簡化成了兩個交易,但是其使用范圍十分受限。在閃電網絡中,線下交易只能在已有直接或者間接通道的用戶之間進行,同時只有在交易頻率較高的情況下才能夠體現出其優勢。但是,在網絡中存在大量的一次性交易,即A向B發送一筆交易后,后續長時間內A和B之間不會發送交易。在這種情況下,單筆交易會被擴展為兩筆交易,得不償失。
分片技術是一種應用于數據庫分片的傳統擴容技術。它將數據庫分割成多個碎片,并將這些碎片放置在不同的服務器上。在區塊鏈情境中,網絡上的交易將被分成不同的碎片,由網絡上的不同節點單獨處理。每個節點只需處理一小部分傳入的交易,并且通過與網絡上的其他節點并行運算,可以同時完成對交易的驗證和處理。因此,隨著網絡規模的增長,區塊鏈同步提升將成為可能,這種屬性也稱為水平擴容。
在區塊鏈中,通過將參與者分片,每個分片單獨處理,存儲不同的交易信息。可以將每個分片想象成一個子鏈,所有的子鏈構成了完整的區塊鏈。區塊鏈中,分片的技術難點在于保證跨分片交易的原子性。一筆交易如果被接受,在所有的分片中都會被接受;如果不被接受,所有的分片都會拒絕這比交易。即狀態的改變是原子性的,全網中的狀態是相同的,如何實現在文獻[14-15]中有具體的描述。同時,在分布式系統中,分片由中心節點來決定。但是,在區塊鏈系統中,沒有一個中心的系統來進行分片。要保證分片的隨機性,需要有一個隨機源來產生隨機數進行分片。慶幸的是,區塊鏈所要解決的問題是隨機選取一個節點來打包交易完成出塊,因此在現存的一些共識算法中可以提供這樣一個隨機源。例如,Algorand中通過VRF產生隨機數,或者通過POW產生的符合要求的nonce值(雖然這不是一個隨機數,但是也是一個不可預測的值)。
本文總結了限制區塊鏈吞吐率提升的主要因素,抽離出提升區塊鏈吞吐率的架構,并從三個方面描述了提高區塊鏈吞吐率的模型,舉例進行了具體分析。在同一協議中可能會使用其中一種或多種,表1中例舉比較了各個協議中提高吞吐率的情況。其中,Y表示該協議擁有該特性,N表示沒有。

表1 提升吞吐率協議對比
相信隨著技術的發展,當吞吐率不再是限制區塊鏈實用的主要影響因素時,區塊鏈作為可能的下一代信息革命的優勢將真正展現出來。