雙花問題硬核科普:“手撕”比特幣白皮書第11章
白皮書第11章計算很難懂?
為紀念比特幣十年,圈內最近掀起了一股重讀比特幣白皮書的熱潮。然而,雖然很多文章都在感嘆比特幣的經濟機制設計得如何精妙,但竟然少有能把白皮書第11章的雙花攻擊成功率的計算公式講明白的。
作為一個剛入圈的新手,我實在無法理解,如果弄不懂比特幣背後的數學機制,不能確信雙花的概率,我們又何來的對比特幣系統安全性的信心。當然,如果諸位只是想要找個附屬物安一個政治口號,宣揚一下自由主義的觀念,再炒作和信仰一番,那就另當別論了。
我也看到了很多比較模糊、甚至與中本聰原意出入很大的說法。例如“比特幣交易需要6個確認”:有人認為比特幣一定要經過6個確認後,才算是交易成功;也有人認為經過6個區塊的確認後,交易就不存在風險了。還有大家常常掛在嘴邊的51%攻擊:很多人認為,攻擊的算力必須達到51%,或者必須多於50%,才能夠攻擊成功。但其實不是這樣的。實際情況是,如果你擁有40%的算力,在人們採取6個確認的情況下,無限攻擊成功的概率仍有50%。
“6個確認”和“51%攻擊”的說法由來以久,且傳播深遠。但如果你讀完中本聰的原文,你會發現,比特幣白皮書中壓根就沒有提到這兩個詞。他既沒有說交易一定需要6個確認,也沒有說必須擁有51%的算力才能成功發動攻擊。甚至在中本聰給出的簡化模型裡,只需要50%的算力,不管人們採取多少個確認(1000個或者10000個),無限攻擊成功的可能性為100%。嚴格意義來說,人們應該稱“51%攻擊”為“50%攻擊”。
但50%攻擊顯然不符合人們的直覺,也不符合人們少數服從多數的政治期望。在日後佈道者們的宣傳中,為了讓人們能夠快速理解和接受這個概念,雙花攻擊最終被簡化成了“51%攻擊”。
本文作為一篇硬核科普,將從數學概率的角度澄清人們對“6個確認”和“51%攻擊”的一些誤解。內容主要分為雙花攻擊流程、雙花成功概率分析、結論與不足。為了讀懂本文,你最好掌握一些概率論的知識,主要是泊松分佈(學過高數就行);你也需要了解一下白皮書中提到的“賭徒破產模型”,它是我們理解“50%攻擊”的關鍵。當然,如果你沒有學過這些內容也無關緊要,因為它們背後的思想都簡單易懂。尤其是“賭徒破產模型”,它看上去非常違背直覺,但很有趣。
雙花攻擊流程
最近鋼鐵佩奇比較火。為了讓講解過程不那麼枯燥,請讓我以鋼鐵佩奇為例來講一講這無聊而又致命的雙花攻擊。
引用電子貨幣領域經典的Alice和Bob交易例子,來說明比特幣作為電子現金的三大難點及其解決方案。Alice想以1299元購買Bob的鋼鐵佩奇,Alice付款有2種方式,一是物理現金,二是電子轉賬。第二種方式實際上傳遞的是一個轉賬訊息,電子訊息充當了貨幣,其成功關鍵在於有銀行判定Alice是否有足夠的餘額支付,並進行劃扣,最終記錄交易雙方賬戶餘額。
設想如果系統中沒有中心的銀行如何進行支付呢?這就是比特幣想要解決的事情。
同樣,Alice向Bob傳送了一個電子訊息“Alice給Bob轉1299元。”想要使Bob相信這筆付款,起碼要解決3個問題,證明此訊息確實是Alice傳送的(不可偽造性)、判斷Alice確實有1299元(所有權證明),知道Alice沒有同時支付給另一個人(雙花)。
利用不對稱加密演算法,Alice使用私鑰簽名能夠提供其資產所有權證明和保證交易的不可偽造性,這是比特幣之前就已經很成熟的技術。
但是雙花難題依舊沒有解決,此前的電子貨幣方案一直依賴於引入中心第三方來解決,這相當於重造了一箇中央銀行,現實意義並不大。中本聰創造性地利用區塊鏈作為公共賬本和引入礦工競爭記賬解決了這個問題,這也是比特幣的偉大之處。
雙花是指,Alice給Bob轉錢的同時又給Charlie轉了相同數目的一筆錢買手機。這時候Bob和Charlie檢視自己的賬本進行驗證,發現Alice確實有1299元。他們無法得知Alice是否給其他人也轉賬了。於是,Alice拿走佩奇和手機,剩下Bob和Charlie只有一個人能得到1299元,這就是簡單情形下的雙花問題。中本聰引入礦工之後,Bob收到這筆付款通過交易驗證後,並不會立馬獨自記賬然後發貨,他會廣播這筆交易,讓網路上多數人幫忙驗證Alice是否只給自己轉了這筆錢。假設Charlie也廣播了這筆交易,那麼最後只能有一筆交易記在公共賬本上。通過分析可以知道,這種簡單雙花基本上是不可能實現的。其他礦工沒動機幫Alice記假賬(放入Alice給Bob和Charlie的兩筆衝突交易)即使Alice競爭到了記賬機會,廣播區塊之後,也會被其他礦工驗證出兩筆衝突交易存在。
以上情形是交易被Alice確認之前的簡單雙花問題,還有一種複雜的雙花問題,Alice可以轉給自己,同時製造分叉鏈最後代替主鏈完成雙花,基本攻擊流程是這樣的。
(1)在圖(a)最後一個區塊,Alice向全網廣播“Alice給Bob轉1299元”
(2)Alice修改自己的客戶端程式,記入一筆“Alice給Alice轉1299元”,同時悄悄挖礦,不廣播自己的進度,挖出圖(b)的白色鏈。
(3)等到Bob看到全網主鏈(黑色鏈)有足夠的確認區塊個數(通常認為是6個,為什麼?),發出鋼鐵佩奇之後,如果Alice的白鏈長於黑色主鏈,他會向全網公佈自己的進度,從而被接受為新的主鏈。
主鏈只記錄“Alice給Alice轉1299元”,從而使得“Alice給Bob轉1299元”無法記入賬本。最終雙花攻擊成功,Alice拿到了鋼鐵佩奇,Bob一無所獲。當然,Alice發起攻擊是有成本的,他為了挖出白色鏈,需要投入礦機以及電力消耗,除非收益大於成本,否則理性攻擊者是不會發起攻擊的。餘下全文,我們僅考慮在收款方等待z個確認之後,佔全網算力q%的攻擊者雙花成功的概率。也就是說,不考慮攻擊的經濟可行性,僅僅分析攻擊成功的概率大小。
雙花成功概率分析
我們都學過如何求解應用題。第一部分交代了雙花問題的背景,相當於告訴了我們“應用題”的條件,現在我們需要求解這道題。題目是:已知Alice佔有全網算力比例為q,誠實節點佔全網算力比例為p,p+q=1,Bob等待z個區塊確認交易後,求解Alice使得自己偷偷挖的白鏈長度追上黑鏈(主鏈)的概率P(win)?
此問題還包含著以下假設:追趕時間內,系統難度值保持不變;攻擊者Alice和誠實節點的算力相對比例不變。
求解追上概率可以拆解為兩種情況來分析,第一情況是在等待z個區塊確認的時間裡,這段時間攻擊者Alice挖出了k個區塊,且k>z即攻擊鏈更長。這種情況下,一旦公開網路上最長鏈追加了z個區塊,Bob就會認為交易已經確認,可以向Alice發出鋼鐵佩奇。而Alice一旦看到貨已經發出,他就可以公佈自己的白色鏈,由於白色鏈長於黑色,那麼Alice記錄的“Alice給Alice轉1299元”交易記錄留在主鏈上,雙花成功。
另一種情況是,k<=z,記n=z-k表示攻擊鏈和誠實主鏈的差距。也就是說,在Bob確認交易的時候,Alice的白鏈短於主鏈,不足以發動攻擊,他會繼續偷偷挖,和主鏈競爭不斷縮小差距,直到比主鏈長。
算出兩種情況下概率再求和就是攻擊成功概率了。
泊松分佈—求Alice挖出k個區塊的概率
以下按照中本聰的白皮書原文思路來推導,採用泊松分佈假設,Meni Rosenfeld在“Analysis of hashrate-based double-spending”中採用更加精確的負二項分佈,兩個結果差異很小。
假設誠實節點按預期時間均勻出塊,那麼在誠實節點挖出Z個塊的時間內,Alice挖出區塊的平均值是λ=z q/p 。
泊松分佈的概率函式為:
P(x=k)=(λ^k ⅇ^(-λ))/k! , k=0,1,2,3·····
泊松分佈用來描述單位時間內隨機事件發生的次數。泊松分佈的引數λ是單位時間(或單位面積)內隨機事件的平均發生次數。
通過泊松分佈,就可以知道k=1,2,3····的概率分別是多少,比如,這段時間Alice只挖到k=1個塊的概率是
那麼第一種情況發生的概率就是
這個式子表示發生k=z+1,z+2,z+3····這些事件的概率之和。
賭徒破產問題
如果你看到了這裡,恭喜。要麼你就是一個腦子裡還留了一點高等數學的人,對於讀者來說這已經相當不易,歡迎在後臺聯系我;要麼你對嚴謹枯燥內容的抗性已經超過了絕大多數人,這比前者還要難得。
我們現在需要對問題的另一半進行解答。但在討論這一部分之前,你需要接受一個反直覺的例子:假使一個賭徒把自己的錢分成n份去賭場賭博,他輸贏的概率為二分之一。如果這場賭博進行無限次,賭徒一定會輸光自己身上所有的錢。
這就是大名鼎鼎的“賭徒破產問題”。這個問題的關鍵在於假設賭場手裡的錢遠多於賭徒,因而不需要考慮籌碼歸零的問題;而賭徒手裡的錢遠少於賭場,一旦某一次賭輸,使籌碼歸零,便必須退出遊戲。因此,雖然從單次賭博的概率上看上去,賭徒和賭場的遊戲是平等的,但由於籌碼的多少限制了賭徒和賭場遊戲可以進行的區間,最終遊戲的天平倒向了賭場。
這個問題規勸了那些賭博成癮的人們。它說明了,就算遊戲是公平的,但如果一個人執迷賭場以此為家,最後也將賠得精光。
這與攻擊者和誠實節點又何其之像!攻擊者只要區塊數追平後超過誠實節點所挖的鏈,按照比特幣“最長鏈”的原則,其他算力便會轉移到節點數更高的新鏈上來,攻擊成功。假設誠實節點們挖得的鏈長度超過攻擊者z-k個,這就好比誠實節點作為賭徒手裡有z-k個籌碼。此時,誠實節點與攻擊者同時進行著一場賭博的競賽,一旦誠實節點將手中的籌碼輸乾淨,攻擊者便能追上。(其實應該是輸到剩下-1個,但中本聰的白皮書裡的假設是輸到0。其實,輸到0僅僅是追平,但雙花攻擊需要超越,因此這個假設不太嚴謹,讀者們見仁見智,可以做更深的討論。我們暫時按照白皮書裡的思路走。)
理解了這個比喻,讓我們回到原來的話題。現在我們要求第二種情況下追上的概率,這種情況下,我們可以把問題進行簡化,近似抽象成賭徒破產問題。已經知道,此時Alice挖出k個區塊,比主鏈少n=z-k個。在既定的n個區塊差距下,他們將競賽挖礦,攻擊者成功概率是q,誠實節點是p。放在數軸上考慮,每一局競賽當攻擊者贏,則向左一步,縮小差距為n-1,否則向右變為n+1。問多局博弈之後,Alice向左移到0的概率?
我們可以先考慮n=1的時候移到n=0的概率。記p(1)表示從1移到0的概率,p(2)表示從2移到0的概率,依次類推求p(n)。
顯然在1這個點,一局博弈之後,只有兩種情況,向左到0,向右到2。然後從2移到0的概率為p(2).所以有以下方程:
p(1)=q+p⋅p(2)
P(1)表示從1到0的概率,也可以表示任何一點向左一步的概率。而從2到0,一定會先到1再到0,故p(2)=p^2 (1).
代入p(2),就可以求出 p(1)=q/p ,則p(n)=(q/P)^n
當q>p ,即 q/p>1 ,有p(n)>1,也就是n次博弈之後,一定會移到0. 結果說明,當Alice算力超過50%時,他一定可以追上主鏈,這是確定事件。
當q=p,即攻擊者算力佔50%,那麼p(1)=1,p(n)=1,攻擊一定會成功。也就是說,50%的算力就一定可以攻擊成功,並不需要51%。
當q<p, 有 p(n)=(q/P)^n,此時q/P<1,說明如果Alice在n較小時沒有追上,越往後其追上的概率越小,n趨於無窮時,p(n)趨近於0,但是永遠不可能為0。
所以第二種情況概率為:
結論
總結得到Alice追上概率為:
這也就是白皮書第11章最後給出的結論公式(見下圖)。一些人用過這個公式,但我沒能找到完整的推導過程。希望本文解答那些對此公式同樣感到費解的朋友們的一些疑惑。
中本聰白皮書原文
在得出這個公式後,讓我們迴歸文章開頭的“6個確認”和“51%攻擊”問題。
簡單來說,這個公式可以總結為p(win)=f(q,z), 即雙花成功的概率是攻擊者算力比例q和收款者等待確認區塊個數z的函式。給定q和z,就可以算出成功概率,以下是Meni Rosenfeld論文中根據此函式,給出的資料和圖。
圖中橫軸表示q取不同值,不同曲線表示z不同,縱軸表示成功概率。
如圖所示:當攻擊者算力佔比大於等於50%時,無限時長的攻擊總能成功
由以上結果,可以得出一些結論:
1、一般情形下,成功概率對z值呈指數下降,所以等待更多區塊以後確認交易是保險的策略。
2、無論多大的確認數z也無法把成功概率降到0,做不到萬無一失。
3、當攻擊算力大於等於50%,不管多大的區塊確認數也無法阻止雙花成功。(關於50%攻擊,請回想一下賭徒破產模型。其實,中本聰在白皮書中把情況二雙花的要求退化成了“追上”。但就算我們把“追上”變成“超過”,即允許賭徒最後可以-1個,這依然改變不了什麼。掌握了50%後,只要能夠發動無限時長的攻擊,就一定能夠攻擊成功。這就類似於,哪怕賭場願意借一塊錢給賭徒賭博,最後賭徒也無法避免破產的命運。)
至此,我們可以清楚明白,所謂“6個確認”是說,攻擊算力在10%以下,等待6區塊確認,雙花成功的概率在0.1%以下。理論上講,在任意小算力和任意大確認數下,成功概率非常小,但仍可能攻擊成功。
不足
此模型有些地方並不精確。求解第二階段概率時,把問題抽象成賭徒破產模型。誠實節點和攻擊者是分別在兩條鏈上各自挖礦競爭,假設攻擊者先挖到了區塊,那麼此局結束,雙方仍以p和q的概率開啟下一局,誠實節點算新區塊,攻擊者繼續算上一個區塊。然而現實時攻擊者雖然此局失敗,但是他已經累積了一定工作量,他繼續算出這個區塊的概率比上一局算出的概率大。由此會對最終計算結果造成一定誤差。
另外一點是本文沒有討論攻擊者的攻擊成本和收益的經濟分析。
注:本文概率分析模型主要參考比特幣白皮書、Meni Rosenfeld的“Analysis of hashrate-based double-spending”以及果殼的“從酒鬼失足到賭徒破產,悲劇收場為何註定”。
參考文獻:
1.Satoshi Nakamoto , ”Bitcoin: A Peer-to-Peer Electronic Cash System”,2009
2.Meni Rosenfeld,“Analysis of hashrate-based double-spending”, 2012
3.pondering,“從酒鬼失足到賭徒破產,悲劇收場為何註定”,果殼,2011
4.Zhangzedtv,”通過原始碼學習比特幣-難度目標與難度調整” 2018
5.Michael Nielsen,”比特幣協議是怎樣工作的”,2014
6.W. Feller, "An introduction to probability theory and its applications,"1957
7.Tiny熊, ”比特幣如何達成共識-最長鏈的選擇”
本文來源:碳鏈價值
作者:白魚 編輯:唐晗