Hyperledger fabric 2.2.0 環境搭建


基礎環境搭建

### docker 安裝
如果服務器上有舊版的docker,需要先執行卸載操作。
$ sudo yum remove docker \ 
                               docker-common \ 
                               docker-selinux \ 
                               docker-engine
                               
隨后開始安裝docker-ce
 1 $ sudo yum install -y yum-utils device-mapper-persistent-data lvm2
 2 
 3 $ sudo yum-config-manager \
 4     --add-repo \
 5 https://download.docker.com/linux/centos/docker-ce.repo
 6 
 7 $ sudo yum-config-manager --enable docker-ce-edge
 8 
 9 $ sudo yum-config-manager --enable docker-ce-test
10 
11 $ sudo yum-config-manager --disable docker-ce-edge
12 
13 $ sudo yum makecache fast
14 
15 $ sudo yum install docker-ce

執行查詢docker版本號,看是否安裝成功
docker --version

docker啟動
service docker start

docker開機自啟(視具體情況使用)
chkconfig docker on

### docker-compose 安裝
需要服務器支持 curl 功能,如果服務器不支持 curl 功能,需要手動進行安裝
yum install curl

執行如下操作下載docker-compose
sudo curl -L "https://github.com/docker/compose/releases/download/1.26.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

下載目錄為:
/usr/local/bin/docker-compose

為其添加可執行權限:
sudo chmod +x /usr/local/bin/docker-compose

查詢版本信息:
docker-compose --version

### Go語言安裝
安裝包下載
curl -O https://golang.google.cn/doc/install?download=go1.15.linux-amd64.tar.gz

解壓縮文件包
tar -C /usr/local -xzf go1.15.linux-amd64.tar.gz

配置 go 的環境變量
    修改 /etc/profile 文件使其永久生效
    1 export PATH=$PATH:/usr/local/go/bin
    2 export GOPATH=/opt/gopath

    修改文件后,執行如下命令,應用上述參數
    source /etc/profile
    
查看當前 go 版本信息
go version

也可通過下述命令查看是否安裝成功
echo $PATH

Fabric源碼及鏡像文件處理

下載 fabric 源碼是因為要用到源碼中的例子和工具,工具編譯需要用到 go 語言環境,因此需要把源碼目錄放到 GOPATH 下,路徑設置為 /opt/gopath

可以使用 Git 命令下載源碼(耗時會比較長):
cd /opt/gopath/src/github.com/hyperledger/
git clone https://github.com/hyperledger/fabric.git

如果沒有 git 命令,需要先執行如下命令,構建 git 環境:
yum install git

默認Fabric源碼下載版本為 2.2.0

Fabric Docker 鏡像的下載:
cd /opt/gopath/src/github.com/hyperledger/fabric/scripts
./bootstrap.sh
等待下載完成即可

至此,Fabric源碼,fabric-samples 源碼、fabric 鏡像的工作已經完成

網絡環境測試

啟動 Fabric 網絡
cd /opt/gopath/src/github.com/hyperledger/fabric/scripts/fabric-samples/test-network
./network.sh up

建立通道
./network.sh createChannel

在通道上啟動鏈碼
./network.sh deployCC

如果鏈碼啟動失敗,手動添加 go 代理
go env -w GO111MODULE=on
go env -w GOPROXY=https://goproxy.cn,direct
再次啟動鏈碼即可

在test-network 目錄進行如下環境變量設置
export PATH=${PWD}/../bin:${PWD}:$PATH
export FABRIC_CFG_PATH=$PWD/../config/

繼續設置如下環境變量,允許以 peer Org1 的形式操作 CLI
# Environment variables for Org1
export CORE_PEER_TLS_ENABLED=true
export CORE_PEER_LOCALMSPID="Org1MSP"
export CORE_PEER_TLS_ROOTCERT_FILE=${PWD}/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt
export CORE_PEER_MSPCONFIGPATH=${PWD}/organizations/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp
export CORE_PEER_ADDRESS=localhost:7051

完成后,source /etc/profile

獲取已添加到通道分類賬中的汽車列表
peer chaincode query -C mychannel -n fabcar -c '{"Args":["queryAllCars"]}'
上述命令可能會出現報錯提示,如下(如果是提示某些文件不存在,我的一個解決辦法是,關閉網絡,啟動網絡前,source /etc/profile):
Error: endorsement failure during query. response: status:500 message:"make sure the chaincode fabcar has been successfully defined on channel mychannel and try again: chaincode fabcar not found"
查看報錯信息,我們可以知道,鏈碼 fabcar 沒有在通道上被定義,所以我們進入對應目錄,執行啟動指令:
cd /opt/gopath/src/github.com/hyperledger/fabric/scripts/fabric-samples/fabcar
./startFabric.sh
等待執行結束即可

我們現在可以重新進入 test-network 目錄,執行命令
peer chaincode query -C mychannel -n fabcar -c '{"Args":["queryAllCars"]}'
可以看到,正常返回結果了
[{"Key":"CAR0","Record":{"make":"Toyota","model":"Prius","colour":"blue","owner":"Tomoko"}},{"Key":"CAR1","Record":{"make":"Ford","model":"Mustang","colour":"red","owner":"Brad"}},{"Key":"CAR2","Record":{"make":"Hyundai","model":"Tucson","colour":"green","owner":"Jin Soo"}},{"Key":"CAR3","Record":{"make":"Volkswagen","model":"Passat","colour":"yellow","owner":"Max"}},{"Key":"CAR4","Record":{"make":"Tesla","model":"S","colour":"black","owner":"Adriana"}},{"Key":"CAR5","Record":{"make":"Peugeot","model":"205","colour":"purple","owner":"Michel"}},{"Key":"CAR6","Record":{"make":"Chery","model":"S22L","colour":"white","owner":"Aarav"}},{"Key":"CAR7","Record":{"make":"Fiat","model":"Punto","colour":"violet","owner":"Pari"}},{"Key":"CAR8","Record":{"make":"Tata","model":"Nano","colour":"indigo","owner":"Valeria"}},{"Key":"CAR9","Record":{"make":"Holden","model":"Barina","colour":"brown","owner":"Shotaro"}}]

上述調試工作相繼完成后,我們繼續如下操作(仍然在 test-network 目錄下),執行關閉網絡指令:
./network.sh down

接着,編輯profile文件,添加如下內容(因為資產轉移鏈碼的背書策略要求事務由 Org1 和 Org2 簽名,chaincode invoke 命令需要同時針對 peer0.org1.example.com 和 peer0.org2.example.com 使用 --peeradresses 標志,而且,由於為網絡啟用了 TLS, 該命令還需要使用 --tlsRootCertFiles 標志為每個對等方引用 TLS 證書。):
vi /etc/profile

# Environment variables for Org2

export CORE_PEER_TLS_ENABLED=true
export CORE_PEER_LOCALMSPID="Org2MSP"
export CORE_PEER_TLS_ROOTCERT_FILE=${PWD}/organizations/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt
export CORE_PEER_MSPCONFIGPATH=${PWD}/organizations/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp
export CORE_PEER_ADDRESS=localhost:9051
保存退出

source /etc/profile

 

啟動測試網絡:
./network.sh up
./network.sh createChannel
./network.sh deployCC

運行如下命令初始化資產分類賬:
peer chaincode invoke -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --tls --cafile ${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C mychannel -n basic --peerAddresses localhost:7051 --tlsRootCertFiles ${PWD}/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt --peerAddresses localhost:9051 --tlsRootCertFiles ${PWD}/organizations/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt -c '{"function":"InitLedger","Args":[]}'

如果有如下報錯信息,可能是鏈碼沒有在通道中被成功定義,關閉測試網絡后,重新執行啟動網絡操作:
Error: endorsement failure during invoke. response: status:500 message:"make sure the chaincode basic has been successfully defined on channel mychannel and try again: chaincode basic not found"

上述初始化指令的執行成功返回結果信息如下:
2020-08-28 11:20:52.062 CST [chaincodeCmd] chaincodeInvokeOrQuery -> INFO 001 Chaincode invoke successful. result: status:200

運行以下命令獲取添加到通道分類賬的資產列表:
peer chaincode query -C mychannel -n basic -c '{"Args":["GetAllAssets"]}'

返回結果如下:
[{"ID":"asset1","color":"blue","size":5,"owner":"Tomoko","appraisedValue":300},{"ID":"asset2","color":"red","size":5,"owner":"Brad","appraisedValue":400},{"ID":"asset3","color":"green","size":10,"owner":"Jin Soo","appraisedValue":500},{"ID":"asset4","color":"yellow","size":10,"owner":"Max","appraisedValue":600},{"ID":"asset5","color":"black","size":15,"owner":"Adriana","appraisedValue":700},{"ID":"asset6","color":"white","size":15,"owner":"Michel","appraisedValue":800}]

當網絡成員希望轉移或更改分類賬上的資產時,會調用鏈碼。使用以下命令更改分類賬上的資產所有者:
peer chaincode invoke -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --tls --cafile ${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C mychannel -n basic --peerAddresses localhost:7051 --tlsRootCertFiles ${PWD}/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt --peerAddresses localhost:9051 --tlsRootCertFiles ${PWD}/organizations/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt -c '{"function":"TransferAsset","Args":["asset6","Christopher"]}'

返回如下提示信息,即表示更改成功:
2020-08-28 11:21:29.252 CST [chaincodeCmd] chaincodeInvokeOrQuery -> INFO 001 Chaincode invoke successful. result: status:200

使用如下命令查詢剛剛的轉移信息:
peer chaincode query -C mychannel -n basic -c '{"Args":["ReadAsset","asset6"]}'

返回結果如下:
{"ID":"asset6","color":"white","size":15,"owner":"Christopher","appraisedValue":800}

 

(如果是提示某些文件不存在,我的一個解決辦法是,啟動網絡前,source /etc/profile)


免責聲明!

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



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