HyperLedger-fabric V0.6 for CentOS7.2開發環境搭建

BlockChain聯盟鏈中的Hyperledger項目中的Fabrica項目是商業聯盟應用區塊鏈的基石之作,現在來搭建一個運行環境,進行技術驗證。

安裝組件如下:

1.Docker-compose:Docker 容器管理;    
2.Go lang SDK:Go 語言開發、編譯環境;    
3.Git:git 鏡像克隆與提交;    
4.Rest Client: rest API 測試;    
容器主要運行有:MemberSrv 和Peer;

一、HyperLedger Fabric環境資源準備

1、docker的安裝

a)檢查版本

$ uname –r

3.10.0-229.el7.x86_64

b)更新Centos

$ sudo yum update

c)安裝需要軟件

yum install –y  docker git

d)把服務設備成開機啓動並啓動服務

systemctl enable docker.service

systemctl start docker

e)驗證 docker正確安裝(通過運行一個測試鏡像,當容器運行時,它打印一個信息性消息並退出。)

docker run hello-world

image


2、Docker Compose安裝

Compose 定位是 “定義和運行多個 Docker 容器的應用”,可以很方便的從官方拉下來一些鏡像,在此基礎上再進行改造。它允許用戶通過一個單獨的 docker-compose.yml 模板文件(YAML 格式)來定義一組相關聯的應用容器爲一個項目(project),即:你可以通過docker-compose.yml 模板文件來定義你的多個容器之間的網絡連接、端口,容器服務器名稱、服務器中運行的鏡像、服務器的環境配置、啓動命令等,使用的鏡像,可以手動拉取鏡像,也可以自動以docker-compose.yml 構建環境後自動拉取。

a)docker-compose.yml文件說明:

------------------------------------------------------------------------------------------------------------------------------

version: '2'      #使用yml文件版本2

membersrvc:     #定義第一臺虛擬機名稱爲membersrvc

           image: hyperledger/fabric-membersrvc     #指定鏡像來源

             ports:    #暴露端口信息,  使用 宿主:容器 格式,    
                         - "7054:7054"    
      command: membersrvc    #覆蓋容器啓動後默認執行的命令 

vp0:     #定義第二臺虛擬機名稱爲vp0    
      image: hyperledger/fabric-peer    
      ports:    
    - "7050:7050"   #REST 服務端口    
    - "7051:7051"   #peer gRPC 服務監聽端口    
    - "7053:7053"   #:peer 事件服務端口    
environment:     #設置環境變量 
    - CORE_PEER_ADDRESSAUTODETECT=true    
    - CORE_VM_ENDPOINT=unix:///var/run/docker.sock    
    - CORE_LOGGING_LEVEL=DEBUG    
    - CORE_PEER_ID=vp0    
    - CORE_PEER_PKI_ECA_PADDR=membersrvc:7054    
    - CORE_PEER_PKI_TCA_PADDR=membersrvc:7054    
    - CORE_PEER_PKI_TLSCA_PADDR=membersrvc:7054

    - CORE_PEER_VALIDATOR_CONSENSUS_PLUGIN=noops     # 定義了一致性機制使用noops    
    - CORE_SECURITY_ENABLED=true        #啓用安全模式    
    - CORE_SECURITY_ENROLLID=test_vp0    
    - CORE_SECURITY_ENROLLSECRET=MwYpmSRjupbT    
volumes:     #數據卷所掛載路徑設置。可以設置宿主機路徑( HOST:CONTAINER ),該指令中路徑支持相對路徑    
      - /var/run/:/var/run/    
links:    #鏈接到其它服務中的容器 
      - membersrvc

  command:     #覆蓋容器啓動後默認執行的命令

               sh -c "sleep 5; peer node start --peer-chaincodedev"

------------------------------------------------------------------------------------------------------------------------------

b).安裝容器Compose(使用官方提供的方法,安裝1.10.1版本):

curl -L https://github.com/docker/compose/releases/download/1.10.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose

docker-compose version

 

二、部署fabric noops模式單結點開發環境

1、手動部署

mkdir /opt/fabric

cd /opt/fabric/

docker pull yeasy/hyperledger-fabric:0.6-dp    #拉取鏡像  
docker tag yeasy/hyperledger-fabric:0.6-dp hyperledger/fabric-peer:latest   #給鏡像加標記  
docker tag yeasy/hyperledger-fabric:0.6-dp hyperledger/fabric-baseimage:latest  
docker tag yeasy/hyperledger-fabric:0.6-dp hyperledger/fabric-membersrvc:latest

docker run --name=vp0 \  
--restart=unless-stopped \  
-it \  
-p 7050:7050 \  
-p 7051:7051 \  
-v /var/run/docker.sock:/var/run/docker.sock \  
-e CORE_PEER_ID=vp0 \  
-e CORE_PEER_ADDRESSAUTODETECT=true \  
-e CORE_NOOPS_BLOCK_WAIT=10 \  
hyperledger/fabric-peer:latest peer node start

image

ok!一個簡單的單結點peer部署完成(CTRL+Z退出,程序仍然在運行)。

2、可以做些常用操作:

docker ps  #查看已經運行的容器

docker-compose logs -f vp0      #查看vp0的日誌

docker-compose exec vp0 bash       #進入到vp0執行它的bash,exit命令可以退出。

 

三、運行與發佈Chaincode

進入vp0的bash,運行如下命令

docker-compose exec vp0 bash

peer chaincode deploy -p github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02 -c '{"Function":"init", "Args": ["a","100", "b", "200"]}'

(參數註釋 -p:指定chaincode源碼路徑;-c:要執行的JSON格式shaincode代碼)

如下圖紅框中返回了chaincode的名稱hash值,就表示區域鏈已經建立成功了!下面可以通過CLI或POST方式進行測試與驗證。

image

 

----------------------------------------------------------手動編譯代碼參考 --------------------------------------------------------------------

a)編譯代碼

cd $GOPATH/src/github.com/hyperledger/fabric/examples/chaincode/go

cp chaincode_example02/chaincode_example02.go $GOPATH/src/    #複製目錄裏面的例2到$GOPATH/src/ 進行編譯

cd $GOPATH/src/

go build ./chaincode_example02.go     #編譯成功會在GOPATH/src目錄生成chaincode_example02文件

(chaincode_example02.go 源碼鏈接https://raw.githubusercontent.com/hyperledger/fabric/master/examples/chaincode/go/chaincode_example02/chaincode_example02.go

image

b)發佈chaincode在GOPATH/src 下運行

CORE_CHAINCODE_ID_NAME=mycc CORE_PEER_ADDRESS=0.0.0.0:7051 ./chaincode_example02

image

直至出現“Received REGISTERED”字樣,代表成功。

使用exit命令或Ctrl+z退出終端。

----------------------------------------------------------手動編譯代碼--------------------------------------------------------------------

 

四、Fabric開發環境測試及驗證

4、firefox中安裝POST接口測試工具:

1)、在firefox的附加組件中下載Restclient插件安裝

image

重啓firefox後,打開RESTClient,進行POST測試

image

 

2)、系統環境測試:deploy(部署),invoke(調用),query(查詢) chaincode(智能合約)(vp0中peer的用戶名和密碼在 membersrvc.yaml 文件裏爲jim: 6avZQLwcUe9b),在非安全模式下“CORE_SECURITY_ENABLED=true CORE_SECURITY_PRIVACY=true ”在CLI模式下不需要加

已經建成的環境架構,目前Farbric Peer只有一個vp0

image

a)進入vp0容器

docker-compose exec vp0 bash

b)login

CLI方式

peer network login jim

輸入密碼:6avZQLwcUe9b

Rest方式(在Body中放入如下代碼):

{  
"enrollId": "jim",  
"enrollSecret": "6avZQLwcUe9b"  
}

image

返回用戶已登錄。

c)deploy(部署)

CLI方式

CORE_SECURITY_ENABLED=true CORE_SECURITY_PRIVACY=true peer chaincode deploy -u jim -n mycc -c '{"Args": ["init", "a","100", "b", "200"]}'

image

Rest方式(POST HOST:7050/chaincode,在Body中放入如下代碼):

{  
"jsonrpc": "2.0",  
"method": "deploy",  
"params": {  
"type": 1,  
"chaincodeID":{  
"path":"github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02"  
},  
"ctorMsg": {  
"function":"init",  
"args":["a", "1000", "b", "2000"]  
},  
"secureContext": "jim"  
},  
"id": 1  
}

 

d)Invoke(調用)

CLI方式

CORE_SECURITY_ENABLED=true CORE_SECURITY_PRIVACY=true peer chaincode invoke -u jim -l golang -n mycc -c '{"Args": ["invoke", "a", "b", "10"]}'

image

Rest方式(POST HOST:7050/chaincode,在Body中放入如下代碼):

{  
"jsonrpc": "2.0",  
"method": "invoke",  
"params": {  
"type": 1,  
"chaincodeID":{  
"name":"980d4bb7f69578592e5775a6da86d81a221887817d7164d3e9d4d4df1c981440abf9a61417eaf8ad6f7fc79893da36de2cf4709131e9af39bca6ebc2e5a1cd9d" },   #980d4bb7f69…cd9來自chaincode的名稱hash值  
"ctorMsg": {  
"function":"invoke",  
"args":["a", "b", "100"]  
},  
"secureContext": "jim"  
},  
"id": 3  
}

 

e)query(查詢)

CLI方式

CORE_SECURITY_ENABLED=true CORE_SECURITY_PRIVACY=true peer chaincode query -u jim -l golang -n mycc -c '{"Function": "query", "Args": ["b"]}'

Rest方式(POST HOST:7050/chaincode,在Body中放入如下代碼):

{  
"jsonrpc": "2.0",  
"method": "query",  
"params": {  
"type": 1,  
"chaincodeID":{  
"name":"980d4bb7f69578592e5775a6da86d81a221887817d7164d3e9d4d4df1c981440abf9a61417eaf8ad6f7fc79893da36de2cf4709131e9af39bca6ebc2e5a1cd9d" }, "ctorMsg": {  
"function":"query",  
"args":["a"]  
},  
"secureContext": "jim"  
},  
"id": 5  
}

 

f)區域信息查詢

Rest方式(GET HOST:7050/chain/blocks/1):

HOST:7050/chain/blocks/0  是創世區塊

HOST:7050/chain/blocks/1  第一個區塊,是depoy部署時建立的

HOST:7050/chain/blocks/2  第二個區塊,是invoke調用交易時建立的

query查詢命令不會創建新的區塊。

 

五、部署PBFT 模式Fabric開發環境

在FabricV0.6版本架構中(如下圖中),共識算法包括 noops、pbft 兩類,使用Noops模式,因其默認沒有采用 consensus 機制,1 個節點即可,可以用來進行快速測試或開發。而PBFT 是經典的分佈式一致性算法,也是 hyperledger 目前最推薦的算法,該算法至少需要 4個節點。

0.6deploy.png


 

a)停止並刪除原來的容器及鏡像

docker  stop

docker rm -f $(docker ps -aq)    #強制刪除全部容器

docker rmi -f $(docker images -q)  #強制刪除全部鏡像

 

b)下載 鏡像 文件

cd /opt/fabric/

docker pull yeasy/blockchain-explorer:latest

docker pull yeasy/hyperledger:latest

docker tag yeasy/hyperledger:latest hyperledger/fabric-baseimage:latest

docker pull yeasy/hyperledger-peer:latest

docker pull yeasy/hyperledger-membersrvc:latest

 

b)下載 compose 文件

git clone https://github.com/yeasy/docker-compose-files

cd /opt/fabric/docker-compose-files/hyperledger/0.6/pbft/

docker-compose -f 4-peers-with-membersrvc-explorer.yml up

因爲4-peers-with-membersrvc-explorer.yml 中啓用了權限管理,所以進入Chaincode需要登錄,例如以內置賬戶 jim 賬戶登錄。

 

c)登陸用戶,

docker exec -it pbft_vp0_1 bash

peer network login jim

登陸密碼:6avZQLwcUe9b

登錄之後,chaincode 的部署、調用等操作與之前類似,只是需要通過 -u 選項來指定用戶名。

例如chaincode 部署(在 vp0 上執行命令):

peer chaincode deploy -u jim -p github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02 -c '{"Function":"init", "Args": ["a","100", "b", "200"]}'

 

 

附:4-peers-with-membersrvc-explorer.yml、explorer.yml、membersrvc.yml、peer.yml內容

4-peers-with-membersrvc-explorer.yml內容如下:

------------------------------------------------------------------------------------------------------------------------------

# This compose file will start 4 hyperledger peer nodes + 1 CA node.

# We add a delay to start the VP nodes after CA node:

# command: sh -c "sleep 5; peer node start"

#

# vp0: validating node as root

# vp1: validating node as peer

# vp2: validating node as peer

# vp3: validating node as peer

# https://github.com/yeasy/docker-compose-files

version: '2'

 

services:

# blockchain-explorer  這個瀏覽器可以圖形化的驗證Fabric的工作環境

explorer:

extends:

file: explorer.yml   #基於其它模板文件進行擴展

service: explorer

hostname: explorer

environment:

- HYP_REST_ENDPOINT=http://vp0:7050

ports:

- "9090:9090"

 

membersrvc0:

extends:

file: membersrvc.yml   #基於其它模板文件進行擴展

service: membersrvc

hostname: membersrvc

environment:

- CORE_LOGGING_SERVER=debug

ports:

- "7054:7054"

command: membersrvc # this repeats the default cmd to make sure

# vp0 will be used for client interactive operations

# If you want to run fabric command on the host, then map 7051:7051 to host

# port, or use like `CORE_PEER_ADDRESS=172.17.0.2:7051` to specify peer addr.

 

vp0: # validating node as the root

extends:

file: peer.yml    #基於其它模板文件進行擴展

service: vp_sec

hostname: vp0

environment:

- CORE_PEER_ID=vp0

- CORE_SECURITY_ENROLLID=test_vp0

- CORE_SECURITY_ENROLLSECRET=MwYpmSRjupbT

ports:

- "7050:7050"

- "7051:7051"

links:

- membersrvc0

command: sh -c "sleep 10; peer node start"

 

vp1:

extends:

file: peer.yml   #基於其它模板文件進行擴展

service: vp_sec

hostname: vp1

environment:

- CORE_PEER_ID=vp1

- CORE_PEER_DISCOVERY_ROOTNODE=vp0:7051

- CORE_SECURITY_ENROLLID=test_vp1

- CORE_SECURITY_ENROLLSECRET=5wgHK9qqYaPy

links:

- vp0

- membersrvc0

command: sh -c "sleep 10; peer node start"

 

vp2:

extends:

file: peer.yml    #基於其它模板文件進行擴展

service: vp_sec

hostname: vp2

environment:

- CORE_PEER_ID=vp2

- CORE_PEER_DISCOVERY_ROOTNODE=vp0:7051

- CORE_SECURITY_ENROLLID=test_vp2

- CORE_SECURITY_ENROLLSECRET=vQelbRvja7cJ

links:

- vp0

- membersrvc0

command: sh -c "sleep 10; peer node start"

 

vp3:

extends:

file: peer.yml    #基於其它模板文件進行擴展

service: vp_sec

hostname: vp3

environment:

- CORE_PEER_ID=vp3

- CORE_PEER_DISCOVERY_ROOTNODE=vp0:7051

- CORE_SECURITY_ENROLLID=test_vp3

- CORE_SECURITY_ENROLLSECRET=9LKqKH5peurL

links:

- vp0

- membersrvc0

command: sh -c "sleep 10; peer node start"

#networks:

# default:

# external:

# name: fabric_pbft

------------------------------------------------------------------------------------------------------------------------------

explorer.yml

------------------------------------------------------------------------------------------------------------------------------

# This is the default base file for blockchain-explorer

# https://github.com/yeasy/docker-compose-files

# Depends on the yeasy/blockchain-explorer image.

version: '2'

services:

explorer:

image: yeasy/blockchain-explorer:latest

restart: unless-stopped

expose:

- "9090"

------------------------------------------------------------------------------------------------------------------------------

  membersrvc.yml

------------------------------------------------------------------------------------------------------------------------------

# This is the default base file to for fabric membersrvc

# https://github.com/yeasy/docker-compose-files/

# Depends on the hyperledger/fabric-membersrvc image.

version: '2'

services:

membersrvc:

image: hyperledger/fabric-membersrvc:latest

#image: yeasy/hyperledger-fabric-membersrvc:0.6-dp

#image: hyperledger/fabric-membersrvc:x86_64-0.6.1-preview

#image: ibmblockchain/fabric-membersrvc:x86_64-0.6.1-preview

restart: unless-stopped

expose:

- "7054"

volumes: # docker.sock is mapped as the default CORE_VM_ENDPOINT

- /var/run/docker.sock:/var/run/docker.sock

command: membersrvc # this repeats the default cmd to make sure

------------------------------------------------------------------------------------------------------------------------------

  peer.yml

------------------------------------------------------------------------------------------------------------------------------

# This is the default base file to config env and command

# Notice that chaincode is executed inside docker in default net mode

# https://github.com/yeasy/docker-compose-files

# Depends on the hyperledger/fabric-peer image.

# This utilized the pbft as consensus

# See https://github.com/hyperledger/fabric/blob/master/docs/dev-setup/devnet-setup.md#using-consensus-plugin for more details.

version: '2'

services:

vp: # vp node no needing membersrvc

image: hyperledger/fabric-peer:latest

#image: yeasy/hyperledger-fabric-peer:0.6-dp

#image: hyperledger/fabric-peer:x86_64-0.6.1-preview

#image: ibmblockchain/fabric-peer:x86_64-0.6.1-preview

restart: unless-stopped

environment:

- CORE_PEER_ADDRESSAUTODETECT=true

- CORE_PEER_NETWORKID=dev

- CORE_LOGGING_LEVEL=info #critical, error, warning, notice, info, debug

#- CORE_VM_DOCKER_HOSTCONFIG_NETWORKMODE=fabric_pbft # uncomment this to use specific network

# The following section enables pbft consensus

- CORE_PEER_VALIDATOR_CONSENSUS_PLUGIN=pbft # noops, pbft

- CORE_PBFT_GENERAL_MODE=batch # batch. classic and sieve will be not supported again.

- CORE_PBFT_GENERAL_N=4

- CORE_PBFT_GENERAL_BATCHSIZE=2 # only useful when in batch mode

- CORE_PBFT_GENERAL_TIMEOUT_REQUEST=2s

expose:

- "7050" # Rest

- "7051" # Grpc

- "7052" # Peer CLI

- "7053" # Peer Event

- "7054" # eCAP

- "7055" # eCAA

- "7056" # tCAP

- "7057" # eCAA

- "7058" # tlsCAP

- "7059" # tlsCAA

volumes: # docker.sock is mapped as the default CORE_VM_ENDPOINT

- /var/run/docker.sock:/var/run/docker.sock

command: peer node start # this repeats the default cmd to make sure

# command: sh -c "sleep 5; peer node start" # peer node should have booting delay with CA

vp_sec: # vp node needing membersrvc suppot

extends:

service: vp

environment:

- CORE_SECURITY_ENABLED=true

- CORE_PEER_PKI_ECA_PADDR=membersrvc0:7054

- CORE_PEER_PKI_TCA_PADDR=membersrvc0:7054

- CORE_PEER_PKI_TLSCA_PADDR=membersrvc0:7054

------------------------------------------------------------------------------------------------------------------------------

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章