林劍宏
摘要:區(qū)塊鏈?zhǔn)且环N顛覆現(xiàn)有格局的底層技術(shù)架構(gòu)體系。區(qū)塊鏈超級賬本Hyperlegder Fabric 1.0網(wǎng)絡(luò)系統(tǒng)的部署涉及硬件、軟件等多種工具和技術(shù)環(huán)境的搭建。為了減少在部署Fabric過程中出現(xiàn)的錯誤,文章通過演示在實際生產(chǎn)環(huán)境下的搭建操作,從零開始詳細(xì)介紹了部署區(qū)塊鏈Hyperlegder Fabric 1.0網(wǎng)絡(luò)系統(tǒng)的全過程,使初學(xué)者能夠快速高效地體驗Fabric網(wǎng)絡(luò)系統(tǒng)的核心功能。
關(guān)鍵詞:區(qū)塊鏈;Hyperlegder Fabric;網(wǎng)絡(luò)系統(tǒng);部署;搭建
中圖分類號:TP316.4? ? ? ? 文獻(xiàn)標(biāo)識碼:A
文章編號:1009-3044(2020)30-0050-04
Abstract: Blockchain is an underlying technology architecture system that subverts the existing pattern. The deployment of the blockchain hyperledger fabric 1.0 network system involves the construction of hardware, software and other tools and technical environment. In order to reduce the errors in the process of deploying fabric, this paper introduces the whole process of deploying the blockchain hyperlegder fabric 1.0 network system in detail from scratch by demonstrating the construction operation in the actual production environment, so that beginners can experience the core functions of fabric network system quickly and efficiently.
Key words:Blockchain; Hyperlegder Fabric; network system ; deployment; Build
1 引言
區(qū)塊鏈[1]的概念由學(xué)者“中本聰”研究者(或研究團(tuán)隊)于2008年提出,區(qū)塊鏈(Blockchain)是一種源自比特幣的分布式存儲機(jī)制數(shù)據(jù)庫,數(shù)據(jù)庫的核心內(nèi)容是通過一串使用非對稱加密算法、安全散列算法等密碼學(xué)方法產(chǎn)生的數(shù)據(jù)塊(block),使得用戶可以在任意節(jié)點中參與系統(tǒng)數(shù)據(jù)的維護(hù)。目前主要有如下幾種主流的區(qū)塊鏈技術(shù)平臺:比特幣(Bitcoin)、以太坊(Ethereum)、和Linux基金會的開源項目超級賬本(Hyperledger Fabric)、EOS企業(yè)級區(qū)塊鏈操作系統(tǒng)(Enterprise Operation System)。超級賬本HyperLedger Fabric作為一個典型的區(qū)塊鏈技術(shù)平臺,是一個帶有可插入各種功能模塊架構(gòu)的區(qū)塊鏈實施方案,目標(biāo)是打造成一個由全社會共同維護(hù)的開源超級賬本。HyperLedger Fabric系統(tǒng)上沒有中心機(jī)構(gòu)擁攬權(quán)力,我們的每一筆交易都是全網(wǎng)公開并且安全的,信用由全社會共同認(rèn)證;超級賬本具有強(qiáng)大的容器技術(shù)來支持任何主流的語言來開發(fā)智能合約(鏈碼)。因此,通過由淺入深、循序漸進(jìn)地掌握超級賬本HyperLedger Fabric 1.0網(wǎng)絡(luò)系統(tǒng)的部署全過程,將能夠進(jìn)一步搭建符合自身業(yè)務(wù)場景的區(qū)塊鏈網(wǎng)絡(luò)平臺,利用區(qū)塊鏈Fabric技術(shù)實現(xiàn)具有去中心化、信息不可篡改的區(qū)塊鏈應(yīng)用項目。
2 HyperLedger Fabric系統(tǒng)的環(huán)境搭建
2.1 基礎(chǔ)環(huán)境
根據(jù)區(qū)塊鏈超級賬本HyperLedger Fabric的官方技術(shù)文檔,F(xiàn)abric系統(tǒng)能夠部署在Linux操作系統(tǒng)、Windows操作系統(tǒng)以及蘋果電腦的MAC等操作系統(tǒng)上,但是在生產(chǎn)環(huán)境中,鑒于穩(wěn)定性、兼容性和安全性的要求,一般都是將Fabric系統(tǒng)部署在Linux操作系統(tǒng)之上。本文的實驗演示環(huán)境采用了64位的Ubantu 16.04LTS, 系統(tǒng)內(nèi)核為GNU/Linux4.15.0-51-generic_x86_64。如果讀者的常用操作系統(tǒng)為Windows系統(tǒng),可以通過采用虛擬機(jī)VM的方法來安裝Ubantu系統(tǒng)。硬件資源要求:內(nèi)存最低為2Gb以上,磁盤空間最低為30Gb以上,本實驗演示環(huán)境采用了4Gb 的內(nèi)存和40Gb的磁盤空間。
2.2 工具軟件
首先,超級賬本HyperLedger Fabric網(wǎng)絡(luò)的運(yùn)行環(huán)境需要安裝git工具,git是一個非常優(yōu)秀的免費、開源的版本管理控制工具,我們可以使用git工具方便地下載各個官方源代碼文件,例如:Golang、Hyperledger Fabric等在Github網(wǎng)站上發(fā)布的相關(guān)源代碼或其它數(shù)據(jù)。在Ubantu系統(tǒng)中通過敲打鍵盤上的“Ctrl+Alt+T”組合鍵調(diào)出終端,然后輸入命令: sudo apt-get install git 即可。接著,下載并安裝開發(fā)基于區(qū)塊鏈應(yīng)用的重要技術(shù)Node.js[2],Node.js通過Google的JavaScript V8引擎解析JavaScript代碼。另外,還需要在Ubantu系統(tǒng)中安裝vim、tree、npm等工具及管理軟件。
2.3 Docker和Docker-Compose的安裝配置
HyperLedgerFabric1.0 依賴Docker容器執(zhí)行智能合約chaincode,Docker [3]是一個開源的應(yīng)用容器引擎,基于Go語言并遵從Apache2.0協(xié)議開源。 Docker可以讓開發(fā)者打包他們的應(yīng)用以及依賴包到一個輕量級、可移植的容器中,然后發(fā)布到任何流行的 Linux 機(jī)器上,也可以實現(xiàn)虛擬化。Docker容器是完全使用沙箱機(jī)制,相互之間不會有任何接口(類似 iPhone 的 App),更重要的是容器性能開銷極低。
首先,安裝依賴包后在終端輸入如下命令安裝docker容器:sudo apt-get install docker-ce, 在終端輸入命令測試Docker:sudo docker pull hello-world,同時可以查看Docker版本:docker --version。Docker Compose的主要功能是能夠在一臺主機(jī)上創(chuàng)建出相互隔離的多個網(wǎng)絡(luò),并通過命令行管理多人Docker容器。我們可以使用如下命令來安裝docker-compose工具:sudo curl -L https://github.com/docker/compose/releases/download/1.24.0-rc1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose,安裝成功后,執(zhí)行如下命令查看Docker-Compose版本信息: docker-compose –version。
2.4 安裝配置go語言
Golang(go語言) 是HyperLedger Fabric區(qū)塊鏈系統(tǒng)底層以用智能合約chaincode的開發(fā)語言。我們可以通過使用wget工具來下載Golang的最新版本壓縮包文件 go1.12.5.linux-amd64.tar.gz,在終端輸入如下命令行下載go 語言:$ wget https://dl.google.com/go/go1.10.3.linux-amd64.tar.gz,接著,使用 tar 命令將下載后的壓縮包文件解壓到指定的 /usr/local/ 路徑下,在終端輸入如下命令:$ sudo tar -zxvf go1.12.5.linux-amd64.tar.gz -C /usr/local/ 。最后,還要配置go 語言環(huán)境變量,解壓源文件之后,為了使go 語言能夠?qū)ο到y(tǒng)的所有用戶開放正常使用,所以我們采用 vim 文件編輯工具打開系統(tǒng)的 profile 文件進(jìn)行編輯:$ sudo vim /etc/profile 并且在profile文件最后添加如下內(nèi)容:export GOPATH=$HOME/go ;export GOROOT=/usr/local/go ;export PATH=$GOROOT/bin:$PATH。使用 source 命令,使剛剛添加的配置信息生效:$ source /etc/profile。最后,通過 go env命令驗證是否正確完成go語言的安裝配置。
3超級賬本HyperLedger Fabric的安裝和編譯
3.1 下載超級賬本HyperLedger Fabric源代碼
首先,通過在終端命令行上輸入如下命令創(chuàng)建工程目錄:sudo mkdir -p /project/goworkspace/src/github.com/hyperLedger 。接著執(zhí)行命令切換到工程目錄,然后在終端上輸入如下命令下載Fabric源代碼:git clone -b release-1.0 https://github.com/hyperledger/fabric 。完成Fabric源代碼的下載后,下一步還需要下載安裝fabric-samples存儲庫,執(zhí)行如下命令即可下載fabric-samples存儲庫到當(dāng)前目錄下:
git clone -b release-1.0 https://github.com/hyperledger/fabric-samples。
3.2 編譯HyperLedger Fabric源代碼
Hyperledger Fabric 可以有兩種方式進(jìn)行編譯安裝,第一種方式(bootstrap.sh腳本方式)進(jìn)行環(huán)境的安裝,優(yōu)點是簡單、方便,能夠快速上手;第二種方式是以 Fabric 源碼方式進(jìn)行編譯,適合動手能力較強(qiáng)的人員,優(yōu)點是可以對 Hyperledger Fabric 相關(guān)組件有深入的理解,但缺點是容易出現(xiàn)各種錯誤且修正比較麻煩。為了使讀者能夠更進(jìn)一步了解Hyperledger Fabric系統(tǒng)各個核心模塊的功能,本文采用了第二種方式對 Fabric 源碼進(jìn)行直接手動編譯。我們在Fabric源代碼所在的文件夾下,執(zhí)行如下命令:make release可以對Fabric進(jìn)行編譯。
3.3? HyperLedger Fabric模塊的安裝
完成對Fabric源代碼的編譯之后,這些模塊就可以被運(yùn)行了,但是目前只能在編譯文件所在的文件夾中運(yùn)行Fabric模塊,這樣是非常不方便的。為了更加方便地使用這些模塊,可以通過下面的命令將Fabric模塊的可執(zhí)行文件復(fù)制到系統(tǒng)目錄中,這樣在系統(tǒng)中的任何路徑下面都能運(yùn)行這些可執(zhí)行這些模塊:復(fù)制成功之后通過以下命令修改各個Fabric模塊文件的執(zhí)行權(quán)限,否則無法行這些模塊。進(jìn)入Fabric模塊所在目錄下,接著依次執(zhí)行下面命令對Fabric各個核心模塊文件執(zhí)行權(quán)限的配置:sudo chmod -R 777 /usr/local/bin/configtxgen 。完成對Fabric各個核心模塊文件執(zhí)行權(quán)限的配置后即可正確運(yùn)行并使用Fabric核心模塊的功能。可以通過如下命令來檢查Fabric模塊安裝過程是否成功:peer version。
3.4 采用Docker運(yùn)行Fabric模塊
除了前面介紹的直接編譯源代碼的方式,還可以通過Docker來運(yùn)行這些模塊。通過Docker運(yùn)行Fabric相關(guān)模塊有兩種方法:通過本地源代碼生成Fabric模塊的Docker鏡像文件和從Docker倉庫中下載Fabric模塊的鏡像文件。下面將介紹這兩種方法的詳細(xì)步驟。第一是通過本地源代碼生成Fabric模塊的Docker鏡像通過本地源代碼生成Fabric模塊的Docker鏡像文件是非常簡單的,具體的操作命令為:make docker,上訴命令的執(zhí)行過程涉及從docker的遠(yuǎn)程服務(wù)器中下載文件,因此需要等待一段時間,具體的安裝時間視網(wǎng)絡(luò)情況而定。在執(zhí)行命令的過程中需要保持網(wǎng)絡(luò)暢通。
第二種方法是從Docker倉庫中下載Fabric模塊的Docker鏡像文件。為了方便用戶使用Fabric,F(xiàn)abric開發(fā)小組會定期將Fabric穩(wěn)定版本的源代碼編譯之后制作成Docker鏡像文件,然后把這些Docker鏡像文件上傳到Docker倉庫中供下載使用。
4 HyperLedger Fabric系統(tǒng)的部署
通過上面對的Hyperledger Fabric系統(tǒng)的開發(fā)環(huán)境搭建之后,我們接下來就可以啟動相關(guān)的Fabric模塊進(jìn)行Fabric系統(tǒng)的部署。
4.1 生成Fabric系統(tǒng)的成員證書文件
成員管理服務(wù)MSP[4] (Merbership Service Provider)在許可區(qū)塊鏈/聯(lián)盟鏈Hyperledger Fabric上認(rèn)證、授權(quán)和管理身份。在對等節(jié)點和排序服務(wù)節(jié)點中運(yùn)行成員管理服務(wù)的代理。MSP為客戶端、peer節(jié)點、Orderer節(jié)點等提供PKI數(shù)字證書以及管理組織成員身份。在MSP機(jī)制下,每個節(jié)點都擁有自己的證書,每個節(jié)點發(fā)出去的消息都會用自己的證書進(jìn)行簽名,同時對端節(jié)點可以對這些消息進(jìn)行真?zhèn)悟炞C。啟動Fabric之前首先需要生成相關(guān)的成員證書,一般情況下,MSP證書可以通過cryptogen模塊生成,同時可以由Fabric-CA管理。本文的案例采用cryptogen模塊生成MSP證書,cryptogen模塊會根據(jù)提供的配置文件生成后續(xù)模塊運(yùn)行過程中需要的證書和數(shù)據(jù)文件。在生成證書之前我們需要創(chuàng)建一個文件夾存放配置文件和生成的證書文件。本例中我們將配置文件和生成的證書文件放在文件夾/opt/hyperledger/fabricconfig中。創(chuàng)建存放證書的文件夾的命令如下所示: mkdir -p /opt/hyperledger/fabricconfig。cryptogen模塊提供了一個命令可以獲取cryptogen模塊所需要的配置文件的樣式,該命令為: cryptogen showtemplate 。把上述命令生成的內(nèi)容復(fù)制到一個文件中稍加修改即可使用。打開終端并執(zhí)行命令:sudo gedit crypto-config.yaml , 將配置文件的內(nèi)容保存到文件夾/opt/hyperledger/fabricconfig中,配置文件夾命名為crypto-config.yaml。保存之后依次執(zhí)行如下命令生成2個組織org1.sy.com和org2.sy.com。然后我們會發(fā)現(xiàn)在文件夾/opt/hyperledger/fabricconfig中會新增加一個文件夾crypto-config,里面存放著本例的相關(guān)配置文件,可以通過在終端執(zhí)行命令:tree-L 5查看生成證書文件的內(nèi)容。
4.2 創(chuàng)建Fabric系統(tǒng)的創(chuàng)世區(qū)塊
創(chuàng)世區(qū)塊是初始化區(qū)塊鏈網(wǎng)絡(luò)或通道的配置區(qū)塊,也是區(qū)塊鏈上的第一個區(qū)塊。利用congfigtxgen模塊生成Fabric系統(tǒng)創(chuàng)世區(qū)塊和Channel創(chuàng)始區(qū)塊的配置文件。創(chuàng)世區(qū)塊Genesis Block是初始化區(qū)塊鏈網(wǎng)絡(luò)或channel的配置區(qū)塊,也是本Fabric系統(tǒng)區(qū)塊鏈上的第一個區(qū)塊。首先進(jìn)入Order的目錄下,通過執(zhí)行如下命令即可生成基于Fabric的區(qū)塊鏈系統(tǒng)創(chuàng)世區(qū)塊, 系統(tǒng)創(chuàng)世區(qū)塊的創(chuàng)建如下圖1所示:
4.3 創(chuàng)建Fabric系統(tǒng)的賬本創(chuàng)世區(qū)塊
賬本[5]是通道中的區(qū)塊鏈和通道中每個節(jié)點維護(hù)的世界狀態(tài)的集合。在Fabric中稱為通道Channel,本文后續(xù)內(nèi)容中用Channel表示,Channel是Fabric中非常重要的概念,一個Channel表示一個賬本。Fabric和其他區(qū)塊鏈平臺最大的區(qū)別是Fabric支持多賬本。每個Fabric應(yīng)用都至少包含一個Channel,因此創(chuàng)建Channel是Fabric中比較重要的步驟。創(chuàng)建通道的命令執(zhí)行完成之后會在相應(yīng)的文件夾下面生成文件Org1MSPanchors.tx和Org2MSPanchors.tx,這些文件是Fabric后續(xù)的部署過程中作為配置參數(shù)所需要的。
4.4? 啟動Orderer 節(jié)點
Orderer節(jié)點的核心功能是排序服務(wù)或共識服務(wù),將交易排序放進(jìn)區(qū)塊的節(jié)點的集合。排序服務(wù)獨立于對等節(jié)點流程之外,并以先到先得的方式為網(wǎng)絡(luò)上所有的通道做交易排序。排序服務(wù)支持可插拔實現(xiàn),目前默認(rèn)實現(xiàn)了Solo和Kafka兩種方式。本實驗由于在單機(jī)環(huán)境下部署區(qū)塊鏈系統(tǒng),因此采用了Solo的排序方式來進(jìn)行。Orderer節(jié)點負(fù)責(zé)交易的打包和區(qū)塊的生成,Orderer節(jié)點的配置信息通常放在環(huán)境變量或者配置文件中,本實驗中的配置信息統(tǒng)一存放在配置文件中。Fabric源碼提供了Orderer啟動所用到的配置文件的實例,將示例配置文件復(fù)制到Orderer的文件夾下面稍加修改即可使用。在配置文件orderer.yaml所在的目錄執(zhí)行如下命令:orderer start啟動orderer節(jié)點。
4.5 啟動peer節(jié)點
Peer模塊是維護(hù)賬本并運(yùn)行智能合約容器來對賬本執(zhí)行讀、寫操作的網(wǎng)絡(luò)實體。Peer節(jié)點由成員擁有和維護(hù)。Peer節(jié)點是Fabric的核心模塊,所有的交易數(shù)據(jù)經(jīng)過Orderer排序打包之后由Peer模塊存儲在區(qū)塊鏈中。所有的Chaincode也是由Peer模塊打包并且激活的。Peer模塊的配置信息同樣由環(huán)境變量和配置文件組成,本例中我們采用配置文件的方式來配置peer節(jié)點的參數(shù)。在設(shè)定配置文件之前需要創(chuàng)建一個文件夾存放Peer模塊的配置文件和區(qū)塊數(shù)據(jù)。在Fabric源碼中同樣提供了Peer模塊配置文件的示例,將示例配置文件復(fù)制到Peer模塊的文件夾下面稍加修改即可使用。創(chuàng)建存儲Peer模塊的配置文件和區(qū)塊數(shù)據(jù)的文件夾,并復(fù)制示例配置文件,接著采用編輯器修改該文。完成編輯后在配置文件core.yaml所在的文件夾中執(zhí)行命令:peer node start啟動peer節(jié)點。
4.6 創(chuàng)建Fabric系統(tǒng)通道
通道是構(gòu)建在Fabric網(wǎng)絡(luò)系統(tǒng)上的私有區(qū)塊鏈,實現(xiàn)了數(shù)據(jù)的隔離和保密。通道內(nèi)特定的賬本在通道中是與所有的對等節(jié)點共享的,并且交易方必須通過該通道的正確性驗證才能與賬本進(jìn)行交互?,F(xiàn)在我們可以創(chuàng)建通道,創(chuàng)建通道的過程一共分為如下三個步驟。第一步,創(chuàng)建通道如圖2所示:
4.7 Chaincode的部署和調(diào)用
在Hyperlegder Fabric系統(tǒng)中,智能合約稱為Chaincode[6] ,中文譯為鏈碼。在Fabric中一個交易的具體邏輯是在Chaincode中運(yùn)行的,智能合約是用戶編寫的一段獨立的可執(zhí)行代碼或應(yīng)用程序,與Fabric自身的模塊程序之間是相互獨立的。Chaincode運(yùn)行在基于Docker的安全容器中,Chaincode在啟動的時候和背書節(jié)點建立gRPC連接,在運(yùn)行過程中通過接口和背書節(jié)點通信。鏈碼是在線下預(yù)先開發(fā)好后再部署到線上的智能合約,部署的時候需要一定的權(quán)限,部署成功就意味著鏈碼的業(yè)務(wù)邏輯是各個關(guān)聯(lián)方都已經(jīng)達(dá)成一致的。Chaincode的實現(xiàn)必須依賴于Peer節(jié)點和Orderer節(jié)點的正確部署。這里采用Fabric源碼附帶的例子chaincode_example02來作為測試Chaincode。Chaincode擁有完整的生命周期,測試Chaincode相關(guān)的測試一共有四個步驟: 第一步,安裝Chaincode;第二步,實例化Chaincode代碼;第三步,通過Chaincode調(diào)用(寫入數(shù)據(jù)),第四步,通過Chaincode查詢數(shù)據(jù)。Fabric智能合約Chaincode的部署和調(diào)用如下圖5所示:
通過對HyperLedger Fabric智能合約Chaincode的安裝、調(diào)用,我們可以查詢到在本超級賬本通道為linjianhongchannel上的所產(chǎn)生的區(qū)塊數(shù)為4個,執(zhí)行invoke的調(diào)用命令后,a向b轉(zhuǎn)移了101,交易完成并進(jìn)行查詢可知,此時a的值為699。經(jīng)過在本實驗的演示,基于HyperLedger Fabric1.06版本的區(qū)塊鏈系統(tǒng)已順利完成部署。
至此,我們對HyperLedger Fabric系統(tǒng)的整體架構(gòu)有了更深入的理解:客戶端peer節(jié)點先將交易提案交給Endorser進(jìn)行背書,通過背書的交易提案會被提交到Orderer節(jié)點排序并生成交易記錄,然后Orderer節(jié)點會把一系列交易打包成區(qū)塊Block提交給Committer,Committer會在交易驗證后將Block寫入?yún)^(qū)塊鏈文件中持久性保存。其次,F(xiàn)abric的多組織和多通道也是這個項目的特色之一,多組織是指交易中有兩個或兩個以上的組織間進(jìn)行時,可以由多方組織進(jìn)行交易背書,這些組織既可以是公司內(nèi)部的不同的部門,也可以是不同的公司。綜上所述,區(qū)塊鏈技術(shù)的重要特征之一就是能夠保證實現(xiàn)安全的交易。HyperLedger Fabric與公有鏈的交易實現(xiàn)上有很大的區(qū)別,如權(quán)限、認(rèn)證、數(shù)據(jù)隔離等優(yōu)點,并克服了比特幣、以太坊等公有鏈項目的缺陷。
5 結(jié)語
本文詳細(xì)介紹了全程手動部署IBM HyperLedger Fabric區(qū)塊鏈系統(tǒng)所需要的關(guān)鍵步驟,主要包括了Fabric開發(fā)運(yùn)行環(huán)境的搭建過程、Fabric核心模塊的編譯、運(yùn)行和配置;同時介紹了Fabric核心概念:賬本通道Channel的創(chuàng)建和使用,最后實現(xiàn)了對Fabric智能合約Chaincode的安裝、實例化以及調(diào)用。文中內(nèi)容通俗易懂、圖文并茂,從零開始將理論知識與手把手操作演示相結(jié)合,通過熟悉文中的實踐案例,有助于使讀者快速掌握區(qū)塊鏈Fabric網(wǎng)絡(luò)系統(tǒng)的組成部分和部署流程,為區(qū)塊鏈應(yīng)用的項目落地開發(fā)奠定堅實的基礎(chǔ)。
參考文獻(xiàn):
[1] SWAN M.Blockchain:blueprint for a new economy[M].USA:0Reilly Media Inc,2015:1-3.
[2] 李寧.第一行代碼-以太坊[M].北京: 水利水電出版社,2018:65-66.
[3] Leader-us,李艷軍,趙鍇.區(qū)塊鏈輕松上手:原理、源碼、搭建與應(yīng)用[M].北京: 電子工業(yè)出版社,2018:78-79.
[4] 李鑫. Hyperledger Fabric 技術(shù)內(nèi)幕:架構(gòu)設(shè)計與實現(xiàn)原理[M].北京: 機(jī)械工業(yè)出版社,2019:25-30.
[5] 蔡亮,李啟雷,梁秀波.區(qū)塊鏈技術(shù)進(jìn)階與實戰(zhàn)[M].北京市:人民郵電出版社,2018:116-118.
[6] 張增駿,董寧,朱軒彤,等.深度探索區(qū)塊鏈:Hyperledger技術(shù)與應(yīng)用[M].北京: 機(jī)械工業(yè)出版社,2018:159-164.
【通聯(lián)編輯:王力】