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

Conflux中文社群發表於2019-03-04

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這樣的中心化的交易服務可以支援每秒上千個交易的吞吐率。

我們先來簡單的看一下比特幣中的共識機制是如何工作的。在這個協議裡面,交易是被打包到區塊裡面的。所有的區塊形成了一個鏈,這個連結串列示了交易的歷史紀錄。每一個參與這個協議的機器節點都會想要去產生一個新的區塊並在該區塊裡打包新的交易,並且通過將前一個區塊的雜湊值存入新區塊的頭部資訊來將新區快鏈在區塊鏈的尾部。這個協議通過使用工作量證明以及最長鏈規則來讓所有的機器節點對區塊鏈的狀態達成共識。同時,它維持了一個很慢的全網的平均出塊率以及相對較小的區塊大小。

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

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

但有人接下來可能會問,是不是可以通過增加出塊率或者增大區塊的大小來提高系統的吞吐率?簡單的在中本聰共識機制裡面這樣去做是有問題的。因為不論是增大塊的大小還是增加出塊率都會使得區塊產生的時間和區塊在網路上傳播的延遲相比變得相對較小。這就使得一個新塊在產生以後還來不及傳播到全網就會有其他的節點產生另外的新塊,於是就在區塊鏈上產生了分叉。雖然整個系統最終會收斂到某一個最長的分叉上,但是出塊率和塊大小越大的話,分叉的情況就會越發嚴重,分叉也會進一步出現在已有的分叉上。所以最終區塊鏈的賬本就發展成這個樣子,就是有很多的分叉。

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

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

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

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


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

接下來我們用一個具體的例子來說明這個想法。假設這個圖上顯示的是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%, 就無法改變由誠實節點確定的主鏈。

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

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

所以,在Conflux中,我們首先按照Epoch的順序來給區塊排個序。然後在每一個Epoch內部,我們再按照拓撲排序來確定區塊的順序。如果出現平局的情況,我們再根據區塊的雜湊值來打破平局。所以這個圖中的區塊排好序以後就是這樣的。接下來我們要為交易排序,Conflux首先按照區塊的順序去給交易排序。然後在每個區塊內部,我們就按照交易在區塊裡所在的位置來排就可以了。

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

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

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


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

那麼接下來一個問題是Conflux如何能夠防止雙花攻擊。我們首先來看一下一個攻擊者如何能夠逆轉在賬本中的一個交易,比如交易4。為了做到這一點,一個攻擊者需要產生一個交易4的雙花交易,打包到一個區塊裡面,並且將這個區塊在區塊的全序中插入到區塊B的前面。但攻擊者很難做到這一點,主要有兩個原因。第一個就是除非攻擊者能夠改變主鏈,不然他不能夠逆轉交易,因為交易的順序是由主鏈來決定的。比如一個攻擊者想把一個塊插在靠前的位置,他能做就是在一個很早的Epoch裡面的區塊後面接著產生新塊。但是隻要這個塊不在主鏈上,它就最終還是會屬於一個很晚的Epoch。因為當一個誠實的新塊產生以後,它會通過引用邊把這個攻擊者的區塊給拉到新的Epoch裡面。

第二個原因就是,如果攻擊者沒有超過50%的算力,他就沒有辦法改變主鏈。為什麼是50%呢。我這裡給出一個直觀的解釋。假設區塊A是一個主鏈上的塊,一個攻擊者想要用區塊A’來取代A在主鏈上的位置。那麼所有攻擊者產生的塊都會在A’的子樹下面,然而所有誠實的節點所產生的塊都會在A的子樹下面,這樣的話,攻擊者就需要超過50%的算力才能讓A’的子樹超過A的子樹。根據理論的分析,A’能夠取代A的概率是隨著時間的增加而指數下降的。

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

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

這個圖概括的展示了Conflux系統架構。 所有參加Conflux協議的機器節點由一個p2p的網路連線起來,他們通過Gossip的方式在網路中傳播交易和區塊。每個機器節點,維護一個交易池,交易池裡面快取著將要打包的交易。另外每個機器節點同時也在不停的執行Conflux的共識協議。

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

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

這個藍色線是Conflux,可以看到區塊越大、出塊率越高,Conflux的吞吐率就可以線性的增加,但是比特幣和Ghost就做不到。這是因為這時比特幣和Ghost的區塊利用率會大幅下降。

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

謝謝。

本文部分內容經授權轉載自“36氪”和“Odaily星球日報”


點選獲取本次演講PPT


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

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


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


相關文章