劉敏娜,尹 成,張 偉
(1.咸陽師范學院,陜西 咸陽 712000;2.微軟-清華大學聯合實驗室,北京 100000)
互聯網上瀏覽網頁使用的是WWW 服務協議。WWW 協議普遍應用基于B/S 架構的網絡模型。在B/S 服務架構中,服務器作為中心節點,為網絡中的其他節點提供數據訪問服務,瀏覽器請求數據服務[1]。B/S 架構建立在對中心服務器絕對信任的前提下,一旦失去信任,信息交換不再成立。同時,B/S 架構還存在對中心服務器依賴過大、服務器數據容易被竊取、數據無法追溯到原始狀態等問題[2]。
區塊鏈采用點對點(P2P)的去中心化的分布式存儲結構。區塊鏈的創造者中本聰提出“區塊鏈中,節點按照既定的運算規則來計算哈希值,由獲勝節點主張上鏈數據,其他節點對上鏈數據進行投票,同時將激勵機制應用到共識上[3]”。區塊鏈上沒有中心節點,節點之間不需要建立信任,通過共識達成規則,從而達成信任。引入區塊鏈技術,可以有效地解決B/S 架構中對服務器的依賴而產生的數據安全性問題。
文中提出在互聯網的分布式環境中,基于區塊鏈技術實現多個節點共識挖礦,存儲交易數據的方案。方案根據交易數據的特點,設計了區塊數據結構,利用區塊鏈的哈希算法對交易數據進行加密,利用共識算法解決記賬權的問題,利用最長鏈比較算法設計節點數據同步規則。
B/S 是WWW 協議最主要的一種網絡結構模型。B 代表Browser 瀏覽器,S 表示Server 服務器[4]。系統功能的核心部分集中在服務器端,用戶通過瀏覽器訪問互聯網上的信息,服務器解析并處理用戶請求。當需要提供數據訪問服務時,服務器獲取數據庫服務器中的數據,并將數據經過動態拼湊后顯示在客戶端瀏覽器中,這種架構簡化了系統的開發、維護和使用[5]。B/S 架構如圖1 所示。

圖1 B/S架構
B/S 架構存在以下問題:
1)對中心服務器依賴過大,一旦出現網絡問題導致擁塞,無法繼續為客戶端提供服務[3];
2)如果中心服務器遭遇惡意攻擊,則服務器數據容易被竊取;
3)服務器中存儲的數據沒有狀態,一旦數據被修改,則無法追溯到原始狀態。
區塊鏈(Block Chain)是比特幣應用的底層技術,使用區塊鏈技術能獨立完成價值轉移,包括數字貨幣、交易、資產等轉移,而且整個過程不依賴于中心機構[6]。
區塊鏈具有如下特點:
1)系統中不存在自上而下的中心化管理,分布式節點之間通過競爭博弈的方式實現自組織和自適應;
2)采用基于共識的數據更新機制。新生成的區塊必須獲得大多數節點驗證通過之后,才可以寫入節點的共享賬本中,因此數據難篡改和偽造[7]。
1.2.1 區塊鏈的核心概念
1)區塊
區塊是區塊鏈的基本元素,比特幣中區塊以文件形式存儲,以太坊中以數據庫形式存儲[8]。區塊由區塊頭和區塊體組成。區塊頭中封裝了前一個區塊的哈希值、當前區塊共識的解隨機數、時間戳等信息[9]。區塊體中包括當前區塊的交易數量以及經過驗證的區塊創建過程中生成的所有交易記錄。
2)節點
網絡中所有交易數據都記錄在節點服務器里[10]。節點分為輕節點和全節點。全節點擁有全網的區塊鏈結構,其中包括所有的交易數據,輕節點只擁有和自己相關的交易數據。
3)共識機制
區塊鏈中沒有中心化節點,因此在交易數據傳輸、價值轉移時,通過共識機制解決交易在所有記賬節點上的一致性和正確性問題[11]。共識機制是區塊鏈的核心組成部分,是保障區塊鏈系統能長久運行的關鍵機制。共識算法有工作量證明POW、權益證明POS、委托權益證明DPOS。
工作量證明POW 算法要求證明方在使用服務或資源之前完成一定難度的復雜運算,且這種工作量很容易被驗證方核實。權益證明POS 是具有最高權益的節點最有可能獲得記賬權,其權益體現為節點對特定數量貨幣的所有權。委托權益證明DPOS 是通過共識節點的權益投票將記賬權賦予特定的節點,從而實現公平和民主的共識過程和區塊鏈治理。
區塊鏈共識算法使用最多的是POW。文中使用POW 共識算法,以便使最快計算出符合要求的隨機數的節點具有記賬權。
1.2.2 點對點模式
點對點模式中每個節點的地位是對等的。網絡中的節點可以自由地加入和退出,網絡中所有節點都具有存儲和轉發功能,可以提高通信效率[13];單個節點的故障不會影響整體系統,可以提高網絡的健壯性;同時網絡的擴展性強,有利于網絡負載均衡[14]。
1.2.3 區塊鏈運行流程
1)源節點創建交易,驗證目的節點地址,對交易簽名加密,將交易廣播至網絡上的其他節點。
2)網絡上節點接收交易,判斷交易數據來源是否正確。全網大多數節點驗證通過之后,節點將交易信息保存在交易池中。
3)節點爭奪記賬權,擁有記賬權的節點將交易數據打包到本地區塊中。全網共識驗證之后,獲勝節點將新區塊追加到主鏈。
4)交易在主鏈上被后續區塊確認。
5)不同節點之間根據最長鏈原則,定期同步區塊鏈數據。
方案是基于該區塊鏈運行流程設計的,方案中包括新節點加入、新交易創建、新區塊生成、區塊上鏈、節點間同步數據等環節。
為了簡化模型,網絡中包括3 個具備獨立記賬能力的全節點,如圖2 所示。全節點上保存不同長度的區塊鏈,節點同步時選擇區塊鏈長度值最大的區塊進行拷貝操作。目前網絡中節點2 的區塊鏈高度值最大,因此節點1 和3 將區塊鏈2 的數據拷貝,更新自身區塊鏈。

圖2 多節點區塊鏈模型
2.2.1 區塊數據結構
區塊中包括索引、時間戳、交易記錄、工作量證明、前一塊哈希值等屬性[15]。區塊結構如圖3 所示。索引是在當前區塊鏈高度基礎上增加1,也可用來表示區塊鏈的高度。時間戳得到的是區塊數據寫入的時間,交易記錄中保存的是交易池中按照優先級別排序的交易列表。工作量證明用來設置爭奪記賬權的計算難度。前一區塊的哈希值用來將當前區塊與前一區塊相連。

圖3 區塊結構
2.2.2 共識算法
將當前區塊的難度值(可變的數值,從1 開始取值)和前一個區塊的難度值相乘,取得二進制編碼,將二進制值進行哈希運算。當哈希運算結果中后四位取值為“0000”時,認為解題成功,取得記賬權。網絡中其他節點收到解題的結果之后,進行工作量校驗,檢查節點是否具有記賬權。
方案包括交易數據上鏈和節點數據同步。交易數據上鏈由發起交易的節點創建新的交易,將交易存在交易池中,等待具有記賬權的節點將交易打包至區塊鏈;數據同步需要獲取全網中所有節點的區塊鏈高度,計算最大高度,使用高度最大的區塊鏈數據同步其他節點區塊鏈。
交易數據上鏈產生新交易,將交易打包到區塊。
1)抓取網絡傳輸的交易,驗證信息中是否包含“sender”,“recipient”和“amount”,如果不包含,則提示數據不完整,返回400 錯誤。
2)讀取網絡上的交易發送方、接收方和金額數據,創建新交易。
3)對交易數據進行哈希運算,隨后寫入區塊中。交易數據添加之后清空交易列表。
區塊表示如下。

4)將交易添加成功的信息寫在網絡響應response 對象上,并返回給客戶端。
1)遍歷網絡中的所有節點self.nodes;
2)獲取當前的區塊鏈長度len(self.chain);
3)依次訪問網絡中的所有節點,取出節點的區塊鏈長度,判斷區塊鏈長度是否小于當前節點的長度,為真則更新區塊鏈。
代碼如下:


方案在Windows 環境實施,采用Python 語言編寫仿真實驗程序,使用flask 框架搭建Web 模型,模擬3 個節點的共識操作。實驗中因為有post 請求,因此需要傳遞一定的參數,使用Postman 進行Web API&HTTP 請求調試[16]。實驗分別模擬新節點入網、新交易創建、交易保存至區塊、區塊上鏈及節點數據同步等操作。
實驗中部署了3 個區塊鏈節點,端口號分別為5000、5002 和5004。這3 個節點都參與記賬權爭奪操作。表1 為這3 個節點在60 min 內的在線情況。

表1 節點的可用性測試
在Postman 中創建post 請求,請求url 為http://127.0.0.1:5000/new_node,在body 中輸入參數{"nodes":["http://127.0.0.1:5002"]},返回提示信息:

網絡節點添加成功。
創建post 請求,請求url 為http://127.0.0.1:5002/new_trainsactions,在body 中輸入參數:

返回提示信息:

目前節點2 上已經生成了5 個區塊,新產生的交易放入交易池,并隨著第6 個區塊的生成而被寫入其中。
Pycharm中啟動flask服務器,運行http://127.0.0.1:5000/mine 進行記賬權爭奪。運行一段時間之后,網絡上3 個節點擁有的區塊鏈情況如表2 所示。目前節點2 上的區塊鏈高度最大,擁有6 個區塊。

表2 網絡節點區塊及交易情況
當發送http://127.0.0.1:5000/node_refresh 請求時,網絡上的3 個節點進行數據同步,3 個節點的區塊鏈數據完全一致,如表3 所示。

表3 同步操作之后網絡節點區塊及交易情況
為了解決B/S 架構中對中心服務器過于依賴的問題,文中設計了一種真實網絡環境下的共識區塊鏈方案。方案利用flask 框架模擬了3 個網絡節點,包括新節點加入網絡、交易的生成和加密、新區塊生成、共識算法驗證、節點數據同步。在節點數據同步中根據最長區塊鏈來更新網絡節點數據。
實驗仿真表明,方案能實現交易數據上鏈,實現多個節點數據同步。因為基于區塊鏈技術,所以交易數據不可篡改、不可否認。產生的交易放入交易池,隨著第6 個區塊的生成而被寫入其中。