劉敏娜,尹 成,張 偉
(1.咸陽師范學(xué)院,陜西 咸陽 712000;2.微軟-清華大學(xué)聯(lián)合實(shí)驗(yàn)室,北京 100000)
互聯(lián)網(wǎng)上瀏覽網(wǎng)頁(yè)使用的是WWW 服務(wù)協(xié)議。WWW 協(xié)議普遍應(yīng)用基于B/S 架構(gòu)的網(wǎng)絡(luò)模型。在B/S 服務(wù)架構(gòu)中,服務(wù)器作為中心節(jié)點(diǎn),為網(wǎng)絡(luò)中的其他節(jié)點(diǎn)提供數(shù)據(jù)訪問服務(wù),瀏覽器請(qǐng)求數(shù)據(jù)服務(wù)[1]。B/S 架構(gòu)建立在對(duì)中心服務(wù)器絕對(duì)信任的前提下,一旦失去信任,信息交換不再成立。同時(shí),B/S 架構(gòu)還存在對(duì)中心服務(wù)器依賴過大、服務(wù)器數(shù)據(jù)容易被竊取、數(shù)據(jù)無法追溯到原始狀態(tài)等問題[2]。
區(qū)塊鏈采用點(diǎn)對(duì)點(diǎn)(P2P)的去中心化的分布式存儲(chǔ)結(jié)構(gòu)。區(qū)塊鏈的創(chuàng)造者中本聰提出“區(qū)塊鏈中,節(jié)點(diǎn)按照既定的運(yùn)算規(guī)則來計(jì)算哈希值,由獲勝節(jié)點(diǎn)主張上鏈數(shù)據(jù),其他節(jié)點(diǎn)對(duì)上鏈數(shù)據(jù)進(jìn)行投票,同時(shí)將激勵(lì)機(jī)制應(yīng)用到共識(shí)上[3]”。區(qū)塊鏈上沒有中心節(jié)點(diǎn),節(jié)點(diǎn)之間不需要建立信任,通過共識(shí)達(dá)成規(guī)則,從而達(dá)成信任。引入?yún)^(qū)塊鏈技術(shù),可以有效地解決B/S 架構(gòu)中對(duì)服務(wù)器的依賴而產(chǎn)生的數(shù)據(jù)安全性問題。
文中提出在互聯(lián)網(wǎng)的分布式環(huán)境中,基于區(qū)塊鏈技術(shù)實(shí)現(xiàn)多個(gè)節(jié)點(diǎn)共識(shí)挖礦,存儲(chǔ)交易數(shù)據(jù)的方案。方案根據(jù)交易數(shù)據(jù)的特點(diǎn),設(shè)計(jì)了區(qū)塊數(shù)據(jù)結(jié)構(gòu),利用區(qū)塊鏈的哈希算法對(duì)交易數(shù)據(jù)進(jìn)行加密,利用共識(shí)算法解決記賬權(quán)的問題,利用最長(zhǎng)鏈比較算法設(shè)計(jì)節(jié)點(diǎn)數(shù)據(jù)同步規(guī)則。
B/S 是WWW 協(xié)議最主要的一種網(wǎng)絡(luò)結(jié)構(gòu)模型。B 代表Browser 瀏覽器,S 表示Server 服務(wù)器[4]。系統(tǒng)功能的核心部分集中在服務(wù)器端,用戶通過瀏覽器訪問互聯(lián)網(wǎng)上的信息,服務(wù)器解析并處理用戶請(qǐng)求。當(dāng)需要提供數(shù)據(jù)訪問服務(wù)時(shí),服務(wù)器獲取數(shù)據(jù)庫(kù)服務(wù)器中的數(shù)據(jù),并將數(shù)據(jù)經(jīng)過動(dòng)態(tài)拼湊后顯示在客戶端瀏覽器中,這種架構(gòu)簡(jiǎn)化了系統(tǒng)的開發(fā)、維護(hù)和使用[5]。B/S 架構(gòu)如圖1 所示。
圖1 B/S架構(gòu)
B/S 架構(gòu)存在以下問題:
1)對(duì)中心服務(wù)器依賴過大,一旦出現(xiàn)網(wǎng)絡(luò)問題導(dǎo)致?lián)砣?,無法繼續(xù)為客戶端提供服務(wù)[3];
2)如果中心服務(wù)器遭遇惡意攻擊,則服務(wù)器數(shù)據(jù)容易被竊取;
3)服務(wù)器中存儲(chǔ)的數(shù)據(jù)沒有狀態(tài),一旦數(shù)據(jù)被修改,則無法追溯到原始狀態(tài)。
區(qū)塊鏈(Block Chain)是比特幣應(yīng)用的底層技術(shù),使用區(qū)塊鏈技術(shù)能獨(dú)立完成價(jià)值轉(zhuǎn)移,包括數(shù)字貨幣、交易、資產(chǎn)等轉(zhuǎn)移,而且整個(gè)過程不依賴于中心機(jī)構(gòu)[6]。
區(qū)塊鏈具有如下特點(diǎn):
1)系統(tǒng)中不存在自上而下的中心化管理,分布式節(jié)點(diǎn)之間通過競(jìng)爭(zhēng)博弈的方式實(shí)現(xiàn)自組織和自適應(yīng);
2)采用基于共識(shí)的數(shù)據(jù)更新機(jī)制。新生成的區(qū)塊必須獲得大多數(shù)節(jié)點(diǎn)驗(yàn)證通過之后,才可以寫入節(jié)點(diǎn)的共享賬本中,因此數(shù)據(jù)難篡改和偽造[7]。
1.2.1 區(qū)塊鏈的核心概念
1)區(qū)塊
區(qū)塊是區(qū)塊鏈的基本元素,比特幣中區(qū)塊以文件形式存儲(chǔ),以太坊中以數(shù)據(jù)庫(kù)形式存儲(chǔ)[8]。區(qū)塊由區(qū)塊頭和區(qū)塊體組成。區(qū)塊頭中封裝了前一個(gè)區(qū)塊的哈希值、當(dāng)前區(qū)塊共識(shí)的解隨機(jī)數(shù)、時(shí)間戳等信息[9]。區(qū)塊體中包括當(dāng)前區(qū)塊的交易數(shù)量以及經(jīng)過驗(yàn)證的區(qū)塊創(chuàng)建過程中生成的所有交易記錄。
2)節(jié)點(diǎn)
網(wǎng)絡(luò)中所有交易數(shù)據(jù)都記錄在節(jié)點(diǎn)服務(wù)器里[10]。節(jié)點(diǎn)分為輕節(jié)點(diǎn)和全節(jié)點(diǎn)。全節(jié)點(diǎn)擁有全網(wǎng)的區(qū)塊鏈結(jié)構(gòu),其中包括所有的交易數(shù)據(jù),輕節(jié)點(diǎn)只擁有和自己相關(guān)的交易數(shù)據(jù)。
3)共識(shí)機(jī)制
區(qū)塊鏈中沒有中心化節(jié)點(diǎn),因此在交易數(shù)據(jù)傳輸、價(jià)值轉(zhuǎn)移時(shí),通過共識(shí)機(jī)制解決交易在所有記賬節(jié)點(diǎn)上的一致性和正確性問題[11]。共識(shí)機(jī)制是區(qū)塊鏈的核心組成部分,是保障區(qū)塊鏈系統(tǒng)能長(zhǎng)久運(yùn)行的關(guān)鍵機(jī)制。共識(shí)算法有工作量證明POW、權(quán)益證明POS、委托權(quán)益證明DPOS。
工作量證明POW 算法要求證明方在使用服務(wù)或資源之前完成一定難度的復(fù)雜運(yùn)算,且這種工作量很容易被驗(yàn)證方核實(shí)。權(quán)益證明POS 是具有最高權(quán)益的節(jié)點(diǎn)最有可能獲得記賬權(quán),其權(quán)益體現(xiàn)為節(jié)點(diǎn)對(duì)特定數(shù)量貨幣的所有權(quán)。委托權(quán)益證明DPOS 是通過共識(shí)節(jié)點(diǎn)的權(quán)益投票將記賬權(quán)賦予特定的節(jié)點(diǎn),從而實(shí)現(xiàn)公平和民主的共識(shí)過程和區(qū)塊鏈治理。
區(qū)塊鏈共識(shí)算法使用最多的是POW。文中使用POW 共識(shí)算法,以便使最快計(jì)算出符合要求的隨機(jī)數(shù)的節(jié)點(diǎn)具有記賬權(quán)。
1.2.2 點(diǎn)對(duì)點(diǎn)模式
點(diǎn)對(duì)點(diǎn)模式中每個(gè)節(jié)點(diǎn)的地位是對(duì)等的。網(wǎng)絡(luò)中的節(jié)點(diǎn)可以自由地加入和退出,網(wǎng)絡(luò)中所有節(jié)點(diǎn)都具有存儲(chǔ)和轉(zhuǎn)發(fā)功能,可以提高通信效率[13];單個(gè)節(jié)點(diǎn)的故障不會(huì)影響整體系統(tǒng),可以提高網(wǎng)絡(luò)的健壯性;同時(shí)網(wǎng)絡(luò)的擴(kuò)展性強(qiáng),有利于網(wǎng)絡(luò)負(fù)載均衡[14]。
1.2.3 區(qū)塊鏈運(yùn)行流程
1)源節(jié)點(diǎn)創(chuàng)建交易,驗(yàn)證目的節(jié)點(diǎn)地址,對(duì)交易簽名加密,將交易廣播至網(wǎng)絡(luò)上的其他節(jié)點(diǎn)。
2)網(wǎng)絡(luò)上節(jié)點(diǎn)接收交易,判斷交易數(shù)據(jù)來源是否正確。全網(wǎng)大多數(shù)節(jié)點(diǎn)驗(yàn)證通過之后,節(jié)點(diǎn)將交易信息保存在交易池中。
3)節(jié)點(diǎn)爭(zhēng)奪記賬權(quán),擁有記賬權(quán)的節(jié)點(diǎn)將交易數(shù)據(jù)打包到本地區(qū)塊中。全網(wǎng)共識(shí)驗(yàn)證之后,獲勝節(jié)點(diǎn)將新區(qū)塊追加到主鏈。
4)交易在主鏈上被后續(xù)區(qū)塊確認(rèn)。
5)不同節(jié)點(diǎn)之間根據(jù)最長(zhǎng)鏈原則,定期同步區(qū)塊鏈數(shù)據(jù)。
方案是基于該區(qū)塊鏈運(yùn)行流程設(shè)計(jì)的,方案中包括新節(jié)點(diǎn)加入、新交易創(chuàng)建、新區(qū)塊生成、區(qū)塊上鏈、節(jié)點(diǎn)間同步數(shù)據(jù)等環(huán)節(jié)。
為了簡(jiǎn)化模型,網(wǎng)絡(luò)中包括3 個(gè)具備獨(dú)立記賬能力的全節(jié)點(diǎn),如圖2 所示。全節(jié)點(diǎn)上保存不同長(zhǎng)度的區(qū)塊鏈,節(jié)點(diǎn)同步時(shí)選擇區(qū)塊鏈長(zhǎng)度值最大的區(qū)塊進(jìn)行拷貝操作。目前網(wǎng)絡(luò)中節(jié)點(diǎn)2 的區(qū)塊鏈高度值最大,因此節(jié)點(diǎn)1 和3 將區(qū)塊鏈2 的數(shù)據(jù)拷貝,更新自身區(qū)塊鏈。
圖2 多節(jié)點(diǎn)區(qū)塊鏈模型
2.2.1 區(qū)塊數(shù)據(jù)結(jié)構(gòu)
區(qū)塊中包括索引、時(shí)間戳、交易記錄、工作量證明、前一塊哈希值等屬性[15]。區(qū)塊結(jié)構(gòu)如圖3 所示。索引是在當(dāng)前區(qū)塊鏈高度基礎(chǔ)上增加1,也可用來表示區(qū)塊鏈的高度。時(shí)間戳得到的是區(qū)塊數(shù)據(jù)寫入的時(shí)間,交易記錄中保存的是交易池中按照優(yōu)先級(jí)別排序的交易列表。工作量證明用來設(shè)置爭(zhēng)奪記賬權(quán)的計(jì)算難度。前一區(qū)塊的哈希值用來將當(dāng)前區(qū)塊與前一區(qū)塊相連。
圖3 區(qū)塊結(jié)構(gòu)
2.2.2 共識(shí)算法
將當(dāng)前區(qū)塊的難度值(可變的數(shù)值,從1 開始取值)和前一個(gè)區(qū)塊的難度值相乘,取得二進(jìn)制編碼,將二進(jìn)制值進(jìn)行哈希運(yùn)算。當(dāng)哈希運(yùn)算結(jié)果中后四位取值為“0000”時(shí),認(rèn)為解題成功,取得記賬權(quán)。網(wǎng)絡(luò)中其他節(jié)點(diǎn)收到解題的結(jié)果之后,進(jìn)行工作量校驗(yàn),檢查節(jié)點(diǎn)是否具有記賬權(quán)。
方案包括交易數(shù)據(jù)上鏈和節(jié)點(diǎn)數(shù)據(jù)同步。交易數(shù)據(jù)上鏈由發(fā)起交易的節(jié)點(diǎn)創(chuàng)建新的交易,將交易存在交易池中,等待具有記賬權(quán)的節(jié)點(diǎn)將交易打包至區(qū)塊鏈;數(shù)據(jù)同步需要獲取全網(wǎng)中所有節(jié)點(diǎn)的區(qū)塊鏈高度,計(jì)算最大高度,使用高度最大的區(qū)塊鏈數(shù)據(jù)同步其他節(jié)點(diǎn)區(qū)塊鏈。
交易數(shù)據(jù)上鏈產(chǎn)生新交易,將交易打包到區(qū)塊。
1)抓取網(wǎng)絡(luò)傳輸?shù)慕灰?,?yàn)證信息中是否包含“sender”,“recipient”和“amount”,如果不包含,則提示數(shù)據(jù)不完整,返回400 錯(cuò)誤。
2)讀取網(wǎng)絡(luò)上的交易發(fā)送方、接收方和金額數(shù)據(jù),創(chuàng)建新交易。
3)對(duì)交易數(shù)據(jù)進(jìn)行哈希運(yùn)算,隨后寫入?yún)^(qū)塊中。交易數(shù)據(jù)添加之后清空交易列表。
區(qū)塊表示如下。
4)將交易添加成功的信息寫在網(wǎng)絡(luò)響應(yīng)response 對(duì)象上,并返回給客戶端。
1)遍歷網(wǎng)絡(luò)中的所有節(jié)點(diǎn)self.nodes;
2)獲取當(dāng)前的區(qū)塊鏈長(zhǎng)度len(self.chain);
3)依次訪問網(wǎng)絡(luò)中的所有節(jié)點(diǎn),取出節(jié)點(diǎn)的區(qū)塊鏈長(zhǎng)度,判斷區(qū)塊鏈長(zhǎng)度是否小于當(dāng)前節(jié)點(diǎn)的長(zhǎng)度,為真則更新區(qū)塊鏈。
代碼如下:
方案在Windows 環(huán)境實(shí)施,采用Python 語言編寫仿真實(shí)驗(yàn)程序,使用flask 框架搭建Web 模型,模擬3 個(gè)節(jié)點(diǎn)的共識(shí)操作。實(shí)驗(yàn)中因?yàn)橛衟ost 請(qǐng)求,因此需要傳遞一定的參數(shù),使用Postman 進(jìn)行Web API&HTTP 請(qǐng)求調(diào)試[16]。實(shí)驗(yàn)分別模擬新節(jié)點(diǎn)入網(wǎng)、新交易創(chuàng)建、交易保存至區(qū)塊、區(qū)塊上鏈及節(jié)點(diǎn)數(shù)據(jù)同步等操作。
實(shí)驗(yàn)中部署了3 個(gè)區(qū)塊鏈節(jié)點(diǎn),端口號(hào)分別為5000、5002 和5004。這3 個(gè)節(jié)點(diǎn)都參與記賬權(quán)爭(zhēng)奪操作。表1 為這3 個(gè)節(jié)點(diǎn)在60 min 內(nèi)的在線情況。
表1 節(jié)點(diǎn)的可用性測(cè)試
在Postman 中創(chuàng)建post 請(qǐng)求,請(qǐng)求url 為http://127.0.0.1:5000/new_node,在body 中輸入?yún)?shù){"nodes":["http://127.0.0.1:5002"]},返回提示信息:
網(wǎng)絡(luò)節(jié)點(diǎn)添加成功。
創(chuàng)建post 請(qǐng)求,請(qǐng)求url 為http://127.0.0.1:5002/new_trainsactions,在body 中輸入?yún)?shù):
返回提示信息:
目前節(jié)點(diǎn)2 上已經(jīng)生成了5 個(gè)區(qū)塊,新產(chǎn)生的交易放入交易池,并隨著第6 個(gè)區(qū)塊的生成而被寫入其中。
Pycharm中啟動(dòng)flask服務(wù)器,運(yùn)行http://127.0.0.1:5000/mine 進(jìn)行記賬權(quán)爭(zhēng)奪。運(yùn)行一段時(shí)間之后,網(wǎng)絡(luò)上3 個(gè)節(jié)點(diǎn)擁有的區(qū)塊鏈情況如表2 所示。目前節(jié)點(diǎn)2 上的區(qū)塊鏈高度最大,擁有6 個(gè)區(qū)塊。
表2 網(wǎng)絡(luò)節(jié)點(diǎn)區(qū)塊及交易情況
當(dāng)發(fā)送http://127.0.0.1:5000/node_refresh 請(qǐng)求時(shí),網(wǎng)絡(luò)上的3 個(gè)節(jié)點(diǎn)進(jìn)行數(shù)據(jù)同步,3 個(gè)節(jié)點(diǎn)的區(qū)塊鏈數(shù)據(jù)完全一致,如表3 所示。
表3 同步操作之后網(wǎng)絡(luò)節(jié)點(diǎn)區(qū)塊及交易情況
為了解決B/S 架構(gòu)中對(duì)中心服務(wù)器過于依賴的問題,文中設(shè)計(jì)了一種真實(shí)網(wǎng)絡(luò)環(huán)境下的共識(shí)區(qū)塊鏈方案。方案利用flask 框架模擬了3 個(gè)網(wǎng)絡(luò)節(jié)點(diǎn),包括新節(jié)點(diǎn)加入網(wǎng)絡(luò)、交易的生成和加密、新區(qū)塊生成、共識(shí)算法驗(yàn)證、節(jié)點(diǎn)數(shù)據(jù)同步。在節(jié)點(diǎn)數(shù)據(jù)同步中根據(jù)最長(zhǎng)區(qū)塊鏈來更新網(wǎng)絡(luò)節(jié)點(diǎn)數(shù)據(jù)。
實(shí)驗(yàn)仿真表明,方案能實(shí)現(xiàn)交易數(shù)據(jù)上鏈,實(shí)現(xiàn)多個(gè)節(jié)點(diǎn)數(shù)據(jù)同步。因?yàn)榛趨^(qū)塊鏈技術(shù),所以交易數(shù)據(jù)不可篡改、不可否認(rèn)。產(chǎn)生的交易放入交易池,隨著第6 個(gè)區(qū)塊的生成而被寫入其中。