Genaro 創始人 Larry:如何設計可持續發展的共識算法 ?

知識庫 技術 劉昱Larry 2018-07-25

2018 年以來,沉澱了多年的區塊鏈技術終於大火,而大家對於區塊鏈的理解依然停留在分佈式賬本上。分佈式賬本,不可篡改,可以說是區塊鏈最原始的特性,目前的公鏈技術可以承載更多類型的應用,對於區塊鏈的理解也可以圍繞多個角度展開,我們先從技術本質的角度來理解究竟什麼是區塊鏈。

2018 年以來,沉澱了多年的區塊鏈技術終於大火,而大家對於區塊鏈的理解依然停留在分佈式賬本上。分佈式賬本,不可篡改,可以說是區塊鏈最原始的特性,目前的公鏈技術可以承載更多類型的應用,對於區塊鏈的理解也可以圍繞多個角度展開,我們先從技術本質的角度來理解究竟什麼是區塊鏈。

file

區塊鏈是一種存儲數據的方式,其本質就是一個狀態機和一個數據庫。

1 . 狀態機:表示狀態及其轉移的機器

狀態,可認為是系統當前各方面指標的值,狀態機則是指發生了一些條件,當前狀態被改變到下一個狀態。比如我當前的狀態是口袋裡有十塊錢,給早點老闆了五塊錢,到達下一個狀態:口袋剩餘五塊錢。

對於比特幣來說:是交易賬單的狀態轉移。

2018 年以來,沉澱了多年的區塊鏈技術終於大火,而大家對於區塊鏈的理解依然停留在分佈式賬本上。分佈式賬本,不可篡改,可以說是區塊鏈最原始的特性,目前的公鏈技術可以承載更多類型的應用,對於區塊鏈的理解也可以圍繞多個角度展開,我們先從技術本質的角度來理解究竟什麼是區塊鏈。

file

區塊鏈是一種存儲數據的方式,其本質就是一個狀態機和一個數據庫。

1 . 狀態機:表示狀態及其轉移的機器

狀態,可認為是系統當前各方面指標的值,狀態機則是指發生了一些條件,當前狀態被改變到下一個狀態。比如我當前的狀態是口袋裡有十塊錢,給早點老闆了五塊錢,到達下一個狀態:口袋剩餘五塊錢。

對於比特幣來說:是交易賬單的狀態轉移。

file

對於以太坊來說,智能合約允許更為複雜的狀態轉移規則,可以在觸發條件滿足的情況下,按照約定的規則進行狀態轉移。

2018 年以來,沉澱了多年的區塊鏈技術終於大火,而大家對於區塊鏈的理解依然停留在分佈式賬本上。分佈式賬本,不可篡改,可以說是區塊鏈最原始的特性,目前的公鏈技術可以承載更多類型的應用,對於區塊鏈的理解也可以圍繞多個角度展開,我們先從技術本質的角度來理解究竟什麼是區塊鏈。

file

區塊鏈是一種存儲數據的方式,其本質就是一個狀態機和一個數據庫。

1 . 狀態機:表示狀態及其轉移的機器

狀態,可認為是系統當前各方面指標的值,狀態機則是指發生了一些條件,當前狀態被改變到下一個狀態。比如我當前的狀態是口袋裡有十塊錢,給早點老闆了五塊錢,到達下一個狀態:口袋剩餘五塊錢。

對於比特幣來說:是交易賬單的狀態轉移。

file

對於以太坊來說,智能合約允許更為複雜的狀態轉移規則,可以在觸發條件滿足的情況下,按照約定的規則進行狀態轉移。

file

講個程序員冷笑話:

老婆給當程序員的老公打電話:“下班順路買一斤包子帶回來,如果看到賣西瓜的,買一個。” 當晚,程序員老公手捧一個包子進了家門。。。 老婆怒道:“你怎麼就買了一個包子?!” 老公答曰:“因為看到了賣西瓜的。”

這個智能合約的條件是:“是否看到賣西瓜的”。狀態轉移規則是:如果沒看到,買一斤包子,如果看到了,買一個包子。狀態的轉移是:程序員由本來買一斤包子的狀態,因為觸發了“看到了賣西瓜的”這個條件,轉變為只買一個包子。

對於 Genaro Network 而言,還要再複雜一點,因為牽扯到網絡中數據存儲導致的狀態改變:

2018 年以來,沉澱了多年的區塊鏈技術終於大火,而大家對於區塊鏈的理解依然停留在分佈式賬本上。分佈式賬本,不可篡改,可以說是區塊鏈最原始的特性,目前的公鏈技術可以承載更多類型的應用,對於區塊鏈的理解也可以圍繞多個角度展開,我們先從技術本質的角度來理解究竟什麼是區塊鏈。

file

區塊鏈是一種存儲數據的方式,其本質就是一個狀態機和一個數據庫。

1 . 狀態機:表示狀態及其轉移的機器

狀態,可認為是系統當前各方面指標的值,狀態機則是指發生了一些條件,當前狀態被改變到下一個狀態。比如我當前的狀態是口袋裡有十塊錢,給早點老闆了五塊錢,到達下一個狀態:口袋剩餘五塊錢。

對於比特幣來說:是交易賬單的狀態轉移。

file

對於以太坊來說,智能合約允許更為複雜的狀態轉移規則,可以在觸發條件滿足的情況下,按照約定的規則進行狀態轉移。

file

講個程序員冷笑話:

老婆給當程序員的老公打電話:“下班順路買一斤包子帶回來,如果看到賣西瓜的,買一個。” 當晚,程序員老公手捧一個包子進了家門。。。 老婆怒道:“你怎麼就買了一個包子?!” 老公答曰:“因為看到了賣西瓜的。”

這個智能合約的條件是:“是否看到賣西瓜的”。狀態轉移規則是:如果沒看到,買一斤包子,如果看到了,買一個包子。狀態的轉移是:程序員由本來買一斤包子的狀態,因為觸發了“看到了賣西瓜的”這個條件,轉變為只買一個包子。

對於 Genaro Network 而言,還要再複雜一點,因為牽扯到網絡中數據存儲導致的狀態改變:

file

2 . 數據庫:是按照數據結構來組織、存儲、管理數據的倉庫

數據結構:計算機存儲數據的方式,常見的基本數據結構有隊列、堆棧、鏈表、樹、圖等等。對於複雜系統,其數據結構也都是由基本的數據結構組合改編而成。

在區塊鏈中,數據結構採用的是一個鏈表,鏈表的每個節點就是一個區塊,一個區塊是一顆梅克爾樹,包含了若干交易記錄。

  • 鏈表

2018 年以來,沉澱了多年的區塊鏈技術終於大火,而大家對於區塊鏈的理解依然停留在分佈式賬本上。分佈式賬本,不可篡改,可以說是區塊鏈最原始的特性,目前的公鏈技術可以承載更多類型的應用,對於區塊鏈的理解也可以圍繞多個角度展開,我們先從技術本質的角度來理解究竟什麼是區塊鏈。

file

區塊鏈是一種存儲數據的方式,其本質就是一個狀態機和一個數據庫。

1 . 狀態機:表示狀態及其轉移的機器

狀態,可認為是系統當前各方面指標的值,狀態機則是指發生了一些條件,當前狀態被改變到下一個狀態。比如我當前的狀態是口袋裡有十塊錢,給早點老闆了五塊錢,到達下一個狀態:口袋剩餘五塊錢。

對於比特幣來說:是交易賬單的狀態轉移。

file

對於以太坊來說,智能合約允許更為複雜的狀態轉移規則,可以在觸發條件滿足的情況下,按照約定的規則進行狀態轉移。

file

講個程序員冷笑話:

老婆給當程序員的老公打電話:“下班順路買一斤包子帶回來,如果看到賣西瓜的,買一個。” 當晚,程序員老公手捧一個包子進了家門。。。 老婆怒道:“你怎麼就買了一個包子?!” 老公答曰:“因為看到了賣西瓜的。”

這個智能合約的條件是:“是否看到賣西瓜的”。狀態轉移規則是:如果沒看到,買一斤包子,如果看到了,買一個包子。狀態的轉移是:程序員由本來買一斤包子的狀態,因為觸發了“看到了賣西瓜的”這個條件,轉變為只買一個包子。

對於 Genaro Network 而言,還要再複雜一點,因為牽扯到網絡中數據存儲導致的狀態改變:

file

2 . 數據庫:是按照數據結構來組織、存儲、管理數據的倉庫

數據結構:計算機存儲數據的方式,常見的基本數據結構有隊列、堆棧、鏈表、樹、圖等等。對於複雜系統,其數據結構也都是由基本的數據結構組合改編而成。

在區塊鏈中,數據結構採用的是一個鏈表,鏈表的每個節點就是一個區塊,一個區塊是一顆梅克爾樹,包含了若干交易記錄。

  • 鏈表

file

  • 區塊(梅克爾樹結構)

2018 年以來,沉澱了多年的區塊鏈技術終於大火,而大家對於區塊鏈的理解依然停留在分佈式賬本上。分佈式賬本,不可篡改,可以說是區塊鏈最原始的特性,目前的公鏈技術可以承載更多類型的應用,對於區塊鏈的理解也可以圍繞多個角度展開,我們先從技術本質的角度來理解究竟什麼是區塊鏈。

file

區塊鏈是一種存儲數據的方式,其本質就是一個狀態機和一個數據庫。

1 . 狀態機:表示狀態及其轉移的機器

狀態,可認為是系統當前各方面指標的值,狀態機則是指發生了一些條件,當前狀態被改變到下一個狀態。比如我當前的狀態是口袋裡有十塊錢,給早點老闆了五塊錢,到達下一個狀態:口袋剩餘五塊錢。

對於比特幣來說:是交易賬單的狀態轉移。

file

對於以太坊來說,智能合約允許更為複雜的狀態轉移規則,可以在觸發條件滿足的情況下,按照約定的規則進行狀態轉移。

file

講個程序員冷笑話:

老婆給當程序員的老公打電話:“下班順路買一斤包子帶回來,如果看到賣西瓜的,買一個。” 當晚,程序員老公手捧一個包子進了家門。。。 老婆怒道:“你怎麼就買了一個包子?!” 老公答曰:“因為看到了賣西瓜的。”

這個智能合約的條件是:“是否看到賣西瓜的”。狀態轉移規則是:如果沒看到,買一斤包子,如果看到了,買一個包子。狀態的轉移是:程序員由本來買一斤包子的狀態,因為觸發了“看到了賣西瓜的”這個條件,轉變為只買一個包子。

對於 Genaro Network 而言,還要再複雜一點,因為牽扯到網絡中數據存儲導致的狀態改變:

file

2 . 數據庫:是按照數據結構來組織、存儲、管理數據的倉庫

數據結構:計算機存儲數據的方式,常見的基本數據結構有隊列、堆棧、鏈表、樹、圖等等。對於複雜系統,其數據結構也都是由基本的數據結構組合改編而成。

在區塊鏈中,數據結構採用的是一個鏈表,鏈表的每個節點就是一個區塊,一個區塊是一顆梅克爾樹,包含了若干交易記錄。

  • 鏈表

file

  • 區塊(梅克爾樹結構)

file

這實際上是雙層結構。區塊鏈之所以採用這樣的“雙層”數據結構,是因為每個區塊內的交易相當於是並行,多筆交易被包含在一個區塊中,增加了區塊大小,在出塊速度一定的情況下,增加了區塊數據量,從而提高系統的性能。

如上圖,D0,D1,D2,D3 是由一名礦工計算,然後廣播驗證,其餘礦工也可以一次驗證四筆交易。

大家看到的移動端的輕錢包就是利用了這個原理。輕錢包僅僅作為一個移動支付工具,是不能佔用太大空間的,所以不可能保存全部節點數據,這時候就得用到以上原理,僅驗證區塊頭(也就之是之前所說的 root 值),就能確認交易是否存在。他能過濾掉大量不相關的數據,減少客戶端不必要的下載量,同時實現去中心化驗證。

這個原理叫簡單支付驗證(SPV,Simplified Payment Verification)。SPV 充分利用默克樹結構,在尋找交易時,只需下載尋找區塊頭而不是整個區塊,區塊頭只有 80 字節,每小時 6 個,一年也就 4M 大小,一般設備都能承載。

綜上所述,區塊鏈的本質是狀態機和數據庫。

同時區塊鏈對與應用來說是一個分佈式賬本,一種通過去中心化、去信任的方式集體維護的一個可靠數據庫方案。

那麼問題來了,如何在一個去中心化和去信任(或降低信用成本)環境裡,讓多個完全陌生的網絡節點,來承認這個區塊鏈的狀態機和數據庫?換句話說,如何設計這個系統規則,讓陌生的買賣雙方,在沒有第三方信任機構的情況下,產生信任,完成交易呢?

答案就是共識機制。

共識機制至關重要,是區塊鏈技術的核心,很大程度上決定了整個區塊鏈系統節點間的相互信任程度,也決定了其他使用者對於區塊鏈上數據的信任程度。一個區塊鏈系統,共識機制設計得好與壞直接決定了系統的工作效率、運行成本、安全性、穩定性,甚至毫不誇張地說,直接決定了系統存在的價值。

下面,我們開始探討本篇的正題 —— 如何設計可持續發展的共識算法。

那麼問題來了,如何在一個去中心化和去信任(或降低信用成本)環境裡,讓多個完全陌生的網絡節點,來承認這個區塊鏈的狀態機和數據庫?換句話說,如何設計這個系統規則,讓陌生的買賣雙方,在沒有第三方信任機構的情況下,產生信任,完成交易呢?

答案就是共識機制。

共識機制至關重要,是區塊鏈技術的核心,很大程度上決定了整個區塊鏈系統節點間的相互信任程度,也決定了其他使用者對於區塊鏈上數據的信任程度。一個區塊鏈系統,共識機制設計得好與壞直接決定了系統的工作效率、運行成本、安全性、穩定性,甚至毫不誇張地說,直接決定了系統存在的價值。

下面,我們開始探討本篇的正題 —— 如何設計可持續發展的共識算法。

file

所謂共識算法,就是每個節點對於本區塊的正確性達成共識。

共識是一切交易的基礎,達成共識越分散(參與度越高),其效率就越低,但安全性越高,因此也越穩定;相反,達成共識越集中(參與度越低),效率越高,也越容易出現獨裁和腐敗現象,安全性越低。如何平衡這些因素,使其具有應用價值,是我們值得探討的重要話題。

以主流 PoW(Proof of Work) 為例,根據區塊頭與一個隨機數進行哈希運算,可簡單理解為必須通過大量數學計算之後,才能將區塊掛入區塊鏈中。

那麼問題來了,如何在一個去中心化和去信任(或降低信用成本)環境裡,讓多個完全陌生的網絡節點,來承認這個區塊鏈的狀態機和數據庫?換句話說,如何設計這個系統規則,讓陌生的買賣雙方,在沒有第三方信任機構的情況下,產生信任,完成交易呢?

答案就是共識機制。

共識機制至關重要,是區塊鏈技術的核心,很大程度上決定了整個區塊鏈系統節點間的相互信任程度,也決定了其他使用者對於區塊鏈上數據的信任程度。一個區塊鏈系統,共識機制設計得好與壞直接決定了系統的工作效率、運行成本、安全性、穩定性,甚至毫不誇張地說,直接決定了系統存在的價值。

下面,我們開始探討本篇的正題 —— 如何設計可持續發展的共識算法。

file

所謂共識算法,就是每個節點對於本區塊的正確性達成共識。

共識是一切交易的基礎,達成共識越分散(參與度越高),其效率就越低,但安全性越高,因此也越穩定;相反,達成共識越集中(參與度越低),效率越高,也越容易出現獨裁和腐敗現象,安全性越低。如何平衡這些因素,使其具有應用價值,是我們值得探討的重要話題。

以主流 PoW(Proof of Work) 為例,根據區塊頭與一個隨機數進行哈希運算,可簡單理解為必須通過大量數學計算之後,才能將區塊掛入區塊鏈中。

file

為什麼不能讓礦工直接把區塊掛上去呢?

在區塊鏈中,最長的鏈被認為是正確的鏈,所有礦工選擇最長的鏈來挖,才能確保鏈的唯一性。公有鏈作為一個完全開放的系統 —— 任何節點都可以來當礦工,其背後的設計哲學在於“作惡得到的好處小於付出的代價,所以理性節點不會做惡”。傳奇跑者普雷方丹也有一句名言:“你可以打敗我,但你必須付出足夠的努力與汗水。”如果礦工可以直接把區塊掛到鏈上,那麼攻擊者就可以分叉,然後瘋狂的把這條鏈加長,使人誤以為這才是正確的區塊鏈。

在 PoW 中,攻擊者必須進行工作量證明才能把分叉鏈加長,必須付出比全網更大的算力(51% 以上)才能跑的最快,同一時間形成更多區塊,讓人誤以為這是最長的鏈,從而完成攻擊,但這顯然是不可能的。

這個系統的設計邏輯沒有問題,但在 PoW 的過程中,需要消耗大量無謂的算力與能源。

首先,PoW 所需的算力不斷增大,比特幣為了保證每 10 分鐘出一個塊,同時在 2140 年產生 2100 萬枚全部比特幣,就必須每 2016 個塊之後進行難度升級。所以挖礦設備也不斷的進行更新換代才能滿足需求。從 CPU 挖礦,到 GPU,到 FPGA 挖礦等等,耗電量也與日俱增。

有英國的研究表明,2017 年用在比特幣“挖礦”上的電量超過 29.05 太瓦時 twh (1 太瓦時為 1 億度電),超過了全球 159 個國家的年均用電量。愛爾蘭全國(477 萬人口)一年的用電量也只有 25 太瓦時的電力。而今年的最新估計表明,這一數字已經接近哥倫比亞全國的用電量,達到 59.6 twh。

可以推算,如果沒有在機制 (mechanism) 上的徹底變革,僅僅用於完成 PoW 計算的電力花費將遲早超過全球任何一個國家的年均用電量。更何況,電力能源屬於二次能源,為了產生電力需要花費的一次能源(如煤炭、石油、水力、天然氣)的消耗更是難以計數。長此以往,在利益的驅動下,假如未來全球大多數的能源都被用來挖礦,那將會造成世界性的能源危機。

首先,PoW 所需的算力不斷增大,比特幣為了保證每 10 分鐘出一個塊,同時在 2140 年產生 2100 萬枚全部比特幣,就必須每 2016 個塊之後進行難度升級。所以挖礦設備也不斷的進行更新換代才能滿足需求。從 CPU 挖礦,到 GPU,到 FPGA 挖礦等等,耗電量也與日俱增。

有英國的研究表明,2017 年用在比特幣“挖礦”上的電量超過 29.05 太瓦時 twh (1 太瓦時為 1 億度電),超過了全球 159 個國家的年均用電量。愛爾蘭全國(477 萬人口)一年的用電量也只有 25 太瓦時的電力。而今年的最新估計表明,這一數字已經接近哥倫比亞全國的用電量,達到 59.6 twh。

可以推算,如果沒有在機制 (mechanism) 上的徹底變革,僅僅用於完成 PoW 計算的電力花費將遲早超過全球任何一個國家的年均用電量。更何況,電力能源屬於二次能源,為了產生電力需要花費的一次能源(如煤炭、石油、水力、天然氣)的消耗更是難以計數。長此以往,在利益的驅動下,假如未來全球大多數的能源都被用來挖礦,那將會造成世界性的能源危機。

file

其次,主鏈上同一時間只會有一個區塊上鍊,這個由計算出來的礦工獲得,但是其他參與計算的礦工雖然消耗了大量算力,卻沒有任何收益,浪費了大量計算資源。

最重要的一點,這些計算並不是有實際意義的計算,換句話說:以比特幣為代表的使用 PoW 共識的公有鏈,本質上只能起到賬本的作用,而不具備實際的功能,所以其所做的計算也都是沒有實際作用的。

起初我們在探討設立 Genaro 共識機制的時候, 就明確一點:要做有意義的計算,也就是說,公有鏈除了做賬本,本來還應該完成互聯網中的某些其他功能。世界上本來就有很多東西需要大量的算力,為什麼一定要做沒有實際意義的哈希計算呢?為什麼不計算蛋白質的分子結構,計算基因工程,計算機器學習?

所以說,減少能源的消耗,同時完成有意義的計算,是共識機制設計的關鍵所在。

但是這兩點同時實現極為困難。第一,如果消耗的資源減少,安全性就越低,因為攻擊者越容易將分叉鏈讓大家誤以為是主鏈;第二,有意義的計算如何有規律的與區塊鏈系統連接起來,比如如果做機器學習計算,穩定的 Data Set 從何而來,計算的獎勵如何分配,都是需要精心設計的地方。

在這樣的一個背景下,“激進”的 PoS 逐漸獲得了更多的認可,幾乎完全不需要進行計算,從而大大降低了能耗。

PoS (Proof of Stake):權益證明。如果把 PoW 比作意大利國家隊穩健的防守體系,那麼 PoS 則擁有巴西隊野心,以降低防守力,來增加攻擊性。

PoS 完全不需要進行計算,而是需要證明者對某些數量的權益展示所有權。證明節點對區塊結果進行押注,如果錯誤則喪失押注,如果正確則贏得獎勵。

然而,無論是在工業界還是學術界,PoS 都是一把雙刃劍,在提升性能的同時,很難保證其安全性。最著名的兩個問題是:nothing at stake 以及 long range attack (長距離攻擊)。以太坊在 PoS 的過程中也遇到了諸多困難。

Nothing at stake:如果攻擊者 fork 當前的鏈,挖礦節點的保證金已經押在了兩條鏈上,他不需要去判斷哪條是正確的鏈,而是都支持,從而導致攻擊者得逞,而無論攻擊者是否得逞,節點選擇全部挖的策略也可以保障自己的收益,所以只要理性節點不是“token 大戶”,都會去支持攻擊者。

這個問題已經有人提出一些解決方案,例如 vitalik 提出的“錯誤懲罰”,如果一個節點在發生分叉時選擇都押注,如果押注超過一條鏈或者押注了錯誤的鏈會被懲罰。

Long range attack則是更為棘手的問題:可以理解為 PoS 中的女巫攻擊。攻擊者不是去 fork 現有的鏈,而是回到初始階段的鏈,造一條更長的新的鏈,讓網絡誤以為是主鏈。因為 PoS 共識中節點的增長速度沒有限定(比特幣 PoW 有限定,10 分鐘出一個塊),攻擊者可以用很短的時間造一條更長的鏈。一個區塊鏈系統,一開始不會有很多礦工,前期的塊都是少數礦工挖的,如果這些礦工互相串通好,聯合起來回到早起階段,因為那個階段只有他們可以挖接下來的塊,他們可以很容易聯合發起此攻擊。

目前 long range attack 沒有很好的解決方案,一些客戶端(包括 casper)試圖通過限定更改區塊的長度來解決這個問題,比如 NXT 的處理方式為超過 720 個區塊的不能被更改。但這只是降低了問題發生的概率,或者說轉化了問題,會導致“weak subjectivity”。

事實上,已經有很多 PoS 算法試圖解決上述問題:

PoS (Proof of Stake):權益證明。如果把 PoW 比作意大利國家隊穩健的防守體系,那麼 PoS 則擁有巴西隊野心,以降低防守力,來增加攻擊性。

PoS 完全不需要進行計算,而是需要證明者對某些數量的權益展示所有權。證明節點對區塊結果進行押注,如果錯誤則喪失押注,如果正確則贏得獎勵。

然而,無論是在工業界還是學術界,PoS 都是一把雙刃劍,在提升性能的同時,很難保證其安全性。最著名的兩個問題是:nothing at stake 以及 long range attack (長距離攻擊)。以太坊在 PoS 的過程中也遇到了諸多困難。

Nothing at stake:如果攻擊者 fork 當前的鏈,挖礦節點的保證金已經押在了兩條鏈上,他不需要去判斷哪條是正確的鏈,而是都支持,從而導致攻擊者得逞,而無論攻擊者是否得逞,節點選擇全部挖的策略也可以保障自己的收益,所以只要理性節點不是“token 大戶”,都會去支持攻擊者。

這個問題已經有人提出一些解決方案,例如 vitalik 提出的“錯誤懲罰”,如果一個節點在發生分叉時選擇都押注,如果押注超過一條鏈或者押注了錯誤的鏈會被懲罰。

Long range attack則是更為棘手的問題:可以理解為 PoS 中的女巫攻擊。攻擊者不是去 fork 現有的鏈,而是回到初始階段的鏈,造一條更長的新的鏈,讓網絡誤以為是主鏈。因為 PoS 共識中節點的增長速度沒有限定(比特幣 PoW 有限定,10 分鐘出一個塊),攻擊者可以用很短的時間造一條更長的鏈。一個區塊鏈系統,一開始不會有很多礦工,前期的塊都是少數礦工挖的,如果這些礦工互相串通好,聯合起來回到早起階段,因為那個階段只有他們可以挖接下來的塊,他們可以很容易聯合發起此攻擊。

目前 long range attack 沒有很好的解決方案,一些客戶端(包括 casper)試圖通過限定更改區塊的長度來解決這個問題,比如 NXT 的處理方式為超過 720 個區塊的不能被更改。但這只是降低了問題發生的概率,或者說轉化了問題,會導致“weak subjectivity”。

事實上,已經有很多 PoS 算法試圖解決上述問題:

file

Ouroboros:一個可證明安全的 PoS 區塊鏈協議,Ouroboros 加入了權益證明算法,定義了節點對賬本狀態達到共識的方法,它是第一個宣稱進行嚴格的安全分析的 PoS 類型的區塊鏈協議。

Ouroboros 在一定條件下的實踐驗證中,解決了各種攻擊,包括雙花攻擊、交易拒絕攻擊、51% 攻擊、無利害關係、去同步攻擊以及其他攻擊。某些前提下,它被科學證明安全的。它在亞馬遜雲中運行了基準測試,這些測試展現了 Ouroboros 的權益證明區塊鏈協議,在性能方面的優勢。

不過經常回頭驗證的模式也有問題。多次回頭,一方面影響 TPS,一方面會增加更多的通信,另一方面還很難驗證回頭 stake 的是否都為正確。

DPoS,相比於普通的 PoS,多了一個選舉機制,類似議會制度,不僅幣數很關鍵,聲望更加關鍵,從而實現速度與安全性的提高,DPoS 希望通過投票來篩選信任節點,解決 PoS 的安全隱患。

類似的,還有 PoP,PoC:

PoP (Proof of Participation),基於賬戶參與度的算法,PoP 將 PoI 和 DPoS 的思想結合,既能確保對設備的公平性,又擁有社區的共識,同時減少了算力浪費。讓記賬這件事情更經濟效率 , 從而支撐起更多大規模的協作體系。

PoC (Proof of Credit),信用共識機制 , “PoC”繼承了“PoW”通過計算來實現賬本安全的特性,但同時提出的非常有創新的一點“利用用戶的信用值”作為挖礦的准入門檻,這樣就會積累有效的節點為網絡加密計算。同樣“PoC”也相對“PoW”在社區發展中公平了很多,在參與挖礦的時候,是根據自己的信用值來判斷是不是有共識(挖礦)資格。在達到共識的信用值後,為了防止節點的違規行為還必須提交一定的保證金額,才能參與共識,共識網絡中加入了簡單的智能合約,作為共識的契約來約束每個節點參與共識,如果有違規,會付出很大的懲罰。這也保證了節點會正常參與共識,用來提高網絡的安全性。

但目前,沒有一種 PoS 是被證明和 PoW 一樣安全的,在設計上儘可能的通過制定出塊規則與獎勵懲罰機制來解決 nothing at stake 等問題,但本質還是不安全的。比較可行的方法是進行一個折中,PoW+PoS 混合共識機制。

例如第一個使用 PoS 的項目:peercoin。peercoin 是第一個 PoS 算法,於 2012 年提出,PPCoin 的最大創新是其採礦方式混合了 PoW+PoS 方式,而 PoW 部分加入幣齡的概念,越早買優勢越大,相比與純 PoS 或者純 PoW,達到節能和安全的平衡。

類似的還有 CFFG,PoW+PoS 混合模型,由 Vitalik Buterin 帶領研究 Casper the Friendly Finality Gadget(CFFG),需要進行兩週期投票,並且需要質押 TOKEN。第一次是 PoW,超過 2/3 即可驗證成功,第二次是 PoS,超過 2/3 即可驗證成功,然後確認區塊,驗證者即可獲得收益。驗證者是被激勵著集合在權威鏈上的,因為如果他們持續在不同的鏈上進行投票將會受到懲罰。驗證者不僅僅會為雙重投票而受罰,也要為在不正確的鏈上進行投票而受到懲罰。

Tendermin,2014 年,由 Jae Kwon 帶領研究,BFT 與 PoS 混合機制,假設少於 1/3 的驗證者是拜占庭,Tendermint 保證安全永遠不會被破壞——也就是,驗證者(2/3 以上)永遠不會在同一個高度提交衝突的區塊。因此,基於 Temdermint 的區塊鏈永遠不會分叉。Tendermint 的設計決策偏向於安全性和不可改變性。

但這樣的混合共識機制,雖然降低了能耗,但依然沒有本質上解決 PoW“浪費不必要能耗”的問題。為了設計可持續發展的共識算法,需要同時做到以下兩點:

  • 找到一個低能耗、有實際效用的算法
  • 將此實際效用作為 PoS 的防禦機制

為了做到以上兩點,勢必需要 PoX+PoS 這樣的混合共識機制,至於 X 是什麼,就取決於各個公鏈的設計了 如果公有鏈除了賬本之外,還有其他的功能,則這個功能就是公式中的“X”。例如 Genaro 公鏈可以解決存儲問題,於是有了 SPoR + PoS。

這也是 Genaro 的 SPoR + PoS 混合共識機制的設計初衷。

先簡單介紹一下什麼是 SPoR:可以被看作是一個微型 PoW。

SPoR 全稱為 sentinel proof of retrievability,是一種數據可檢索行證明。數據可檢索證明的意思是,當用戶不取回文件的時候,依然可以相信文件完好無損的保存在系統中。在 Genaro 系統中每天都會對存儲節點進行“challenge”,存儲節點通過運行 SPoR 算法表明數據是可被取回的。

首先這種證明的難度不會隨著時間的推移而增加。證明一個文件可取回,今天的計算量和明年是幾乎一致的。

其次這是在實際生活中有用的計算,即便是雲存儲也本身需要這樣的證明。SPoR 是一種在存儲領域被驗證為可靠的算法,將其引入區塊鏈系統並不會帶來額外的隱患。

PoS (Proof of Stake):權益證明。如果把 PoW 比作意大利國家隊穩健的防守體系,那麼 PoS 則擁有巴西隊野心,以降低防守力,來增加攻擊性。

PoS 完全不需要進行計算,而是需要證明者對某些數量的權益展示所有權。證明節點對區塊結果進行押注,如果錯誤則喪失押注,如果正確則贏得獎勵。

然而,無論是在工業界還是學術界,PoS 都是一把雙刃劍,在提升性能的同時,很難保證其安全性。最著名的兩個問題是:nothing at stake 以及 long range attack (長距離攻擊)。以太坊在 PoS 的過程中也遇到了諸多困難。

Nothing at stake:如果攻擊者 fork 當前的鏈,挖礦節點的保證金已經押在了兩條鏈上,他不需要去判斷哪條是正確的鏈,而是都支持,從而導致攻擊者得逞,而無論攻擊者是否得逞,節點選擇全部挖的策略也可以保障自己的收益,所以只要理性節點不是“token 大戶”,都會去支持攻擊者。

這個問題已經有人提出一些解決方案,例如 vitalik 提出的“錯誤懲罰”,如果一個節點在發生分叉時選擇都押注,如果押注超過一條鏈或者押注了錯誤的鏈會被懲罰。

Long range attack則是更為棘手的問題:可以理解為 PoS 中的女巫攻擊。攻擊者不是去 fork 現有的鏈,而是回到初始階段的鏈,造一條更長的新的鏈,讓網絡誤以為是主鏈。因為 PoS 共識中節點的增長速度沒有限定(比特幣 PoW 有限定,10 分鐘出一個塊),攻擊者可以用很短的時間造一條更長的鏈。一個區塊鏈系統,一開始不會有很多礦工,前期的塊都是少數礦工挖的,如果這些礦工互相串通好,聯合起來回到早起階段,因為那個階段只有他們可以挖接下來的塊,他們可以很容易聯合發起此攻擊。

目前 long range attack 沒有很好的解決方案,一些客戶端(包括 casper)試圖通過限定更改區塊的長度來解決這個問題,比如 NXT 的處理方式為超過 720 個區塊的不能被更改。但這只是降低了問題發生的概率,或者說轉化了問題,會導致“weak subjectivity”。

事實上,已經有很多 PoS 算法試圖解決上述問題:

file

Ouroboros:一個可證明安全的 PoS 區塊鏈協議,Ouroboros 加入了權益證明算法,定義了節點對賬本狀態達到共識的方法,它是第一個宣稱進行嚴格的安全分析的 PoS 類型的區塊鏈協議。

Ouroboros 在一定條件下的實踐驗證中,解決了各種攻擊,包括雙花攻擊、交易拒絕攻擊、51% 攻擊、無利害關係、去同步攻擊以及其他攻擊。某些前提下,它被科學證明安全的。它在亞馬遜雲中運行了基準測試,這些測試展現了 Ouroboros 的權益證明區塊鏈協議,在性能方面的優勢。

不過經常回頭驗證的模式也有問題。多次回頭,一方面影響 TPS,一方面會增加更多的通信,另一方面還很難驗證回頭 stake 的是否都為正確。

DPoS,相比於普通的 PoS,多了一個選舉機制,類似議會制度,不僅幣數很關鍵,聲望更加關鍵,從而實現速度與安全性的提高,DPoS 希望通過投票來篩選信任節點,解決 PoS 的安全隱患。

類似的,還有 PoP,PoC:

PoP (Proof of Participation),基於賬戶參與度的算法,PoP 將 PoI 和 DPoS 的思想結合,既能確保對設備的公平性,又擁有社區的共識,同時減少了算力浪費。讓記賬這件事情更經濟效率 , 從而支撐起更多大規模的協作體系。

PoC (Proof of Credit),信用共識機制 , “PoC”繼承了“PoW”通過計算來實現賬本安全的特性,但同時提出的非常有創新的一點“利用用戶的信用值”作為挖礦的准入門檻,這樣就會積累有效的節點為網絡加密計算。同樣“PoC”也相對“PoW”在社區發展中公平了很多,在參與挖礦的時候,是根據自己的信用值來判斷是不是有共識(挖礦)資格。在達到共識的信用值後,為了防止節點的違規行為還必須提交一定的保證金額,才能參與共識,共識網絡中加入了簡單的智能合約,作為共識的契約來約束每個節點參與共識,如果有違規,會付出很大的懲罰。這也保證了節點會正常參與共識,用來提高網絡的安全性。

但目前,沒有一種 PoS 是被證明和 PoW 一樣安全的,在設計上儘可能的通過制定出塊規則與獎勵懲罰機制來解決 nothing at stake 等問題,但本質還是不安全的。比較可行的方法是進行一個折中,PoW+PoS 混合共識機制。

例如第一個使用 PoS 的項目:peercoin。peercoin 是第一個 PoS 算法,於 2012 年提出,PPCoin 的最大創新是其採礦方式混合了 PoW+PoS 方式,而 PoW 部分加入幣齡的概念,越早買優勢越大,相比與純 PoS 或者純 PoW,達到節能和安全的平衡。

類似的還有 CFFG,PoW+PoS 混合模型,由 Vitalik Buterin 帶領研究 Casper the Friendly Finality Gadget(CFFG),需要進行兩週期投票,並且需要質押 TOKEN。第一次是 PoW,超過 2/3 即可驗證成功,第二次是 PoS,超過 2/3 即可驗證成功,然後確認區塊,驗證者即可獲得收益。驗證者是被激勵著集合在權威鏈上的,因為如果他們持續在不同的鏈上進行投票將會受到懲罰。驗證者不僅僅會為雙重投票而受罰,也要為在不正確的鏈上進行投票而受到懲罰。

Tendermin,2014 年,由 Jae Kwon 帶領研究,BFT 與 PoS 混合機制,假設少於 1/3 的驗證者是拜占庭,Tendermint 保證安全永遠不會被破壞——也就是,驗證者(2/3 以上)永遠不會在同一個高度提交衝突的區塊。因此,基於 Temdermint 的區塊鏈永遠不會分叉。Tendermint 的設計決策偏向於安全性和不可改變性。

但這樣的混合共識機制,雖然降低了能耗,但依然沒有本質上解決 PoW“浪費不必要能耗”的問題。為了設計可持續發展的共識算法,需要同時做到以下兩點:

  • 找到一個低能耗、有實際效用的算法
  • 將此實際效用作為 PoS 的防禦機制

為了做到以上兩點,勢必需要 PoX+PoS 這樣的混合共識機制,至於 X 是什麼,就取決於各個公鏈的設計了 如果公有鏈除了賬本之外,還有其他的功能,則這個功能就是公式中的“X”。例如 Genaro 公鏈可以解決存儲問題,於是有了 SPoR + PoS。

這也是 Genaro 的 SPoR + PoS 混合共識機制的設計初衷。

先簡單介紹一下什麼是 SPoR:可以被看作是一個微型 PoW。

SPoR 全稱為 sentinel proof of retrievability,是一種數據可檢索行證明。數據可檢索證明的意思是,當用戶不取回文件的時候,依然可以相信文件完好無損的保存在系統中。在 Genaro 系統中每天都會對存儲節點進行“challenge”,存儲節點通過運行 SPoR 算法表明數據是可被取回的。

首先這種證明的難度不會隨著時間的推移而增加。證明一個文件可取回,今天的計算量和明年是幾乎一致的。

其次這是在實際生活中有用的計算,即便是雲存儲也本身需要這樣的證明。SPoR 是一種在存儲領域被驗證為可靠的算法,將其引入區塊鏈系統並不會帶來額外的隱患。

file

Genaro 並不是用 SPoR 代替 PoW, 實際上,Genaro 的混合共識機制是以 PoS 為主體,而 SPoR 主要用來要求節點貢獻算力、存儲空間等資源來加強 PoS 共識的“防守”。此混合共識機制的大致過程為:

step1. 節點進行 GNX 押注,分享存儲空間,申請加入委員會

step2. 報名者進行實力排名(根據 epoch 中 heft 重量與 GNX 押注等因素)確定委員會名單

step3. 由委員會點按排名順序依次連續出塊

step4. 出塊節點獲得獎勵

這個流程相當於通過 SPoR 來篩選可信節點,也即要求共識節點付出一定代價,也即 something at stake,於是 nothing at stake 不攻即破。其中,選取部分節點以及允許信任節點連續出塊是提升 TPS 的方法,詳情請參考之後的文章《公有鏈七大超級難題之提升 TPS 的必要性與方法》

對於 long range attack 而言,Genaro 的混合共識機制的本質是將存儲網絡與公有鏈進行深度綁定。可以簡單這樣理解:公有鏈中的交易分為兩部分:

  1. 普通交易
  2. 存儲行為引發的交易(例如上傳下載分享等)

而第 2 類交易會將文件的 sentinel 相關信息存入區塊中。那麼,如果節點想要實施 long range attack,回到最初階段的區塊鏈狀態,則無法復原存儲網絡,就無法將區塊推進到當前高度,網絡會判斷你不是最長鏈,直接進行懲罰。

此外,這樣的混合共識機制還可以防止分叉。如果攻擊者想要故意分叉(就像 ETC 與 ETH),即便可以拉攏部分礦工在分叉鏈上繼續出塊,但這條鏈將會喪失用戶數據的完整性,成為了一條毫無價值的“偽鏈”,用戶不會使用,礦工就沒有了消費者,自然不會去挖。

這樣,通過引入“存儲”這樣更多的一個維度,打造出的 SPoR + PoS 混合共識機制,變成為了可持續共識機制的一個例子,這也說明,可持續共識機制要求公鏈本身有記賬之外的更多實際功能。

最後,共識算法的可持續發展還有一個必要條件:任意節點可以加入並作出貢獻,這對共識算法的選取有了更高的要求


本文作者:劉昱 Larry

本文技術校對:Waylon

本文內容校對 / 編輯 / 學術整理:Xuan, Sophia,Iris