穆莉莉 豐 韋 伍習(xí)東
(安徽建筑大學(xué) 經(jīng)濟與管理學(xué)院,安徽 合肥 230601)
當(dāng)前社會正處于高度信息化時代,教育建設(shè)十分重要。目前對個人受教育情況的查詢存在一些弊端,一些盜版網(wǎng)站屢見不鮮[1],現(xiàn)存?zhèn)€人教育經(jīng)歷共享溯源系統(tǒng)基本是基于B/S結(jié)構(gòu)和Web技術(shù):將個人教育經(jīng)歷數(shù)據(jù)存入數(shù)據(jù)庫中,然后個人通過網(wǎng)站查詢獲得。但當(dāng)數(shù)據(jù)庫出現(xiàn)問題或被惡意攻擊導(dǎo)致數(shù)據(jù)被更改和刪除時易造成故障,所以,目前這種方法不能保證數(shù)據(jù)的完整性。考慮到以上情況,采用基于hyperledger fabric技術(shù),該技術(shù)為一種開源超級分布式賬本,具有透明、公開、去中心化等特點,在溯源和共享系統(tǒng)起到很大作用,能保證信息的真實性,可實現(xiàn)溯源共享平臺的創(chuàng)建。將hyperledger技術(shù)和個人教育情況溯源共享結(jié)合[2],利用區(qū)塊鏈的分布式儲存實現(xiàn)信息共享[3],利用區(qū)塊鏈的共識算法防止信息被惡意更改,打造一個安全,去中心化的可溯源個人教育情況體系。本實驗采用虛擬機的Linux系統(tǒng),docker容器,hyperledger fabric,設(shè)計了個人教育經(jīng)歷共享溯源平臺。將Hyperledger Fabric技術(shù)作為網(wǎng)絡(luò)底層,在應(yīng)用程序及業(yè)務(wù)鏈碼方面利用fabric-sdk-go實現(xiàn)智能合約,并且通過相關(guān)API接口實現(xiàn)web業(yè)務(wù)層。通過賬號登錄操作,將業(yè)務(wù)發(fā)送給鏈碼,通過對鏈碼的調(diào)用,實現(xiàn)對超級賬本的操作。
根據(jù)節(jié)點的類型,區(qū)塊鏈可分為三種情況,這三種的范圍是不同的。分為公有鏈,聯(lián)盟鏈和私有鏈。
公有鏈:公有鏈就是公開的,所有人都可以登錄網(wǎng)絡(luò)和區(qū)塊,所有人都可以加入?yún)^(qū)塊鏈網(wǎng)絡(luò)。
聯(lián)盟鏈:聯(lián)盟鏈?zhǔn)侵冈谶@個范圍內(nèi)的成員才有權(quán)限使用去中心化功能。
私有鏈:私有鏈?zhǔn)菍为毜膫€體使用,具有溯源和不能篡改的特性。
1.hyperledger fabric平臺
hyperledger fabric是一個超級賬本,是區(qū)塊鏈技術(shù)第一個面向企業(yè)應(yīng)用場景的開源分布式賬本平臺,將區(qū)塊鏈技術(shù)引入聯(lián)盟鏈的應(yīng)用場景中。支持多通道,增強了隔離的安全性[4]。支持共識組件,權(quán)限管理組件。分為peer節(jié)點的多種角色,并根據(jù)實際情況進行設(shè)置。 hyperledger fabric運行時的架構(gòu),如圖1所示。
圖1 fabric運行架構(gòu)
其中:
CA:對Hyperledger的成員身份進行管理。
Msp:為客戶端和peer提供系統(tǒng)抽象組件。
Channel:通道,是一種通信機制,將指定的peer和orderer連接在一起。
Org:代表組織。
Peer:組織中的節(jié)點,是用來存儲和同步賬本數(shù)據(jù),用戶通過客戶端工具對數(shù)據(jù)進行put操作, 數(shù)據(jù)寫入一個節(jié)點里邊數(shù)據(jù)同步是fabric框架實現(xiàn)的。一個Peer節(jié)點可以充當(dāng)多種角色,一個區(qū)塊鏈網(wǎng)絡(luò)中會有多個Peer節(jié)點。
Orderer:排序節(jié)點,主要是用來排序和分發(fā)交易。對交易進行排序,批量打包,生成區(qū)塊,然后發(fā)給Peer節(jié)點。一個區(qū)塊鏈網(wǎng)絡(luò)中會有多個Orderer節(jié)點,共同提供排序服務(wù)。
ChainCode:鏈碼,用來進行交互。
Ledger:賬本。
2. Fabric 交易流程
通過SDK提供的API創(chuàng)建客戶端業(yè)務(wù)層,將業(yè)務(wù)交易打包發(fā)送給背書節(jié)點。背書節(jié)點進行模擬交易,模擬文件的格式是否正確,是否具有重復(fù)性已執(zhí)行權(quán)限,并對結(jié)果進行簽名。將結(jié)果返還給客戶端。客戶端收到了背書節(jié)點的驗證簽名,然后將業(yè)務(wù)層面的交易發(fā)送給orderer點。Orderer節(jié)點根據(jù)時間進行排序,然后創(chuàng)建區(qū)塊[5]。之后發(fā)送給所有組織的leader節(jié)點,leader節(jié)點是領(lǐng)導(dǎo)節(jié)點,根據(jù)其接收到的區(qū)塊,要進行驗證是否重復(fù)是否進行背書策略,驗證通過后,傳播給組織中的其他節(jié)點。Leader節(jié)點通過同步廣播,將區(qū)塊傳播給組織中的其他節(jié)點,并且分類賬本進行更新,將業(yè)務(wù)提交到當(dāng)前狀態(tài)數(shù)據(jù)庫中。如圖2所示為hyperledger fabric交易流程。
圖2 fabric交易流程
1. 系統(tǒng)架構(gòu)
溯源共享系統(tǒng)架構(gòu),第一層為fabric-network網(wǎng)絡(luò)搭建[6],通過crypto-config.yaml配置相關(guān)的組織信息,根據(jù)需要添加新的組織信息,根據(jù)需要可在組織中指定多個節(jié)點。最后hyperledger fabric提供的cryptogen工具可生成組織結(jié)構(gòu)和身份證書密鑰。需要注意的是已生成的組織結(jié)構(gòu)無法進行修改,要提前進行計劃好。再通過相關(guān)的配置文件生成創(chuàng)世區(qū)塊和通道。
第二層fabric-sdk-go為業(yè)務(wù)層,需要創(chuàng)建fabric-sdk對象并且需要創(chuàng)建通道。在確認(rèn)hyperledger fabric網(wǎng)絡(luò)環(huán)境沒有問題之后創(chuàng)建config.yaml文件,為fabric-sdk-go配置參數(shù)和指定hyperledger fabric通信地址。
定義結(jié)構(gòu)體,用于包含fabric-sdk需要的配置信息。包括通道名稱、通道配置文件路徑、組織名稱、組織管理員名稱、orderer名稱、資源管理。
type initinfo struct {
ChannelID string
ChannelConfig string
OrgName string
OrgAdmin string
OrdererOrgName string
OrgResMgmt *resmgmt.client}
定義好結(jié)構(gòu)體之后就可以創(chuàng)建sdk實例,并進行一系列操作。之后創(chuàng)建sdk及通道的創(chuàng)建,并將peer節(jié)點加入通道中,為保證客戶端初始化所有組織,需要進行測試創(chuàng)建通道。
接下來使用fabri-sdk實現(xiàn)鏈碼安裝,實例化鏈碼,創(chuàng)建客戶端實例。通過該實例可對鏈碼進行查詢、調(diào)用。
第三層為web控制層,方便用戶操作。系統(tǒng)架構(gòu),如圖3所示。
圖3 系統(tǒng)架構(gòu)
2.環(huán)境搭建
此應(yīng)用采用ubuntu系統(tǒng)完成,環(huán)境所需安裝配置包括vim、git、docker、docker-compose、goland。需要進行拉去鏡像,接下來是搭建hyperledger Fabric的步驟。
第一步需要生成Fabric的證書編寫,并生成組織節(jié)點證書的配置文件,可將其命名為:crypto-config.yaml。在文件里指定組織的名稱,節(jié)點個數(shù),用戶個數(shù)和訪問節(jié)點的域名信息。
第二步需要創(chuàng)建創(chuàng)世塊文件和通道文件。Fabric是分布式賬本技術(shù)平臺,被設(shè)計用于企業(yè)場景, 每個賬本都有自己的區(qū)塊, 賬本的區(qū)塊鏈作用就是用來存儲業(yè)務(wù)的交易數(shù)據(jù),但賬本的第一個區(qū)塊與其他區(qū)塊不同,第一個區(qū)塊是不儲存業(yè)務(wù)的交易數(shù)據(jù)是用來存儲配置信息,所以,把賬本的第一個區(qū)塊稱為創(chuàng)始塊。通過指令生成創(chuàng)世塊文件,名稱為genesis.block。通道在Fabric中稱為channel,一個channel表示一個賬本。Fabric多樣化的可配置特性,能夠滿足多種行業(yè)的各種各樣需求。在fabric中至少有一個channel,通過命令將通道創(chuàng)建出來,通道文件名稱為channel.tx。
第三步通過指令編寫docker-compose啟動時需要的配置文件,默認(rèn)生成的文件名為:docker-compose.yaml通過指令docker-compose up -d測試測試啟動網(wǎng)絡(luò)環(huán)境,通過指令docker ps顯示狀態(tài)全為up狀態(tài),啟動測試成功。
3. 鏈碼的設(shè)計與實現(xiàn)
鏈碼對于區(qū)塊鏈來說是一個十分重要的組成部分。在Fabric中將智能合約稱之為ChainCode,也就是鏈碼。在鏈碼中設(shè)計了此實驗的結(jié)構(gòu)體。代碼如下:
鏈碼通過hyperledger提供的接口和賬本數(shù)據(jù)進行交互操作,對應(yīng)用程序提供的接口。ChainCode是業(yè)務(wù)層客戶端和Fabric技術(shù)之間的連接,是業(yè)務(wù)的承載體,通過操作業(yè)務(wù)層客戶端程序可以發(fā)起交易、查詢交易,負(fù)責(zé)具體的業(yè)務(wù)邏輯。Fabric中的ChainCode包含了鏈碼及管理命令。ChainCode程序需要運行在容器中。所以,ChainCode鏈碼非常安全;ChainCode管理命令是對ChainCode鏈碼進行安裝、實例化、調(diào)用、打包、簽名等步驟進行操作。
Chain Code需要導(dǎo)入Fabric技術(shù)提供一些系統(tǒng)包,ChainCode通過導(dǎo)入這些系統(tǒng)包實現(xiàn)ChainCode和Fabric的連接。Fabric包中的Shim包包含了配置環(huán)境,以及Fabric和ChainCode連接的相關(guān)接口。在鏈碼中操作執(zhí)行查詢增加等功能都需要通過shim才能實現(xiàn)。
定義結(jié)構(gòu)體并實現(xiàn),ChainCode若要實現(xiàn)Fabric技術(shù)提供的接口,首先,要實現(xiàn)以下兩個方法。第一個是Init方法,為系統(tǒng)初始化的方法。第二個是Invoke方法,這種方法的作用是寫入數(shù)據(jù),如發(fā)起交易。可以使用相關(guān)的API來創(chuàng)建SDK實例:創(chuàng)建通道、將組織中peer節(jié)點加入已創(chuàng)建的通道中、安裝鏈碼、實例化鏈碼、創(chuàng)建客戶端實例。其次,進行創(chuàng)建fabirc-sdk,并進行測試。通過使用SDK相關(guān)的API來進行安裝鏈碼、實例化鏈碼,創(chuàng)建客戶端并進行測試,顯示鏈碼實例化成功。
4. Fabric-sdk-go功能的實現(xiàn)
在業(yè)務(wù)層定義一個函數(shù)實現(xiàn)鏈碼的調(diào)用,管理員用戶向分布式賬本中添加信息功能。
定義一個 FindEduInfoByEntityID 函數(shù),接收字符串參數(shù),代表身份證號碼,此函數(shù)通過調(diào)用鏈碼實現(xiàn)查詢用戶的個人教育情況追溯。
定義一個 ModifyEdu 函數(shù),接收Education結(jié)構(gòu)的對象,該函數(shù)實現(xiàn)管理員通過調(diào)用鏈碼對已存在的信息進行修改的功能。
5. Web應(yīng)用的實現(xiàn)
Web應(yīng)用的實現(xiàn)主要分為兩個步驟:控制層的實現(xiàn)和視圖層的實現(xiàn)。控制層主要是處理響應(yīng),處理要求。在控制層設(shè)置管理員用戶和普通用戶,管理員用戶可添加個人教育經(jīng)歷信息,修改個人信息。普通用戶只可實現(xiàn)查詢功能。在控制層創(chuàng)建controllerHandler.go 函數(shù)實現(xiàn)用戶的請求,根據(jù)不同的用戶請求調(diào)用業(yè)務(wù)層不同的函數(shù),在業(yè)務(wù)層,通過sdk提供的接口實現(xiàn)對鏈碼的訪問,具有添加信息、查詢信息,修改信息等功能,實現(xiàn)對分類賬本的訪問。每次發(fā)布信息都會有對應(yīng)的哈希值。
在視圖層存放頁面布局的css文件、與用戶交互的javaScript文件、以及所需圖片文件。
至此所有項目結(jié)束,可通過命令查看效果。圖4為鏈碼的實現(xiàn)流程,圖5為web頁面顯示。
圖4 鏈碼實現(xiàn)的流程
圖5 web頁面顯示
區(qū)塊鏈的主要特點是數(shù)據(jù)不可更改和可以進行溯源驗證,建立相互信任的個人教育經(jīng)歷的共享溯源,可打破個人教育情況偽造的現(xiàn)象。
共享平臺的特點是去中心化,方便提供個人教育認(rèn)證,提高效率。
區(qū)塊鏈技術(shù)將數(shù)字證書的哈希值存儲在分布式賬本中,可保證數(shù)據(jù)完整性和準(zhǔn)確性[7],方便個人教育數(shù)據(jù)的管理。
針對傳統(tǒng)個人教育經(jīng)歷的弊端,將個人教育經(jīng)歷應(yīng)用系統(tǒng)與區(qū)塊鏈技術(shù)的結(jié)合。提出了基于hyperledger fabric個人教育情況的共享溯源系統(tǒng)[8],具有透明化、數(shù)據(jù)不可篡改等特點[9]。采用了虛擬機的Linux系統(tǒng),docker容器,hyperledger fabric環(huán)境等設(shè)計了共享溯源平臺,解決了數(shù)據(jù)的可信問題和數(shù)據(jù)的安全性,為數(shù)據(jù)建設(shè)提供一種全新的技術(shù)支持。