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