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