區(qū)塊鏈當(dāng)中的自私挖礦是怎么回事
工作量證明(PoW)區(qū)塊鏈實現(xiàn)了一種形式的狀態(tài)機(jī)復(fù)制系統(tǒng)(State Machine Replication,SMR)。不像傳統(tǒng)的 SMR 協(xié)議,PoW 區(qū)塊鏈?zhǔn)情_放的,即,任何人都可以加入這個協(xié)議,而且系統(tǒng)也會用經(jīng)濟(jì)利益來激勵參與者(也叫 “礦工”)遵守協(xié)議。
因此,同樣迥異于傳統(tǒng) SMR 協(xié)議的地方是,在推理區(qū)塊鏈的安全性時,僅僅假設(shè)惡意參與者的數(shù)量往往并不能得到答案。關(guān)鍵是要問一問,礦工是否真的有足夠的動機(jī)來遵守所在的協(xié)議。這就是本文要討論的東西。
為使討論更具體一些,我們把討論的語境限定為中本聰?shù)?u>比特幣協(xié)議。Ling 已經(jīng)提供了一些相關(guān)的背景知識,以及一個對惡意敵手的安全性分析。在我們的分析中,我們準(zhǔn)備把這個系統(tǒng)描述為礦工之間的一個游戲(game,亦可稱 “博弈”)。
游戲
游戲玩家就是出塊的礦工。這個游戲是按回合(round)來進(jìn)行的,每一回合都有一個礦工可以出一個區(qū)塊,其他礦工可以發(fā)布(publish)這個區(qū)塊。同時,游戲中的消息是同步(synchronous)傳播的,因此,所有礦工都會收到上一輪發(fā)布的區(qū)塊。
這樣當(dāng)然是簡化了現(xiàn)實,例如,這個模型忽略了系統(tǒng)中挖礦總算力的緩慢變化,也忽略了偶爾會發(fā)生的出塊沖突(即分叉)(這種情況雖然少見,但還是會發(fā)生的)。雖然如此,這個模型作為一階近似,也足夠了。
協(xié)議的規(guī)定是讓每一個礦工都在最長鏈上出塊,或者,如果分叉中的兩條鏈長度相同,他們就跟隨自己先接收到的那條鏈。
游戲中的每一個玩家都致力于最大化自己的收益 —— 這個就是 TA 的效用函數(shù)(uTIlity funcTIon)了。具體來說,我們還假設(shè)這是一個 infinite-horizon 游戲,即,隨著游戲時間不斷趨近于無限,一個礦工的收益就是其平均出塊比例。這就代表,密碼學(xué)貨幣形式的獎勵是按礦工所出的區(qū)塊發(fā)給出塊礦工的。注意,主鏈之外的區(qū)塊不會進(jìn)入礦工的收益。
重要觀察
主鏈上的出塊比例就是對礦工收益的實時模擬。
假設(shè)系統(tǒng)中的挖礦總算力是靜態(tài)不變的,系統(tǒng)每 10 分鐘出一個區(qū)塊,攻擊在一次難度調(diào)整完成后立即發(fā)動。假設(shè)一種出塊策略會導(dǎo)致網(wǎng)絡(luò)中一定比例的區(qū)塊被拋棄,比如所有礦工出的塊中有 20% 的塊會產(chǎn)生在主鏈之外,而且這個比例是穩(wěn)定的。那么,雖然這個系統(tǒng)仍然是每 10 分鐘出一個塊,但只有 80% 會出在主鏈上,也就是主鏈的生長速度會變成每 12.5 分鐘延長一個塊,而不是每 10 分鐘延長一次。比特幣協(xié)議每出 2016 個塊會調(diào)整一次難度,如此一來,調(diào)整難度所需的時間也會比一般情形要長(是 12.5×2016 分鐘,而不是 10×2016 分鐘)。
一旦難度調(diào)整發(fā)生,難度又會下降,使得主鏈的出塊間隔重新變回 10 分鐘。這就意味著系統(tǒng)的整體出塊速度更高了,每 8 分鐘就能出一個塊。
所以,一個礦工如果有算力占全網(wǎng)比例為 α,且在主鏈上出塊的占比為 α′ 》 α,則其每小時收益會與 α′ 成比例(而不是與 α 成比例)。
自私挖礦算法
自私挖礦(Selfish Mining)是一種投機(jī)挖礦算法,用于證明前述協(xié)議對小礦工并不公平(not an equilibrium)。我們先來看看自私挖礦的機(jī)制,然后討論看看自私挖礦為什么以及何時會產(chǎn)生這樣的效果。
一開始,自私的礦工會在最長鏈上挖礦,就像協(xié)議希望的那樣。不過,一旦 TA 挖出了一個區(qū)塊,TA 會先把這個區(qū)塊藏起來,而不是立即發(fā)布出去,然后嘗試在這個秘密塊后繼續(xù)出塊,形成一個 “秘密分支”。
與此同時,其它礦工會延長公開的那條鏈,這條鏈最終會變得更長(概率為 1),因為他們的挖礦算力占大頭。而自私挖礦的礦工會繼續(xù)延長其秘密分支,直到公開分支落后一個區(qū)塊。然后自私礦工就會把自己的秘密分支發(fā)布出來。
因為秘密分支更長,那么另一方就會認(rèn)為這條才是主鏈,從這時開始,所有人都會跟隨自私礦工的分支,而其他礦工挖出的區(qū)塊會被拋棄 —— 被忽略,并使得出塊礦工一無所獲。
但這種策略也不是萬無一失 —— 從開始秘密挖礦時起,自私礦工就一直承擔(dān)著風(fēng)險。如果 TA 出了一個秘密區(qū)塊同時別的礦工也出了一個區(qū)塊,TA 就不能靠發(fā)布這個秘密區(qū)塊來變成最長鏈;相反,此時會變成兩個同樣長的分支在競爭最長鏈。
自私礦工會嘗試延長自己的分支;為簡化分析,我們假設(shè)其他礦工也會嘗試延長自己所在的分支。如果 TA 能搶先出下一個塊,則 TA 的分支會變成最長鏈,然后下一次攻擊會在這條最長鏈的末端重新開始。如果其他礦工生出,那么自私礦工就屬于不利地位(TA 的鏈更短)。在這種情況下,TA 會放棄這次攻擊,尋找下一次機(jī)會。在這次攻擊中,TA 的秘密分支會變成一條較短的分叉,使 TA 一無所獲。
自私挖礦分析
乍一看,這種攻擊應(yīng)該不會奏效 —— 自私礦工的算力只占少數(shù),必定是贏少輸多。不過,一個細(xì)致的分析表明,并不總是如此。這個游戲可以自然而然地描述成一個 Markov Chain(譯者注:馬爾可夫鏈,在狀態(tài)轉(zhuǎn)換的過程中是 “無記憶性” 的,即新一回合中的得益跟以往任何一回合的得益都無關(guān))。通過計算自私礦工的出塊和其他礦工的出塊情況,我們可以計算出自私礦工的區(qū)塊(及收益)在主鏈上的比例,其實就是其算力規(guī)模的函數(shù)。
我們可以看出,算力占比超過 1/3 的自私礦工可以通過違反協(xié)議及執(zhí)行自私挖礦算法來提高自己的收益。
結(jié)論
上述分析表面,當(dāng)自私礦工的算力超過 1/3 時,自私挖礦的策略比誠實挖礦的策略收益高,但這是在樂觀的假設(shè)下的結(jié)果。想要更深度的分析(包括更弱的模型以及加強(qiáng)協(xié)議的路徑),請看 Financial Crypto 2013 上的論文以及 ACM 2018 會議上的論文。
后續(xù)的 研究,包括最近的一個,都使用馬爾可夫方法來確定誠實挖礦策略占優(yōu)的算力閥值(就跟本文使用的方法一樣)。
感謝 Ittai Abraham 富有教益的反饋。