讓POW的共識機制再也不成爲公鏈系統吞吐率的瓶頸

Conflux項目的CTO 伍鳴在Odaily星球日報與36Kr集團共同主辦的2018 P.O.D New BlockTrend新區勢區塊鏈峯會上就《Scaling Nakamoto Consensus to Thousands of Transactions per Second》(將中本聰共識的吞吐率提高到每秒數千次交易)發表演講,對於基於POW機制的擴容提出了新看法。算法

伍鳴從中本聰共識機制的工做原理出發,指出簡單的在共識機制中增大區塊容量以及提升出塊率的方式並不可取,這兩種方式均會使區塊在網絡上傳播的延時相對變長,從而在帳本中產生不少分叉,不只浪費計算和網絡的資源,也危害了安全性。編程

對此,伍鳴介紹,Conflux利用區塊鏈中交易少衝突的特色,樂觀的處理併發塊,且將區塊經過父邊和引用邊組織成有向無環圖(DAG),同時創新的將Ghost規則和Epoch的概念相結合,從而使參與協議的機器節點可以在一致的帳本結構中決定一致的交易全序。Ghost規則保證的了主鏈的選擇沒法被逆轉,DAG和Epoch幫助肯定一致的交易全序。經過這樣的技術,Conflux可以在防治雙花攻擊的同時將分叉上的區塊變爲有效從而提高有效區塊的比例,進而可以將公鏈系統的吞吐率提高到每秒上千次交易,且可以在分鐘級別的延時內確認交易。在Conflux中,系統的吞吐率瓶頸已再也不是共識機制自己,而在於網絡帶寬以及每一個節點局部的計算處理能力。緩存


如下爲伍鳴博士的演講實錄:
安全

你們好,今天很高興有機會給你們介紹一下咱們的Conflux項目,它是一個創新的公鏈系統,它主要的優點特色是可以將基於工做量證實的中本聰共識機制的吞吐率提高到每秒上千條交易的量級。網絡

咱們先來看一下問題的背景。現現在,區塊鏈和數字貨幣在業界已經產生了至關大的影響力。也有愈來愈多的人開始關注它。以比特幣爲表明的區塊鏈技術已經發展成爲一能夠個在互聯網級別上支持安全的,一致的,分佈式的交易帳本的平臺。這個平臺進而帶動了金融科技,供應鏈,和醫療健康等應用領域的技術創新。全球的數字貨幣市場也支撐着千億美圓的市值。架構

然而,儘管如此,性能和效率問題仍然是現有的區塊鏈系統一個很大的痛點。這使得現有的區塊鏈的用戶體驗很糟糕,好比很長的處理延遲,以及高昂的交易費用。同時也限制了在區塊鏈系統上開發更有意義的應用的能力。咱們都知道,比特幣每秒能夠處理大概7個交易,以太坊是每秒30個交易。而像visa這樣的中心化的交易服務能夠支持每秒上千個交易的吞吐率。併發

咱們先來簡單的看一下比特幣中的共識機制是如何工做的。在這個協議裏面,交易是被打包到區塊裏面的。全部的區塊造成了一個鏈,這個鏈表示了交易的歷史紀錄。每個參與這個協議的機器節點都會想要去產生一個新的區塊並在該區塊裏打包新的交易,而且經過將前一個區塊的哈希值存入新區塊的頭部信息來將新區快鏈在區塊鏈的尾部。這個協議經過使用工做量證實以及最長鏈規則來讓全部的機器節點對區塊鏈的狀態達成共識。同時,它維持了一個很慢的全網的平均出塊率以及相對較小的區塊大小。app

假設圖中是一個區塊鏈的當前的狀態,假設一個攻擊者想要逆轉區塊n-2中的一個交易,他就會想要從區塊n-3後面引入一個分叉來使區塊n-2變得無效。可是與此同時,全部的誠實的節點都會遵循最長鏈規則從而將他們新產生出來的區塊鏈在最長鏈的尾部。因爲系統維持了很低的出塊率和較小的塊大小,網絡延遲相對於出塊時間來說是比較小的,因此這些誠實的節點所產生的區塊基本上就是順序的。這樣的話,只要誠實節點的總算力超過50%,攻擊者就不可以使他本身產生的鏈成爲最長鏈。分佈式


但有人接下來可能會問,是否是能夠經過增長出塊率或者增大區塊的大小來提升系統的吞吐率?簡單的在中本聰共識機制裏面這樣去作是有問題的。由於不管是增大塊的大小仍是增長出塊率都會使得區塊產生的時間和區塊在網絡上傳播的延遲相比變得相對較小。這就使得一個新塊在產生之後還來不及傳播到全網就會有其餘的節點產生另外的新塊,因而就在區塊鏈上產生了分叉。雖然整個系統最終會收斂到某一個最長的分叉上,可是出塊率和塊大小越大的話,分叉的狀況就會愈加嚴重,分叉也會進一步出如今已有的分叉上。因此最終區塊鏈的帳本就發展成這個樣子,就是有不少的分叉。post

這帶來兩個問題。第一,這些分叉浪費了網絡和計算資源,由於只有最長鏈中的區塊才被認爲是有效的。第二,它危害了安全性,由於整個區塊鏈裏的最長鏈變短了,這使得攻擊者只須要少於50%的算力就能夠產生出惡意的最長鏈了。


那接下來咱們來看一下Conflux是如何解決這個問題的?咱們注意到,在比特幣中的這種基於鏈的共識機制裏,它本質上對交易的執行順序有一個嚴格的限制,也就是交易的執行順序要和他們所在的區塊的產生的順序是一致的。好比在這個例子中,若是區塊1是在區塊0以後產生的,它隱含的意思是說,區塊1中的交易都要發生在區塊0的後面。一樣當區塊2產生在區塊0後面,它也隱含了相同的意思。因此假如後面的區塊3,4,5,鏈在了區塊1的後面,區塊2就會被丟掉,由於咱們沒法肯定它的交易應該怎麼去排序。

可是咱們若是仔細觀察的話,實際上區塊鏈的系統裏面,不少的交易是沒有衝突,因此它們能夠按任意的順序執行,只要全部的參與節點都贊成一個順序就能夠了。那麼基於這樣一個觀察,咱們Conflux的主要的核心想法就是這樣的。咱們首先樂觀的處理這些可能併發的區塊,而後咱們把這些區塊組織成有向無環圖,也就是DAG。接下來咱們讓全部的機器節點首先假設全部的交易相互之間都沒有衝突,從而決定一個一致的區塊順序。而後他們再根據區塊的順序進一步決定全部交易的執行順序,最後再依照這個交易的順序去解決交易的衝突問題。



接下來咱們用一個具體的例子來講明這個想法。假設這個圖上顯示的是Conflux的帳本在某一時刻的狀態。每一個區塊都有一個指向它的父親區塊的parent邊。那麼這些區塊和它們的parent邊,就構成了一個樹形結構。除了指向父親的邊之外,每個區塊還能夠有多個引用邊。這個引用邊主要是記錄和表達區塊之間的happens-before關係。好比,若是一個機器節點在產生區塊E的時候,它已經有了區塊D,並且這個時候,D也沒有任何一個其餘區塊引用了它。那麼這個節點能夠給E加上一個引用D的邊來表示D是在E以前產生的。

有了這些邊的定義,這個帳本結構就定下來了,這個結構會在全網節點進行廣播,因此,全部的節點最終都會獲得一個一致的帳本。那麼有了一致的帳本之後,全部的節點如何去決定一個一致的區塊全序呢?咱們的核心想法是,首先,這些節點先在DAG中決定一個一致的主鏈,而後,再根據這個主鏈來決定一個一致的區塊的全序。

爲了決定主鏈,Conflux使用了Ghost規則。具體來講就是,咱們從創世塊開始,迭代的去從孩子區塊中選擇下一個在主鏈上的區塊。選擇的規則是挑選擁有最大子樹的孩子區塊。好比,區塊A和區塊B是創世區塊的兩個孩子區塊。A的子樹有6個區塊,B的子樹有5個區塊。因此咱們選擇區塊A做爲緊接着創世區塊的主鏈區塊。相應的咱們根據相同的規則,將區塊C,E,H,都選進了主鏈。

爲了產生一個新的區塊,一個機器節點首先選擇主鏈上的最後一個區塊做爲新區塊的父親,而後這個新區塊再把全部已經收到但尚未被其餘區塊所引用的區塊引用起來。

這裏之因此使用Ghost規則而不是最長鏈規則來選主鏈,是由於Ghost規則中全部的區塊,包括那些在分叉上的區塊,都會對主鏈的選擇作出貢獻。這樣的話,就保證了只要攻擊者的算力沒有超過50%, 就沒法改變由誠實節點肯定的主鏈。


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

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


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


那麼接下來一個問題是Conflux如何可以防止雙花攻擊。咱們首先來看一下一個攻擊者如何可以逆轉在帳本中的一個交易,好比交易4。爲了作到這一點,一個攻擊者須要產生一個交易4的雙花交易,打包到一個區塊裏面,而且將這個區塊在區塊的全序中插入到區塊B的前面。但攻擊者很難作到這一點,主要有兩個緣由。第一個就是除非攻擊者可以改變主鏈,否則他不可以逆轉交易,由於交易的順序是由主鏈來決定的。好比一個攻擊者想把一個塊插在靠前的位置,他能作就是在一個很早的Epoch裏面的區塊後面接着產生新塊。可是隻要這個塊不在主鏈上,它就最終仍是會屬於一個很晚的Epoch。由於當一個誠實的新塊產生之後,它會經過引用邊把這個攻擊者的區塊給拉到新的Epoch裏面。

第二個緣由就是,若是攻擊者沒有超過50%的算力,他就沒有辦法改變主鏈。爲何是50%呢。我這裏給出一個直觀的解釋。假設區塊A是一個主鏈上的塊,一個攻擊者想要用區塊A’來取代A在主鏈上的位置。那麼全部攻擊者產生的塊都會在A’的子樹下面,然而全部誠實的節點所產生的塊都會在A的子樹下面,這樣的話,攻擊者就須要超過50%的算力才能讓A’的子樹超過A的子樹。根據理論的分析,A’可以取代A的機率是隨着時間的增長而指數降低的。


所以,一個交易的確認就包含如下幾步。用戶首先對攻擊者的算力比例以及他所能承受的風險有一個假設。給定這個假設,Conflux首先找到這個交易所屬的Epoch,而後找到和這個Epoch相應的主鏈區塊。最後再檢查這個主鏈區塊被逆轉的機率是否小於用戶所能承受的風險。若是小於,則該交易能夠確認。

這個圖歸納的展現了Conflux系統架構。 全部參加Conflux協議的機器節點由一個p2p的網絡鏈接起來,他們經過Gossip的方式在網絡中傳播交易和區塊。每一個機器節點,維護一個交易池,交易池裏面緩存着將要打包的交易。另外每一個機器節點同時也在不停的運行Conflux的共識協議。

接下來咱們再簡要的看一些實驗結果。咱們搭建了Conflux的一個原型系統,而後在Amazom EC2上運行1萬個Conflux節點來作實驗。爲了模擬公網上真實網絡環境,咱們限制每一個節點的網絡帶寬是20Mbps。在實驗中咱們調整不一樣的區塊大小和出塊率。咱們測量了系統的吞吐率和交易延遲,而且和比特幣以及Ghost的協議進行了比較。


這個藍色線是Conflux,能夠看到區塊越大、出塊率越高,Conflux的吞吐率就能夠線性的增長,可是比特幣和Ghost就作不到。這是由於這時比特幣和Ghost的區塊利用率會大幅降低。

最後總結一下。Conflux利用了優化處理併發區塊的想法,使得公鏈系統的吞吐率達到每秒上千次的交易,以及分鐘級別的確認時間。在Conflux的交易裏面,整個系統的吞吐率瓶頸已經不在共識機制上,而是在網絡帶寬或每一個節點的計算能力上。

謝謝。

本文部份內容經受權轉載自「36氪」和「Odaily星球日報」


點擊獲取本次演講PPT


Conflux在團隊成員的組成方面有着巨大的優點:團隊成員均有着專業的研究背景,豐富的從業經驗和編程大賽獲獎經歷。

Conflux是由中國惟一圖靈獎得到者姚期智教授所領導的團隊。姚期智院士是世界著名的計算機科學家。由於其對計算機理論研究的重要貢獻,包括基於複雜性的僞隨機數生成理論,密碼學和通訊複雜性,在2000年得到了圖靈獎。此外,包括聯合創始人,首席技術官,核心系統工程開發師,算法工程師等技術團隊成員,大部分都是「姚班」出來的。而且幾乎全部人都有國際信息學競賽,ACM-ICPC,Code Jam等編程大賽金牌的經歷。Conflux團隊在技術人員配置方面,有着無與倫比的優點。而在將來的發展中,還會不斷擴充壯大這一核心優點。


相關文章
相關標籤/搜索