在祕猿科技區塊鏈小課堂 26/27 期中,咱們分享了研究員 Ren Zhang 對於主流共識協議的分析( Ren Zhang 來自於前 比特幣技術實現公司 Blocksteam)。這一期小課堂,咱們將會深刻分析 PoW 共識協議的安全性,指出三種攻擊 PoW 鏈的方法,以及解決方案。而且 提出衡量協議安全性的共同指標!(PS:前排提示,理解本文須要必定共識方面背景知識,若是看不懂。那麼,只須要了解結論:1/公鏈更適合 PoW 共識;2/PoW 共識性能可以被突破)
祕猿科技區塊鏈小課堂第 28 期算法
在 Nakamoto 共識協議(Nakamoto Consensus 圖片中簡稱 NC)中,爲解決分叉問題,礦工們被要求在可能的狀況下選擇最長的鏈;在沒有最長鏈時,礦工選擇第一個接收到的區塊加入到主鏈中。在發放獎勵方面,主鏈區塊會得到所有獎勵,而孤塊什麼也得不到。安全
這樣是否足夠安全?網絡
Nakamoto 共識的原始分析傾向於認爲區塊鏈自己具有完美的鏈質量,即低於全網 50% 算力的攻擊者是沒法修改區塊鏈的。然而實際上攻擊者徹底能夠有很是高的成功率去修改區塊鏈。異步
有三種攻擊方式會修改區塊鏈:自私挖礦(Selfish Mining)、雙花(Double Spending)和審查攻擊(Censorship Attack)。其中,自私挖礦的攻擊者能夠得到與其算力不成正比的、不公平的區塊獎勵。他們能夠將挖礦算力集中起來去得到更高的相對區塊獎勵,從而破壞區塊鏈的去中心化特性;在雙花攻擊中,攻擊者能夠逆轉已確認的交易,將本身利益最大化;審查攻擊狀況下,攻擊者阻止交易被確認,形成誠實礦工的經濟損失。函數
紅色方塊表示塊被傳播到網絡的時間,而後橙色圓圈表示攻擊者的區塊,三角形表示被誠實礦工挖出的區塊。攻擊者很幸運地找到了第一個區塊,但沒有將其發佈到網絡上,而是選擇了扣留這個區塊。工具
當誠實礦工找到一個塊時,攻擊者會在這時候搶在誠實礦工以前廣播以前扣留的區塊,則以後全部的礦工都將在攻擊者的區塊而不是誠實礦工的區塊上挖礦。性能
若是攻擊者足夠幸運,可以連續找到多個區塊,那麼攻擊者就能夠毫無風險地孤立一個誠實區塊。在這種狀況下,攻擊者的的鏈變得更長,而且全網的算力會到它的鏈上挖礦。經過這種方式,攻擊者成功地增長了在總體區塊獎勵中得到的相對比例。區塊鏈
雙花攻擊與自私挖礦攻擊很是類似,是經過祕密挖礦來得到額外獎勵。如比特幣中,按照慣例有 6 個區塊確認交易後基本是徹底確認了。若是攻擊者祕密地扣留了 6 個區塊,並一次性將它們廣播到網絡中,他就可以在收到商品或者服務以後逆轉這個交易。ui
審查攻擊試圖孤立全部不符合審查要求的塊,即我要廣播我要審查的這些交易,若是你不遵從個人命令,我會盡力孤立你的塊。spa
下面咱們來講說解決 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 共識, 和子鏈。
顯而易見的是,對於水果鏈來講, 若是你想使其餘塊無效, 要比其餘協議要困可貴多, 由於它們是在多個條件下得到獎勵, 即便你是孤塊也是如此。
爲何當 α 足夠大的時候, 也就是攻擊者算力佔比較高的時候,獎勵分配協議會比水果鏈更好呢?由於在水果鏈上, 間隔被定義爲主區塊和指針塊之間的區塊高度差。而在獎勵分配協議中, 間隔被定義爲主區塊和區塊自己之間的區塊高度差。
所以在水果鏈中,若攻擊者在長期的出塊競爭中都獲勝了,那麼誠實的水果的獎勵都會被拿走由於他們的指針塊都被孤立了。也就是說若是你把他們的指針都孤立了,那麼對他們來講就玩完了。然而在獎勵分發協議中,最後的幾個誠實的區塊仍是可以得到一些獎勵。若是想要讓誠實礦工失去全部獎勵,將他們的指針孤立是不夠的,你須要將大量連續的區塊孤立起來才行。(這給攻擊者增長了阻礙)。
這些圖片可以說明這些問題。
在水果鏈中,若是你孤立了指針,那麼你可以安心地得到全部的獎勵。然而在獎勵分配協議中,即便你在出塊競爭中長期孤立了這些區塊,可是這些區塊仍是會指向回主鏈。由於關鍵關係並無考慮進去,這個區塊仍會分走攻擊者一半的出塊獎勵,這讓它更能抵抗審查攻擊。(由於就算被審查,誠實礦工仍是能得到一部分獎勵。)
下面談一下研究中對於抵抗攻擊協議的一些通用結論。
合理的設置更長的區塊確認時間和更大的帶寬會增長安全性。
有一個兩難困境,咱們稱爲「獎勵壞人,懲罰好人」的機制。這對於你們來有點顛覆對協議獎勵的認知。由於在這裏即便你分叉你仍然可以得到出塊獎勵,你分叉是沒有風險的。因此這反而激勵了攻擊者去分叉和發動雙花攻擊。
在懲罰性協議中,由於審查攻擊者不在意他們本身的出塊獎勵,你的懲罰規則反而給攻擊者另外一個工具,來讓誠實的礦工放棄出塊獎勵。
而對於幸運獎勵協議,若是你不打破信息不對稱,那麼幸運並不意味着好。有時候幸運的塊反而是壞的塊,讓事情變得更糟。
結論就是,想要解決全部的攻擊,咱們須要在底層規則中超越獎勵。(獎勵規則並不能很好解決攻擊的問題)
具體怎麼作?我提出一些想法和你們討論一下。
咱們不該該設計一個太複雜、太難分析的協議。咱們須要設計一個設計者可以分析的協議。簡單就是好的,複雜是安全的敵人。
僅針對單一攻擊策略的安全性分析是很危險的。對於不少協議來講,它們的設計者通過模擬說他們的協議可以抵抗某種特定的攻擊方式,可是這樣的協議卻啓發了攻擊者去研究其餘的攻擊策略。僅針對單一攻擊動機的安全性分析也是很危險的。
攻擊者可能會着眼於短時間利益,長期利益或者損害其餘礦工的利益。爲了抵抗某一種攻擊,你就可能啓發了攻擊者基於另外一個目標發動另外一種形式的攻擊。在你的模型中你須要考慮到全部不一樣動機的攻擊者。