一 搭建開(kāi)發(fā)環(huán)境
?
?1.1?安裝Git
sudo apt-get install git
1.2 安裝curl
sudo apt-get install curl
?1.3 安裝docker
# 安裝并檢查版本
sudo apt-get -y install docker-compose
docker --version
docker-compose --version
# 提示,以后只要碰到docker有關(guān)的錯(cuò)誤,先執(zhí)行2.3.1步驟
#1.重啟docker
sudo systemctl start docker
#設(shè)置系統(tǒng)啟動(dòng)時(shí)docker啟動(dòng),可選
sudo systemctl enable docker
#2.將用戶(hù)添加到docker組,確保在用戶(hù)命令下可以執(zhí)行
sudo gpasswd -a $USER docker
#3.更新用戶(hù)組
newgrp docker
# docker信息
docker info
# 測(cè)試docker,若報(bào)錯(cuò)詳見(jiàn)文末附加問(wèn)題1
docker run hello-world
1.4 安裝go
新建目錄、下載、解壓
mkdir ~/download
cd ~/download
# 下載
wget https://studygolang.com/dl/golang/go1.13.linux-amd64.tar.gz
# 解壓
sudo tar -C /usr/local -xzf go1.13.linux-amd64.tar.gz
配置環(huán)境
mkdir $HOME/go
#用vi打開(kāi)~./bashrc,配置環(huán)境變量
vi ~/.bashrc
# 在最下方插入
export GOROOT=/usr/local/go
export GOPATH=$HOME/go
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
#使配置的環(huán)境變量生效
source ~/.bashrc
#檢查是否配置正確
go version
# 配置goproxy環(huán)境變量加速?lài)?guó)內(nèi)下載
go env -w GOPROXY=https://goproxy.io
1.5 安裝JQ
sudo apt-get install jq
二 安裝實(shí)例、二進(jìn)制和docker鏡像
2.1 新建目錄,克隆fabric-samples?倉(cāng)庫(kù)
mkdir -p $GOPATH/src/github.com/hyperledger
cd $GOPATH/src/github.com/hyperledger
# 獲取fabric-samples源碼
git clone https://github.com/hyperledger/fabric-samples.git
?選擇適當(dāng)?shù)陌姹緲?biāo)簽,進(jìn)入目錄,切換分支
cd fabric-samples
# 可自行選擇版本
git checkout release-2.2
#查看版本
git branch
2.2 下載docker鏡像
?將指定版本的 Hyperledger Fabric 平臺(tái)特定二進(jìn)制文件和配置文件安裝到 fabric-samples 下的?/bin
和?/config
?目錄中,下載指定版本的 Hyperledger Fabric docker 鏡像
2.2.1 配置鏡像源
sudo vi /etc/docker/daemon.json
#把以下代碼加進(jìn)去
{
"registry-mirrors":["https://registry.docker-cn.com"]
}
#如果你想要最新的生產(chǎn)發(fā)布版本,忽略所有的版本標(biāo)識(shí)符。
# curl -sSL https://bit.ly/2ysbOFE | bash -s
# curl -sSL https://bit.ly/2ysbOFE | bash -s -- <fabric_version> <fabric-ca_version> <thirdparty_version>
# 若報(bào)錯(cuò)詳見(jiàn)文末附加問(wèn)題2
curl -sSL https://bit.ly/2ysbOFE | bash -s -- 2.2.0 1.4.7 0.4.18
# 若不行試試下面這個(gè)
curl -sSL https://raw.githubusercontent.com/hyperledger/fabric/master/scripts/bootstrap.sh | bash -s 2.2.0 1.4.7 0.4.18
注:以上curl主要是為了獲得一個(gè)bootstrap.sh
的腳本文件并執(zhí)行,可能會(huì)出現(xiàn)拒絕連接或者訪(fǎng)問(wèn),以及網(wǎng)絡(luò)故障等問(wèn)題
可以去去fabric中下載bootstrap.sh源碼即可。
- 需要先下載zip?
https://github.com/hyperledger/fabric.git
?(master分支) - 再將文件
fabric/scripts/bootstrap.sh
?移動(dòng)到目錄$HOME/go/src/github.com/<your_github_userid>
下,也就是虛擬機(jī)fabric-samples目錄 - 在fabric-samples目錄下執(zhí)行下面的指令
cat bootstrap.sh |bash -s
結(jié)果:
2.2.2 將go版本匹?
?查看安裝的go版本
go version
cd chaincode-go
sudo vi go.mod
# 進(jìn)入文件發(fā)現(xiàn)是1.14 自己把改成1.13 ,要與你下載的go版本匹配
?2.2.3?環(huán)境變量設(shè)置
vi ~/.bashrc
# 添加下面的變量
export PATH=$PATH:$GOPATH/src/github.com/hyperledger/fabric-samples/bin
# 使之生效
source ~/.bashrc
# 檢驗(yàn)成功否
fabric-ca-client version
?三 使用fabric測(cè)試網(wǎng)絡(luò)
到了這里說(shuō)明環(huán)境已經(jīng)部署完畢,接下來(lái)要使用測(cè)試網(wǎng)絡(luò),需要注意的是最好在一個(gè)完整的時(shí)間段操作?。
首先開(kāi)啟debug模式
#開(kāi)啟debug模式
export FABRIC_LOGGING_SPEC=debug
?3.1 啟動(dòng)測(cè)試網(wǎng)絡(luò)
進(jìn)入fabric-samples
下的test-network,
執(zhí)行以下命令以執(zhí)行腳本network.sh
./network.sh up
執(zhí)行完畢后看到,我們創(chuàng)建了排序組織orderer、聯(lián)盟成員org1的peer0節(jié)點(diǎn)和聯(lián)盟成員org2的peer0節(jié)點(diǎn)以及相應(yīng)的鏡像image
3.2?測(cè)試網(wǎng)絡(luò)的組成部分
執(zhí)行
docker ps -a
?Fabric網(wǎng)絡(luò)成員的所有組織稱(chēng)為聯(lián)盟,此測(cè)試網(wǎng)絡(luò)有兩個(gè)聯(lián)盟成員org1、2,一個(gè)維護(hù)網(wǎng)絡(luò)排序服務(wù)的組織orderer,每個(gè)組織各運(yùn)營(yíng)一個(gè)對(duì)等節(jié)點(diǎn),peer0.org1.example.com和peer0.org2.example.com。peer節(jié)點(diǎn)是fabric網(wǎng)絡(luò)的基本組件,最常見(jiàn)的peer節(jié)點(diǎn)就是背書(shū)節(jié)點(diǎn),對(duì)等節(jié)點(diǎn)存儲(chǔ)區(qū)塊鏈賬本進(jìn)行交易之前的驗(yàn)證。
3.3 創(chuàng)建一個(gè)channel
使用./network.sh createChannel
?在org1和org2之間創(chuàng)建通道并加入他們的對(duì)等節(jié)點(diǎn),如下有幾種方法:
- 創(chuàng)建Channel,系統(tǒng)默認(rèn)命名為?
mychannel
- channel名稱(chēng)限制
- 僅包含小寫(xiě)ASCII字母數(shù)字,點(diǎn)“?!焙推普厶?hào)“-”
- 少于250個(gè)字符
- 以字母開(kāi)頭
# 1.不輸入自定義名稱(chēng)通道,默認(rèn)為mychannel
./network.sh createChannel
# 2.輸入自定義名稱(chēng),可以創(chuàng)建多個(gè)不同名稱(chēng)通道
./network.sh createChannel -c channel1
./network.sh createChannel -c channel2
# 3.也可以建立網(wǎng)絡(luò)創(chuàng)建通道一起
./network.sh up createChannel
我這里默認(rèn)通道名
?執(zhí)行完成顯示:
?3.3?在通道啟動(dòng)一個(gè)鏈碼
在fabric 中,鏈碼就是指的智能合約。
在創(chuàng)建通道后,開(kāi)始部署鏈碼與通道賬本交互,鏈碼包含區(qū)塊鏈賬本上資產(chǎn)的業(yè)務(wù)邏輯,用的go語(yǔ)言編寫(xiě)。由成員運(yùn)行的應(yīng)用程序網(wǎng)絡(luò)可以在賬本上調(diào)用智能合約創(chuàng)建,更改和轉(zhuǎn)讓資產(chǎn)。
為確保交易有效,使用智能合約創(chuàng)建的交易需要多個(gè)組織簽名才能提交到賬本,也就是背書(shū),而智能合約也定義了背書(shū)策略,比如需要成員2/3同意便通過(guò),一半成員同意通過(guò)等等。
創(chuàng)建完通道,現(xiàn)在開(kāi)始啟動(dòng)鏈碼
?
./network.sh deployCC -ccn basic -ccp ../asset-transfer-basic/chaincode-go -ccl go
鏈碼啟動(dòng)成功
?3.4?與網(wǎng)絡(luò)互動(dòng),配置peer指令
均在?test-network
?文件夾下執(zhí)行
3.4.1 把fabric-samples的bin文件下的二進(jìn)制文件添加到CLI路徑:
export PATH=${PWD}/../bin:$PATH
3.4.2 將fabric-samples代碼庫(kù)中的FABRIC_CFG_PATH設(shè)置為指向其中的core.yaml文件:
export FABRIC_CFG_PATH=$PWD/../config/
?3.4.3?設(shè)置環(huán)境變量,允許用戶(hù)作為org1操作peer的CLI:
# Environment variables for Org1
export CORE_PEER_TLS_ENABLED=true
export CORE_PEER_LOCALMSPID="Org1MSP"
#CORE_PEER_TLS_ROOTCERT_FILE和CORE_PEER_MSPCONFIGPATH環(huán)境變量指向Org1的organizations文件夾中的的加密材料。
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
該?CORE_PEER_TLS_ROOTCERT_FILE
?和?CORE_PEER_MSPCONFIGPATH
?環(huán)境變量指向的ORG1加密材料?organizations
?文件夾。?
?3.4.4 初始化賬本
接下來(lái)可以調(diào)用鏈碼(Go)的 InitLedger 方法來(lái)賦予一些賬本上的初始資產(chǎn),運(yùn)行如下命令,用一些資產(chǎn)來(lái)初始化賬本。
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":[]}'
3.4.5?用CLI工具查詢(xún)賬本
peer chaincode query -C mychannel -n basic -c '{"Args":["GetAllAssets"]}'
?
成功查詢(xún)后的輸出:
[{"AppraisedValue":300,"Color":"blue","ID":"asset1","Owner":"Tomoko","Size":5},
{"AppraisedValue":400,"Color":"red","ID":"asset2","Owner":"Brad","Size":5},
{"AppraisedValue":500,"Color":"green","ID":"asset3","Owner":"Jin Soo","Size":10},
{"AppraisedValue":600,"Color":"yellow","ID":"asset4","Owner":"Max","Size":10},
{"AppraisedValue":700,"Color":"black","ID":"asset5","Owner":"Adriana","Size":15},
{"AppraisedValue":800,"Color":"white","ID":"asset6","Owner":"Michel","Size":15}]
?賬或改變資產(chǎn)所有者(也就是數(shù)據(jù)庫(kù)中的改操作)
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"]}'
更改結(jié)果:
[{"AppraisedValue":300,"Color":"blue","ID":"asset1","Owner":"Tomoko","Size":5},
{"AppraisedValue":400,"Color":"red","ID":"asset2","Owner":"Brad","Size":5},
{"AppraisedValue":500,"Color":"green","ID":"asset3","Owner":"Jin Soo","Size":10},
{"AppraisedValue":600,"Color":"yellow","ID":"asset4","Owner":"Max","Size":10},
{"AppraisedValue":700,"Color":"black","ID":"asset5","Owner":"Adriana","Size":15},
{"AppraisedValue":800,"Color":"white","ID":"asset6","Owner":"Christopher","Size":15}]
發(fā)現(xiàn)ID為asset6的擁有者已經(jīng)變成了Christopher。
3.4.6?我們可以通過(guò)org2的peer來(lái)查詢(xún),在這之前我們先設(shè)置一下org2的環(huán)境變量
# 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
peer chaincode query -C mychannel -n basic -c '{"Args":["ReadAsset","asset6"]}'
查詢(xún)運(yùn)行在 mychannel 上的?asset-transfer-basic
?鏈碼?peer0.org2.example.com
?
?結(jié)果和org1一樣asset6轉(zhuǎn)給了名叫Christopher的人.
3.4.7?至此測(cè)試完畢,我們關(guān)閉網(wǎng)絡(luò)./network.sh down
./network.sh down
?3.5?使用認(rèn)證機(jī)構(gòu)建立網(wǎng)絡(luò)
?Hyperledger Fabric使用公鑰基礎(chǔ)設(shè)施(PKI)來(lái)驗(yàn)證所有網(wǎng)絡(luò)參與者的行為。 每個(gè)節(jié)點(diǎn),網(wǎng)絡(luò)管理員和用戶(hù)提交的交易需要具有公共證書(shū)和私鑰以驗(yàn)證其身份。 這些身份必須具有有效的信任根源,該證書(shū)是由作為網(wǎng)絡(luò)中的成員組織頒發(fā)的。
在測(cè)試網(wǎng)絡(luò)中,network.sh在創(chuàng)建節(jié)點(diǎn)之前就使用cryptogen工具創(chuàng)建了這些加密材料。
在text-network目錄下執(zhí)行
./network.sh up -ca
結(jié)果:
可以看到腳本啟動(dòng)了三個(gè)CA,分別是orderer、org1和org2。?
下面還可以查看一下org1的MSP文件夾,其中包含了每個(gè)身份的證書(shū)和私鑰:
tree organizations/peerOrganizations/org1.example.com/users/Admin@org1.example.com/
# tree命令并不是默認(rèn)安裝的,如果沒(méi)有該命令,按照提示先安裝
organizations/peerOrganizations/org1.example.com/users/Admin@org1.example.com/
└── msp
? ? ├── cacerts //根CA服務(wù)器證書(shū)
? ? │???└── localhost-7054-ca-org1.pem
? ? ├── config.yaml
? ? ├── IssuerPublicKey
? ? ├── IssuerRevocationPublicKey
? ? ├── keystore //節(jié)點(diǎn)的私鑰
? ? │???└── 1018d5470ce399ed212639a454a80d1ea96592b01bed4c0560e11b65c34ed1b6_sk
? ? ├── signcerts
? ? │???└── cert.pem //賬戶(hù)證書(shū)文件
? ? └── user5 directories, 6 files
?文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-671634.html
關(guān)閉網(wǎng)絡(luò):文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-671634.html
#關(guān)閉網(wǎng)絡(luò)
./network.sh down
到了這里,關(guān)于區(qū)塊鏈hyperledger fabric部署的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!