劉敏娜 尹成 姚波
(1.咸陽師范學院,陜西咸陽 712000;2.微軟-清華大學聯合實驗室,北京 100000)
區塊鏈是由中本聰提出的比特幣的底層技術。區塊鏈技術具有去中心化的組織方式、基于共識的數據共識機制、建立在隱私保護基礎上的公開數據讀取方式等特點[1]。區塊鏈通過交易數據哈希加密,可以保證數據安全,解決數據篡改驗證的問題;通過時間戳機制記錄數據交易的完整過程,使得交易數據全程可追溯;借助POW工作量證明算法解決不同節點記賬權的問題??傊?使用區塊鏈技術可以解決Web應用程序中心化平臺的安全隱患。
目前區塊鏈技術研究主要包括通用協議研究(智能合約,隱私保護等協議)、數據層研究(非對稱加密,分布式數據庫等)、網絡層研究和應用研究。應用研究包括區塊鏈技術與金融、教育、工業等領域整合應用[2]。本文主要研究使用Go語言構建區塊鏈模型,目的是通過模型研究為下一步將區塊鏈技術整合在基于B/S架構的Web程序(即傳統Web程序+區塊鏈技術應用)打下基礎。
區塊鏈技術本質是一個去中心的、通過分布式節點進行數據存儲、驗證、傳遞和交流的網絡技術方案[3]。區塊鏈技術最早是應用在比特幣系統中,作為比特幣的底層存儲結構。區塊鏈的基礎技術有哈希計算、數字簽名、P2P網絡、共識算法和智能合約。一個成熟的區塊鏈具有透明可信、防篡改、隱私安全保障和系統高可靠等特性。區塊鏈從最初的金融領域的應用,到現在在供應鏈、政務、數字版權和醫療等領域都有廣泛的應用。
Go語言是Google公司開發的一種開源通用編程語言,是一種用于搭載Web服務器,存儲集群的系統編程語言[4]。具有編譯速度快,執行效率高、網絡編程友好、高并發、跨平臺等特性,因此使用Go語言進行區塊鏈開發具有天然優勢。因此,本文使用Go語言構建區塊鏈模型。
區塊鏈最早應用在以比特幣為首的數字貨幣中,區塊鏈技術的出現對金融領域產生顛覆性的影響。隨著智能合約的出現,區塊鏈擴展到了金融領域之外的司法、醫療、教育、物流等領域。區塊鏈與傳統行業的融合目前采用的是以傳統行業為主,以微創新的方式在傳統行業內部以可控的方式應用區塊鏈技術[5]。本文探討的是網絡環境下區塊鏈模型的構建,模型的搭建對于理解區塊鏈技術原理有重大的意義,同時為下一步將區塊鏈技術融合在現有的軟件系統提供重要的指導思想。
基于Go語言的區塊鏈模型整體架構如圖1所示。模型中包括POW工作量證明、交易數據生成、區塊生成、區塊校驗和區塊上鏈五個模塊。區塊鏈操作過程為:用戶在網絡中通過post請求發起新的交易,節點接收到交易數據之后存儲在本地交易池中,網絡中的所有節點競爭記賬權,通過POW工作量證明算法來保證只有最早解出題的節點可以將交易池中的數據寫入區塊。擁有寫入數據權力的節點將新生成的區塊發送給網絡其它節點,當網絡中51%的節點驗證通過,此時網絡中節點將新區塊寫入本地區塊鏈中。

圖1 區塊鏈模型結構圖Fig.1 Blockchain model structure diagram

圖2 網絡上的區塊鏈信息Fig.2 Blockchain information on the network
方案的設計流程為:創建創世區塊,并將創世區塊追加到切片中,加載配置文件,并解析配置文件中的端口號,開啟監聽器,等待用戶請求,當發送get請求時,將網絡中區塊鏈節點顯示到客戶端。發送post請求時,接收用戶輸入的交易信息,將交易信息和當前時間等信息打包到區塊中,并發送給其它節點校驗數據。
共識機制用來驗證交易記錄的有效性,同時通過共識機制來競爭記賬權。區塊鏈上的共識機制包括工作量證明POW,權益證明POS,股份授權證明DPOS[6]。因為POW工作量證明完全去中心化,且節點可以自由進出,因此本方案采用POW算法作為共識機制。
POW中所有節點競爭記賬權,只有解出難題的節點才有記賬權利。每一次的記賬都有一個難度系數Diff,這個難度系數控制鏈增長的速度。模型中設置難度系數為4,當前區塊的前一區塊哈希值PreHash、當前區塊的難度系數Diff、當前區塊的交易數據BPM、當前區塊的高度Index、當前區塊的隨機數Nonce字符串這五個變量連接之后計算哈希值,如果哈希值滿足難度系數要求的前4位是全零,這時節點解出難題,將難度系數記錄在區塊中。由其它節點校驗解題結果,校驗通過將區塊寫入區塊鏈;如果哈希值不滿足要求,則將Nonce值加1,再次計算哈希值結果是否滿足難度要求。
為了將研究重點聚焦在區塊的生成、上鏈等操作。模型中簡化了區塊鏈的結構,去掉了默克爾樹根。區塊中包括PreHash前一個區塊的哈希值、Hash Code當前區塊的哈希值、TimeStamp時間戳、Diff難度系數、BPM交易信息、Index區塊高度和Nonce隨機值。區塊和上一個區塊之間通過PreHash值構成了連接關系,從而組成了區塊鏈。
區塊結構體定義如下:
type Block struct {
PreHash string
HashCode string
TimeStamp string
Diff int
BPM int
Index int
Nonce int
}
區塊校驗包括:()1判斷新生成的區塊中的index是否比已有區塊鏈中最后一個區塊的index大1;(2)新區塊的PreHash是否等于上一個區塊的哈希值;(3)根據新區塊的信息再次計算哈希值,判斷是否和newBlock中的Hash Code相等。
Windows7環境中,使用Go語言編寫仿真實驗程序。實驗中因為涉及到發送get和post請求,需要傳遞一定的參數,使用Postman進行請求測試。實驗分別模擬get請求查看網絡中區塊鏈、post請求創建新交易,通過這兩種請求可以測試新交易創建、交易保存至區塊、區塊校驗、區塊上鏈等操作。
在Postman中,設置請求方式為POST,輸入url:http://localhost:9000,在body表選項卡中輸入參數{“BMP”:1000},這個參數表示交易金額是1000,點擊發送之后,在response區域顯示經過POW工作量計算生成的區塊信息,前面已經生成了兩個區塊,因此當前區塊高度為3。經過測試,可以生成新交易,并通過工作量計算,可以將交易寫入區塊。
啟動Postman應用程序,下拉列表中選擇GET請求方式,輸入代表本地測試的localhost,端口號是9000,點擊send按鈕發送請求。在response區域顯示網絡上的區塊鏈信息,鏈上有3個區塊,如圖2所示。高度值為1的區塊是創世塊,第2個區塊的哈希值為“00005105373dcbdfcd ba3b13f5194bf1cbef194ac3e2f441e69b2339d85118e8”,第3個區塊的哈希值為“0000f5d782bb7b4d61002802769 f8a1b91b6c0267e4bc4752d979a01223728e1”,哈希值滿足難度系數要求的前綴“0000”。新的區塊校驗成功,區塊被寫入區塊鏈。
本文設計了基于Go語言的區塊鏈模型。模型中模擬新交易數據生成、新區塊生成、區塊上鏈等過程。模型的搭建對于理解區塊鏈技術原理有重大的意義,同時為區塊鏈技術整合在基于B/S架構的Web程序打下基礎,為在傳統行業融合區塊鏈技術提供重要的指導思想。