挑戰“不可能三角”,公鏈設計、選型與開發實戰
開發一條公鏈,對於任何技術團隊都是一件極具挑戰性的事情。假如糟糕的網路通訊這種被動的惡意,還能讓人接受,那麼不擇手段的雙花、DDoS、智慧合約攻擊等等,讓我們必須謹慎的設計每一個邏輯環節。
公鏈面臨的問題
我們先來看看公鏈設計中的“不可能三角”問題:Scalability、Decentralization、Security。
Scalability,可以理解為可擴充套件性,例如分片技術;也可以理解為網路能耗低,保證網路的效能最優,總的來講就是優異的TPS。
Decentralization,去中心化是如何保障網路的去中心性,這就要求該網路需要是一個對等網路,該網路中的機器的地位都是平等的,不存在任何特殊化的中心節點,同時為了保證該網路的去中心性,該網路需要是一個開放的無准入的網路,從而可以讓人人都能夠加入該網路,且該網路不會被一個或多箇中心控制。
Security,安全性是保障該網路足夠安全,不能被壞人破壞。在一個開放並與經濟利益掛鉤的網路中,不僅會有好人購買機器加入這個網路,也會有更多的壞人企圖希望通過破壞該網路獲利。那麼,如何在網路內部存在壞人的情況下,保證網路的安全性,這已經突破了傳統意義上的安全架構,是安全設計的挑戰。
PoW的算力浪費以及單節點產塊讓它的效能低下,PoS面對眾多安全問題,例如無厲害攻擊、遠端攻擊等,DPoS的產塊節點有限,雖然有選舉制度,但是它的去中心化就是讓人耿耿於懷,而PBFT的同步通訊讓它的節點數註定會受到制約。
以上是現有共識的優缺點,而我所在的alabs ADAG公鏈團隊,選擇了Hashgraph作為基本共識演算法來設計我們的公鏈,因為我們通過嚴謹的分析該共識演算法,並在此基礎上做了重要的改進,在不破壞演算法嚴謹性的同時,讓它面對公網環境時,也能具有很強的說服力。我們在它身上,看到了畫出一個儘可能最大三角的可能,以下就談談它的效能,去中心化和安全三個維度的情況。
ADAG為什麼選擇Hashgraph共識
Hashgraph的效能與去中心化
Hashgraph演算法是swirlds團隊基於DAG(有向無環圖)設計的一種完全非同步的類BFT共識演算法。該演算法有兩大特點:
Gossip about gossip (八卦協議)
Virtual Voting(虛擬投票技術)
事實上,在選型之初,我們很快意識到Hashgraph是一個類BFT演算法,而且不像PoW,DPoS那樣,完美的避開了拜占庭將軍問題。這讓它顯得沒有那麼有魅力,而就是這兩個特性,讓我們看到了它的獨特之處。
概括的說,它們指的就是,節點間隨機的發生通訊,通訊的載體叫event,圖中的圓圈。A,B,C,D為不同的節點。例如A與B通訊,通訊的內容就是A節點知道的,而B節點不知道的交易列表。
假如B節點建立一個event來記錄這次通訊內容,該event除了要包含交易,還要有兩個非常重要的欄位,即Selfparent(B) 和 Otherparent(A),由此隨著交易的發生,每個節點本地都會存在一個這樣由通訊歷史組成的雜湊圖(Hashgraph),而每個節點根據本地的Hashgraph都能夠獨立的計算出一個塊,而且塊中包含的交易序列以及順序都是一致的。
節點間的通訊我們叫gossip,而gossip的內容簡單來說就是我知道的,而你不知道的,所以很形象的稱為八卦協議。而self parent 和 otherparent 又記錄下所有的歷史通訊記錄,這是演算法再進行witness 和 famouswitness 選舉時最重要的資訊(具體演算法可以參照swirlds白皮書),有了這些資訊,節點就可以獨立的計算並獲得塊(產塊),並保證塊的一致性(這叫做虛擬投票)。
所以你會發現,通過這種看似隨意的通訊,Hashgraph避免掉了傳統BFT類共識中常見的訊息傳遞風暴(N²),很大程度的降低了網路能耗,而且能夠很好的支援併發。用Hashgraph發明者的話來說就是:“Hashgraph具備投票演算法的一切優點,然而避開了它的最大缺陷。”
從演算法中我們也可以看到,這是一個非同步的類BFT演算法,所有的節點是對等的,不存在其他身份的節點,所以它是一個去中心化的系統。當然作為BFT類共識,它依然要面對拜占庭問題,即1/3惡意節點問題,我們需要額外的獎懲機制來約束網路環境。
Hashgraph的安全性
首先Hashgraph作為一個完全非同步的拜占庭容錯,這意味著它並不對訊息在網際網路上傳遞有多快做任何假設。該功能使得它能夠抵禦DDoS攻擊、僵屍網路。另一個經常被討論的問題就是Hashgraph能否經受Sybil攻擊,即攻擊者通過建立大量假身份來破壞對等網路的信譽系統,並利用它們獲得不成比例的巨大影響力。
我們設計了一種讓所有共識參與者共同維護“共識白名單”的機制,讓所有參與者能夠驗證彼此對同一個塊的簽名,再配合獎懲機制,讓它能夠應對假身份攻擊的危險。
該演算法能夠通過定義網路中的大多數為2/3*N~3/4*N,從而能夠抵抗1/3~1/2的惡意攻擊,當然大多數越接近N,對效能會有負面的影響。
Hashgraph存在的問題
當然Hashgraph並不是完美的,作為一個完全非同步的BFT類共識,它在公網環境下,能夠支援多少個節點?完全的非同步讓它對網路環境的要求沒有那麼苛刻,我們知道它最終能夠達成一致,但是,如果這個時間視窗過長,那麼它將無法面對很多業務場景,而且,作為BFT類共識,它必須知道全網節點數N,而這些都是公網環境下無法保證的。於是我們設計了基於Hashgraph的快速同步功能以及共識節點的動態驗證集策略。
在傳統鏈式結構中,大家對這兩個功能並不陌生。像以太坊的快速同步功能,以及casper中的動態驗證集。基於鏈式的資料結構讓我們很容易能夠想象,這兩個功能如何去實現,所以我們需要把Hashgraph鏈式化。
如何解決
鏈式賬本結構,它更適應於表示不可變的事務的有序列表。在我們的系統裡,交易順序由Hashgraph一致性演算法控制,但是最終的“塊狀”交易被對映到由塊組成的線性資料結構。每個塊包含交易的有序列表,前一個塊的雜湊,對應的應用程式狀態(statehash),以及來自動態驗證集的簽名集合。
在區塊鏈世界裡,任何一個共識系統的輸出都是一個有序的交易列表。我們最終決定使用鏈式結構來建模最終資料,是因為它是高效的,具有良好區塊鏈相容性(分片,跨年,layer2等)。由批量,有序的交易序列,hash,簽名,組成的線性資料結構讓它很容易驗證很多事務。
Hashgraph是一種基於同義資料結構的,優秀的一致性演算法。然而swirlds團隊也僅僅是給出對交易進行排序的一致性演算法,然而雜湊圖資料結構在表示線性交易序列時並不容易使用。它是一個有向無環圖(DAG),其順序必須通過一些複雜的一致性函式來提取,為了驗證給定交易的一致性索引,必須重新計算hash圖的子集上的一致性方法。而鏈式結構不需要進一步的處理來提取交易的有序序列,並且通過簡單的加密原語足以驗證塊。
如上圖所示,我們根據swirlds演算法中的round以及roundreceived概念,將Hashgraph對映為鏈式結構。在鏈式結構上,我們通過設計新的資料結構來截斷Hashgraph,以便支援快速同步,並在不同的round中支援不同的動態驗證集,這讓我們的公鏈在面對惡劣的公網環境,能夠有很好的適應能力。
同步功能,我們設計了兩種同步方式,一種是基於全圖譜的全資料同步模式,另一種是基於某一個特定的“frame”,以及對應的block,對應的賬本snapshot的快速同步模式。
快速同步功能雖然並不陌生,但是它對與一個完全非同步的BTF類共識就顯得格外重要了,因為由於網路原因,某些節點會落後於當前大多數節點,在一些特定得應用場景中,我們鼓勵節點積極的使用快速同步,這樣可以有效得控制並防止非同步過程中,全網資料狀態不一致的時間視窗越來越長。當然需要全資料的節點可以通過不斷的gossip,來同步自己的全資料,然後不斷產塊,來追趕最新的資料,方式是靈活的。
動態驗證集功能,公網環境下,我們很難控制節點的行為,當然有效的獎懲機制是個不錯的選擇,這是另外一個很大的話題,這裡暫且不說。節點的新增與刪除,我們通過設計一種特殊的交易型別來實現。
這樣的交易會像普通交易一樣被封裝在event裡,並gossip到全網中,這樣根據一致性的共識演算法,這個交易會被大多數節點放到同一個塊裡,那麼它們就可以在邏輯上一致性的去維護一個共識白名單。我們的策略是一個節點可以隨時的線上或者斷線,但是我們將它在邏輯上與對應的round週期相對應,這樣在投票演算法中,就不會破壞共識演算法的嚴謹性。
回到文章開始的地方,我們之所以選擇Hashgraph+鏈式賬本結構的方式來開發我們的公鏈,就是因為,通過嚴謹的研究與分析,以及核心創新功能的開發,我們在ADAG身上看到了很多可能。
關於layer2的一些思考
在區塊鏈的技術棧中,跨鏈和layer2的方向正被越來越多人重視,相關技術的發展也越來越成熟。我們團隊也一直很重視ADAG對相關技術的支援,如果不是很嚴謹的說,Inter-Blockchain Communication (IBC)是關於一個鏈充當另一個鏈的輕客戶端,而為一個鏈式結構構建一個清客戶端明顯要比在一個hash圖上構建要簡單的多。為了在塊鏈之間實現相互操作,幾個倡議已經被提出,如Cosmos、Polkadot 和 EOS。而ADAG的鏈式賬本可以與這些網路體系結構很好的整合。
Layer2的很多技術都可以通過智慧合約來實現,ADAG採用通用的鏈式賬本結構,能夠輕鬆的支援智慧合約,當前支援EVM,支援WASM的分支也在開發中。
分享與建議
公鏈並不是萬能的,它需要適配自己的業務場景。這對技術選型,未來的成長至關重要。
假如你使用的共識演算法並不成熟,而你又希望開發一條公鏈,那麼建議團隊在全力投入之前,先確定你的共識演算法的安全,容錯邊界,以免搭建空中樓閣。
無論中本聰類共識,還是BFT類共識的容錯邊界都是有限的,所以也不要對公鏈初期的准入與控制行為耿耿於懷。
篇幅原因,文章中沒有對經濟模型和獎懲機制做更多的介紹,而它們與共識一樣對公鏈的成敗至關重要。
作者:馮英飛,Alabs ADAG主鏈專案技術負責人。區塊鏈領域開發專家,致力於區塊鏈主鏈技術的研發及應用落地,畢業於江南大學,曾工作於futurmaster中國,長期從事分散式計算,網路通訊等領域的研發工作。
— END —
推薦閱讀:
點選“閱讀原文”,開啟 APP 獲取更多幹貨喲!