一、前置環(huán)境安裝
1 安裝pip,curl,git工具包
2 安裝docker
3 安裝docker-compose
4 GO語(yǔ)言依賴
二、Fabric2.2 開(kāi)發(fā)環(huán)境
1 創(chuàng)建文件夾并拉取 fabric 源碼
? ? ? ? ?2 下載實(shí)驗(yàn)所需樣例及 docker 鏡像
3 網(wǎng)絡(luò)環(huán)境測(cè)試
4 問(wèn)題
三、測(cè)試自己的鏈碼
1 啟動(dòng) Fabric 網(wǎng)絡(luò)
2 部署鏈碼
3 調(diào)用結(jié)果
WIN10 Ubuntu20.04?Fabric?2.0安裝部署
虛擬機(jī)配置:
一、前置環(huán)境安裝
1 安裝pip,curl,git工具包
在安裝相關(guān)工具包前更新所需軟件,否則安裝時(shí)部分包會(huì)安裝失敗。
更新指令:sudoapt-getupdate 和 sudoapt-getupgrade
sudo apt install git
sudo apt install curl
sudo apt install python-pip
pip install?--upgrade pip
2 安裝docker
安裝 docker前為確保docker版本先卸載原有 docker 版本 ,重新安裝
卸載指令:sudo apt-get remove docker docker-engine docker.io
安裝 docker 指令:sudo apt install docker.io
查看 docker 版本:?docker -v
重啟服務(wù)
sudo systemctl daemon-reload
sudo systemctl restart docker
3 安裝docker-compose
安裝指令:sudo apt install docker-compose
查看指令:docker-compose -v
允許其他用戶執(zhí)行 compose 相關(guān)命令
執(zhí)行指令:sudo chmod +x /usr/share/doc/docker-compose
4 GO語(yǔ)言依賴
安裝依賴包:sudo apt install libtool libltdl-dev
下載GO語(yǔ)言安裝包并解壓安裝,指令下載的是go1.14.6
安裝指令:wget https://studygolang.com/dl/golang/go1.14.6.linux-amd64.tar.gz
解壓指令:sudo tar -xzvf go1.14.6.linux-amd64.tar.gz -C /usr/local/
配置環(huán)境變量 ,加在文件末尾
配置指令:sudo vim/etc/profile
export PATH= $PATH:/usr/local/go/bin
export GOROOT= /usr/local/go
export GOPATH= $HOME/go
export PATH= $PATH:$GOPATH/bin:$GOPATH/bin
錯(cuò)誤:vim:command not found
缺少 vim 工具,安裝指令:sudo apt-get install vim-gtk,類(lèi)似錯(cuò)誤同樣處理。
生效指令:source /etc/profile
檢查是否安裝成功:go version
重啟虛擬機(jī),檢查環(huán)境
GO 語(yǔ)言:go1.14.6linux/amd64
Docker-compose:docker-composeversion1.25.0
Docker:dockerversion19.03.8
二、Fabric2.2 開(kāi)發(fā)環(huán)境
1 創(chuàng)建文件夾并拉取 fabric 源碼
mkdir -p go/src/github.com/hyperledger/
cd?go/src/github.com/hyperledger/
安裝指令:
git clone "https://github.com/hyperledger/fabric.git"
cd fabric/
cd scripts/
2 下載實(shí)驗(yàn)所需樣例及 docker 鏡像
可以直接運(yùn)行sudo./bootstrap.sh下載官方樣例和所需docker鏡像,但是運(yùn)行特別慢,失敗可以重新運(yùn)行,或者修改 bootstrap.sh 腳本運(yùn)行:
vim ~/?go/src/github.com/hyperledger/fabric/scripts/bootstrap.sh
圖片左邊改成右邊,:wq!保存退出
回到原來(lái)的文件夾運(yùn)行指令:sudo./bootstrap.sh
修改后的腳本下載時(shí)只會(huì)進(jìn)行鏡像拉取,因此需要手動(dòng)下載 fabric-samples 及二進(jìn)制文件。
cd?~/?go/src/github.com/hyperledger/fabric/scripts
git clone https://github.com/hyperledger/fabric-samples.git
這里很容易因?yàn)榫W(wǎng)絡(luò)問(wèn)題下載不全鏡像,之后的運(yùn)行會(huì)出問(wèn)題,如果出問(wèn)題,多運(yùn)行幾次,下全缺失的鏡像
下好 fabric-samples 文件后下載二進(jìn)制文件并解壓。
wget https://github.com/hyperledger/fabric/releases/download/v2.2.1/hyperledger-fabric-lin ux-amd64-2.2.1.tar.gz
sudo tar -xzvf?hyperledger-fabric-lin ux-amd64-2.2.1.tar.gz
3 網(wǎng)絡(luò)環(huán)境測(cè)試
進(jìn)入管理員權(quán)限,不會(huì)頻繁出環(huán)境變量的錯(cuò)誤
啟動(dòng) fabric 網(wǎng)絡(luò):sudo ./network.sh up
在網(wǎng)絡(luò)上建立通道:sudo ./network.sh createChannel
在通道上啟動(dòng)鏈碼:sudo ./network.sh deployCC
啟動(dòng)鏈碼后在 test-network 目錄上進(jìn)行環(huán)境變量設(shè)置并使之生效。
source /etc/profile
執(zhí)行查詢指令:
peer chaincode query -C mychannel -n fabcar -c? '{"Args":["queryAllCars"]}'
查詢出現(xiàn)錯(cuò)誤后進(jìn)入 fabcar 文件執(zhí)行./startFabric.sh,重新啟動(dòng)網(wǎng)絡(luò)再查詢
cd /opt/gopath/src/github.com/hyperledger/fabric/scripts/famples-samples/fabcar
sudo ./startFabric.sh
關(guān)閉網(wǎng)絡(luò):./network.sh down
4 問(wèn)題
解決辦法:對(duì) go 換源,之后重新啟動(dòng)鏈碼。
執(zhí)行指令:go env -w GO111MODULE=on
? ? ? ? ?go env -w GOPROXY=https://goproxy.cn,direct
三、測(cè)試自己的鏈碼
例子:資產(chǎn)交易平臺(tái):? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
鏈接里的代碼是基于1.4的,需要把開(kāi)頭這個(gè)部分替換掉
"github.com/hyperledger/fabric-chaincode-go/shim"
"github.com/hyperledger/fabric-protos-go/peer"
把這里的鏈碼復(fù)制到fabcar.go文件里替換保存
1 啟動(dòng) Fabric 網(wǎng)絡(luò)
刪除運(yùn)行中的 docker,以免之前實(shí)驗(yàn)的遺留部分有所影響,關(guān)閉網(wǎng)絡(luò)。
執(zhí)行指令:./network.sh down
建立新的測(cè)試網(wǎng)絡(luò):./network.sh up 和 ./network.sh createChannel。
執(zhí)行后可創(chuàng)建一個(gè)通道 mychannel 和兩個(gè)組織 Org1,Org2.每個(gè) 組織有一個(gè) peer 且已經(jīng)加入通道中。
2 部署鏈碼
部署鏈碼主要分為四部分:打包鏈碼、安裝打包的鏈碼、各組織對(duì)鏈碼內(nèi)容和定義達(dá)成一致、向 channel 中提交鏈碼。
1 打包鏈碼
先對(duì)鏈碼打包,進(jìn)入 fabric-samples/chaincode/fabcar/go 文件,使用 go module,查看 go.mod 文件并安裝鏈碼依賴包。
鏈碼依賴包安裝完成后,回到 test-network 目錄。
root權(quán)限下
cd /home/用戶名/go/src/github.com/hyperledger/fabric/scripts/fabric-samples/chaincode/fabcar/go
cat go.mod
GO111MODULE=on go mod vendor
cd /home/用戶名/go/src/github.com/hyperledger/fabric/scripts/fabric-samples/test-network
使用 peerCLI 來(lái)打包鏈碼,添加 Peer 到 CLI 命令路徑中,并設(shè)置相關(guān)路徑, 設(shè)置完成后查看 peer 版本來(lái)確認(rèn)是否安裝成功。
export PATH=${PWD}/../bin:$PATH
export FABRIC_CFG_PATH=$PWD/../config/
peer version
打包鏈碼:
peer lifecycle chaincode package fabcar.tar.gz --path../chaincode/fabcar/go/ --langgolang --labelfabcar_1
2 安裝打包的鏈碼
首先在 Org1 的 peer 上安裝,可以通過(guò)設(shè)置環(huán)境變量來(lái)指定 peer 操作的是 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
peer lifecycle chaincode install fabcar.tar.gz
同樣,在 Org2 的 peer 上安裝鏈碼:
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
peer lifecycle chaincode install fabcar.tar.gz
輸出的結(jié)果是一樣的
3 審議鏈碼定義
查找 peer 上的 packageID 并將其保存到環(huán)境變量中。
peer lifecycle chaincode queryinstalled
export CC_PACKAGE_ID=______________________________//這里是剛查出來(lái)的id
用 Org1 和 Org2 分別審議鏈碼,這里環(huán)境變量還在Org2下
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的環(huán)境
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
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
4 向 Channel 中提交鏈碼定義
檢查一下哪些成員同意了鏈碼定義
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
通道內(nèi)所有組織都同意了鏈碼定義之后,鏈碼定義就可以提交到 channel 中。
peer lifecycle chaincode commit -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --channelID mychannel --name fabcar --version 1.0 --sequence 1 --tls true --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.examp le.com/tls/ca.crt
//確認(rèn)是否提交到通道上
peer lifecycle chaincode querycommitted
3 調(diào)用結(jié)果
之前用的root權(quán)限,所以每次注冊(cè)的操作都要對(duì)相關(guān)的安全證書(shū)定義,注冊(cè)的代碼比較長(zhǎng),查詢的不需要
//用戶1注冊(cè)
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 fabcar --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 '{"Args":["userRegister", "user1", "user1"]}'
//資產(chǎn)1登記
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 fabcar --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 '{"Args":["assetEnroll", "asset1", "asset1", "metadata", "user1"]}'
//用戶2注冊(cè)
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 fabcar --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 '{"Args":["userRegister", "user2", "user2"]}'
//1資產(chǎn)轉(zhuǎn)讓2
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 fabcar --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 '{"Args":["assetExchange", "user1", "asset1", "user2"]}'
//用戶1注銷(xiāo)
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 fabcar --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 '{"Args":["userDestroy", "user1"]}'
//用戶1查詢
sudo peer chaincode query -C mychannel -n token -c '{"Args":["queryUser", "user1"]}'
//資產(chǎn)1查詢
sudo peer chaincode query -C mychannel -n token -c '{"Args":["queryAsset", "asset1"]}'
//用戶2查詢
sudo peer chaincode query -C mychannel -n token -c '{"Args":["queryUser", "user2"]}'
//資產(chǎn)交易記錄查詢
sudo peer chaincode query -C mychannel -n token -c '{"Args":["queryAssetHistory", "asset1"]}'
sudo peer chaincode query -C mychannel -n token -c '{"Args":["queryAssetHistory", "asset1", "all"]}'
【標(biāo)準(zhǔn)版】400元/年/5用戶/無(wú)限容量
【外貿(mào)版】500元/年/5用戶/無(wú)限容量
其它服務(wù):網(wǎng)站建設(shè)、企業(yè)郵箱、數(shù)字證書(shū)ssl、400電話、
聯(lián)系方式:電話:13714666846 微信同號(hào)
聲明:本站所有作品(圖文、音視頻)均由用戶自行上傳分享,或互聯(lián)網(wǎng)相關(guān)知識(shí)整合,僅供網(wǎng)友學(xué)習(xí)交流,若您的權(quán)利被侵害,請(qǐng)聯(lián)系 管理員 刪除。
本文鏈接:http://www.goalq.com.cn/article_32804.html