郭 雨
(吉林建筑科技學(xué)院 計(jì)算機(jī)科學(xué)與工程學(xué)院, 吉林 長(zhǎng)春 130114)
傳統(tǒng)供應(yīng)鏈中,對(duì)于實(shí)現(xiàn)交易平臺(tái)之間、交易平臺(tái)與用戶之間、交易平臺(tái)與商戶之間等信息交互的利用,無(wú)法保障信息的有效利用以及信息安全性的維護(hù),從而導(dǎo)致交易平臺(tái)在數(shù)據(jù)交互過(guò)程中產(chǎn)生各種各樣難以解決的問(wèn)題,如溯源不清、交易數(shù)據(jù)被篡改、質(zhì)量問(wèn)題難以劃分責(zé)任等問(wèn)題。
區(qū)塊鏈技術(shù)已逐漸走入大眾的生活,成為社會(huì)關(guān)注的焦點(diǎn)。區(qū)塊鏈源于比特幣,利用加密鏈?zhǔn)絽^(qū)塊結(jié)構(gòu)存儲(chǔ)數(shù)據(jù),其中共識(shí)算法是區(qū)塊鏈技術(shù)的一個(gè)核心問(wèn)題,利用共識(shí)算法來(lái)生成、驗(yàn)證數(shù)據(jù),可以有效地解決互聯(lián)網(wǎng)上信任與價(jià)值的可靠傳遞難題[1]。利用區(qū)塊鏈技術(shù)去中心化的特點(diǎn),采用一種全新的數(shù)據(jù)庫(kù)技術(shù),可以高價(jià)值、多方位對(duì)交易數(shù)據(jù)進(jìn)行保護(hù),并通過(guò)密碼學(xué)技術(shù)保護(hù)交易數(shù)據(jù)內(nèi)容難以進(jìn)行篡改、造假或者抵賴。區(qū)塊鏈技術(shù)的應(yīng)用有助于建立新的交易平臺(tái)建設(shè)體系,以去中心化、開(kāi)放的特征,強(qiáng)調(diào)和尊重時(shí)長(zhǎng)交易的自愿原則,發(fā)揮統(tǒng)籌協(xié)調(diào)機(jī)制。
傳統(tǒng)交易平臺(tái)數(shù)據(jù)需要一個(gè)第三方可信任的中介進(jìn)行交易,與傳統(tǒng)的交易平臺(tái)相比,區(qū)塊鏈技術(shù)除了具有去中心化的優(yōu)勢(shì)外,還可以保證網(wǎng)絡(luò)數(shù)據(jù)的一致性,實(shí)現(xiàn)點(diǎn)對(duì)點(diǎn)的交易,從而增加交易平臺(tái)的數(shù)據(jù)安全性和可靠性[2]。但是想要達(dá)到點(diǎn)對(duì)點(diǎn)的交易,就需要考慮區(qū)塊鏈安全、效率等因素。區(qū)塊鏈主要的共識(shí)算法有POW、POS、DPOS、PBFT。在這些共識(shí)算法中,拜占庭容錯(cuò)算法(Practical Byzantine Fault Tolerance, PBFT)在交易平臺(tái)中具有更大的優(yōu)勢(shì)。
在分布式系統(tǒng)中,拜占庭容錯(cuò)技術(shù)能夠很好地對(duì)應(yīng)節(jié)點(diǎn)故障和傳輸錯(cuò)誤的問(wèn)題。但是早期的拜占庭算法是需要有數(shù)級(jí)的算法,算法復(fù)雜,使用難度較大。直到1999年提出的PBFT算法才將算法復(fù)雜度降為多項(xiàng)式級(jí)別,改進(jìn)后的算法極大地提高了拜占庭算法的效率[3]。
在PBFT算法中,存在view(視圖)概念,在每一個(gè)view里,相同配置下運(yùn)行每一個(gè)節(jié)點(diǎn),并且只能設(shè)置一個(gè)主節(jié)點(diǎn),而其他節(jié)點(diǎn)作為view中的備選節(jié)點(diǎn)。view中的主節(jié)點(diǎn)主要對(duì)平臺(tái)申請(qǐng)數(shù)據(jù)進(jìn)行排序,并且按照排序進(jìn)行分配,將數(shù)據(jù)分別存儲(chǔ)到備份節(jié)點(diǎn)中。備份節(jié)點(diǎn)檢查主節(jié)點(diǎn)對(duì)請(qǐng)求的排序是否正常,如果出現(xiàn)分配異常狀態(tài),就會(huì)觸發(fā)view change機(jī)制,將主節(jié)點(diǎn)進(jìn)行替換,在view中進(jìn)入一個(gè)新的主節(jié)點(diǎn)。
PBFT算法主要執(zhí)行流程如圖1所示。
圖1 PBFT算法執(zhí)行流程
算法中包含5個(gè)階段。
1)request:客戶端首先發(fā)送請(qǐng)求,請(qǐng)求信息發(fā)送格式為
其中:o----執(zhí)行操作
t----時(shí)間;
c----編號(hào)。
2)pre-prepare:將收到的請(qǐng)求發(fā)送給主節(jié)點(diǎn),主節(jié)點(diǎn)進(jìn)行記錄,記錄后發(fā)送一條廣播數(shù)據(jù)給其他的備份節(jié)點(diǎn),pre-prepare格式為
< pre-prepare,v,n,d>,
其中:v----所在視圖請(qǐng)求;
n----主節(jié)點(diǎn)分配編號(hào);
d----digest編號(hào)。
通過(guò)信息比對(duì),如果備份節(jié)點(diǎn)在視圖中的數(shù)據(jù)與請(qǐng)求數(shù)據(jù)相同,并且未收到過(guò)相同節(jié)點(diǎn)信息,但是每個(gè)節(jié)點(diǎn)的摘要編號(hào)不相同,則該信息通過(guò),進(jìn)入下個(gè)階段。
3)prepare:進(jìn)入到prepare階段的備份節(jié)點(diǎn)會(huì)產(chǎn)生一條prepare廣播信息,并且會(huì)接收到其他節(jié)點(diǎn)發(fā)送的prepare信息,prepare格式為
< prepare,v,n,d,i>,
其中:i----節(jié)點(diǎn)編號(hào)。
當(dāng)節(jié)點(diǎn)接收到2倍的允許節(jié)點(diǎn)出錯(cuò)的容錯(cuò)數(shù)量,并且prepare中的請(qǐng)求、節(jié)點(diǎn)編號(hào)以及備份節(jié)點(diǎn)編號(hào)相同,則這個(gè)節(jié)點(diǎn)可以進(jìn)入下個(gè)階段。
4)commit:進(jìn)入到commit階段的備份節(jié)點(diǎn)會(huì)產(chǎn)生一條commit廣播信息,同時(shí),也會(huì)接收到其他節(jié)點(diǎn)發(fā)送的commit信息,commit格式為
當(dāng)節(jié)點(diǎn)接收到包含自己在內(nèi)2倍的允許節(jié)點(diǎn)出錯(cuò)的容錯(cuò)數(shù)量具有相同的v和n的commit信息后,在節(jié)點(diǎn)等待中編號(hào)較低的請(qǐng)求,請(qǐng)求經(jīng)過(guò)同意后可以進(jìn)行執(zhí)行。
5)reply:該節(jié)點(diǎn)對(duì)客戶請(qǐng)求進(jìn)行答復(fù),reply格式為
< reply,v,t,v,t,r>,
其中:r----請(qǐng)求所在的視圖;
t----隊(duì)形的時(shí)間戳;
i----作為請(qǐng)求答復(fù)的節(jié)點(diǎn)編號(hào);
r----請(qǐng)求答復(fù)的最終結(jié)果。
當(dāng)客戶端收到包含自己在內(nèi)的允許節(jié)點(diǎn)出錯(cuò)的容錯(cuò)數(shù)量,并且請(qǐng)求答復(fù)時(shí),t和r的結(jié)果都相同,這時(shí)表示請(qǐng)求被系統(tǒng)處理。當(dāng)遇到網(wǎng)絡(luò)原因,客戶端未及時(shí)收到答復(fù)時(shí),消息將會(huì)被重復(fù)發(fā)送。
除此之外,當(dāng)視圖中節(jié)點(diǎn)執(zhí)行完成后,還需要對(duì)多余數(shù)據(jù)機(jī)型回收,即將之前的請(qǐng)求記錄信息進(jìn)行清除,從而節(jié)省系統(tǒng)資源,減少系統(tǒng)資源的占用。在使用時(shí),還需要考慮到網(wǎng)絡(luò)延遲等因素,可能導(dǎo)致視圖中的節(jié)點(diǎn)并不在同一個(gè)處理狀態(tài)中,因此,在PBFT算法設(shè)置check point協(xié)議,在check point協(xié)議中預(yù)先設(shè)置檢查點(diǎn),在所有節(jié)點(diǎn)執(zhí)行完畢并通過(guò)檢查點(diǎn)時(shí),檢查點(diǎn)將會(huì)對(duì)全網(wǎng)進(jìn)行全面檢查,并通知其他節(jié)點(diǎn)中的檢查點(diǎn)節(jié)點(diǎn)信息執(zhí)行完畢。
智能合約作為一種計(jì)算機(jī)協(xié)議,合約條款在執(zhí)行時(shí)可以是全部或部分自動(dòng)執(zhí)行,同時(shí),智能合約為了避免外界因素產(chǎn)生的干擾,實(shí)現(xiàn)當(dāng)一個(gè)預(yù)先編號(hào)的程序被執(zhí)行時(shí),智能合約執(zhí)行系統(tǒng)相應(yīng)的協(xié)議條款[4]。這種執(zhí)行方式使得合約的履行更加便捷,也為執(zhí)行數(shù)據(jù)帶來(lái)保障。
智能合約與傳統(tǒng)合約對(duì)比見(jiàn)表1。
表1 智能合約與傳統(tǒng)合約對(duì)比
智能合約與傳統(tǒng)合約對(duì)比,具有不可比擬的優(yōu)勢(shì),尤其是在區(qū)塊鏈技術(shù)出現(xiàn)以后,分布式賬本技術(shù)為智能合約提供了底層技術(shù)基礎(chǔ),從而保證數(shù)據(jù)不被隨意篡改,并且保證數(shù)據(jù)能夠按照預(yù)定執(zhí)行的合約條款執(zhí)行[5]。在超級(jí)賬本中,智能合約部署在其fabric網(wǎng)絡(luò)節(jié)點(diǎn)上時(shí),可以被調(diào)用的與分布式進(jìn)行交互的程序代碼。在以太坊中,智能合約是運(yùn)行在相互不信任參與者之間的協(xié)議,由區(qū)塊鏈的共識(shí)機(jī)制自動(dòng)實(shí)施,不依賴于受信任的機(jī)構(gòu)[6]。
智能合約作為一種協(xié)議,其數(shù)據(jù)架構(gòu)可以分為呈現(xiàn)層、應(yīng)用層、業(yè)務(wù)層和數(shù)據(jù)層[7]。呈現(xiàn)層主要表示客戶前端,應(yīng)用層根據(jù)不同應(yīng)用程序進(jìn)行不同設(shè)計(jì),業(yè)務(wù)層包含系統(tǒng)所需要業(yè)務(wù)過(guò)程上的實(shí)現(xiàn),數(shù)據(jù)層提供持久化數(shù)據(jù)服務(wù)[8]。智能合約的運(yùn)行機(jī)制如圖2所示。
圖2 智能合約運(yùn)行機(jī)制
智能合約可以自動(dòng)觸發(fā)執(zhí)行代碼,驗(yàn)證合約的有效性,從而避免數(shù)據(jù)篡改的風(fēng)險(xiǎn)。為實(shí)現(xiàn)智能合約的交互操作,智能合約會(huì)預(yù)留一個(gè)接口,根據(jù)密碼學(xué)原理,使得合約與接口進(jìn)行交互驗(yàn)證,保證合約的安全性。
1)PBFT算法在分布式系統(tǒng)中,通過(guò)異步通信機(jī)制進(jìn)行傳輸,從而達(dá)成共識(shí)[9]。PBFT算法具有很強(qiáng)的一致性,每次計(jì)算都需要遍歷整個(gè)網(wǎng)絡(luò)節(jié)點(diǎn),但如果在交易平臺(tái)中具有龐大的網(wǎng)絡(luò)系統(tǒng),此時(shí)PBFT算法的效率就會(huì)降低。當(dāng)節(jié)點(diǎn)個(gè)數(shù)大于節(jié)點(diǎn)編號(hào)的1/3時(shí),網(wǎng)絡(luò)安全將會(huì)遭到破壞,從而降低系統(tǒng)的安全性。同時(shí),由于PBFT算法具有的特定通信機(jī)制,每一個(gè)備份節(jié)點(diǎn)的數(shù)據(jù)都需要進(jìn)行5步驗(yàn)證,導(dǎo)致PBFT算法執(zhí)行效率不高。
2)PBFT算法在系統(tǒng)view中,每一次的請(qǐng)求數(shù)據(jù)、備份節(jié)點(diǎn)的請(qǐng)求數(shù)據(jù)都需要有回應(yīng),但是交易平臺(tái)數(shù)據(jù)節(jié)點(diǎn)數(shù)量龐大,無(wú)形中增加了網(wǎng)絡(luò)通信和數(shù)據(jù)交換的數(shù)量,增加了系統(tǒng)的延時(shí)時(shí)長(zhǎng),從而降低計(jì)算效率。
3)PBFT算法中,主節(jié)點(diǎn)與備份節(jié)點(diǎn)固定,如果節(jié)點(diǎn)進(jìn)行動(dòng)態(tài)變化,由于節(jié)點(diǎn)的固定問(wèn)題,無(wú)法對(duì)應(yīng)節(jié)點(diǎn)的動(dòng)態(tài)變化,在交易平臺(tái)中,各個(gè)節(jié)點(diǎn)的數(shù)據(jù)量非常大,由于交易平臺(tái)中并不是一對(duì)一的交易,而是具有多家供應(yīng)商和多用戶,并且在交易平臺(tái)中,供應(yīng)商的數(shù)量也可以不斷變化,使得節(jié)點(diǎn)的數(shù)量和交互過(guò)程隨之變化,但是PBFT算法無(wú)法對(duì)節(jié)點(diǎn)進(jìn)行動(dòng)態(tài)的增加或者刪除,使得交易平等數(shù)據(jù)交互得到了限制。
根據(jù)區(qū)塊鏈技術(shù)采用的網(wǎng)絡(luò)模式對(duì)PBFT算法進(jìn)行分析設(shè)計(jì),假設(shè)服務(wù)器絕大部分時(shí)間處于正常狀態(tài),不用每一個(gè)請(qǐng)求都在達(dá)成一致后再執(zhí)行,取消共識(shí)過(guò)程,只需要在錯(cuò)誤發(fā)生之后再進(jìn)行共識(shí),達(dá)成一致性即可,刪除原有算法中的reply階段,在各個(gè)備選節(jié)點(diǎn)收到消息后,如果收到pre-prepare階段的廣播消息,那么此次消息傳遞完成,取消客戶參與算法共識(shí)階段,將PBFT算法的執(zhí)行流程簡(jiǎn)化為三個(gè)階段,實(shí)現(xiàn)流程優(yōu)化效果,PBFT算法改進(jìn)流程如圖3所示。
圖3 PBFT算法改進(jìn)流程
優(yōu)化后的PBFT算法執(zhí)行流程如下:
1)取消客戶端發(fā)送請(qǐng)求的方式,備選節(jié)點(diǎn)中的任一節(jié)點(diǎn)都可發(fā)送請(qǐng)求,為防止請(qǐng)求被數(shù)據(jù)篡改,需要在請(qǐng)求時(shí)加入簽名,保護(hù)交易數(shù)據(jù)的可靠性。
2)主節(jié)點(diǎn)不需要每次都檢查備選節(jié)點(diǎn)消息,而是每隔一段時(shí)間進(jìn)行消息匹配,匹配內(nèi)容為
這里替換原有數(shù)據(jù)格式,取消客戶端編號(hào)c,用s表示主節(jié)點(diǎn)簽名機(jī)制。其中t不再表示本地時(shí)間,用來(lái)表示每次主節(jié)點(diǎn)進(jìn)行共識(shí)的時(shí)間間隔。
3)在備用節(jié)點(diǎn)收到主節(jié)點(diǎn)的消息后,會(huì)進(jìn)行消息驗(yàn)證,并且進(jìn)行消息回復(fù)。
采用智能合約技術(shù)結(jié)果區(qū)塊鏈算法進(jìn)行實(shí)驗(yàn)數(shù)據(jù)對(duì)比分析,對(duì)改進(jìn)后的PBFT算法進(jìn)行實(shí)驗(yàn),并得到相應(yīng)的實(shí)驗(yàn)數(shù)據(jù)。首先建立智能合約的超級(jí)賬本,建立一個(gè)接口為Run的函數(shù),通過(guò)結(jié)構(gòu)調(diào)用智能合約內(nèi)不同方法。主要偽代碼如下:
func( )Run(){
定義并處理不同函數(shù)
if初始化數(shù)據(jù){
return返回?cái)?shù)據(jù)
}
else if調(diào)用賬鏈代碼{
return返回?cái)?shù)據(jù)賬鏈代碼)
}
else if f刪除用戶{
return t. 刪除用戶返,返回?cái)?shù)據(jù)
}
func{
對(duì)賬戶進(jìn)行初始化,并分配賬戶A和B一個(gè)地址,并賦值。
賬戶地址
賬戶金額
}
初始化數(shù)據(jù)
if 賬戶余額不足{
return 返回錯(cuò)誤信息
}
…
fmt.Printf(將執(zhí)行后的結(jié)果寫入賬本中)
從賬本中獲取狀態(tài)/變量信息
查詢A賬戶當(dāng)前余額并轉(zhuǎn)換為數(shù)值
}
return 返回主信息
1)在PBFT算法中,如果頻繁地更換主節(jié)點(diǎn),會(huì)導(dǎo)致view的跟換,從而影響系統(tǒng)效率以及系統(tǒng)的吞吐量,改進(jìn)后的算法增加了主節(jié)點(diǎn)簽名機(jī)制,增加節(jié)點(diǎn)的信任度,并且在選取主節(jié)點(diǎn)時(shí),可以從信任節(jié)點(diǎn)中進(jìn)行選擇,不用進(jìn)行原有節(jié)點(diǎn)選取方法。
2)將PBFT算法原有的5個(gè)階段消息傳遞變?yōu)?個(gè)階段消息傳遞,增加主節(jié)點(diǎn)巡查機(jī)制,降低系統(tǒng)的通信次數(shù),同時(shí),減少網(wǎng)絡(luò)通信和數(shù)據(jù)交換的數(shù)量,降低系統(tǒng)的延時(shí)時(shí)長(zhǎng),從而提高計(jì)算效率。
選取實(shí)驗(yàn)主節(jié)點(diǎn),利用智能合約機(jī)制與改進(jìn)后的PBFT算法相結(jié)合,在實(shí)驗(yàn)時(shí)選取6個(gè)主模擬節(jié)點(diǎn),并將1節(jié)點(diǎn)和4節(jié)點(diǎn)設(shè)置為PBFT節(jié)點(diǎn),進(jìn)行300次主節(jié)點(diǎn)更換,對(duì)比原始PBFT算法和改進(jìn)后的PBFT算法進(jìn)行實(shí)驗(yàn),對(duì)比實(shí)驗(yàn)數(shù)據(jù)如圖4所示。
圖4 傳統(tǒng)算法與改進(jìn)后的PBFT算法數(shù)據(jù)對(duì)比
實(shí)驗(yàn)結(jié)果表明,減少主節(jié)點(diǎn)數(shù)量,并且減少主要交互流程以及網(wǎng)絡(luò)通信和數(shù)據(jù)交換的數(shù)量,降低了系統(tǒng)的延時(shí)時(shí)長(zhǎng),從而提高計(jì)算效率。
針對(duì)原始的PBFT算法存在系統(tǒng)延時(shí)時(shí)間長(zhǎng)、計(jì)算效率低、主節(jié)點(diǎn)更換次數(shù)龐大等問(wèn)題,提出改進(jìn)PBFT算法的供應(yīng)鏈溯源方法。減少主節(jié)點(diǎn)變換次數(shù)及交互流程,增加主節(jié)點(diǎn)簽名機(jī)制及節(jié)點(diǎn)的信任度,并且在選取主節(jié)點(diǎn)時(shí),可以從信任節(jié)點(diǎn)中進(jìn)行選擇,并與智能合約機(jī)制相結(jié)合,從而達(dá)到降低算法的通信開(kāi)銷中心化、公開(kāi)透明以及交易可追溯。整個(gè)構(gòu)架對(duì)供應(yīng)鏈中產(chǎn)品從生產(chǎn)商到消費(fèi)者全過(guò)程數(shù)據(jù)記錄,保證了交易過(guò)程中產(chǎn)品的安全性。