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