前期準備
操作系統:CentOS 7
Fabric版本: 2.0.1
軟件/依賴 | 版本 |
---|---|
go | 1.14.x |
git | 最新版本 |
curl | 最新版本 |
docker | 17.06.2-ce及以上版本 |
docker-compose | 1.14及以上 |
下載fabric-samples源碼:下載地址
證書,創世塊生成
執行目錄: $GOPATH/src/github.com/hyperledger/fabric-samples/first-network
手工生成證書: …/bin/cryptogen 爲二進制工具cryptogen的相對路徑,如果已將cryptogen 設置爲全局使用(/usr/local/bin),則無需提供相對路徑
../bin/cryptogen generate --config=./crypto-config.yaml
生成創世塊: 設置FABRIC_CFG_PATH變量爲當前目錄(configtxgen工具將在FABRIC_CFG_PATH尋找configtx.yaml文件)
export FABRIC_CFG_PATH=$PWD
../bin/configtxgen -profile SampleMultiNodeEtcdRaft -channelID byfn-sys-channel -outputBlock ./channel-artifacts/genesis.block
創建通道,配置交易: 創世塊及後續生成的錨節點配置文件默認存放到first-network的channel-artifacts目錄
export CHANNEL_NAME=mychannel && ../bin/configtxgen -profile TwoOrgsChannel -outputCreateChannelTx ./channel-artifacts/channel.tx -channelID $CHANNEL_NAME
錨節點配置:
../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
啓動網絡
如果要查看網絡的實時日誌,請不要提供-d標誌。再打開一個shell以執行CLI調用。
docker-compose -f docker-compose-cli.yaml -f docker-compose-etcdraft2.yaml up -d
創建,加入通道
docker exec -it cli bash #進入cli窗口
默認當前節點爲peer0.org1.example.com,當需要切換到其它節點執行,修改下面的四個變量的配置,本篇文章使用peer0.org1.example.com,peer0.org2.example.com兩個節點進行手動測試,如需兩組織四節點測試,修改配置按照實例執行命令即可。
CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/[email protected]/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
創建通道: -c指定我們的通道名稱,-f指定生成的通道配置文件(tx後綴的文件)路徑及名稱, 通道名稱必須全部爲小寫字母,少於250個字符,並且與正則表達式[a-z] [a-z0-9 .-] 相匹配
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
節點peer0.org1.example.com加入通道:
peer channel join -b mychannel.block
節點peer0.org2.example.com加入通道:
CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/[email protected]/msp CORE_PEER_ADDRESS=peer0.org2.example.com:9051 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 channel update -o orderer.example.com:7050 -c $CHANNEL_NAME -f ./channel-artifacts/Org1MSPanchors.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
CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/[email protected]/msp CORE_PEER_ADDRESS=peer0.org2.example.com:9051 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 update -o orderer.example.com:7050 -c $CHANNEL_NAME -f ./channel-artifacts/Org2MSPanchors.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
鏈碼週期2.0
package
peer lifecycle chaincode package mycc.tar.gz --path github.com/hyperledger/fabric-samples/chaincode/abstore/go/ --lang golang --label mycc_1
install
peer0.org1.example.com節點安裝鏈碼
peer lifecycle chaincode install mycc.tar.gz
查看已安裝的鏈碼:
peer lifecycle chaincode queryinstalled
返回結果:Package ID:mycc_1:c62d60b38372d28e3e08032d10712d769a533da3f705421f52ece3f7dc788aa6, Label: mycc_1
把查詢已安裝鏈碼得到的packageID作爲環境變量給保存起來:
CC_PACKAGE_ID=mycc_1:c62d60b38372d28e3e08032d10712d769a533da3f705421f52ece3f7dc788aa6
切換到peer0.org2.example.com:
CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/[email protected]/msp
CORE_PEER_ADDRESS=peer0.org2.example.com:9051
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 lifecycle chaincode install mycc.tar.gz
approve
接上面那條命令,當前身份爲peer0.org2.example.com,執行以下命令:
peer lifecycle chaincode approveformyorg --channelID $CHANNEL_NAME --name mycc --version 1.0 --init-required --package-id $CC_PACKAGE_ID --sequence 1 --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
注:一定要用–package-id指定package ID, --init-required去要求在實現鏈碼的時候必須執行init函數
還提供了–signature-policy和–channel-config-policy參數去設置背書策略.背書策略規定了對於一個給定的鏈碼需要不同通道成員的多少Peer去驗證一個交易.這裏因爲未設置策略,mycc將會使用默認的背書策略,提交交易時需要大多數通道成員認可.這意味着新增或者刪除組織時,背書策略要求的背書數量會自動更新.
執行下面命令,查看當前合約是否已被認可
peer lifecycle chaincode checkcommitreadiness --channelID mychannel --name mycc --version 1.0 --sequence 1 --output json --init-required
切換到peer0.org1.example.com
CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/[email protected]/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
組織一同意鏈碼
peer lifecycle chaincode approveformyorg --channelID $CHANNEL_NAME --name mycc --version 1.0 --init-required --package-id $CC_PACKAGE_ID --sequence 1 --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
Commit
peer lifecycle chaincode commit -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 --channelID mychannel --name 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:9051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt --version 1.0 --sequence 1 --init-required
參數含義
–tls 是否啓動tls
–cafile證書路徑
–channelID 智能合約安裝通道
–name 合約名
–version 合約版本
–package-id queryinstalled查詢的合約ID
–sequence 序列號
–waitForEvent 等待peer提交交易返回
–init-required 合約是否必須執行init
–peerAddresses 節點路徑
–tlsRootCertFiles 節點ca根證書路徑(–peerAddresses --tlsRootCertFiles 連用,可多個節點,多個節點即將合約部署到對應節點集合上)
查看節點已提交合約
peer lifecycle chaincode querycommitted --channelID mychannel --name mycc
Init
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 mychannel -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:9051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt --isInit -c '{"Args":["Init","a","100","b","100"]}'
執行query函數
peer chaincode query -C mychannel -n mycc -c '{"Args":["query","a"]}'