記錄Hyperledger Fabric的安裝部署以及鏈碼運行程序
- 前言
- 一、環境部署步驟
- 1.安裝基本工具
- 2.安裝docker
- 3.安裝docker-compose
- 4.安裝Go語言
- 二、Hyperledger Fabric安裝
- 1.拉取fabric原始碼
- 2.啟動Fabric網路,呼叫測驗鏈碼
- 三、在fabric-sample網路環境下部署自己的鏈碼
- 3.1 恢復到已知的初始狀態
- 3.2 啟動測驗網路
- 3.3、設定Logspout(可選)
- 3.4、打包智能合約
- 3.5、安裝鏈碼包
- 3.6、通過鏈碼定義
- 3.7、將鏈碼定義提交給通道
文章目錄
- 前言
- 一、環境部署步驟
- 1.安裝基本工具
- 2.安裝docker
- 3.安裝docker-compose
- 4.安裝Go語言
- 二、Hyperledger Fabric安裝
- 1.拉取fabric原始碼
- 2.啟動Fabric網路,呼叫測驗鏈碼
- 三、在fabric-sample網路環境下部署自己的鏈碼
- 3.1 恢復到已知的初始狀態
- 3.2 啟動測驗網路
- 3.3、設定Logspout(可選)
- 3.4、打包智能合約
- 3.5、安裝鏈碼包
- 3.6、通過鏈碼定義
- 3.7、將鏈碼定義提交給通道
前言
主要記錄一下初次探索區塊鏈技術的簡要程序
提示:以下是本篇文章正文內容,下面案例可供參考
一、環境部署步驟
1.安裝基本工具
首先我們要明確我們運行的基礎環境是Ubuntu18.04版本
代碼如下(示例):
sudo apt install git //安裝git
sudo apt install curl //安裝curl
安裝pip并更新
sudo apt install python-pip
pip install --upgrade pip
2.安裝docker
代碼如下(示例):
1.首先需要安裝17.06.2-ce或更高版本,建議安裝最新版本的docker,
2.安裝docker之前未確保docker版本過低我們選擇卸載以前的docker,重新安裝docker
sudo apt-get remove docker docker-engine docker.io
3.卸載docker完成之后我開始安裝docker,分別執行一下命令
sudo apt install docker.io
docker -v //查看版本
//重啟服務
sudo systemctl daemon-reload
sudo systemctl restart docker
3.安裝docker-compose
sudo apt install docker-compose
docker-compose -v
sudo chmod +x /usr/share/doc/docker-compose
4.安裝Go語言
首先安裝一些必要的依賴:
sudo apt install libtool libltdl-dev
去該網站 https://studygolang.com/dl 下載Go語言的安裝包,我下的是目前最新版本: go1.14.6.linux-amd64.tar.gz
將壓縮包復制到/usr/local路徑下,然后進行解壓:
wget https://studygolang.com/dl/golang/go1.14.6.linux-amd64.tar.gz
下載完 Golang 壓縮包之后,使用 tar 命令將壓縮包解壓到指定的 /usr/local/ 路徑下,命令如下
sudo tar -xzvf go1.14.6.linux-amd64.tar.gz -C /usr/local/
3.下面我們開始配置環境變數
sudo vim /etc/profile
在檔案末尾加入如下代碼
export PATH=$PATH:/usr/local/go/bin
export GOROOT=/usr/local/go
export GOPATH=$HOME/go
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
4.使用 source 命令,使剛剛添加的配置資訊生效
source /etc/profile
5.使用 go version 命令驗證是否安裝成功
如果顯示了版本號,就說明安裝成功,我的版本號是這樣的
go version
go version go1.14.6 linux/amd64
二、Hyperledger Fabric安裝
1.拉取fabric原始碼
首先創建檔案夾(默認在學員/home/stack/目錄下,這里的stack改為你自己的用戶名)
mkdir -p go/src/github.com/hyperledger/
進入剛剛創建的檔案夾內
cd go/src/github.com/hyperledger/
從github上拉取fabric的原始碼:
git clone https://hub.fastgit.org/hyperledger/fabric.git
修改bootstrap.sh腳本
cd fabric/
cd scripts/
vim ~/go/src/github.com/hyperledger/fabric/scripts/bootstrap.sh
修改腳本

為

運行bootstrap.sh腳本
sudo ./bootstrap.sh
注:這個地方可能仍然很慢:可以試試換docker的源
參考:換源參考(親測有效)
拉取fabric-samples
進入目錄
cd ~/go/src/github.com/hyperledger/fabric/scripts
然后開始拉取fabric-samples
git clone https://hub.fastgit.org/hyperledger/fabric-samples.git
下載二進制檔案并解壓
cd ~/go/src/github.com/hyperledger/fabric/scripts/fabric-samples
wget https://github.91chifun.workers.dev//https://github.com/hyperledger/fabric/releases/download/v2.2.1/hyperledger-fabric-linux-amd64-2.2.1.tar.gz
然后在當前目錄解壓包
sudo tar -xzvf hyperledger-fabric-linux-amd64-2.2.1.tar.gz
但是這里并沒有結束!!!!!解壓后fabric-samples下有一個bin檔案夾,里面其實少了兩個有關fabric-ca的檔案,這會導致后面運行找不到二進制檔案的問題,所以,接下來我按照官網的方法進行如下操作:
cd (此命令回到用戶根目錄)
mkdir test (創建一個臨時的檔案夾)
cd /test
執行官網給出的命令
curl -sSL https://bit.ly/2ysbOFE | bash -s
下載完畢后,test檔案夾下也會有一個fabric-samples的檔案夾,其下面也有一個bin檔案夾,打開可以看到下面相比上文多了兩個可執行檔案fabric-ca-client ,fabric-ca-server(***正是我們所缺少的!***)
將這個bin檔案夾整個復制到我們之前的fabric-samples下
cp -r /home/stack/test/fabric-samples/bin /home/stack/go/src/github.com/hyperledger/fabric/scripts/fabric-samples/
(根據自己的目錄情況而定,兩個路徑中間有一個空格)
回到我們之前的目錄下
cd /home/stack/go/src/github.com/hyperledger/fabric/scripts/fabric-samples/test-network
2.啟動Fabric網路,呼叫測驗鏈碼
啟動 Fabric 網路
sudo ./network.sh up
建立通道
sudo ./network.sh createChannel
12在通道上啟動鏈碼
(這里建議再執行一遍
source /etc/profile 不然下一步可能出現錯誤)
sudo ./network.sh deployCC
13進行環境變數設定(必須在test-network目錄下)
sudo vim /etc/profile
添加如下資訊:
export PATH=${PWD}/../bin:${PWD}:$PATH
export FABRIC_CFG_PATH=${PWD}/../config/
繼續添加如下環境變數
# 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(必須在test-network目錄下)
運行
peer chaincode query -C mychannel -n fabcar -c '{"Args":["queryAllCars"]}'
(但是這里應該會報錯)
因為沒有將fabcar加入通道!
所以,退回到上一級目錄
cd ..
進入fabcar目錄
cd /fabcar
運行startFabric.sh可執行檔案
./startFabric.sh
16若是運行成功,則回到test-network目錄
cd ..
cd /test-network
這時再次運行
peer chaincode query -C mychannel -n fabcar -c '{"Args":["queryAllCars"]}'
得到汽車串列
結束!
三、在fabric-sample網路環境下部署自己的鏈碼
建議進入超級管理賬號(命令:su - ,然后輸入密碼就可以進入,具體功能還有怎么操作可以百度,這個好理解),然后后續操作中不要再加sudo!!
這里主要看個人選擇吧,實際的開發案例中都是使用用戶賬號,而非root權限賬號,但是如果使用root權限來進行操作的話會比較容易成功,所以以下以root權限賬戶為例:
首先是docker的換源(根據個人網路環境參考)
cd /etc/docker
cat daemon.json
{
"registry-mirrors": [
"https://docker.mirrors.ustc.edu.cn",
"https://kfwkfulq.mirror.aliyuncs.com",
"https://2lqq34jg.mirror.aliyuncs.com",
"https://pee6w651.mirror.aliyuncs.com",
"https://registry.docker-cn.com",
"http://hub-mirror.c.163.com"
]
}
systemctl daemon-reload
systemctl restart docker
然后可以將自己的鏈碼替換掉fabcar里面的內容,也可以自己再新建一個檔案夾撰寫自己的鏈碼檔案
這里我直接替換掉了fabcar的內容
進入fabric-samples/test-network目錄
cd ~/go/src/github.com/hyperledger/fabric/scripts/fabric-samples/test-network
以下內容參考自大佬的博客內容
https://blog.csdn.net/mutou___/article/details/110039475#comments_13973567
3.1 恢復到已知的初始狀態
使用以下命令結束所有活動或陳舊的Docker容器并洗掉以前生成的部件
sudo ./network.sh down
3.2 啟動測驗網路
sudo ./network.sh up createChannel
該createChannel命令創建一個以mychannel兩個通道成員Org1和Org2命名的通道,該命令還將屬于每個組織的peer節點加入通道,如果成功創建了網路和通道,則可以在日志中看到以下訊息:
Channel successfully joined====
3.3、設定Logspout(可選)
此步驟不是必需的,但是對于故障排除鏈碼非常有用,
Fabric示例monitordocker.sh中的commercial-paper示例已包含用于安裝和配置Logspout的腳本,
打開一個新的終端
進入fabric-samples/test-network目錄
cd ~/go/src/github.com/hyperledger/fabric/scripts/fabric-samples/test-network
將monitordocker.sh腳本從commercial-paper示例復制到fabric-samples/test-network作業目錄中
sudo cp ../commercial-paper/organization/digibank/configuration/cli/monitordocker.sh .
啟動Logspout
sudo ./monitordocker.sh net_test
成功后可以看到類似于以下內容的輸出:
Starting monitoring on all containers on the network net_test
Unable to find image 'gliderlabs/logspout:latest' locally
latest: Pulling from gliderlabs/logspout
188c0c94c7c5: Already exists
f76076d59b2f: Pull complete
d09edbff691c: Pull complete
Digest: sha256:2b70c1989a00a2775311e66aec8be6e2479deb0e0c0c0be603de1863f49027e8
Status: Downloaded newer image for gliderlabs/logspout:latest
1c6c61c50c02e45282d565c8177d81358945a1ab59065a822491ee88fcac1ad6
3.4、打包智能合約
注意:以下為由Go語言撰寫的智能合約打包步驟,JavaScript打包見第八節,
打開一個新的終端
安裝chaincode依賴項
依賴項go.mod在fabric-samples/chaincode/fabcar/go目錄中的檔案中列出,該go.mod檔案將Fabric合約API匯入到智能合約包中,
cd ~/go/src/github.com/hyperledger/fabric/scripts/fabric-samples/chaincode/fabcar/go
sudo GO111MODULE=on go mod vendor
回傳到test-network所在目錄,以便可以將鏈碼與其他網路部件打包在一起,
cd ../../../test-network
將bin目錄中二進制檔案添加到CLI路徑
所需格式的鏈碼包可以使用peer CLI創建,使用以下命令將這些二進制檔案添加到你的CLI路徑,
export PATH=${PWD}/../bin:$PATH
設定FABRIC_CFG_PATH為指向fabric-samples中的core.yaml檔案
export FABRIC_CFG_PATH=$PWD/../config/
創建鏈碼包
使用peer lifecycle chaincode package命令創建鏈碼包,
sudo peer lifecycle chaincode package fabcar.tar.gz --path ../chaincode/fabcar/go/ --lang golang --label fabcar_1
命令解釋:此命令將在當前目錄中創建一個名為basic.tar.gz的軟體包,–lang標簽用于指定鏈碼語言,–path標簽提供智能合約代碼的位置,該路徑必須是標準路徑或相對于當前作業目錄的路徑,–label標簽用于指定一個鏈碼標簽,該標簽將在安裝鏈碼后對其進行標識,建議您的標簽包含鏈碼名稱和版本,
現在,我們已經創建了鏈碼包,我們可以在測驗網路的對等節點上安裝鏈碼,
3.5、安裝鏈碼包
打包Fabcar智能合約后,我們可以在peer節點上安裝鏈碼,需要在將認可交易的每個peer節點上安裝鏈碼,因為我們將設定背書策略以要求來自Org1和Org2的背書,所以我們需要在兩個組織的peer節點上安裝鏈碼:peer0.org1.example.com和peer0.org2.example.com,
Org1 peer節點安裝鏈碼
先在Org1 peer節點上安裝鏈碼,
設定以下環境變數,以Org1管理員的身份操作peer CLI,
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
使用 peer lifecycle chaincode install 命令在peer節點上安裝鏈碼,
sudo peer lifecycle chaincode install fabcar.tar.gz
如果命令成功,則peer節點將生成并回傳包識別符號,下一步,此包ID將用于通過鏈碼,你應該看到類似于以下內容的輸出:
2020-11-24 20:59:00.766 CST [cli.lifecycle.chaincode] submitInstallProposal -> INFO 001 Installed remotely: response:<status:200 payload:"\nIfabcar_1:762e0fe3dbeee0f7b08fb6200adeb4a3a20f649a00f168c0b3c2257e53b6e506\022\010fabcar_1" >
2020-11-24 20:59:00.775 CST [cli.lifecycle.chaincode] submitInstallProposal -> INFO 002 Chaincode code package identifier: fabcar_1:762e0fe3dbeee0f7b08fb6200adeb4a3a20f649a00f168c0b3c2257e53b6e506
Org2 peer節點安裝鏈碼
設定以下環境變數,以Org2管理員的身份操作peer CLI,
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_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
使用 peer lifecycle chaincode install 命令在peer節點上安裝鏈碼,
sudo peer lifecycle chaincode install fabcar.tar.gz
注意:安裝鏈碼時,鏈碼由peer節點構建,如果智能合約代碼有問題,install命令將從鏈碼中回傳所有構建錯誤,
3.6、通過鏈碼定義
安裝鏈碼包后,需要通過組織的鏈碼定義,該定義包括鏈碼管理的重要引數,例如名稱,版本和鏈碼認可策略,
如果組織已在其peer節點上安裝了鏈碼,則他們需要在其組織通過的鏈碼定義中包括包ID,包ID用于將peer節點上安裝的鏈碼與通過的鏈碼定義相關聯,并允許組織使用鏈碼來認可交易,
查詢包ID
可以使用peer lifecycle chaincode queryinstalled命令來查詢peer節點,從而找到鏈碼的包ID,
sudo peer lifecycle chaincode queryinstalled
包ID是鏈碼標簽和鏈碼二進制檔案的哈希值的組合,每個peer節點將生成相同的包ID,你應該看到類似于以下內容的輸出:
Installed chaincodes on peer:
Package ID: fabcar_1:762e0fe3dbeee0f7b08fb6200adeb4a3a20f649a00f168c0b3c2257e53b6e506, Label: fabcar_1
通過鏈碼時,我們將使用包ID,因此,將包ID保存為環境變數,將回傳的包ID粘貼到下面的命令中,
注意:包ID對于所有用戶而言都不相同,因此需要使用上一步中從命令視窗回傳的包ID來完成此步驟,而不是直接復制命令!!!
export CC_PACKAGE_ID=fabcar_1:762e0fe3dbeee0f7b08fb6200adeb4a3a20f649a00f168c0b3c2257e53b6e506
Org2通過鏈碼定義
因為已經設定了環境變數為peer CLI作為Orig2管理員進行操作,所以我們可以以Org2組織級別將Fabcar的鏈碼定義通過,使用 peer lifecycle chaincode approveformyorg命令通過鏈碼定義:
sudo peer lifecycle chaincode approveformyorg -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --channelID mychannel --name fabcar --version 1.0 --package-id $CC_PACKAGE_ID --sequence 1 --tls --cafile ${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem
Org1通過鏈碼定義
設定以下環境變數以Org1管理員身份運行:
export CORE_PEER_LOCALMSPID="Org1MSP"
export CORE_PEER_MSPCONFIGPATH=${PWD}/organizations/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp
export CORE_PEER_TLS_ROOTCERT_FILE=${PWD}/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt
export CORE_PEER_ADDRESS=localhost:7051
Org1通過鏈碼定義:
sudo peer lifecycle chaincode approveformyorg -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --channelID mychannel --name fabcar --version 1.0 --package-id $CC_PACKAGE_ID --sequence 1 --tls --cafile ${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem
3.7、將鏈碼定義提交給通道
使用peer lifecycle chaincode checkcommitreadiness命令來檢查通道成員是否已批準相同的鏈碼定義:
sudo peer lifecycle chaincode checkcommitreadiness --channelID mychannel --name fabcar --version 1.0 --sequence 1 --tls --cafile ${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem --output json
1
該命令將生成一個JSON映射,該映射顯示通道成員是否批準了checkcommitreadiness命令中指定的引數:
{
"approvals": {
"Org1MSP": true,
"Org2MSP": true
}
}
由于作為通道成員的兩個組織都同意了相同的引數,因此鏈碼定義已準備好提交給通道,你可以使用peer lifecycle chaincode commit命令將鏈碼定義提交到通道,commit命令還需要由組織管理員提交,
sudo peer lifecycle chaincode commit -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --channelID mychannel --name fabcar --version 1.0 --sequence 1 --tls --cafile ${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem --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
可以使用peer lifecycle chaincode querycommitted命令來確認鏈碼定義已提交給通道,
sudo peer lifecycle chaincode querycommitted --channelID mychannel --name fabcar --cafile ${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem
如果將鏈碼成功提交給通道,該querycommitted命令將回傳鏈碼定義的順序和版本:
Version: 1.0, Sequence: 1, Endorsement Plugin: escc, Validation Plugin: vscc, Approvals: [Org1MSP: true, Org2MSP: true]
到此內容基本結束,可以開始呼叫你自己的鏈碼了,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/230621.html
標籤:區塊鏈
