挑戰“不可能三角”,公鏈設計、選型與開發實戰

挑戰“不可能三角”,公鏈設計、選型與開發實戰

開發一條公鏈,對於任何技術團隊都是一件極具挑戰性的事情。假如糟糕的網絡通信這種被動的惡意,還能讓人接受,那麼不擇手段的雙花、DDoS、智能合約攻擊等等,讓我們必須謹慎的設計每一個邏輯環節。

公鏈面臨的問題

我們先來看看公鏈設計中的“不可能三角”問題:Scalability、Decentralization、Security。

  1. Scalability,可以理解為可擴展性,例如分片技術;也可以理解為網絡能耗低,保證網絡的性能最優,總的來講就是優異的TPS。
  2. Decentralization,去中心化是如何保障網絡的去中心性,這就要求該網絡需要是一個對等網絡,該網絡中的機器的地位都是平等的,不存在任何特殊化的中心節點,同時為了保證該網絡的去中心性,該網絡需要是一個開放的無准入的網絡,從而可以讓人人都能夠加入該網絡,且該網絡不會被一個或多箇中心控制。
  3. Security,安全性是保障該網絡足夠安全,不能被壞人破壞。在一個開放並與經濟利益掛鉤的網絡中,不僅會有好人購買機器加入這個網絡,也會有更多的壞人企圖希望通過破壞該網絡獲利。那麼,如何在網絡內部存在壞人的情況下,保證網絡的安全性,這已經突破了傳統意義上的安全架構,是安全設計的挑戰。
挑戰“不可能三角”,公鏈設計、選型與開發實戰

PoW的算力浪費以及單節點產塊讓它的性能低下,PoS面對眾多安全問題,例如無厲害攻擊、遠程攻擊等,DPoS的產塊節點有限,雖然有選舉制度,但是它的去中心化就是讓人耿耿於懷,而PBFT的同步通信讓它的節點數註定會受到制約。

以上是現有共識的優缺點,而我所在的alabs ADAG公鏈團隊,選擇了Hashgraph作為基本共識算法來設計我們的公鏈,因為我們通過嚴謹的分析該共識算法,並在此基礎上做了重要的改進,在不破壞算法嚴謹性的同時,讓它面對公網環境時,也能具有很強的說服力。我們在它身上,看到了畫出一個儘可能最大三角的可能,以下就談談它的性能,去中心化和安全三個維度的情況。

挑戰“不可能三角”,公鏈設計、選型與開發實戰

ADAG為什麼選擇Hashgraph共識

Hashgraph的性能與去中心化

Hashgraph算法是swirlds團隊基於DAG(有向無環圖)設計的一種完全異步的類BFT共識算法。該算法有兩大特點:

  1. Gossip about gossip (八卦協議)
  2. 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中國,長期從事分佈式計算,網絡通信等領域的研發工作。


分享到:


相關文章: