Conflux伍鳴:用DAG結構提高中本聰共識的吞吐率

12月25日聖誕夜,Conflux CTO伍鳴博士作客「火星財經創始學習羣」,分享了「Conflux: 使用 DAG 結構提高中本聰共識的吞吐率」。算法

嘉賓簡介:

clipboard.png
Conflux CTO:伍鳴博士
本科畢業於中國科技大學,中科院計算機系統結構博士,曾爲微軟亞洲研究院(MSRA)系統研究組的高級研究員,研究方向包括分佈式事務處理系統、圖計算引擎和人工智能平臺。近年來在多個系統領域的頂級會議(如 SOSP、OSDI、NSDI、ATC等)中發表論文,並擔任過 OSDI、ASPLOS、HotDep等會議的程序委員會委員。安全

要點速覽:

1.基於中本聰共識的思想,使用 DAG 技術改造,能夠在不犧牲去中心化和安全性的前提下,大幅提升吞吐效率。
2.爲何傳統的基於PoW的中本聰共識機制的吞吐率很是低下?總結來講,爲了安全,不得不如此。
3.保證安全性是公鏈系統最核心的要求,PoS雖減小了PoW中挖礦所須要消耗的資源,但同時引入了不少新的攻擊情形和安全性威脅,目前沒有很完美的解決方案。

伍鳴博士坦言,目前存在的一些基於PoW的區塊鏈系統所能提供的交易吞吐率都很是低,由此帶來不少問題,包含用戶體驗糟糕、交易費用高昂,並進一步限制了在區塊鏈系統上開發更有意義的應用的能力。網絡

在此背景下,Conflux經過有向無環圖技術(DAG)與中本聰共識(比特幣的共識機制)的結合,在不犧牲去中心化和安全性的前提下,提升基於工做量證實(PoW)的區塊鏈系統的吞吐率。併發

如下爲伍鳴博士直播的詳細內容(由Conflux和火星財經整理)分佈式

第一部分:行業背景

衆所周知,當前區塊鏈領域面臨的最大的一個問題之一,就是效率的問題。業界已經存在的一些基於PoW的區塊鏈系統(例如比特幣、以太坊)所能提供的交易吞吐率都很是的低。比特幣的極限速度是平均每秒處理大概7個交易,以太坊是每秒30個交易,遠遠低於像Visa這樣的中心化的交易服務能夠支持每秒上千個交易的吞吐率。性能

效率低會帶來不少問題:學習

首先,效率低使得現有的區塊鏈的用戶體驗很糟糕,好比交易被加入區塊須要等很長時間。區塊鏈

其次,吞吐率有限使得交易費用高昂。測試

更進一步,交易費用高昂限制了在區塊鏈系統上開發更有意義的應用的能力。優化

爲了提升效率,大致有如下這麼幾個思路:

1.依然採用中本聰共識,但調整協議參數。

經過調整出塊時間和區塊大小來提升效率。如萊特幣(2.5 min/1MB block), BCH (10min/32MB block)。但有研究代表,不管這兩個參數如何調整,提升吞吐率必然以下降安全性爲代價,在第二部分,我將爲你們分析這其中的緣由。

2.基於中本聰共識的思想,使用 DAG 技術改造。

這能夠在不犧牲去中心化和安全性的前提下,大幅提升吞吐效率。

3.使用 PoS 或 dPoS 機制。

dPoS算法如 EOS 很大程度上犧牲了去中心化,有不小的爭議。而 PoS 算法也存在股權集中、難以應對長程攻擊(Long Range Attack)等去中心化或安全性問題。

4.使用分片 (Sharding), 狀態通道 (State Channel) 等側鏈或鏈下解決方案。

其中一部分被有些人稱爲 Layer 2。 這些方案與 Conflux 目前的解決方案是正交的,它們在嘗試從另外一個角度解決吞吐率問題,對吞吐率的提升是能夠效果疊加或優點互補的。例如,提高全節點的吞吐率的技術能夠幫助使用分片技術的系統減小跨鏈交易所形成的性能瓶頸,也能夠完成更多的狀態通道結算交易。

第二部分:中本聰共識機制爲什麼吞吐率低下

爲何傳統的基於PoW的中本聰共識機制的吞吐率很是的低下?總結來講,爲了安全,不得不如此。

在公有鏈中,爲了能讓參與網絡協議的機器節點對交易的執行達成共識,礦工挖出區塊之後須要在P2P網絡中進行廣播,以便讓全部的機器得到一致的帳本結構。每一個礦工會根據最長鏈規則,選擇將新挖出的區塊接在它所看到的最長鏈的末尾。也就是全部誠實的節點,會共同延長這個最長的主鏈。這樣,若是惡意的節點沒有>50%的算力就不可能逆轉主鏈。

然而,若是網絡延遲比較大,使得一個新塊在產生之後還來不及傳播到全網就會有其餘的節點產生另外的新塊,就會在區塊鏈上產生了大量分叉。

下面讓咱們用一個圖片,來展現了發生分叉後區塊鏈帳本的樣子。

clipboard.png

這些分叉帶來兩個問題。第一,分叉的區塊最終被丟棄,這浪費了網絡和計算資源。第二,分叉同時也危害了安全性,若是大量誠實節點生成的區塊由於分叉被丟棄,攻擊者只須要少於50%的算力就能夠產生出惡意的最長鏈了。

所以,在比特幣或以太坊中,爲了保證安全性,它們須要保持一個很長的出塊時間(即很低的出塊速率),或者維持很小區塊大小以減少區塊在網絡中廣播的延遲,以此來減小分叉出現的頻率,但同時也所以大大下降了系統的吞吐率。

提升吞吐率會引起分叉,而不一樣分叉上的兩個區塊是競爭關係。它們爭奪後續挖出的確認區塊,來讓本身所在的分支成爲最長鏈,失敗者則被丟棄。誠實節點挖出來的區塊之間這種無心義的競爭,爲攻擊者帶來了可乘之機。爲了提升安全性,比特幣選擇了下降出塊速度,儘可能避免這種狀況出現。

那麼,若是咱們選擇了另外一個思路,即經過容許每一個區塊選擇多個區塊做爲本身的父親或祖先,哪怕在出塊速度很快的時候,也能夠避免誠實區塊之間無心義的競爭。這樣,就繞開了中本聰共識中安全與效率兩難的困境。

在這種思路下,整個網絡將構成有向無環圖結構(DAG)。下一步要考慮的是,不一樣的區塊中的交易,應該以什麼順序執行?這時,咱們經過設計一個安全的有向無環圖拓撲排序算法,每一個節點只須要在本身本地的 DAG 上執行一遍這個算法,就能夠得到一個區塊的執行順序,這個算法應該保證:

·每一個挖礦的機器節點排出來的序應當是一致的。
·即便在遭遇雙花攻擊時,這個順序也不可被更改。

稍後,我將以 Conflux 爲例,來看一下怎麼樣設計這個安全的拓撲排序算法。

DAG 技術有不少了,好比說 Spectre和 Phantom 算法,這是設計思路與咱們最接近的算法,都是採用 DAG 角度優化 PoW 鏈的效率。但遺憾的是,Spectre 沒法對全部區塊排一個序出來,這致使它上面沒法跑智能合約。而Phantom 被咱們發現有漏洞。

同時,還有一些基於 DAG 的算法,與今天講的內容相比,形似但非神似,好比說雪崩共識,Hashgraph. 這些算法本質上都是聯盟鏈的算法。與經過「股權質押」的方式,將聯盟鏈算法轉換成PoS 公鏈算法。但聯盟鏈轉換成PoS公鏈算法的過程存在安全性問題。比較爲人熟知的一些針對PoS的攻擊有,無利害攻擊(Nothing-at-Stake Attack)和長程攻擊(Long-Range Attack)。

第三部分:使用PoW+DAG提升區塊鏈吞吐量實例分析-Conflux 的機制設計

接下來咱們以Conflux爲例,具體從技術細節的角度看一下,利用DAG提升吞吐量的思路是怎麼實現的。

在Conflux中,每一個區塊包含兩種邊,父邊和引用邊。父邊和引用邊共同構成一個有向無環圖。去掉引用邊,全部父邊又構成了一棵樹。在挖礦環節,礦工要監聽 P2P 網絡中廣播的區塊,並在本地維護一個有向無環圖結構的區塊帳本。礦工在挖礦時,新區塊父邊和引用邊的選擇,須要遵循如下的規則:

clipboard.png

1.在父邊構成的樹中,依據 Ghost 規則選擇一條主鏈。具體來講,從創世塊開始,迭代地去從孩子區塊中選擇下一個在主鏈上的區塊。選擇的規則是挑選擁有最大子樹的孩子區塊。新區塊的父邊,應當指向主鏈中最後一個區塊。

2.此外,對於那些既沒有父邊,也沒有引用邊指向的區塊,咱們稱爲「葉子區塊」,新區塊的引用邊要指向全部剩下的葉子區塊。

有了這些邊的定義,這個帳本結構就定下來了,區塊被廣播後,全部的節點最終都會獲得一個結構一致的有向無環圖,即一個一致的帳本。

那麼有了一致的帳本之後,全部的節點如何去決定一個安全的、一致的區塊排序呢?咱們的核心想法是,首先,這些節點先在DAG中決定一個一致的主鏈,而後,再根據這個主鏈來決定一個一致的區塊的排序。

下面,讓咱們用一個例子來看下如何決定一個一致的區塊排序。

clipboard.png

主鏈的選取一樣遵循 Ghost 規則,剛剛在選父邊的時候我提到過這個規則。咱們根據這一規則,咱們將區塊C,E,H,都選進了主鏈。

根據咱們剛剛講的選邊規則。新區塊的父邊應當指向 H, 同時 K 是葉子區塊。因此新區塊的引用邊應當指向 K.(注意:H 的引用邊指向了 G, 因此 G 不是葉子區塊)。

如今咱們有了讓全部節點對主鏈產生共識的機制。那接下來,這些節點如何對區塊的全序達成共識呢?爲了作到這一點,咱們引入一個Epoch的概念。在主鏈上的每個區塊就肯定了一個Epoch。在分叉上的區塊屬於哪一個Epoch,是由第一個產生在它以後的主鏈區塊所在的Epoch決定的。好比,區塊D屬於Epoch E,由於D最早被E引用,因此產生在E以前,可是D並不產生在C以前。按照這個規則,咱們能夠獲得一個一致的排序,以下圖所示。

clipboard.png

因此,在Conflux中,咱們首先按照Epoch的順序來給區塊排個序。而後在每個Epoch內部,咱們再按照拓撲排序來肯定區塊的順序。若是出現平局的狀況,咱們再根據區塊的哈希值來打破平局。因此這個圖中的區塊排好序之後就是這樣的。接下來咱們要爲交易排序,Conflux首先按照區塊的順序去給交易排序。而後在每一個區塊內部,咱們就按照交易在區塊裏所在的位置來排就能夠了。

最後,咱們來看一下,交易若是發生重複或衝突怎麼解決。咱們再用一個例子來解釋一下:

clipboard.png

這個例子裏面的交易2和交易3發生了衝突。由於交易2執行過之後,帳戶X裏面就沒有足夠的餘額來完成交易3了,由於在這個交易的全序裏面,交易3是發生在交易2以後的,因此咱們會讓交易3變爲無效。另外一種狀況是,相同的交易有可能被不一樣的節點打包到不一樣的併發區塊裏,好比交易4。在這種狀況下,Conflux只會接受在全序中出現的第一個這樣的交易,而把後面的重複交易無效掉。

問答環節:

Q1:Conflux 如何與PoS 公鏈項目對比?

A1:咱們都知道,保證安全性是公鏈系統最核心的要求,由於公鏈自己就是在構建一個可信的系統。PoS雖然減小了PoW中挖礦所須要消耗的資源,但同時它也引入了不少新的攻擊情形和安全性威脅,並且目前沒有很完美的解決方案。比較爲人熟知的一些針對PoS的攻擊有,無利害攻擊(Nothing-at-Stake Attack)和長程攻擊(Long-Range Attack)。出於這個緣由,Conflux堅持採用基於POW的共識機制,經過引入DAG的技術來打破共識機制的性能瓶頸。這是咱們原型測試系統實際跑出來的結果。

Q2: Conflux 一筆交易能多久確認?

A2: 在沒有壞人攻擊的狀況下,5s 一個 4MB 大小的區塊,確認時間約 8 分鐘。在有 30% 算力攻擊的狀況下,確認時間約 16 分鐘。

Q3:Conflux的TPS能跑到多少 ?

A3:在談論和對比 TPS 的時候,咱們須要注意區分測試 TPS 的實驗設定。例如在比特幣中,每個區塊都須要廣播給全部礦工,每一筆交易都被全部人驗證過,咱們稱之爲一個交易獲得的「全節點驗證」。在一些 Sharding方案的實驗中,全部的交易被分紅 30 份, 每一個節點可能只驗證其中一份。這樣的交易稱爲「部分節點驗證」。很顯然,「部分節點驗證」交易的總 TPS 是能夠成倍於 「全節點驗證」 的。

Conflux 在共識層面能夠作到 4000-6000 TPS 的「全節點驗證」, 若是考慮合約執行、狀態讀寫等因素,實際部署可能會低一些。Sharding 技術是共識層技術一個很好的補充,Conflux 有計劃在將來實現 Sharding, 提供更高的 「部分節點驗證」 TPS, 爲用戶提供多種選擇。

Q4: Conflux的roadmap和相關時間計劃是怎樣的?

A4: 咱們計劃在春節後測試網上線,預計明年Q3主網上線。

Q5:Conflux會有代幣發行嗎?仍是挖礦?

A5:Conflux沒有ERC20,主網上線以後會有挖礦。

Q6: 那這裏會不會涉及到PoW,或者挖礦的算力? 另外這裏的主要難點是什麼?面臨的主要技術問題是什麼?

A6: Conflux 是基於中本聰共識作的改進,是一個PoW 共識機制,固然會有挖礦。

這裏主要的難點是爲DAG的帳本設計高效的一致的排序算法。這個算法要能保證好人之間達成一致,還可以抵抗各類複雜的攻擊情形。

Q7: Conflux是如何預防雙花攻擊的?

A7: 這個問題回答起來比較複雜,先來看一個圖

clipboard.png

在這個圖中,咱們首先來看一下一個攻擊者如何可以逆轉在帳本中的一個交易,好比交易4。爲了作到這一點,一個攻擊者須要產生一個交易4的雙花交易,打包到一個區塊裏面,而且將這個區塊在區塊的全序中插入到區塊B的前面。

但攻擊者很難作到這一點,主要有兩個緣由。第一個就是除非攻擊者可以改變主鏈,否則他不可以逆轉交易,由於交易的順序是由主鏈來決定的。好比一個攻擊者想把一個塊插在靠前的位置,他能作就是在一個很早的Epoch裏面的區塊後面接着產生新塊。可是隻要這個塊不在主鏈上,它就最終仍是會屬於一個很晚的Epoch。由於當一個誠實的新塊產生之後,它會經過引用邊把這個攻擊者的區塊給拉到新的Epoch裏面。

第二個緣由就是,若是攻擊者沒有超過50%的算力,他就沒有辦法改變主鏈。

Q8: Conflux的CTPS有測試數據嗎?

A8: CTPS是指確認交易的TPS。咱們實驗中測出來的TPS實際上就是確認交易的TPS。大概在4000~6000。

Q9: 挖礦的話,對於挖礦設備具體有什麼要求呢?

A9: 咱們會選擇GPU友好的POW算法,因此使用GPU設備就能夠了。

clipboard.png

相關文章
相關標籤/搜索