HyperLedger Fabric 1.1 手動部署單機單節點

手動部署單機單節點html

(個人博客即將入駐「雲棲社區」,誠邀技術同仁一同入駐。)java

以前發佈過官方的e2e部署方案,因爲環境或是訪問權限等各類問題,仍是有至關一部分碼友沒法成功跑起來,故此,本章未來一次純手動操做的部署。node

主要須要的步驟以下:linux

  1:環境整理git

  2:環境部署github

  3:源碼安裝web

  4:生成證書文件docker

  5:orderer節點處理api

  6:peer節點處理tomcat

  7:channel建立加盟

  8:chaincode安裝部署實例化、測試

本次再也不分章,一章寫完。

 

環境整理

這一步並不是必須,但鑑於docker容器的實際狀況,理論上linux內核須要在3.10及以上。有朋友在3.10上跑經過,具體是什麼內核版本沒詳細去確認,爲了順利起見,請首先升級linux內核到4.x,按照CentOS 7. × 系統及內核升級指南最終經過以下命令來查詢版本信息:

uname -a

結果應以下圖所示:

 

除了上述操做外,相關依賴包若無強制性要求,可所有升級到最新版,執行以下命令:

yum upgrade

 

環境部署

Hyperledger Fabric 1.0 從零開始(二)——環境構建(公網)Hyperledger Fabric 1.0 從零開始(三)——環境構建(內網/準離線)兩篇文章中,我的感受已經寫的很詳盡了,這裏就再也不贅述,最後給一個我新搭建的環境截圖,在寫這篇文章的時候,docker和go都有了版本升級,因此我都應用的最新版本,實際版本圖以下:

 

源碼安裝

截止今日Fabric已經發布了1.1release版,因爲時間問題,本來打算整理的版本升級list會延後發佈。這裏爲了順應需求,也就拿1.1的版原本作部署,具體下載地址hyperledger/fabric v1.1.0

請自行經過上述地址download最新版本到本地,或按照Hyperledger Fabric 1.0 從零開始(四)——Fabric源碼及鏡像文件處理中的方案進行安裝也同樣。

源碼下載到本地後,上傳至/home或/data或其它數據存儲(看着順眼)的目錄中,稍後補圖看結果。

這裏說明下,fabric的安裝目錄並不是必定要在哪哪哪,但在yaml中的工做路徑和映射路徑必定不能寫錯,不然會致使fabric中shim的api各類調用失敗(緣由以下圖),因此仍是按照官方的習慣部署會穩當點。

根據上述,我選擇/home做爲根目錄,因此個人fabric會安裝在/home/docker/github.com/hyperledger/fabric這個路徑下,這個路徑中的docker目錄能夠無視,看上圖並記住「github.com/hyperledger/fabric」這個纔是關鍵,對於新手來講不要動了,老鳥隨意。

最終個人目錄結構圖以下:

大家會發現這裏多了一個aberic的目錄,這是我本身新建的項目目錄,有javaweb開發經驗的朋友應該能明白如何在tomcat的webapp中部署本身的項目,其實也相似,方便我本身管理和維護。

 

生成證書文件

這一步以前的文章也發過,Hyperledger Fabric 1.0 從零開始(五)——運行測試e2e,但總仍是有碼友看的不仔細或把這一整章給略過了,羣裏不時還會有碼友問這些操做。

爲了確保完整性,這裏就再次重複一遍操做,在上述連接章節中提到了三種獲取生成證書文件必備的二進制文件方案,咱們使用官網提供的離線下載網址,找到咱們本章計劃操做的1.1的版本信息,能夠獲得最終的離線下載文件地址,下載該文件到本地。

根據官網的介紹,解壓後會獲得一個bin文件夾,將其解壓至/home/docker/github.com/hyperledger/fabric/aberic目錄下。

接下來,咱們繼續參考Hyperledger Fabric 1.0 從零開始(八)——Fabric多節點集羣生產部署中寫到的方案來生成必須的證書文件。

這裏說下,在本章操做中使用的configtx.yaml是用的1.0版本的,雖然咱們是在1.1的環境中進行部署,相對而言,我的感受1.1的e2e demo把入門門檻進一步拉高了,致使不少人運行起來很費勁,始終沒法跑通。與之配套的crypto-config.yaml也採用1.0版本提供的demo。相關文件自行點入下載或copy。

運行二進制文件須要在命令行中指定路徑,故此個人路徑安排以下圖所示:

接下來咱們就能夠開始生成所需證書文件了,咱們執行相關命令須要指定執行文件的路徑,故此,爲了方便,直接進入aberic項目目錄下進行操做,隨後執行以下命令生成咱們項目所需文件:

./bin/cryptogen generate --config=./crypto-config.yaml

效果示圖以下:

可能各位在執行過程當中會報一些沒有權限的異常,這些我在Hyperledger Fabric 1.0 從零開始(八)——Fabric多節點集羣生產部署已經提到過了,就不贅述了。

上述命令生成的證書文件在/home/docker/github.com/hyperledger/fabric/aberic/crypto-config目錄下,也就是說會自動建立一個crypto-config文件夾,示圖以下:

接下來,要根據configtx.yaml來生成創世區塊,具體命令及綜合截圖效果以下:

./bin/configtxgen -profile TwoOrgsOrdererGenesis -outputBlock ./channel-artifacts/genesis.block

如上圖所示,出現了一個小問題,提示沒有該文件或文件夾,channel-artifacts是一個文件夾,故此,咱們在/home/docker/github.com/hyperledger/fabric/aberic目錄下手動建立一個channel-artifacts文件夾,隨後再次運行上述命令,,具體命令及綜合截圖效果以下:

最終會在/home/docker/github.com/hyperledger/fabric/aberic/channel-artifacts目錄下建立出咱們指定名稱的創世區塊,ftp結果視圖以下:

創世區塊是爲了orderer啓動時用到的,peer在啓動後須要建立的channel配置文件在這裏也一併生成,執行具體命令和綜合結果示圖以下:

./bin/configtxgen -profile TwoOrgsChannel -outputCreateChannelTx ./channel-artifacts/mychannel.tx -channelID mychannel

該命令是生成了一個channelID爲mychannel的tx文件(文件名稱看各位心情來取),經過該文件,peer能夠執行channel的建立工做,後面會提到。

 

orderer節點處理

單機多節點部署,至少本章採用的共識模式的solo,而非kafka,若是開始考慮kafka作集羣的話,相信本章的內容已經再也不適合你了,本章偏基礎。

首先須要編寫一份docker-orderer.yaml文件,源碼以下:

 1 version: '2'
 2 
 3 services:
 4 
 5   orderer.example.com:
 6     container_name: orderer.example.com
 7     image: hyperledger/fabric-orderer
 8     environment:
 9       - CORE_VM_DOCKER_HOSTCONFIG_NETWORKMODE=aberic_default
10       # - ORDERER_GENERAL_LOGLEVEL=error
11       - ORDERER_GENERAL_LOGLEVEL=debug
12       - ORDERER_GENERAL_LISTENADDRESS=0.0.0.0
13       - ORDERER_GENERAL_LISTENPORT=7050
14       #- ORDERER_GENERAL_GENESISPROFILE=AntiMothOrdererGenesis
15       - ORDERER_GENERAL_GENESISMETHOD=file
16       - ORDERER_GENERAL_GENESISFILE=/var/hyperledger/orderer/orderer.genesis.block
17       - ORDERER_GENERAL_LOCALMSPID=OrdererMSP
18       - ORDERER_GENERAL_LOCALMSPDIR=/var/hyperledger/orderer/msp
19       #- ORDERER_GENERAL_LEDGERTYPE=ram
20       #- ORDERER_GENERAL_LEDGERTYPE=file
21       # enabled TLS
22       - ORDERER_GENERAL_TLS_ENABLED=false
23       - ORDERER_GENERAL_TLS_PRIVATEKEY=/var/hyperledger/orderer/tls/server.key
24       - ORDERER_GENERAL_TLS_CERTIFICATE=/var/hyperledger/orderer/tls/server.crt
25       - ORDERER_GENERAL_TLS_ROOTCAS=[/var/hyperledger/orderer/tls/ca.crt]
26     working_dir: /opt/gopath/src/github.com/hyperledger/fabric
27     command: orderer
28     volumes:
29     - ./channel-artifacts/genesis.block:/var/hyperledger/orderer/orderer.genesis.block
30     - ./crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/msp:/var/hyperledger/orderer/msp
31     - ./crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/tls/:/var/hyperledger/orderer/tls
32     networks:
33       default:
34         aliases:
35           - aberic
36     ports:
37       - 7050:7050

 

 

peer節點處理

有了orderer啓動文件,咱們還須要docker-peer.yaml啓動文件,orderer和peer的啓動yaml文件名稱隨意看心情,源碼以下:

 1 version: '2'
 2 
 3 services:
 4 
 5   couchdb:
 6     container_name: couchdb
 7     image: hyperledger/fabric-couchdb
 8     # Comment/Uncomment the port mapping if you want to hide/expose the CouchDB service,
 9     # for example map it to utilize Fauxton User Interface in dev environments.
10     ports:
11       - "5984:5984"
12 
13   ca:
14     container_name: ca
15     image: hyperledger/fabric-ca
16     environment:
17       - FABRIC_CA_HOME=/etc/hyperledger/fabric-ca-server
18       - FABRIC_CA_SERVER_CA_NAME=ca
19       - FABRIC_CA_SERVER_TLS_ENABLED=false
20       - FABRIC_CA_SERVER_TLS_CERTFILE=/etc/hyperledger/fabric-ca-server-config/ca.org1.example.com-cert.pem
21       - FABRIC_CA_SERVER_TLS_KEYFILE=/etc/hyperledger/fabric-ca-server-config/95e05e630b6fd2f16b6367823c3a1295cc86e96431dd87b1376bea1d6120eb90_sk
22     ports:
23       - "7054:7054"
24     command: sh -c 'fabric-ca-server start --ca.certfile /etc/hyperledger/fabric-ca-server-config/ca.org1.example.com-cert.pem --ca.keyfile /etc/hyperledger/fabric-ca-server-config/95e05e630b6fd2f16b6367823c3a1295cc86e96431dd87b1376bea1d6120eb90_sk -b admin:adminpw -d'
25     volumes:
26       - ./crypto-config/peerOrganizations/org1.example.com/ca/:/etc/hyperledger/fabric-ca-server-config
27 
28   peer0.org1.example.com:
29     container_name: peer0.org1.example.com
30     image: hyperledger/fabric-peer
31     environment:
32       - CORE_LEDGER_STATE_STATEDATABASE=CouchDB
33       - CORE_LEDGER_STATE_COUCHDBCONFIG_COUCHDBADDRESS=couchdb:5984
34 
35       - CORE_PEER_ID=peer0.org1.example.com
36       - CORE_PEER_NETWORKID=aberic
37       - CORE_PEER_ADDRESS=peer0.org1.example.com:7051
38       - CORE_PEER_CHAINCODELISTENADDRESS=peer0.org1.example.com:7052
39       - CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer0.org1.example.com:7051
40       - CORE_PEER_LOCALMSPID=Org1MSP
41 
42       - CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock
43       # the following setting starts chaincode containers on the same
44       # bridge network as the peers
45       # https://docs.docker.com/compose/networking/
46       - CORE_VM_DOCKER_HOSTCONFIG_NETWORKMODE=aberic
47       # - CORE_LOGGING_LEVEL=ERROR
48       - CORE_LOGGING_LEVEL=DEBUG
49       - CORE_VM_DOCKER_HOSTCONFIG_NETWORKMODE=aberic_default
50       - CORE_PEER_GOSSIP_SKIPHANDSHAKE=true
51       - CORE_PEER_GOSSIP_USELEADERELECTION=true
52       - CORE_PEER_GOSSIP_ORGLEADER=false
53       - CORE_PEER_PROFILE_ENABLED=false
54       - CORE_PEER_TLS_ENABLED=false
55       - CORE_PEER_TLS_CERT_FILE=/etc/hyperledger/fabric/tls/server.crt
56       - CORE_PEER_TLS_KEY_FILE=/etc/hyperledger/fabric/tls/server.key
57       - CORE_PEER_TLS_ROOTCERT_FILE=/etc/hyperledger/fabric/tls/ca.crt
58     volumes:
59         - /var/run/:/host/var/run/
60         - ./crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/msp:/etc/hyperledger/fabric/msp
61         - ./crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls:/etc/hyperledger/fabric/tls
62     working_dir: /opt/gopath/src/github.com/hyperledger/fabric/peer
63     command: peer node start
64     ports:
65       - 7051:7051
66       - 7052:7052
67       - 7053:7053
68     depends_on:
69       - couchdb
70     networks:
71       default:
72         aliases:
73           - aberic
74 
75   cli:
76     container_name: cli
77     image: hyperledger/fabric-tools
78     tty: true
79     environment:
80       - GOPATH=/opt/gopath
81       - CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock
82       # - CORE_LOGGING_LEVEL=ERROR
83       - CORE_LOGGING_LEVEL=DEBUG
84       - CORE_PEER_ID=cli
85       - CORE_PEER_ADDRESS=peer0.org1.example.com:7051
86       - CORE_PEER_LOCALMSPID=Org1MSP
87       - CORE_PEER_TLS_ENABLED=false
88       - CORE_PEER_TLS_CERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/server.crt
89       - CORE_PEER_TLS_KEY_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/server.key
90       - CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt
91       - CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp
92     working_dir: /opt/gopath/src/github.com/hyperledger/fabric/peer
93     volumes:
94         - /var/run/:/host/var/run/
95         - ./chaincode/go/:/opt/gopath/src/github.com/hyperledger/fabric/aberic/chaincode/go
96         - ./crypto-config:/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/
97         - ./channel-artifacts:/opt/gopath/src/github.com/hyperledger/fabric/peer/channel-artifacts
98     depends_on:
99       - peer0.org1.example.com

peer的這份啓動文件是目前所寫的最全文件,裏面有cli客戶端、couchdb插件以及ca插件。

有幾個地方須要注意修改下,首先是ca部分有兩處,一處是FABRIC_CA_SERVER_TLS_KEYFILE,另外一處是command中最後一部分,這兩處的_sk文件名稱須要替換成以前生成的證書文件名稱,其實這裏的主要目的是加載ca並生成ca用戶。

這個peer啓動文件啓動的是peer0.org1.example.com節點,因此對應的ca證書文件在peer0.org1.example.com下能夠找到,具體路徑是/home/docker/github.com/hyperledger/fabric/aberic/crypto-config/peerOrganizations/org1.example.com/ca

目標視圖以下:

最後將docker-peer.yaml中兩處的d8785a9dbc94f677d3e1e6aeb3a6222ee6579fe751204ac1b70094e1d3f0fe06_sk替換成95e05e630b6fd2f16b6367823c3a1295cc86e96431dd87b1376bea1d6120eb90_sk便可。

切記這裏的替換是替換各位本身生成的,我在這只是一個demo說明,以避免到時沒法跑通!!!

在cli客戶端配置中咱們指定了智能合約的部署路徑,故此,咱們在aberic目錄下建立與之對應的chaincode文件夾,並在該文件夾下建立go文件夾,表示合約目錄下以go語言爲基礎的合約目錄。

最終效果截圖以下:

如上圖,我把官方demo中的chaincode_example02示例也一併上傳到go目錄下,稍後會以該合約爲基礎進行測試。

接下來將編寫好的docker-orderer.yaml和docker-peer.yaml文件上傳至aberic目錄下,最終結果示圖以下:

運行以下命令啓動orderer和peer,按照順序應該先啓動排序服務,命令及綜合視圖以下:

docker-compose -f docker-orderer.yaml up -d
docker-compose -f docker-peer.yaml up -d

上圖有點問題,多是ssh的問題,致使peer啓動的命令被後續命令覆蓋。

固然,運行到此步可能有碼友提示須要啓動鏡像,這個我就不贅述了,直接參考Hyperledger Fabric 1.0 從零開始(四)——Fabric源碼及鏡像文件處理,所需鏡像截圖以下:

在啓動完成後,咱們執行以下命令查看容器是否都已啓動,具體結果視圖以下:

能夠看到全部的容器都已經成功啓動,接下來就是channel和chaincode的操做了。

 

channel建立加盟

對peer的操做基本都須要依賴客戶端完成,這裏咱們沒有用sdk,但安裝了tools鏡像,即cli客戶端,能夠經過以下命令進入客戶端進行channel的相關操做:

docker exec -it cli bash

隨後執行以下命令建立一個channel:

peer channel create -o orderer.example.com:7050 -c mychannel -t 50 -f ./channel-artifacts/mychannel.tx

請注意,這個channel的建立並不是隨意,而是以前建立過一個mychannel.tx文件,在建立該文件的時候就已經指定了channelID是mychannel,這裏不能隨意看心情了。

隨後執行ls便可查看已經建立的mychannel.block文件。

最終執行效果視圖以下:

建立完channel後,咱們須要經過mychannel.block文件來加入該channel,以便後續能夠安裝實例化並測試智能合約。

具體命令和視圖結果以下:

peer channel join -b mychannel.block

 至此,咱們已經完成了channel的建立併成功加入了該channel。

 

chaincode安裝部署實例化、測試

在以前咱們上傳了官方的chaincode demo到go目錄下,合約目錄爲/home/docker/github.com/hyperledger/fabric/aberic/chaincode/go/chaincode_example02,這個目錄也是咱們即將安裝的智能合約路徑。

首先安裝智能合約,具體命令和執行結果以下所示:

peer chaincode install -n mychannel -p github.com/hyperledger/fabric/aberic/chaincode/go/chaincode_example02 -v 1.0

 安裝完成後須要進行實例化chaincode,執行以下命令並有以下視圖:

peer chaincode instantiate -o orderer.example.com:7050 -C mychannel -n mychannel -c '{"Args":["init","A","10","B","10"]}' -P "OR ('Org1MSP.member')" -v 1.0

上圖有些問題,但最終執行是成功的。

咱們看合約提供的方法中有個query方法,須要傳入一個參數,咱們執行一次查詢看看實例化時候的結果是否傳入,以下命令和視圖:

peer chaincode query -C mychannel -n mychannel -c '{"Args":["query","A"]}'

咱們查到A有10快錢,符合初始化init時候的傳參,繼續執行以下命令查詢B的,視圖也以下:

peer chaincode query -C mychannel -n mychannel -c '{"Args":["query","B"]}'

能夠看到B也有10快錢。

咱們根據合約內容,讓A給B轉5快錢,執行以下命令並附視圖(包括最終再次查詢A和B資金的結果):

peer chaincode invoke -C mychannel -n mychannel -c '{"Args":["invoke", "A", "B", "5"]}'

咱們能夠看到合約已經運行無誤,A成功給B轉讓了5快錢。

 

至此,先暫時告一段落,多節點部署也是在這個基礎上進行的,因爲章節太長,下次開接續部分的章節來完善這一塊內容,且時間確實比較忙,若是能把這個跑通,後面再部署新節點就確定能跑通了,最終開一個新節點的視圖以下:

相關文章
相關標籤/搜索