hyperledger fabric-1.2 demo部署除錯
最近工作相對輕鬆,玩了一下區塊鏈,儘管幣圈讓人很受傷,但依然不改學習區塊鏈的熱情,這幾天在鋸超級賬本,按照文件部署了第一個demo.這裡做一個記錄.
說實話,走了很多彎路,主要原因是版本適配的問題,hyperledger還是屬於比較新的技術,這就意味著它本身以及demo的迭代速度快,如果對照著之前的部落格或者文章(也許僅僅是幾個月前)部署的話很有可能有問題,走了很多彎路後最終迴歸官方文件,終於部署成功.之所以把這些話放在這裡說是希望大家也不要完全對照這這篇部落格部署,有可能會因為過時造成的環境以及版本問題,但這篇文章是完全按照官方文件的步驟以及結構寫的,因此,大家在看官方文件的時候可以參考.
先高亮一下文件限定的環境(其中打*號的是文件的要求,必須遵守):
文件: https://hyperledger-fabric.readthedocs.io/en/release-1.2/prereqs.html
os:ubuntu 16.4.5
*docker: 17.06.2-ce或更高, 18年版的謹慎使用,不確定會不會有問題,但17年版本經過驗證是可以使用,這裡用的是docker-ce=17.09.0~ce-0~ubuntu這個版本
*docker-compose: 1.14.0版本或更高,這裡用的是1.14.0版本
*go: 1.10.x版本
*node.js 版本:8.9.x or greater 不支援9.x版本, (推薦)npm. 如果node.js是8.9.x的版本預設安裝的npm比較舊,文件推薦安裝5.6.0
*Python: 2.7 尤其是ubuntu 16.04的版本自帶的python是3.5版本,目前fabric的sdk不支援,需要降到2.7版本
目前文件對ubuntu環境的限定就這些,如果部署除錯中有遇到奇怪的問題,先檢查一下上面的環境是否符合文件要求
下面開始安裝環境以及部署babric程式碼:
1.安裝ubuntu 16.04,用virtualbox虛擬機器,找一個16.04的映象,desktop或者server都行,這裡用的是desktop版
2.cURL工具安裝
apt install curl
3.docker安裝
//1.更新apt包
apt-get update
//2.apt倉庫
apt-get install \
apt-transport-https \
ca-certificates \
curl \
software-properties-common
//3.新增GPG key
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
//4.stable倉庫
add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) \
stable"
//5.再次更新aptbao
apt-get update
//6.安裝
apt-get install docker-ce
//7.版本
apt-get install docker-ce=docker-ce=17.09.0~ce-0~ubuntu
4.docker-compose安裝
sudo curl -L "https://github.com/docker/compose/releases/download/1.14.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
5.go安裝
//下載
wget https://storage.googleapis.com/golang/go1.10.linux-amd64.tar.g
//解壓
sudo tar -xvf go1.10.linux-amd64.tar.gz
//環境變數
//進入.profile檔案
vi ~/.profile
//新增如下程式碼並儲存退出
export PATH=$PATH:/usr/local/go/bin
export GOROOT=/usr/local/go
export GOPATH=$HOME/go
export PATH=$PATH:$HOME/go/bin
//重啟源
source ~/.profile
//在home目錄下建立go資料夾
cd ~
mkdir go
6.nodejs安裝
//安裝nvm
curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.1/install.sh | bash
//環境變數
cd ~
vi .bash_profile
//新增如下程式碼並儲存
export NVM_DIR="$HOME/.nvm"
. "$NVM_DIR/nvm.sh"
//重啟源
source .bash_profile
//安裝node
nvm install 8.9.2
//升級
npm install npm@5.6.0 -g
7.python(並檢查版本是否是2.7)
sudo apt-get install python
到此hyperledger的環境安裝完成,下面開始安裝fabric sample
1.clone程式碼
mkdir sample
cd sample
git clone https://github.com/hyperledger/fabric-samples.git
2.下載平臺的二進位制檔案(這裡時間比較久,請耐心等待)
cd fabric-samples
curl -sSL http://bit.ly/2ysbOFE | bash -s 1.2.0
3//構建專案配置資訊
cd first-network
./byfn.sh generate
4.關閉網路以防萬一
./byfn.sh down
5.生成初始區塊
../bin/cryptogen generate --config=./crypto-config.yaml
export FABRIC_CFG_PATH=$PWD
../bin/configtxgen -profile TwoOrgsOrdererGenesis -outputBlock ./channel-artifacts/genesis.block
6.生成通道配置資訊
export CHANNEL_NAME=mychannel && ../bin/configtxgen -profile TwoOrgsChannel -outputCreateChannelTx ./channel-artifacts/channel.tx -channelID $CHANNEL_NAME
7.定義兩個錨節點
../bin/configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org1MSPanchors.tx -channelID $CHANNEL_NAME -asOrg Org1MSP
../bin/configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org2MSPanchors.tx -channelID $CHANNEL_NAME -asOrg Org2MSP
8.啟動網路
docker-compose -f docker-compose-cli.yaml up -d
9.環境變數(org1)
CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/[email protected].example.com/msp
CORE_PEER_ADDRESS=peer0.org1.example.com:7051
CORE_PEER_LOCALMSPID="Org1MSP"
CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt
10.進入容器
docker exec -it cli bash
11.安裝chaincode
11.1 當前終端
//建立通道
export CHANNEL_NAME=mychannel
peer channel create -o orderer.example.com:7050 -c $CHANNEL_NAME -f ./channel-artifacts/channel.tx --tls --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem
//org1加入通道
peer channel join -b mychannel.block
//org2加入通道(以下為一行命令,當然,也可以放在另一個終端中)
CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/[email protected].example.com/msp CORE_PEER_ADDRESS=peer0.org2.example.com:7051 CORE_PEER_LOCALMSPID="Org2MSP" CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt peer channel join -b mychannel.block
//安裝鏈碼
peer chaincode install -n mycc -v 1.0 -p github.com/chaincode/chaincode_example02/go/
11.2 再開啟一個終端對org2安裝chaincode
//環境變數
CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/[email protected].example.com/msp
CORE_PEER_ADDRESS=peer0.org2.example.com:7051
CORE_PEER_LOCALMSPID="Org2MSP"
CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt
//安裝鏈碼並配置channelname變數
export CHANNEL_NAME=mychannel
peer chaincode install -n mycc -v 1.0 -p github.com/chaincode/chaincode_example02/go/
到這裡chaincode已經部署完成,下面可以開始除錯(隨便哪個終端)
1 查詢a賬戶(當前餘額100)
peer chaincode query -C $CHANNEL_NAME -n mycc -c '{"Args":["query","a"]}'
2.轉賬(a>b)
peer chaincode invoke -o orderer.example.com:7050 --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C $CHANNEL_NAME -n mycc --peerAddresses peer0.org1.example.com:7051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt --peerAddresses peer0.org2.example.com:7051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt -c '{"Args":["invoke","a","b","10"]}'
3.查詢a賬戶(當前餘額90)
peer chaincode query -C $CHANNEL_NAME -n mycc -c '{"Args":["query","a"]}'