高永琳,程曉榮
華北電力大學(xué) 控制與計算機工程學(xué)院,河北 保定 071003
區(qū)塊鏈技術(shù)因其去中心、安全、可追溯、去信任等優(yōu)勢被研究、重視[1-3]。在能源互聯(lián)網(wǎng)、金融支付、物聯(lián)網(wǎng)等領(lǐng)域正處于研發(fā)探索階段[4-7],應(yīng)用前景廣闊。“分叉”是區(qū)塊鏈系統(tǒng)中的普遍現(xiàn)象,浪費挖掘算力,影響區(qū)塊鏈系統(tǒng)的運作。自私挖掘就是利用分叉現(xiàn)象“非法”獲得區(qū)塊收益的攻擊策略。因此,對區(qū)塊鏈的安全性進行研究十分重要。
由于區(qū)塊鏈?zhǔn)且豁椥屡d技術(shù),目前國內(nèi)外學(xué)者對區(qū)塊鏈攻擊方面的研究還不夠完善,提出了一些降低攻擊效果的方法[8-10]。針對區(qū)塊鏈的攻擊大體上可分為雙花攻擊、自私挖掘、女巫攻擊、日蝕攻擊等。根據(jù)已有的研究文獻,自私挖掘攻擊是一種選擇性地公布區(qū)塊的挖掘策略,是由部分挖礦節(jié)點組成的一個礦池。國外學(xué)者主要從挖掘策略和預(yù)防策略等方面對自私挖掘進行研究與分析。一個自私的礦工可以通過隱藏區(qū)塊來增加其相對的挖礦收入。研究表明,在區(qū)塊沒有被確認(rèn)的情況下進行的交易是不安全的,確認(rèn)的數(shù)量越多,交易越安全[11]??的螤柎髮W(xué)的Eyal和Sirer首先提出了自私挖掘的概念并對其研究,在采用自私挖掘攻擊時,一個起初只擁有33%挖礦算力的礦池能逐漸獲得超過50%的挖礦算力[12]。在研究早期,自私挖掘被視為一種塊丟棄攻擊(block discarding attack)而進行研究[13]。文獻[14]探討了傳播延遲因素在自私挖掘攻擊中對區(qū)塊鏈攻擊效果的影響。針對自私采礦,文獻[15]提出一種使用不可偽造的時間戳來防御自私挖掘的措施。文獻[16]采用一種顛覆性的采礦策略,設(shè)計出一種具體的、實際的抵御攻擊的區(qū)塊。為了保障系統(tǒng)安全,文獻[17]研究了自私挖掘的算力閾值,提出限制自私挖掘算力的策略,與本文的研究有相似之處。文獻[18]提出一種向后兼容的防御區(qū)塊隱藏的機制,一個沒有被公布的區(qū)塊會被忽略掉。
通過文獻綜述可知,國內(nèi)外對于自私挖掘在區(qū)塊鏈方面的攻擊研究已經(jīng)具有一定的理論基礎(chǔ),研究的分析側(cè)重點也不同。然而自私挖掘?qū)^(qū)塊鏈的攻擊方面的研究尚未引起足夠重視,國內(nèi)缺乏對自私挖掘過程的模型的研究。為研究算力對自私挖掘收益的影響,本文設(shè)計了一種挖掘策略,通過求解自私與誠實挖掘概率大小的方法來決定是否公布隱藏的區(qū)塊,從而提高自私挖掘收益的相對份額。文章分析了區(qū)塊鏈平臺下的自私挖掘過程,計算出了自私挖掘的算力閾值。
自私挖掘池選擇性地釋放挖到的區(qū)塊,有時放棄自己當(dāng)前的收入,但常常突然釋放更多的塊,迫使其他網(wǎng)絡(luò)丟掉自己的塊或者失去應(yīng)有的收入。短期內(nèi)自私挖掘的收入會較低,同時這也降低了其他塊的收入。而保持中立的節(jié)點就可能加入自私挖掘池的隊伍來增加他們的收入。最終,自私挖掘池的隊伍會逐漸擴大到超過50%的大小,網(wǎng)絡(luò)的控制權(quán)由自私挖掘池掌握。
區(qū)塊收益由目標(biāo)動作所控制,其最優(yōu)決策就是在什么情形下選擇公布區(qū)塊以獲得最優(yōu)收益。本文使用SAPV模型描述自私挖掘的過程,即以下多元組:
S,A,P,V
S是有限狀態(tài)集,S={(t,g)},(i,g)指當(dāng)前i步驟處于 g 狀態(tài),g=(State1,State2,State3,State4,State5,State6,State7)。
A是行動集,A()S是在狀態(tài)S下可采取的行動集,a∈A()
S={h(隱藏),p(公布),a(接受)}。
P是狀態(tài)S×S×A→[ ]0,1是在可用行動a下狀態(tài)轉(zhuǎn)移S→S'的概率函數(shù),表示動作a下,當(dāng)前狀態(tài)下挖到下一個區(qū)塊的概率。
V表示當(dāng)前狀態(tài)下的期望收益。
下面對相關(guān)參數(shù)進行定義:
集合 L=(0',0,1,2,3),表示自私挖掘鏈相對于誠實鏈的領(lǐng)先數(shù)量,0表示只有一條公共鏈,0'則表示含有兩條長度為1的鏈。
La表示目前自私挖掘鏈上的長度,Lh表示目前誠實鏈上的長度,令△L=La-Lh,表示自私挖掘鏈相對于公共鏈的領(lǐng)先數(shù)量。
αa∈[ 0,1 ]表示自私礦池的算力,1-αa則表示誠實節(jié)點的算力。
β表示選擇在礦池中挖掘的誠實節(jié)點的數(shù)量。
Ca表示自私挖掘鏈,Ch表示誠實鏈。
Na表示自私挖掘池目前挖掘到一個新塊,Nh表示誠實鏈挖掘到一個新塊。
區(qū)塊鏈系統(tǒng)收益來源于兩部分,一部分來源于誠實節(jié)點,該部分節(jié)點遵循正常的挖掘協(xié)議,一旦誠實節(jié)點挖掘到一個新的區(qū)塊就會立刻向全網(wǎng)公布,由此獲得區(qū)塊獎勵;另一部分收益來源于自私挖掘池,自私挖掘池會選擇性地公布挖到的區(qū)塊。分析區(qū)塊鏈系統(tǒng)的挖掘過程,當(dāng)出現(xiàn)分叉情況時,為防止無限狀態(tài),限制鏈的最大深度為6個區(qū)塊。狀態(tài)如圖1所示,共有7個基本的分叉狀態(tài)圖。
圖1 自私挖掘基本狀態(tài)
挖掘過程中,當(dāng)自私挖掘鏈的深度與誠實鏈的深度都為1時,為獲取更多的利益,此時誠實節(jié)點中的一部分節(jié)點可能會加入到自私挖掘池中,如圖1中的State2。每種狀態(tài)下,此時若是自私挖掘池發(fā)現(xiàn)一個區(qū)塊,自私挖掘池都能依一定概率做出不同反應(yīng),公布、隱藏、接受是自私挖掘池將采取的動作;若是誠實節(jié)點發(fā)現(xiàn)新的區(qū)塊,則只會選擇公布新區(qū)快。自私挖掘池采取不同的動作,結(jié)果也不同,結(jié)果如表1所示。
表1 自私挖掘狀態(tài)轉(zhuǎn)換
說明:“”表示自私鏈達到公布條件,此時必須公布;Fork表示出現(xiàn)兩條長度為2的分叉鏈;Fail表示誠實節(jié)點首先挖到新區(qū)快,且鏈的長度超過自私挖掘鏈,此時自私鏈上的區(qū)塊自動失效,自私挖掘失??;Reward表示自私鏈上有區(qū)塊收益。
2.3.1 誠實挖掘概率分布
區(qū)塊被挖到的概率與算力的關(guān)系很大。由文獻[19]知,正常的挖掘過程近似于泊松分布,在恒定的算力下,區(qū)塊以一定的概率被獨立開采。正常情況下,每10 min系統(tǒng)中就會有一個區(qū)塊被挖掘出來,系統(tǒng)會根據(jù)區(qū)塊被開采出來的的速率自動調(diào)整難度以保持速率在10 min左右。由文獻[15]可知,一個誠實節(jié)點挖到下一個區(qū)塊的概率為:
其中,αi表示節(jié)點的算力,d表示難度值。單位時間內(nèi)節(jié)點挖到區(qū)塊的數(shù)量為;假設(shè)挖到每個區(qū)塊獲得獎勵貨幣為r,則單位時間獲得的獎勵為。將所有誠實節(jié)點看做一個整體,則αh=1-αa=∑αi為誠實部分的節(jié)點算力。
2.3.2 自私挖掘概率分布
自私挖掘在礦池節(jié)點不變的情況下算力基本不會變化,所以單位時間內(nèi)發(fā)現(xiàn)一個區(qū)塊的概率基本恒定為pa=1-e-1α0at。假設(shè)自私節(jié)點xi對區(qū)塊進行挖掘,當(dāng)挖到一個區(qū)塊時記xi=1,否則xi=0;由中心極限定理可知,自私礦池節(jié)點X=x1+x2+…+xn之和的標(biāo)準(zhǔn)化變量服從如下分布:
式中μ為期望值,σ為標(biāo)準(zhǔn)差。
而自私挖掘在挖礦過程中會出現(xiàn)誠實節(jié)點加入的情況,這會增加礦池的算力,所以概率分布會發(fā)生變化。式(3)P′表示挖掘礦池算力變化時新區(qū)塊被發(fā)現(xiàn)的概率分布。
公式(3)中,當(dāng) P′=(1 -β)(1 -pa),表示在狀態(tài)2的情況下有一部分節(jié)點加入到了礦池中,而新區(qū)塊被誠實節(jié)點發(fā)現(xiàn);概率β(1 -pa)表示在狀態(tài)2的情況下,被誠實節(jié)點發(fā)現(xiàn)的新區(qū)塊被鏈接在自私挖掘鏈上。
2.3.3 追趕概率
由文獻[19],假設(shè)誠實鏈能夠彌補z個區(qū)塊差距的概率為qz,則:
由公式(1)知用已挖掘出k個區(qū)塊數(shù)量的誠實挖掘概率密度乘以依然能追趕上的概率為:
對于自私挖掘而言,關(guān)鍵的問題是選擇在什么情況下公布隱藏的區(qū)塊[20],以保障收益。為保證自私挖掘能成功,采用以下挖掘策略:
(1)在ΔL=0且已出現(xiàn)分叉時,當(dāng)下一個被發(fā)現(xiàn)的區(qū)塊為Na時,立刻公布區(qū)塊并鏈接在自私鏈上。
(2)在ΔL=1時,當(dāng)下一個被發(fā)現(xiàn)的區(qū)塊為Nh時,立刻公布自私鏈上的區(qū)塊;而當(dāng)被發(fā)現(xiàn)的區(qū)塊為Na時,將Na鏈接在自私鏈上并隱藏區(qū)塊,繼續(xù)挖掘。
(3)在ΔL=2并且分叉的情況下,當(dāng)下一個被發(fā)現(xiàn)的區(qū)塊為Nh時,此時計算在已挖到一個區(qū)塊數(shù)的前提下挖到下一個區(qū)塊的概率q',并計算自私鏈在當(dāng)前情況下挖到下一個區(qū)塊的概率 pa,當(dāng)q'>pa,則自私挖掘鏈立刻公布所有隱藏的區(qū)塊,否則只公布與誠實鏈相對應(yīng)的區(qū)塊;而當(dāng)被發(fā)現(xiàn)的區(qū)塊為Na時,將Na鏈接在自私鏈上并隱藏區(qū)塊,繼續(xù)挖掘。
(4)當(dāng)ΔL≥3時,當(dāng)下一個被發(fā)現(xiàn)的區(qū)塊為Nh時,此時自私挖掘鏈公布的區(qū)塊數(shù)應(yīng)與誠實挖掘的區(qū)塊數(shù)相同;而當(dāng)被發(fā)現(xiàn)的區(qū)塊為Na時,將Na鏈接在自私鏈上并隱藏區(qū)塊,繼續(xù)挖掘。
根據(jù)文獻[10],以自私挖掘的相對收益作為目標(biāo)函數(shù)。系統(tǒng)總的收益基本恒定,所以以自私挖掘的相對收益份額作為研究的對象更具對比性。目標(biāo)函數(shù)表示如下:約束條件為ΔL≥0。其中,ra()π表示自私挖掘池在策略π下的收益,rh()π則表示誠實節(jié)點的收益。由函數(shù)(2)知自私挖掘的收益ra與相對收益rrel成正比例關(guān)系。
為驗證本文所提模型的有效性,實驗布置在總內(nèi)存為64 GB的Linux服務(wù)器模擬進行,Go語言環(huán)境,采用計算機端口作為模擬的節(jié)點,節(jié)點之間通過消息進行通信,采用MATLAB工具編碼仿真圖像。
事實上,挖礦收益受多種因素影響,包含區(qū)塊大小、消息傳播速率、節(jié)點之間的距離、挖礦計算難度等,由于實驗主要分析礦池和誠實節(jié)點的收益情況,所以消息傳播時的延遲時間、區(qū)塊大小等因素在實驗中被忽略。區(qū)塊體的參數(shù)主要有區(qū)塊大小(Blocksize)、前一區(qū)快的散列值(parentHash)、當(dāng)前區(qū)塊的散列值(Hash)、時間戳(timeStamp)、隨機數(shù)(Nonce)等,將區(qū)塊體的參數(shù)設(shè)置為默認(rèn)值。
本模型所涉及的參數(shù)主要有自私挖掘算力αa、自私挖掘鏈上的誠實者比重β等。在共識算法方面,采用工作量證明機制(PoW),運用TCP/IP協(xié)議控制節(jié)點的信息傳輸。實驗共設(shè)置1 000個模擬節(jié)點。實驗?zāi)康囊皇菧y試自私挖掘礦池在不同算力下的收益效果,包括在不同β下時的收益變化情況;二是不同β下自私挖掘的閾值變化。
實驗過程如下:
(1)首先在Linux服務(wù)器上模擬構(gòu)建區(qū)塊鏈節(jié)點,每個端口號代表一個節(jié)點,采用IP地址與端口號相結(jié)合的方式作為節(jié)點的標(biāo)識。
(2)本實驗將1 000個模擬節(jié)點分為兩部分,一少部分為誠實節(jié)點,另一部分為自私節(jié)點。誠實節(jié)點遵循正常的比特幣挖掘協(xié)議,礦池中的自私節(jié)點依照提出的SAPV模型進行挖掘,以與誠實節(jié)點的挖掘收益形成對比。
(3)針對公式(3),分別取 β 值為0、0.2、0.3、0.5、0.7、0.8、1,計算不同β下的概率分布;由于礦池算力αa小于系統(tǒng)算力的一半被認(rèn)為是保障區(qū)塊安全的前提,所以實驗中,自私挖掘的算力值最大為0.5,分別取值0.1、0.2、0.3、0.4、0.5。當(dāng)出現(xiàn)狀態(tài)2的情形,修改誠實節(jié)點與自私節(jié)點的比例,將P′值帶入SAPV模型中。
(4)根據(jù)公式(6),不斷采集誠實節(jié)點與自私節(jié)點的收益數(shù)據(jù),重復(fù)實驗,對比在不同β下各部分的收益情況。
(5)在以上工作的基礎(chǔ)上,分析各部分的挖礦收益,利用MATLAB工具編碼計算β∈[ ]0,1條件下的算力安全閾值,即自私挖掘以某一最小的算力獲得的收益高于誠實挖掘的收益。
自私挖掘礦池的算力影響礦池的收益,下面主要對比分析在不同算力下的礦池收益。對不同β下的礦池算力進行仿真實驗。表2為系統(tǒng)中的礦池與誠實節(jié)點收益,由表2可知,當(dāng)β=1時自私挖掘收益高于誠實節(jié)點收益;隨著算力的增加,礦池收益持續(xù)增高,最大值在0.8附近,遠高于誠實挖掘的最高收益值。驗證了采用本模型時可以提高礦池的收益。
根據(jù)表2的實驗數(shù)據(jù)進行圖表繪制,圖2為自私挖掘及誠實節(jié)點的相對收益。自私挖掘池的收入不斷增加,這會吸引誠實節(jié)點陸續(xù)加入到其中,然而這不利于區(qū)塊鏈挖掘協(xié)議的穩(wěn)定運行。在自私挖掘鏈深度與誠實鏈深度相等的情況下,部分誠實節(jié)點會加入到礦池中。由圖2知,隨著礦池規(guī)模的增大收益值逐漸提高。當(dāng)α很小時,誠實鏈與自私挖掘鏈的收益值差別不大;不同的是,隨著α增加,自私挖掘收益值快速增長,誠實鏈上的收益值增長的速率則較緩慢,這是因為自私挖掘池中不斷有誠實節(jié)點加入,提高了挖掘礦池的算力。
表2 節(jié)點收益
圖2 自私挖掘相對收益趨勢
圖3 為不同β下的算力閾值,由圖3知,閾值隨β的增加而下降,即使當(dāng)β值為0時,自私挖掘的算力也不可超過0.3,否則誠實鏈處于劣勢中,這也印證了圖2中當(dāng)β=0的情況。
圖3 算力閾值
本實驗表明了當(dāng)誠實節(jié)點擁有超過1 2系統(tǒng)的算力時并不能保證挖掘過程的絕對安全。為保證比特幣挖掘協(xié)議在挖掘過程中的有效性,當(dāng)β=0時,自私挖掘鏈的算力應(yīng)小于0.3;當(dāng)β=0.5時,自私挖掘鏈的算力應(yīng)小于1 4。
本文設(shè)計了自私挖掘區(qū)塊的公布策略,給出一種基于概率的SAPV模型。首先詳細(xì)分析了自私挖掘過程,基于此計算了挖掘過程的概率分布。該模型能通過優(yōu)化自私挖掘池的絕對收益來提高自私挖掘的相對份額。實驗表明該模型能有效提高自私挖掘的收益,能更嚴(yán)格地計算出保證誠實節(jié)點協(xié)議安全的算力閾值。限制自私挖礦池的算力是保證區(qū)塊鏈系統(tǒng)進行安全挖掘的重要方法。在比特幣挖掘系統(tǒng)中,針對自私挖掘池逐漸增大、挖掘算力浪費的問題,閾值的設(shè)定具有很好的防范作用。本文研究對挖掘協(xié)議的改進具有參考的價值。
但本文的研究仍有不足之處,本文選取的參數(shù)值需要進行多次調(diào)整以適應(yīng)不同的場景,這方面有待于改進。構(gòu)建基于多因素的自私挖掘分析模型有待下一步的研究與完善。