王 健,陳恭亮
(上海交通大學(xué) 電子信息與電氣工程學(xué)院,上海 200240)
2 008年,Satoshi Nakamoto發(fā)表了一篇創(chuàng)新性的論文[1],提出了一個全新的貨幣系統(tǒng)——比特幣。傳統(tǒng)的貨幣系統(tǒng)通常由一個統(tǒng)一機構(gòu)或者權(quán)威第三方作為中心節(jié)點來處理所有事務(wù),而比特幣顛覆了這種設(shè)計。它利用共識和激勵機制在點對點網(wǎng)絡(luò)中維護了一個分布式公共賬簿,賬簿中的數(shù)據(jù)通過密碼學(xué)算法來保證安全性與合法性。區(qū)塊鏈?zhǔn)潜忍貛胖芯唧w實現(xiàn)分布式賬簿的數(shù)據(jù)結(jié)構(gòu)。它由許多區(qū)塊首尾相連而成,每一個區(qū)塊都記錄著系統(tǒng)一段時間內(nèi)的交易數(shù)據(jù)。系統(tǒng)中的每個節(jié)點會通過網(wǎng)絡(luò)通信將區(qū)塊鏈數(shù)據(jù)存儲到本地,在共識機制作用下,各節(jié)點的區(qū)塊鏈數(shù)據(jù)具有高度一致性。正是由于區(qū)塊鏈數(shù)據(jù)在系統(tǒng)中的各節(jié)點都有備份,任何試圖篡改或是偽造交易數(shù)據(jù)的攻擊都難以實現(xiàn)。區(qū)塊鏈安全而又去中心化,許多研究人員認(rèn)為它可以有效解決中心化系統(tǒng)存在的構(gòu)建困難﹑維護成本高﹑效率低下以及安全存在風(fēng)險等問題。然而,區(qū)塊鏈的應(yīng)用并非易事,最主要的原因是區(qū)塊鏈本身具有非常復(fù)雜的內(nèi)部設(shè)計,不恰當(dāng)?shù)男薷倪@些設(shè)計可能會影響區(qū)塊鏈的一些安全特性。區(qū)塊鏈分叉的處理機制是比特幣系統(tǒng)中眾多重要設(shè)計之一,關(guān)系到整個系統(tǒng)的安全性和可用性,是設(shè)計和應(yīng)用區(qū)塊鏈技術(shù)時必須充分考慮的因素。本文以比特幣中的區(qū)塊鏈為具體研究對象,分析其分叉產(chǎn)生的原因以及影響分叉產(chǎn)生的各種因素,并介紹一些基于分叉的攻擊手段﹑改良方案以及實際應(yīng)用案例。
區(qū)塊鏈?zhǔn)潜忍貙崿F(xiàn)去中心化的技術(shù)核心,是比特幣中最重要的概念之一。下面將主要介紹區(qū)塊鏈的相關(guān)一些基本概念和數(shù)據(jù)結(jié)構(gòu)等背景知識。
在傳統(tǒng)的交易模式中,用戶往往會有一個憑證用來表示自己的賬戶。中心系統(tǒng)會將賬戶和用戶所持有的金額數(shù)目相關(guān)聯(lián),并在發(fā)生交易后對金額進行變更和記錄。這種方式的優(yōu)點是便于用戶管理自己的資產(chǎn),查詢歷史流水;缺點是用戶的賬戶和身份信息極其容易被綁定,增大了遭遇針對性攻擊的可能。比特幣中不再使用賬戶這一概念,而是通過未經(jīng)使用的交易輸出(Unspent Transaction Output,UTXO)的數(shù)據(jù)結(jié)構(gòu)來構(gòu)建交易。如圖1所示,比特幣中一筆交易大致可以分為輸入﹑輸出和交易哈希三個部分。其中,輸入﹑輸出部分都是一系列UTXO的集合。每一個UTXO都包含金額大?。ˋmount)﹑索引值(Index)﹑鎖定腳本(Lock Script)等信息。在構(gòu)建交易時,付款方首先需要提供作為交易輸入部分的一些UTXO,然后將找零和支付金額用UTXO的方式來構(gòu)造作為輸出部分。交易輸入部分的UTXO都是從其他交易的輸出中選取的,付款方必須指明輸入UTXO所在的交易哈希值和索引值,以便證明這些UTXO確實存在而不是憑空創(chuàng)造的。為了保證交易的安全性,付款方還必須證明自己確實是這些UTXO的持有者,而收款方必須能夠保證只有自己可以在未來使用這筆交易輸出中屬于自己的UTXO。比特交易使用鎖定腳本和解鎖腳本來滿足上述兩項安全需求。這些腳本采用簽名技術(shù)產(chǎn)生,其中鎖定腳本在交易數(shù)據(jù)中被公開,而解鎖腳本由用戶私密保管,只有在使用UTXO時,用戶才把解鎖腳本寫到交易中。比特幣中腳本簽名所使用的協(xié)議有P2PKH(Pay To Public Key Hash)﹑P2PK(Pay To Public Key)﹑多重簽名等。這些簽名算法所使用的公鑰和私鑰都是按照比特幣規(guī)范生成的。用戶使用特定范圍內(nèi)的隨機數(shù)作為私鑰,利用secp256k1[2]所規(guī)定的橢圓曲線和點對私鑰計算后得到對應(yīng)的公鑰。
圖1 Bitcoin交易結(jié)構(gòu)
基于UTXO實現(xiàn)的方式使得比特幣中的多方交易變得簡單,參與方只需要提供輸入UTXO或者創(chuàng)建輸出UTXO,就可以參與到同一筆交易中。另一方面,UTXO還保證了參與交易用戶的信息安全,每一個UTXO都會擁有不同的簽名,而用戶往往同時擁有多個UTXO,攻擊者幾乎無法將用戶身份和UTXO關(guān)聯(lián)。但是作為代價,用戶必須小心維護自己未使用的UTXO的解鎖腳本,因為一旦解鎖腳本丟失,用戶就無法使用與之對應(yīng)的UTXO,里面的金額也將會永久凍結(jié)。
在比特幣中,一筆交易需要等待確認(rèn)才具有合法性,在介紹區(qū)塊時會具體解釋確認(rèn)過程。交易一旦被驗證并確認(rèn)后,其輸入部分的UTXO將不能再用來作為其他交易的輸入,防止重復(fù)消費問題的發(fā)生。比特幣中,一筆交易的輸入UTXO金額總和往往略大于輸出UTXO的金額總和,兩者的差值被稱為交易費。交易費可以使該筆交易在系統(tǒng)中更快地被確認(rèn)。
區(qū)塊是比特幣中用來記錄和確認(rèn)交易信息的數(shù)據(jù)結(jié)構(gòu)。它是由比特幣系統(tǒng)中一些稱為礦工的節(jié)點產(chǎn)生的,而礦工構(gòu)造區(qū)塊的過程被稱為挖礦。
比特幣區(qū) 塊的結(jié)構(gòu)如表1所示,主要可以分為區(qū)塊頭部和交易數(shù)據(jù)兩大部分。在一筆交易被創(chuàng)建后,用戶會通過點對點網(wǎng)絡(luò)向全網(wǎng)廣播這筆交易,而礦工們則會收集并驗證這些交易數(shù)據(jù),并將其中合法的交易信息存儲在本地交易池中。在交易數(shù)目達到一定量后,礦工開始用這些交易數(shù)據(jù)構(gòu)造區(qū)塊。礦工首先會確定要產(chǎn)生的區(qū)塊應(yīng)該包含哪些交易數(shù)據(jù),并計算交易數(shù)據(jù)的Merkle值作為區(qū)塊交易數(shù)據(jù)的校驗。一般來說,礦工會盡可能多地優(yōu)先選擇交易費較高的交易,因為一旦礦工挖礦成功,這些交易費都將由他獲得。隨后,礦工會根據(jù)自己的挖礦協(xié)議以及前一個區(qū)塊數(shù)據(jù),填充區(qū)塊頭部的版本﹑前驅(qū)區(qū)塊哈希值以及區(qū)塊時間。隨后,礦工會獲取系統(tǒng)當(dāng)前的難度值,填入nBits字段。這一數(shù)值是由系統(tǒng)設(shè)定用于調(diào)整挖礦難度的數(shù)值。一個合法區(qū)塊的哈希必須符合難度值的要求,在后面介紹影響分叉產(chǎn)生因素時將詳細(xì)解釋這一數(shù)值。最后,礦工開始遍歷隨機數(shù)Nonce,試圖獲得哈希符合當(dāng)前系統(tǒng)難度值的區(qū)塊。這一步是挖礦環(huán)節(jié)最主要的工作。比特幣挖礦采用sha256算法作為區(qū)塊的哈希算法,這一算法目前沒有明顯的攻擊策略和漏洞,礦工們只有通過暴力搜索來尋找符合系統(tǒng)難度值的區(qū)塊哈希值,這要求礦工具有非常強大的計算能力。而在某些難度值較大的情況下,礦工甚至不得不去調(diào)整一些交易數(shù)據(jù)的組合,以獲得更大的哈希搜索范圍。
表1 比特幣區(qū)塊結(jié)構(gòu)
礦工挖礦成功后,會向全網(wǎng)廣播其構(gòu)建的區(qū)塊。系統(tǒng)中的節(jié)點會驗證和確認(rèn)這個區(qū)塊,并將合法的區(qū)塊添加到區(qū)塊鏈的尾部,并把它繼續(xù)向外傳播。挖礦成功的礦工除了獲得區(qū)塊中所有包含的交易費外,還會額外獲得一個系統(tǒng)設(shè)定的獎勵費,用作挖礦工作的回報。獎勵費是通過一個沒有輸入的特殊交易來實現(xiàn)的,這種交易也被稱為Coinbase交易。在交易費和獎勵費的激勵下,礦工會不斷投入計算力量爭取成功挖礦,區(qū)塊鏈也得以不斷延伸,從而記錄下更多的交易信息。
假設(shè)比特幣的網(wǎng)絡(luò)是同步的,且不存在多個礦工同時挖出一個合法區(qū)塊的情況,那么系統(tǒng)中的區(qū)塊會依次不斷產(chǎn)生并添加到區(qū)塊鏈尾部。在這種狀態(tài)下,系統(tǒng)中的所有節(jié)點所存儲的區(qū)塊鏈數(shù)據(jù)一致。在驗證一筆交易的時候,節(jié)點可以通過遍歷搜索區(qū)塊鏈的數(shù)據(jù)來確認(rèn)交易中的UTXO是確實存在且沒有被重復(fù)使用,而攻擊者幾乎沒有方法能夠修改或是偽造數(shù)據(jù)。然而,比特幣是基于點對點網(wǎng)絡(luò)建立的系統(tǒng),區(qū)塊的傳播必然存在延時,且礦工之間的挖礦工作相互獨立,存在同時挖礦成功的可能。在這種情況下,系統(tǒng)將不再處于理想狀態(tài)。
考慮延時和競爭的情況下,假設(shè)當(dāng)前區(qū)塊鏈的長度為l,鏈尾部區(qū)塊為b。在某一時刻,礦工Alice首先挖出了區(qū)塊ba并開始向全網(wǎng)傳播ba。與此同時,系統(tǒng)中的另一位礦工Bob也在對長度為l的區(qū)塊鏈進行挖礦,恰巧Bob在ba傳達到他之前獨自挖出了一個區(qū)塊bb。他并不知道區(qū)塊ba已經(jīng)被挖出,于是開始向全網(wǎng)傳播bb。這時網(wǎng)絡(luò)中同時有兩個區(qū)塊ba和bb在傳播,且這兩個區(qū)塊都指向同一個前驅(qū)區(qū)塊b。隨著這兩個區(qū)塊被不斷轉(zhuǎn)發(fā),系統(tǒng)中的節(jié)點將會分別以Alice和Bob為中心維護著兩個長度同為l+1的鏈chaina和chainb,但兩者尾部區(qū)塊并不相同。最終,網(wǎng)絡(luò)中在Alice和Bob中間的一些節(jié)點最終會收到來自兩邊試圖延伸同一個區(qū)塊鏈的不同區(qū)塊。這些節(jié)點會將兩個區(qū)塊都追加在區(qū)塊b處,這就是區(qū)塊鏈的分叉。
分叉是區(qū)塊鏈必須解決的問題,因為如果任由分叉不斷延伸,那么攻擊者可以分別在chaina和chainb上同時使用b區(qū)塊以及之前區(qū)塊交易中的UTXO進行重復(fù)消費。不僅如此,分叉狀況下,只有少數(shù)中間節(jié)點能夠察覺到分叉的存在,大部分不知情的節(jié)點會繼續(xù)在各自的鏈上挖礦。對于全網(wǎng)而言,節(jié)點的計算能力實際上被割裂,這將直接降低區(qū)塊的產(chǎn)生速率,影響系統(tǒng)性能。比特幣處理區(qū)塊鏈分叉方法是先讓節(jié)點繼續(xù)在兩條鏈上繼續(xù)挖礦,一旦有一條鏈的高度超過了其他支鏈,那么這條鏈就會勝出成為主鏈,而其他支鏈將會被拋棄。這些被拋棄鏈上的區(qū)塊不再有任何意義,被稱為孤塊。這種處理分叉的方法實際上就是比特幣的共識,即所有節(jié)點都遵循的一個公開規(guī)范。共識也是去中心化系統(tǒng)解決競爭問題的主要方式之一。
由于分叉的存在,區(qū)塊鏈中尾部的一些區(qū)塊并不是絕對安全的,因為它們存在著被新的分支超越的可能。但是,隨著后續(xù)新區(qū)塊的不斷追加,它們被新的分叉超越的可能性會呈指數(shù)式下降?;谶@一情況,比特幣中一筆交易的確認(rèn)往往需要等待該交易所在區(qū)塊能夠有一定數(shù)量的后續(xù)區(qū)塊,這導(dǎo)致了比特幣中的交易確認(rèn)并不是實時的,其過程通常需要幾個區(qū)塊產(chǎn)生的時間。
前面提到了分叉產(chǎn)生的條件是一個區(qū)塊還在傳播時另一個區(qū)塊被發(fā)現(xiàn)并傳播。Christian Decker等人在研究比特幣的網(wǎng)絡(luò)[3]時,針對這一事件給出了一個關(guān)于分叉的數(shù)學(xué)模型。假設(shè)在比特幣的網(wǎng)絡(luò)中能夠在每個節(jié)點設(shè)立觀測點來檢測區(qū)塊的傳播,那么當(dāng)一個特定區(qū)塊開始傳播后,觀測點會先后收到該區(qū)塊。如果定義f(t)為從區(qū)塊開始傳播t時間后接收到區(qū)塊的觀測點的百分比,當(dāng)前系統(tǒng)挖出一個區(qū)塊事件的概率為Pb,那么區(qū)塊傳播時產(chǎn)生區(qū)塊的概率為:
為了方便后續(xù)描述,在Pb非常小的情況下,利用伯努利不等式把式(1)放大近似為:
由定義可知,一定存在一正數(shù)ε,使得t>ε時f(t)=1。所以,式(2)中的積分項大小大致取決于ε的大小。具體到比特幣,全網(wǎng)節(jié)點的計算能力大小決定了Pb的大小,而網(wǎng)絡(luò)延遲情況決定了ε的大小。所以,對于一個穩(wěn)定的網(wǎng)絡(luò)結(jié)構(gòu),式(2)中積分部分的值是相對穩(wěn)定的。這表明分叉的產(chǎn)生和區(qū)塊產(chǎn)生概率約成正比,也就是說區(qū)塊產(chǎn)生速率越快,分叉越容易出現(xiàn)。雖然利用共識可以解決分叉問題,但其本身也是依賴于網(wǎng)絡(luò)通信。如果區(qū)塊產(chǎn)生的速率過快,將會導(dǎo)致系統(tǒng)中分叉的收斂速度變慢,區(qū)塊鏈不同分叉尾部的一些區(qū)塊變成孤塊的可能性會大幅增加,從而嚴(yán)重影響系統(tǒng)的可用性和安全性。在區(qū)塊產(chǎn)生的速率超過了共識交換信息所需要基本用時的極端情況下,區(qū)塊鏈分叉甚至將無法收斂,共識機制不能起到任何作用,此時區(qū)塊鏈就會崩塌。
Christian Decker的模型假設(shè)中要求一個全節(jié)點的檢測系統(tǒng),這一點在真實環(huán)境中幾乎不可能實現(xiàn)。一方面,技術(shù)上難以實現(xiàn)連接其所有的節(jié)點并向一個中心匯報數(shù)據(jù);另一方面,系統(tǒng)中網(wǎng)絡(luò)節(jié)點的規(guī)模本身也在不斷變化,不可能做到實時更新檢測。然而,區(qū)塊速率必須被監(jiān)測和控制。為了解決這一問題,比特幣系統(tǒng)設(shè)計了一個難度算法共識,系統(tǒng)會在固定周期時間點不斷根據(jù)當(dāng)前系統(tǒng)狀況調(diào)整挖礦的難度。區(qū)塊鏈沒有中心化系統(tǒng),所以要實現(xiàn)這一難度調(diào)整工作必須通過共識來完成。比特幣的挖礦速率控制目標(biāo)是每隔10 min產(chǎn)生一個區(qū)塊,在每2 016個區(qū)塊產(chǎn)生后對系統(tǒng)的難度進行調(diào)整。其中,2 016個區(qū)塊剛好是理想速率下兩周的時間所能挖得的區(qū)塊數(shù)目。礦工在挖礦時會根據(jù)區(qū)塊鏈中的區(qū)塊數(shù)據(jù)自行計數(shù)來調(diào)整難度值。
比特幣難度是通過計算一個256位的大整形數(shù)——目標(biāo)值Target來控制挖礦的概率。前面提到每一個區(qū)塊都有一個nBits字段,如圖2所示nBits字段經(jīng)過計算可以得到相對應(yīng)的目標(biāo)值,一個合法區(qū)塊的哈希值應(yīng)該小于目標(biāo)值,這就意味著目標(biāo)值越小,遍歷隨機數(shù)計算哈希時符合要求的期望就越低。比特幣定義nBits在0x1d00ffff時對應(yīng)最小難度,在0x008000時對應(yīng)最大難度。每當(dāng)2 016個區(qū)塊產(chǎn)生后,系統(tǒng)中的節(jié)點會根據(jù)這些區(qū)塊的產(chǎn)生時間T來調(diào)整計算目標(biāo)值,改變后面區(qū)塊的nBits字段,計算公式如下:
其中T2weeks是兩周的時長。如果T<T2weeks,那么系統(tǒng)就會縮小當(dāng)前的目標(biāo)值,增大挖礦難度;反之,系統(tǒng)目標(biāo)值將會變大,放寬挖礦的計算要求。通過難度值的調(diào)整,比特幣大致保持了系統(tǒng)的區(qū)塊產(chǎn)生速率穩(wěn)定。截止到目前,根據(jù)blockchain.info網(wǎng)站的數(shù)據(jù)統(tǒng)計,比特幣系統(tǒng)中孤塊同時存在數(shù)未超過5個。可以說,在控制區(qū)塊產(chǎn)生速率和分叉出現(xiàn)方面,比特幣做得相當(dāng)成功。
圖2 比特幣目標(biāo)值與nBits字段換算
雖然現(xiàn)階段比特幣較為穩(wěn)定,但是由于控制分叉的要求,比特幣中交易的確認(rèn)速度十分緩慢。目前,比特幣區(qū)塊大小的上限是1 MB,而每個區(qū)塊所能包含的交易數(shù)目目前維持在2 000到2 250。這意味著系統(tǒng)打包交易的速度大約是每秒3.5比交易,而確認(rèn)交易的時間會更長。為此,比特幣社區(qū)有人提出了增大區(qū)塊鏈大小上限至2 MB的提案,以一次性包含更多的交易。事實上,區(qū)塊的大小也會影響區(qū)塊鏈的分叉。在不改變區(qū)塊產(chǎn)生速率的前提下,區(qū)塊增大會使得節(jié)點之間傳播區(qū)塊的傳輸時間線性增大,式(2)中f(t)將會被橫向拉伸,積分式的值也會線性增大。Christian Decker通過實驗也驗證了這一結(jié)論,即在區(qū)塊尺寸不是非常小的時候,區(qū)塊大小和傳輸時間比基本為一個常數(shù)。因此,這樣會使分叉產(chǎn)生的概率增大,給系統(tǒng)帶來不穩(wěn)定性。另一方面,大區(qū)塊的哈希計算更加耗時,保持區(qū)塊產(chǎn)生速率不變就意味著要降低區(qū)塊難度,這會降低每一個區(qū)塊的安全性。在交易保證安全性不變的要求下,交易確認(rèn)需要等待的后續(xù)區(qū)塊數(shù)目將會增加,這會反過來降低交易的確認(rèn)速率。所以,不難看出,提升區(qū)塊大小上限并不能正真解決交易確認(rèn)慢的情況,且如果區(qū)塊大小上限被過分放大,不排除有些礦工可能會故意構(gòu)造小的區(qū)塊來加快傳播速度,從而使其在競爭中更有利,而這顯然會嚴(yán)重影響挖礦秩序。鑒于種種原因,比特幣的維護者們一直對于區(qū)塊擴容持非常謹(jǐn)慎的態(tài)度,即使2 MB擴容提案已經(jīng)確定會在未來實施,他們也非常清楚擴容并不是加快系統(tǒng)處理速度的根本方法。
由于網(wǎng)絡(luò)異步性和節(jié)點的競爭,分叉在區(qū)塊鏈中幾乎不可避免,這讓許多人開始研究如何利用分叉進行攻擊或者是加以應(yīng)用。下面將介紹常見的基于分叉的攻擊手段﹑新的分叉處理機制GHOST以及比特幣的軟分叉和硬分叉。
很長一段時間,人們認(rèn)為如果比特幣中沒有一個節(jié)點的計算能力超過50%,那么系統(tǒng)就是安全的。因為只有超過全網(wǎng)一半的計算能力,攻擊者才可以比其他所有節(jié)點更快地產(chǎn)生區(qū)塊,從而做到利用分叉覆蓋交易記錄進行雙重支付﹑阻止區(qū)塊確認(rèn)特定交易以及阻止其他礦工開采到有效的區(qū)塊。這種攻擊被稱為“51%攻擊”。在這種攻擊下,比特幣的去中心化特性將名存實亡。
但是,比特幣實際上更加脆弱。Ittay Eyal和Emin Gün Sirer在比特幣研究中[4]提出了一種自私挖礦策略。這一策略使得攻擊者只需要獲得系統(tǒng)大約25%的計算能力,就可以獲得超過這一比值的收益。自私挖礦策略是指礦工隱藏自己挖到的區(qū)塊,在擁有一定計算優(yōu)勢的情況下,攻擊者總能得到比系統(tǒng)中區(qū)塊鏈更長的私有鏈。一旦攻擊者持有的私有鏈長度超過系統(tǒng)中的區(qū)塊鏈,礦工會將自己的私有鏈廣播,人為制造分叉產(chǎn)生,而這條私有鏈最終會因為長度優(yōu)勢成為主鏈,導(dǎo)致大量誠實節(jié)點的計算工作就此浪費。Ayelet Sapirshtein等人進一步研究了這一攻擊策略[5],并指出即使在計算能力不到全網(wǎng)25%的情況下,攻擊者仍然可以尋找最優(yōu)的自私挖礦策略來獲得不成正比的收益。
自私挖礦中單節(jié)點達到25%左右的計算能力比較困難,但是攻擊者可以結(jié)合網(wǎng)絡(luò)攻擊降低這一要求。攻擊者可以通過控制系統(tǒng)的大部分節(jié)點來發(fā)布自己的區(qū)塊數(shù)據(jù),從而削弱其他節(jié)點的區(qū)塊鏈數(shù)據(jù)在全網(wǎng)的比重,這種攻擊稱為“女巫攻擊”。它使得攻擊者能夠輕易獲得系統(tǒng)中節(jié)點對其私有區(qū)塊鏈的認(rèn)可,從而改變區(qū)塊鏈的數(shù)據(jù)。攻擊者還可以控制其他節(jié)點的連接,割裂網(wǎng)絡(luò)通信,使網(wǎng)絡(luò)中計算能力的優(yōu)勢被放大,從而使得自私挖礦更加容易。這種攻擊被稱為“日蝕攻擊”。Ethan Heilman等人首先提出了具體方案[6],并給出了具體控制的規(guī)模和數(shù)目要求。
目前,比特幣還未出現(xiàn)過明顯的上述這些攻擊,但為了防患于未然,比特幣官方也在比特幣挖礦程序中硬編碼了“檢查點”[7]來禁止某一個區(qū)塊前的任何分叉被認(rèn)可。事實上,一旦這幾種攻擊被發(fā)現(xiàn),系統(tǒng)將很容易定位到攻擊者。比特幣的維護者們不會坐視不管,他們會采取硬分叉來強制撤銷攻擊鏈,使用IP黑名單等手段來排除網(wǎng)絡(luò)異常。此外,這種大范圍的攻擊會導(dǎo)致輿論發(fā)表對于比特幣的負(fù)面言論,造成比特幣的信譽降低和價縮水值,但這對于攻擊者來說得不償失。
雖然會增大分叉產(chǎn)生的可能性,但是許多以區(qū)塊鏈作為底層技術(shù)的應(yīng)用還是迫切希望能夠加快區(qū)塊產(chǎn)生速率,從而提升系統(tǒng)的吞吐量。針這一問題,Sompolinsky和Zohar提出了GHOST(Greedy Heaviest-Observed Sub-Tree)協(xié)議[8]。GHOST是一種新的分叉選擇策略,不同于比特幣中選取最大高度的支鏈作為主鏈,GHOST選擇最大子樹作為主鏈區(qū)塊選擇依據(jù)。如圖3所示,GHOST在決定分叉區(qū)塊的哪一個子區(qū)塊作為主鏈上的區(qū)塊時,會計算子樹所包含的區(qū)塊數(shù)目,選擇其中最大值作為主鏈上的區(qū)塊。依照這一策略,0→4G構(gòu)成了GHOST共識下的主鏈,而不是最長的0→6B。GHOST對于自私挖礦有著很好的限制。在高區(qū)塊產(chǎn)生速度的情況下,誠實挖礦節(jié)點的工作不會被浪費,而是作為權(quán)重來抵抗自私挖礦。圖3中的最長鏈0→6B就很有可能是來自某個自私挖礦的攻擊,然而它不是主鏈,其區(qū)塊也不會被認(rèn)可。
圖3 GHOST主鏈選擇策略
GHOST在盡可能不影響安全性的情況下,提升了區(qū)塊產(chǎn)生速率,從而增強了系統(tǒng)的處理能力。這一特性在區(qū)塊鏈實際應(yīng)用中頗具價值,著名的以太坊項目(Ethereum)就已經(jīng)使用經(jīng)過微小修改的GHOST協(xié)議作為其區(qū)塊鏈實現(xiàn)的標(biāo)準(zhǔn)之一。
比特幣的設(shè)計決定了其升級或者修改規(guī)范是非常難以實現(xiàn)的。因為去中心化的特性,任何對區(qū)塊結(jié)構(gòu)或者是計算規(guī)范的改變,都會影響每一個節(jié)點的挖礦﹑驗證以及歷史數(shù)據(jù)的合法性。但是,分叉可以用來巧妙地實現(xiàn)協(xié)議或者規(guī)范升級。比特幣有兩種分叉升級策略:硬分叉和軟分叉。
硬分叉升級有一個特點,即舊的區(qū)塊按照新規(guī)范仍然能被驗證通過,但新的區(qū)塊不能被舊的規(guī)范所認(rèn)可。所以,硬分叉在實施前會事先調(diào)查新規(guī)范的接受程度,當(dāng)多數(shù)節(jié)點同意升級規(guī)范后,新規(guī)范就被正式實施。硬分叉初期,系統(tǒng)將會產(chǎn)生大量按照新規(guī)范產(chǎn)生的區(qū)塊,而未升級的節(jié)點無法驗證通過這些區(qū)塊而舍棄它們。由于不同的共識,硬分叉會使未升級節(jié)點與升級節(jié)點分別在舊區(qū)塊鏈上和新的分支上繼續(xù)挖礦。但是,由于升級節(jié)點占多數(shù),未升級礦工也會逐漸升級,新的分支最終將會替代舊鏈,升級過程得以實現(xiàn)。硬分叉的實施關(guān)鍵取決于大部分計算能力是否支持升級方案。截止到目前,比特幣還未進行過任何的正式硬分叉升級,而正在準(zhǔn)備進行的SegWit2x將會是比特幣第一次正式硬分叉(SegWit2x是將區(qū)塊大小上限擴大為2 MB的方案)。
軟分叉不是真正意義上的分叉,而是一種雙向兼容的規(guī)范設(shè)計。軟分叉要求新規(guī)范下的區(qū)塊能夠被未升級節(jié)點認(rèn)可,而升級節(jié)點同樣也能夠認(rèn)可按照舊規(guī)范產(chǎn)生的區(qū)塊。這種升級不會造成實際分叉,是一種非常平穩(wěn)的方法,適用于細(xì)微的規(guī)范和協(xié)議修改。2012年,比特幣通過軟分叉實現(xiàn)了BIP(Bitcoin Improvement Proposal)16[9]中添加P2SH鎖定腳本簽名方案的升級。軟分叉對設(shè)計有著相當(dāng)高的要求,在對協(xié)議或者規(guī)范進行破壞性修改時,軟分叉的實現(xiàn)會非常困難,甚至不能勝任。而一旦軟分叉的實現(xiàn)過于復(fù)雜,其實現(xiàn)過程中出現(xiàn)漏洞的可能性也會增大。
綜上所述,比特幣的這兩種分叉升級策略各有優(yōu)缺點,所以升級時需要按照實際情況選擇使用。
本文主要綜述比特幣中區(qū)塊鏈的分叉現(xiàn)象,分析分叉的成因和影響因素,介紹相關(guān)的攻擊手段﹑改良方案和應(yīng)用場景??梢钥吹剑瑓^(qū)塊鏈的分叉是非常復(fù)雜的現(xiàn)象,它的產(chǎn)生特性是由區(qū)塊鏈的許多特性決定的,而理解分叉對于設(shè)計和應(yīng)用區(qū)塊鏈技術(shù)有著非常重要的作用。本文的許多概念和思想仍然適用與其他基于區(qū)塊鏈的系統(tǒng),對于區(qū)塊鏈技術(shù)的理論研究有著一定的借鑒和參考意義。
[1] Nakamoto S.Bitcoin:A Peer-to-peer Electronic Cash System[EB/OL].(2008-10-31)[2017-08-25].https://bitcoin.org/bitcoin.pdf.
[2] SEC S.2:Recommended Elliptic Curve Domain Parameters[S].Standards for Efficient Cryptography Group,Certicom Corp,2000.
[3] Decker C,Wattenhofer R.Information Propagation in the Bitcoin Network[C].Peer-to-Peer Computing(P2P),2013 IEEE Thirteenth International Conference on,2013:1-10.
[4] Eyal,Ittay,Emin G S.Majority is not Enough:Bitcoin Mining is Vulnerable[C].International Conference on Financial Cryptography and Data Security,2014.
[5] Sapirshtein,Ayelet,Yonatan S,et al.Optimal Selfish Mining Strategies in Bitcoin[C].International Conference on Financial Cryptography and Data Security,2016.
[6] Heilman E,Kendler A,Zohar A,et al.Eclipse Attacks on Bitcoin's Peer-to-Peer Network[C].USENIX Security Symposium,2015:129-144.
[7] Bitcoin Wiki Contributors.Checkpoint Lockin [G/OL].(2014-07-08)[2017-08-25].https://en.bitcoin.it/w/index.php?title=Checkpoint_Lockin&oldid=47965.
[8] Sompolinsky Y,Zohar A.Secure High-rate Transaction Processing in Bitcoin[C].International Conference on Financial Cryptography and Data Security,2015:507-527.
[9] Bitcoin Wiki Contributors.BIP 0016[G/OL].(2015-12-29)[2017-08-25].https://en.bitcoin.it/w/index.php?title=BIP_0016&oldid=59730.