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


手動部署單機單節點

(我的博客即將入駐“雲棲社區”,誠邀技術同仁一同入駐。)

之前發布過官方的e2e部署方案,由於環境或是訪問權限等各種問題,還是有相當一部分碼友無法成功跑起來,故此,本章將來一次純手動操作的部署。

主要需要的步驟如下:

  1:環境整理

  2:環境部署

  3:源碼安裝

  4:生成證書文件

  5:orderer節點處理

  6:peer節點處理

  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快錢。

 

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM