從區塊鏈到DAG(三)--DAG共識之SPECTRE協議

承接上一篇結尾提出的問題,接下來的文章會着重介紹DAG的賬本共識SPECTRE協議。從上一篇(《從區塊鏈到DAG(二)--DAG的基本結構》)可以看出,DAG的整個網絡並不是線性的。SPECTRE協議順應了這種結構所以並沒有提出選擇主鏈的概念,而是着眼於解決衝突交易和防止惡意攻擊。這裏需要聲明一下,所有討論賬本共識有效有個大前提:網絡中大多數節點都是誠實的。我們不考慮集中超過51%算力的這種惡意攻擊,因爲無論用什麼賬本共識這樣的攻擊都會奏效。

 

 1.  SPECTRE如何解決衝突交易

SPECTRE通過區塊間的投票來排除衝突的交易,如圖1。

圖片1 一個簡單的DAG網絡的投票過程

來源:Yonatan Sompolinsky, Yoad Lewenberg, and Aviv Zohar,《SPECTRE:Serialization of Proof-of-work Events: Confifirming Transactions viaRecursive Elections》

 

區塊X裏記錄的交易信息是交易x先於交易y發生,記爲x<y ;區塊Y裏記錄的交易信息是交易y先於交易x發生,記爲y<x,這兩個交易相互衝突。

投票過程:

區塊X和區塊Y分別投票給自己。

區塊X之後產生的區塊我們稱之爲X的未來區塊,回溯這些未來區塊發現6,7,8只能回溯到X,所以這三個區塊都投票給X,標記爲藍色。同理,回溯區塊Y的未來區塊發現9,10,11只能投票給Y,標記爲紅色。

未來區塊12既回溯到X又能回溯到Y,它會投出與上一輪投票一樣的結果X。圖中虛線部分是上一輪的投票,按少數服從多數的原則可知,投票的結果是X。

X或Y之前產生的區塊我們稱爲X或Y的過去區塊,這些區塊會分別統計自己對應的未來區塊的投票,然後跟投給得票較多的那個選項。由此,區塊1~5都投給X,交易x<y認定有效,y<x被丟棄。

 

 2.  “最長鏈共識”與SPECTRE的關係

圖片2展示了當SPECTRE應用在區塊鏈結構上的情況。

圖片2:SPECTRE在“單鏈”上的應用

來源:Yonatan Sompolinsky, Yoad Lewenberg, and Aviv Zohar,《SPECTRE:Serialization of Proof-of-work Events: Confifirming Transactions viaRecursive Elections》

 

從“最長鏈共識”來看,鏈5->6->7->8長於9->10->11,所以藍色區塊會被選入賬本。

現在我們換個思考方式,按照SPECTRE的原則對兩筆衝突交易投票,比如6<10和10<6:

區塊6,7,8投給6<10,因爲6投給自己,6的未來區塊7、8只能回溯到6。6的過去區塊5根據自己的未來區塊投票,5的未來區塊有6、7、8都投票給6<10,所以5也投票給6<10。以此類推,區塊9~11都會投給10<6。

區塊1~4都是6和10的過去區塊。以4爲例,它的未來區塊中5、6、7、8投票給6<10, 9、10、11投票給10<6,投給6<10的票數更多,所以4也會投票給6<10。同理,剩下的1~3也會投給6<10。最終投給6<10的區塊佔多數,投給10<6的區塊被棄用,10<6被判斷爲無效信息。

從上述分析可以看出,SPECTRE和“最長鏈共識” 能夠得到一個一致的結果。“最長鏈共識”其實就是SPECTRE在區塊鏈結構下的簡化版,SPECTRE是“最長鏈共識”在DAG結構下的拓展。在瞭解了SPECTRE的投票機制可以解決衝突交易後,我們來看看這種賬本共識要怎麼解決“雙花”攻擊和censorship攻擊。

 

 3.  “雙花”攻擊

圖片3展示了一次不成功的“雙花”攻擊,這種攻擊一共分爲三個階段。

圖片3 一次不成功的“雙花”攻擊

來源:Yonatan Sompolinsky, Yoad Lewenberg, and Aviv Zohar,《SPECTRE:Serialization of Proof-of-work Events: Confifirming Transactions viaRecursive Elections》

 

在第一階段攻擊者祕密準備了一個區塊Y,Y包含了交易y<x。而後攻擊者繼續祕密生產區塊13和14,這些新生產的區塊一定會引用攻擊區塊,但是其中的一部分也會引用誠實節點的區塊,例如13;目的是爲了在後續的投票過程中“策反”這些誠實區塊使他們投票給Y,比如誠實區塊4,在第一階段結束時4的未來區塊只有13,14,4會投票給Y。但是這種“策反”在SPECTRE的投票規則裏是無效的,因爲誠實節點總是比做惡的節點多,總體上看誠實節點的出塊效率會高於做惡節點,所以即使短時間內“策反”成功了,在後續過程中還是可以給修正回來。

第二階段開始後,正常的交易x<y被記錄在區塊X中,攻擊者的目的是等x<y被幾個區塊確認納入賬本以後,把通過這比交易獲得的代幣兌換成法幣或者某種服務牟利;而後再釋放出自己的攻擊區塊,使整個賬本回滾並認定x<y這筆交易被無效,回滾後原本已經轉出兌換的代幣又重新回到自己的賬戶,可以反覆使用,即“雙花”(同一筆錢花掉兩次)。

但是在SPECTRE投票中這種攻擊是不會成功的。在第二階段攻擊者繼續祕密生產區塊15、16、17,誠實節點由於不知道這些祕密區塊所以誠實節點產生的區塊不會引用它們。

在第三階段,攻擊者繼續生產區塊並把之前祕密生產的所有區塊上傳到網絡中,企圖讓自己的攻擊區塊合法化,回滾整個賬本。此時分析圖片可知:

Y的未來區塊13~19只能回溯到Y故而投票給Y。

X的未來區塊6~10只能回溯到X,故而投票給X。X的過去區塊1~5分別通過統計各自的未來區塊,可以得出大部分未來區塊都投的X,所以它們也會跟投X。區塊4在第一階段被“策反”的投票正是在這裏給修正了回來,因爲在4的16個未來區塊中,有9個投給X(區塊X加上區塊5~12),比投給Y的7個多(區塊13~19),所以4最終會投票給X。

區塊11和12既能回溯到X又能回溯到Y,所以他們分別投出與前一輪投票一致的結果,根據少數服從多數的原則,前一輪投票也是投給X的區塊佔大多數,所以11、12最終也會投給X。

綜合所有區塊的投票,投給X的佔絕大多數,最終賬本會記錄x<y而拋棄y<x,”雙花“攻擊沒有奏效。

 

 4.  censorship攻擊

相比廣爲熟知的“雙花”攻擊,censorship 攻擊(審查攻擊)要顯的陌生很多。與“雙花”攻擊不同,censorship的攻擊者會持續的產生區塊並立刻把這些區塊在網絡中公開,見圖片4。

圖片4 一次不成功的censorship攻擊

來源:Yonatan Sompolinsky, Yoad Lewenberg, and Aviv Zohar,《SPECTRE:Serialization of Proof-of-work Events: Confifirming Transactions viaRecursive Elections》

 

在當前階段,攻擊者持續產生區塊12~16,但是這些區塊和區塊X是沒有關聯的,它們即不會引用X,也不會回溯到X;這意味着這些區塊將來是有可能被“策反”投票給Y的。

在未來的某個時刻,攻擊者上傳一個包含衝突交易的區塊Y,Y的未來區塊都會投票給Y,例如17、18。而與X不相關的過去區塊16這時候會被“策反”投票給Y,因爲16的大部分未來區塊也都投票給了Y。那些與X不相關的、有“策反”可能的區塊降低了網絡的安全性,誠實的礦工在驗證交易時會發現網絡中有很多與X無關的區塊,這會使X這筆交易的可信度降低,可能會增加確認交易的時間。因爲無論是區塊鏈還是DAG,新的交易都需要引用過去的交易來完成驗證(通過區塊頭記錄的哈希值來引用之前的區塊),這些過去的交易得是可以信任的。(參考《從區塊鏈到DAG(二)--DAG的基本結構》)

在SPECTRE的投票規則中,就算面對censorship攻擊,交易也可以立刻得到確認。16~18都投票給Y。區塊2~9都是隻能回溯到X的區塊,所以它們投票給X。區塊1,12~15都投票給X,因爲分別統計它們各自所屬的未來區塊的投票,都是投給X的佔多數。區塊10和11既能回溯到X又能回溯到Y,按照上一次投票的結果跟投,以少數服從多數原則可知它們都會投票給X。最終投給X的區塊更多,攻擊失效。

 

 5.  SPECTRE的不足之處

從上面的分析可以看出,SPECTRE可以很好的排除衝突交易,抵禦攻擊。如果一個項目只是向比特幣一樣用作支付作用的話,SPECTRE已經足夠。但是如果要集成智能合約功能SPECTRE就無法勝任了,因爲它只能對沖突交易做一個相對排序(判斷衝突交易間的先後順序),但無法給所有的區塊做一個絕對排序。

智能合約的語言得是圖靈完備的,就像我們編寫一段計算機程序一樣,需要按嚴格的順序執行各種運算,所以具備智能合約功能的網絡都有一個特徵:網絡中的交易可以按時間先後做線性排序(時序性)。

但爲什麼區塊鏈的賬本共識沒有考慮時序性排序?因爲區塊鏈的底層賬本結構天然的帶有時序屬性。區塊鏈結構不允許分叉,每個區塊一定要等前一個區塊被確認以後才能加入賬本(具體內容參考《從區塊鏈到DAG(一)--區塊鏈的賬本結構和共識機制》),所以一條鏈上的區塊和這些區塊所記錄的交易自然而然的就能按時間先後排出順序。區塊鏈的賬本共識只需專注考慮如何排除衝突交易和防止惡意攻擊即可。

圖片5 本系列文章提煉的幾個概念之間的關係

 

如圖片5所示,底層賬本結構和共識機制是組成主網的兩大要素,而時序性是智能合約功能的必備要求。對區塊鏈來說,時序性被天然的集成在了底層賬本的鏈式結構中;但是對允許分叉的DAG來說,時序性只能通過賬本共識來實現。SPECTRE無法用作智能合約正是因爲它沒有時序性,下一篇將介紹一種可以滿足時序性要求的DAG共識。

 

參考資料:

[1] GHOST, DAG, SPECTRE, PHANTOM和CONFLUX技術原理,https://www.jianshu.com/p/8734e06d558f

[2] Yonatan Sompolinsky, Yoad Lewenberg, and Aviv Zohar,SPECTRE:

Serialization of Proof-of-work Events: Confifirming Transactions via

Recursive Elections

 

————  e n d ————

 

 

歷史文章

 

希望大家可以關注微信公衆號更加方便交流。公衆號的文章也會率先更新~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章