制定通用的標準:評估PoW 共識協議的安全性

在Nakamoto 共識協議(Nakamoto Consensus 圖片中簡稱NC)中,為解決分叉問題,礦工們被要求在可能的情況下選擇最長的鏈;在沒有最長鏈時,礦工選擇第一個接收到的區塊加入到主鏈中。在發放獎勵方面,主鏈區塊會獲得全部獎勵,而孤塊什麼也得不到。
這樣是否足夠安全?
Nakamoto 共識的原始分析傾向於認為區塊鏈本身俱備完美的鏈質量,即低於全網50% 算力的攻擊者是無法修改區塊鏈的。然而實際上攻擊者完全可以有非常高的成功率去修改區塊鏈。

有三種攻擊方式會修改區塊鏈:自私挖礦(Selfish Mining)、雙花(Double Spending)和審查攻擊(Censorship Attack)。其中,自私挖礦的攻擊者可以獲得與其算力不成正比的、不公平的區塊獎勵。他們可以將挖礦算力集中起來去獲得更高的相對區塊獎勵,從而破壞區塊鏈的去中心化特性;在雙花攻擊中,攻擊者可以逆轉已確認的交易,將自己利益最大化;審查攻擊情況下,攻擊者阻止交易被確認,造成誠實礦工的經濟損失。
自私挖礦

自私挖礦
雙花攻擊
審查攻擊
紅色方塊表示塊被傳播到網絡的時間,然後橙色圓圈表示攻擊者的區塊,三角形表示被誠實礦工挖出的區塊。攻擊者很幸運地找到了第一個區塊,但沒有將其發佈到網絡上,而是選擇了扣留這個區塊。
當誠實礦工找到一個塊時,攻擊者會在這時候搶在誠實礦工之前廣播之前扣留的區塊,則之後所有的礦工都將在攻擊者的區塊而不是誠實礦工的區塊上挖礦。
如果攻擊者足夠幸運,能夠連續找到多個區塊,那麼攻擊者就可以毫無風險地孤立一個誠實區塊。在這種情況下,攻擊者的的鏈變得更長,並且全網的算力會到它的鏈上挖礦。通過這種方式,攻擊者成功地增加了在整體區塊獎勵中獲得的相對比例。
雙花攻擊與自私挖礦攻擊非常相似,是通過秘密挖礦來獲得額外獎勵。如比特幣中,按照慣例有6 個區塊確認交易後基本是完全確認了。如果攻擊者秘密地扣留了6 個區塊,並一次性將它們廣播到網絡中,他就能夠在收到商品或者服務之後逆轉這個交易。
審查攻擊試圖孤立所有不符合審查要求的塊,即我要廣播我要審查的這些交易,如果你不聽從我的命令,我會盡力孤立你的塊
兩種解決方法

下面我們來說說解決Nakamoto 共識安全問題的兩種方法。
第一大類我們稱之為「更佳鏈質量」協議。如圖所示這一大類中有很多協議,這些協議聲稱它們可以提高鏈的質量。這次我將重點介紹「最小哈希平局打破協議(Smallest hash tie-breaking protocol ,簡稱SHTB)」 和「不可預測的確定性平局打破協議(Unpredictable deterministic tie-breaking,簡稱UDTB)」。

第二大類稱為「抗攻擊」(Attack-resistant protocols)協議。這些協議聲稱,他們可以在鏈的質量並不完美的情況下抵禦攻擊,因此他們不需要提高鏈的質量。
抗攻擊協議的三種類型
第一種是「全部獎勵」(Reward-all)協議。這類協議給大多數最近做了工作量證明的以獎勵, 符合要求的塊無論如何都會獲得獎勵,如此攻擊者無法進行自私挖礦攻擊來迫使誠實礦工的獎勵無效,從而攻擊者沒有動機進行自私挖礦攻擊。
第二個被稱為「懲罰」(Punishment)協議。這些協議將沒收那些可疑的區塊的獎勵。懲罰規則希望通過損失厭惡, 讓所有人不得不遵守協議。
第三個被稱為「幸運獎勵」(Reward-lucky)協議。這些協議根據區塊內容對某些幸運區塊進行獎勵,希望這些幸運區塊作為穩定網絡的「錨點」。
接下來讓我們更深入地了解這些協議。

首先我們分析「更佳鏈質量」這一類協議,首先是「最小哈希平局打破協議」。在這個協議中,每當有平局時,協議都要求所有礦工選擇哈希最小的塊,不管它首先接收的是誰。
第二個稱為「不可預測的確定性平局打破協議」。該協議規定,每當有平局時,每個人都使用不可預知的確定性偽隨機函數來計算所有參與競爭鏈的順序,而不管首先接收哪一個塊。不可預測的確定性協議背後的原理是,由於攻擊者無法預測他是否會以超過50% 的機率贏得整塊競爭,進行自私挖礦攻擊是不明智的(因此不會選擇這麼做)。

對於抗攻擊協議,我會從每種技術方法中選擇一種協議來分析。對於「全部獎勵」協議我們來分析水果鏈。在水果鏈中,對兩種不同的產品使用了相同的挖礦程序。如果一個候選區塊的哈希值最前面的k bits 小於某個閾值,那麼就判斷它是一個塊;如果某個候選區塊的哈希值最後的k bits 小於某個閾值,那麼就判斷它是水果。因此,當你運行哈希算法時,你可能會得到一個區塊,也可能是得到一個水果。
該協議和Nakamoto 共識一樣,遵循最長鏈原則,並且根據最先收到的區塊打破平局。
對於所有抵抗攻擊協議,我們使用Nakamoto 共識作為其分叉解決的規則。因此,當我們分析他們的攻擊抗性時,他們被置於同一規則下。
水果是嵌入在區塊中的。你可以把水果想像成Nakamoto 共識中的交易,這個交易只是被嵌入到了水果中。

每個水果都有一個指針塊,這是一個最近的塊,水果礦工不會被孤立。圖中香蕉塊的指針就是這樣一個案例,如果指針塊在主鏈中,則水果是有效的。如果指針塊是孤塊,就像圖上的番茄一樣,那麼這個水果不再是有效的水果。
還有一個額外的規則,即水果出塊的間隔需要小於預定義的超時閾值。間隔定義為主區塊和指針區塊之間的區塊高度差。
比如,香蕉的間隔就是2,這是因為主區塊比指針區塊晚2 個區塊。因此有效水果獲得全額獎勵,而區塊則沒有獲得任何獎勵。

對於懲罰協議,我們選擇DECOR 協議修改版本作為案例來講解。在我們的修改版本中,我們將其稱為「獎勵分配」(Reward-Splitting ,簡稱RS)協議,顧名思義,獎勵在所有相同高度的競爭區塊之間平分。這個協議允許一個區塊引用之前的孤塊為叔塊,如果其間隔是低於超時閾值的,那麼這個叔塊就是有效的(也會獲得一定的獎勵)。
這是在獎勵分配協議中間隔的定義和水果鏈類似。不同在於,在此協議中,間隔被定義為主區塊和叔塊的高度差,而不是主區塊和指針區塊的高度差。所以我們不考慮區塊的親緣關係,只考慮該區塊本身的高度。每個區塊獎勵在相同高度的競爭區塊和叔塊之間平均分配。例如,在這個圖中,區塊B 和區塊C 分別得到了一半的區塊獎勵,區塊A 和區塊D 則獲得全部的區塊獎勵。

最後一個是子鏈。子鏈也是採用相同的挖礦程序,但是是兩種不同的產品。子鏈中的出塊規則和比特幣相同,如果候選區塊的哈希低於某個特定閾值,那判斷這個塊有效。如果候選區塊的哈希值大於塊閾值但小於另一個閾值,我們將其視為弱塊(Weak Block)。弱塊也計入鍊長度,也執行交易確認的功能。但是,弱塊不會收到任何塊獎勵。只有區塊能獲得塊獎勵。
衡量協議安全性的共同指標
我非常激動,因為下面我們要一起設定一些衡量協議安全性的共同指標。你聲稱這是最安全的協議,你要向我證明它,就需要從這幾個指標的維度來衡量你的協議有多安全。
在這個研究中共有四個指標,我們來分析一下。

第一個指標我們稱之為鏈質量(Chain Quality),是指主鏈上誠實礦工的區塊的最小百分比。在這個例子中,鏈質量是六分之三,因為主鏈中有六個區塊,其中三個來自誠實礦工。
第二個稱之為激勵相容度(Incentive Compatibility),用來衡量對自私挖礦攻擊的抗性,被定義為誠實礦工區塊獎勵的最小百分比。
在這種情況下,由於六個主鏈區塊中有三個區塊來自於誠實礦工,因此激勵相容度是50%。在Nakamoto 共識中,這兩個指標(指鏈質量和激勵相容度)是相等的。但是,對於其他協議,這兩個指標並不相同。鏈質量只是用來評估拜占庭敵手(也就是作惡節點),但激勵相容度則把獎勵也考慮在內。

第三個指標是另一個攻擊抗性的指標,稱為「作惡收益」(Subversion Gain),衡量抗雙花攻擊的性能。它被定義為「平均每個出塊間隔能夠獲得的區塊獎勵加上雙花獎勵的最大值」。
在這種情況下,假設每隔10 分鐘能找到一個塊,如果總共有8 個塊,那麼總共需要80 分鐘(其中攻擊者有3 個塊)。在這個例子裡,平均每10 分鐘,攻擊者獲得3/8 個區塊獎勵。雙花獎勵為0,因為雙花獎勵需要連續孤立六個塊。
因為在抗雙花攻擊中沒有完整的百分比獎勵,因此指標設定為「平均每個出塊間隔獲得區塊獎勵的最大值」。在這張圖上,沒有雙花攻擊獎勵,因為你需要連續出孤立至少6 個區塊才能獲得雙花獎勵。
最後一個指標稱為「審查敏感性」(Censorship Susceptibility),即因為拒絕審查者的要求,導致誠實礦工的獎勵損失的最大百分比。因為如果我拒絕審查請求,攻擊者將開始孤立我的區塊。此指標用來衡量我的區塊可以被孤立的百分比。在這個案例中,有5 個誠實的塊,其中2 個是孤塊,所以審查敏感性是2/5。
評估結果
現在我們來看看評估結果。在這次分享中我分析了5 個協議,我們來看看第一個指標鏈質量。
我們先定義一個變量γ ,它是在平局情況下,在攻擊者的鏈上挖礦的誠實礦工算力佔所有誠實礦工算力的百分比。
如果γ 等於零,那麼所有誠實礦工的算力都會用在挖誠實礦工的鏈上,沒有誠實礦工的算力在攻擊者的鏈上挖礦。如果γ 等於1,則所有誠實礦工的算力將在攻擊者鏈上挖礦,並且沒有人會在誠實礦工的鏈上挖礦。
這是是用來評估Nakamoto 共識的通用參數。這裡有五個情況,分別是在γ = 0,0.5,1 情況下的Nakamoto 共識、最小哈希平局打破協議(SHTB)和不可預測的確定性平局打破協議(UDTB) ,哪一個是鏈質量最佳的?

在這五個協議中,最小哈希平局打破協議(SHTB) 和不可預測的確定性平局打破協議(UDTB) 僅關注如何打破平局。所以你並不能比γ = 0 的平局的情況下的Nakamoto 共識做的更好。因為當γ = 0 的時候,所有的挖礦算力將會在誠實的鏈上。並且你不能比γ = 1 的情況下的Nakamoto 共識更差了,攻擊者在這種情況下可以贏得所有的平局。
所以在剩下的三個協議裡(SHTB、UDTB、γ = 0.5 的Nakamoto 協議)哪一個是表現最差的?其實是最小哈希平局打破協議。那麼對於剩下兩個協議(UDTB、γ = 0.5 的Nakamoto 協議)哪一個更好呢?
我來揭開這個答案。 γ = 0.5 的Nakamoto 共識是更好的。為什麼?舉例來說,在不可預測的確定性平局打破協議(UDTB)中,當一個攻擊者找到了一個區塊,但是此時誠實的礦工打包了這個區塊並且先於攻擊者將它廣播了出去,那麼有可能這個攻擊者會計算偽隨機函數並意識到如果他發布了他的區塊,是沒有人會繼續在他的區塊之上挖礦的,因為他在出塊競爭的平局中失敗了。那麼這個攻擊者能夠做什麼?
在Nakamoto 共識中,攻擊者註定會失敗,因為最先收到的區塊打破平局的規則,如果你不盡快把區塊發佈出去,沒有人會在你的區塊上面挖礦。但是在UDTB 中則不同,即使下一個區塊都被挖出來了,攻擊者還是能夠在這個區塊之上繼續挖礦,只要攻擊者能夠贏得下一個出塊權,那麼成功之後這個攻擊者就能夠在誠實礦工的區塊之後同時發布兩個區塊。
如果這個偽隨機函數表明攻擊者贏得了出塊競賽,攻擊者就能拿到出塊獎勵。因為UDTB 允許一個稱為“後發製人“的特殊攻擊行為,因此UDTB 的安全性會比γ = 0.5 的Nakamoto 共識更差。
那為什麼最小哈希平局打破協議安全性那麼差?因為當攻擊者找到一個區塊並且這個哈希值的確非常小的時候,攻擊者會有大約99% 的可能性,不論其他人的哈希是多少,他都能夠贏得這個出塊權。不論我先廣播哪一個區塊,我都能準確的預測出我能夠贏得這個平局的可能性。這就允許攻擊者在他足夠幸運的時候能夠發動扣塊攻擊。
當誠實的礦工找到下一個區塊的時候,因為攻擊者區塊的哈希是足夠小的,他有很高的可能性能夠贏得出塊權,因此他能夠發佈區塊並且獲得這個出塊權。下一次當攻擊者沒有這麼幸運的時候,他拿到的區塊的哈希相對來說比較大,攻擊者能夠發布這個區塊並直接獲得獎勵。
更佳鏈質量協議的一般性結論
下面是我們研究更佳鏈質量協議的一些一般性結論。

當攻擊者所佔算力α > 1/4 時,沒有一個協議能夠達到一個理想的區塊鏈的質量。只要攻擊者的算力超過了全網算力的1/4,它的收益就能夠比它按照算力份額計算的正常收益更高。
只要攻擊者的算力超過了全網算力的1/4 ,它的收益就能夠比它按照算力份額計算的正常收益更高。
對於任何一個α 的值,在γ = 0 的情況下,沒有一個協議在安全性上表現比Nakamoto 共識更好。
可能對於某一特定情況,某個協議在安全性上會比Nakamoto 共識更好,但是在整體上Nakamoto 共識在安全性上是最好的。
這是為什麼?因為協議並不能區分誠實的區塊和攻擊者的區塊。
為什麼協議不能區分這些區塊?
這是因為信息的不對稱。攻擊者是基於所有可得信息來行動的,也就是說他知道他發布了多少個區塊,有多少個扣留的區塊,我什麼時候發布這些區塊等等,攻擊者是都知道的。然而誠實的礦工僅基於有限的公開信息來行動。
這又是為什麼?
這是因為PoW 的安全假設較弱。他們試圖異步操作,規定所有的礦工只對非常有限的公開信息採取行動/進行操作。
那麼現在我們來針對Nakamoto 共識、水果鏈、獎勵分配(Reward-Splitting,RS)協議、和子鏈來分析一下他們攻擊抗性,首先是激勵相容性。

其中獎勵分配協議(執行)表現最好,因為懲罰總是激勵正確行為的最有效方式。子鍊錶現最差。
水果鍊錶現有時比Nakamoto 共識好,有時更糟。子鏈允許攻擊者使用無價值的弱區塊來使誠實的區塊失效。如果所有東西都是有價值的,那麼攻擊者扣留區塊則是有風險的。但是弱區塊本身毫無價值,攻擊者可以扣留這個弱區塊,而不會有失去區塊獎勵的風險。既然無風險,那麼為什麼不嘗試更大膽的扣留區塊的行為?
更多的弱區塊,協議行為越糟糕。所以更多的弱區塊實際上使事情變得更糟。最好的情況就是不去使用弱區塊。
當水果鏈的超時值小的時候,它的表現比Nakamoto 共識差。攻擊者可以使用無用的區塊使他的水果失效。這也有類似的問題出現,因為區塊在水果鏈中沒有任何獎勵,所以攻擊者沒有發佈區塊的動機,因為扣留區塊也並無風險,結果是攻擊者可以嘗試更大膽的扣留區塊行為。
結果是攻擊者可以嘗試更大膽的持有行為。

如果有更多的水果,那麼情況會稍微好一點。有一個著名的Newton-Pepys 問題,它是說一個概率問題,即
A. 6 個正常的骰子獨立投擲,至少出現1 個 6
B. 12 個正常的骰子獨立投擲,至少出現2 個 6
如果你擲6 次骰子,得到1 個6 的概率比你擲12 次骰子得到2 個6 的概率要大。
在水果鏈中有四種挖礦產品:誠實水果,誠實區塊,攻擊水果,攻擊區塊。
我們可以將「攻擊者比誠實礦工擁有1 個超時區塊」——即攻擊者可以成功地孤立一些水果——看作是一個條件事件。此事件完全獨立於水果生成(fruit generation),因為它僅考慮區塊。我們可以把它作為Newton-Pepy's 問題中的條件去看待——因為它是獨立的,所以我們可以直接把它扔掉。但當條件滿足時,如果水果較少,則“攻擊者有更多水果”的概率非常低。
更多的水果意味著更多的攻擊者水果。因為攻擊者是少數派,如果水果的總數更多,這意味著攻擊者的水果的總佔比會比實際上多一些。這裡用賭博來做類比更好理解,因為我們有更多的水果,這意味著當攻擊者有更多的水果, 那麼他就會更少參與賭博。人們更願意在沒有什麼可失去的情況下賭博, 但如果有更多的資本可能會失去, 他就不想賭, 這意味著更多的水果稍微有助於提高激勵相容性。
接下來在攻擊抵抗性中我們分析攻擊「作惡收益」,這個指標是越小越好的,如圖所示,獎勵分配協議優於Nakamoto 共識,優於水果鏈,優於子鏈。

我們分析了另一個有趣的衡量方法,稱為「作惡賞金」。我們定義其為最低雙花獎勵,來研究激勵偏差。 (也就是說,在雙花攻擊的獎勵大於作惡賞金時,攻擊者才有動力作惡)。 ( 圖中右下角的表格,分別是Nakamoto 共識和獎勵分配協議在區塊確認數3 或6 , α (攻擊者算力佔比在0.1 ~ 0.4 的情況下,計算出來的作惡賞金)。
通過計算各個協議的「作惡賞金」可以發現,基本上可以零成本破壞水果鍊和子鏈,甚至可以嘗試無獎勵雙花,因為毫無風險。
我們可以看到,隨著交易確認次數的增加,對於一個弱攻擊者,作惡賞金的增長幾乎呈指數增長。這意味著更多的交易確認確實有助於抵抗雙花,但是對於強攻擊者來說效果就不那麼明顯了。

對於抗審查能力, 我們計算所有的數字和排名如下:
對於小α,也就是攻擊者算力佔比較低的情況下, 水果鍊是最好的, 然後是Nakamoto 共識, 再然後是獎勵分配協議和子鏈。
對於大α,也就是攻擊者算力佔比較高的情況下,獎勵分配協議變成了最好的, 然後是水果鏈, Nakamoto 共識, 和子鏈。
顯而易見的是,對於水果鏈來說, 如果你想使其他塊無效, 要比其他協議要困難得多, 因為它們是在多個條件下獲得獎勵, 即使你是孤塊也是如此。
為什麼當α 足夠大的時候, 也就是攻擊者算力佔比較高的時候,獎勵分配協議會比水果鏈更好呢?因為在水果鏈上, 間隔被定義為主區塊和指針塊之間的區塊高度差。而在獎勵分配協議中, 間隔被定義為主區塊和區塊本身之間的區塊高度差。
因此在水果鏈中,若攻擊者在長期的出塊競爭中都獲勝了,那麼誠實的水果的獎勵都會被拿走因為他們的指針塊都被孤立了。也就是說如果你把他們的指針都孤立了,那麼對他們來說就玩完了。然而在獎勵分發協議中,最後的幾個誠實的區塊還是能夠獲得一些獎勵。如果想要讓誠實礦工失去所有獎勵,將他們的指針孤立是不夠的,你需要將大量連續的區塊孤立起來才行。 (這給攻擊者增加了阻礙)。

這些圖片能夠說明這些問題。
在水果鏈中,如果你孤立了指針,那麼你能夠安心地獲得所有的獎勵。然而在獎勵分配協議中,即使你在出塊競爭中長期孤立了這些區塊,但是這些區塊還是會指向回主鏈。因為關鍵關係並沒有考慮進去,這個區塊仍會分走攻擊者一半的出塊獎勵,這讓它更能抵抗審查攻擊。 (因為就算被審查,誠實礦工還是能獲得一部分獎勵。)
抵抗攻擊協議的通用結論
下面談一下研究中對於抵抗攻擊協議的一些通用結論。

合理的設置更長的區塊確認時間和更大的帶寬會增加安全性。
有一個兩難困境,我們稱為“獎勵壞人,懲罰好人”的機制。這對於大家來有點顛覆對協議獎勵的認知。因為在這裡即使你分叉你仍然能夠獲得出塊獎勵,你分叉是沒有風險的。所以這反而激勵了攻擊者去分叉和發動雙花攻擊。
在懲罰性協議中,因為審查攻擊者不在乎他們自己的出塊獎勵,你的懲罰規則反而給攻擊者另一個工具,來讓誠實的礦工放棄出塊獎勵。
而對於幸運獎勵協議,如果你不打破信息不對稱,那麼幸運並不意味著好。有時候幸運的塊反而是壞的塊,讓事情變得更糟。
結論就是,想要解決所有的攻擊,我們需要在底層規則中超越獎勵。 (獎勵規則並不能很好解決攻擊的問題)
具體怎麼做?我提出一些想法和大家討論一下。

我們不應該設計一個太複雜、太難分析的協議。我們需要設計一個設計者能夠分析的協議。簡單就是好的,複雜是安全的敵人。
僅針對單一攻擊策略的安全性分析是很危險的。對於很多協議來說,它們的設計者經過模擬說他們的協議能夠抵抗某種特定的攻擊方式,但是這樣的協議卻啟發了攻擊者去研究其他的攻擊策略。僅針對單一攻擊動機的安全性分析也是很危險的。
攻擊者可能會著眼於短期利益,長期利益或者損害其他礦工的利益。為了抵抗某一種攻擊,你就可能啟發了攻擊者基於另一個目標發動另一種形式的攻擊。在你的模型中你需要考慮到所有不同動機的攻擊者。


