前面咱們學習了區塊鏈是什麼、還有自動搭建學習東西咱們就要從簡單到深刻(入門到放棄),如今自動部署已經跑通了接下來就是手動搭建Fabric 網絡能夠更好的理解爲何要這麼作。html
# crypto-config.yaml 文件結構 OrdererOrgs: #定義一個Order組織 - Name: Orderer #order節點的名稱,當前網絡模式爲solo類型,因此只定義了一個Order節點 Domain: example.com #order節點的域 Specs: #暫時用不到 - Hostname: orderer - Hostname: orderer2 - Hostname: orderer3 - Hostname: orderer4 - Hostname: orderer5 PeerOrgs: #定義Peer組織 - Name: Org1 #聲明Peer組織名稱爲Org1 Domain: org1.example.com #Org1組織的域 EnableNodeOUs: true #暫時沒搞清楚該字段的意義 Template: #在這裏能夠定義所生成的Org1組織中的Peer節點證書數量,不包括Admin Count: 2 #代表須要生成兩個Peer節點的證書,若是須要其餘數量的Peer節點,只須要更改這裏的數量。 Users: #在這裏能夠定義所生成的Org1組織中類型爲User的證書數量,不包括Admin Count: 1 #生成用戶的證書的數量 - Name: Org2 #聲明第二個Peer組織名稱爲Org2,若是須要更多的Peer組織證書,只須要按該模板添加便可。 Domain: org2.example.com #與以上相同 EnableNodeOUs: true Template: Count: 2 Users: Count: 1
# 會根據crypto-config.yaml文件配置生成兩個錨節點交易,一個對應一個Peer組織 cryptogen generate --config=./crypto-config.yaml #生成系統通道創世區塊genesis.block生成的配置組件位於channel-artifacts目錄下 configtxgen -profile SampleMultiNodeEtcdRaft -channelID byfn-sys-channel -outputBlock ./channel-artifacts/genesis.block #經過環境變量設定通道名稱 export CHANNEL_NAME=mychannel #建立 通道配置 事務 configtxgen -profile TwoOrgsChannel -outputCreateChannelTx ./channel-artifacts/channel.tx -channelID $CHANNEL_NAME #建立 更新組織Org1在該通道上的錨節點(錨節點爲某組織對order可見的節點) 的事務 configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org1MSPanchors.tx -channelID $CHANNEL_NAME -asOrg Org1MSP #建立 更新組織Org2在該通道上的錨節點 的事務 configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org2MSPanchors.tx -channelID $CHANNEL_NAME -asOrg Org2MSP
#啓動fabric網絡 -d用於不顯示網絡的實時日誌,若想查看日誌流,則後續命令須要打開另外一個終端來執行 #首先將first-network目錄下的docker-compose-cli.yaml文件中cli容器配置信息中的FABRIC_LOGGING_SPEC=INFO修改成FABRIC_LOGGING_SPEC=DEBUG以看到更多的執行過程信息 docker-compose -f docker-compose-cli.yaml -f docker-compose-etcdraft2.yaml up -d
啓動網絡以後咱們能夠看到docker啓動的容器
進入容器 建立並加入通道,並指定(更新)組織的錨節點git
#進入cli容器內部 docker exec -it cli bash #配置CLI容器做爲peer0.org1.example.com節點執行命令的環境變量 CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/Admin@org1.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 #以環境變量形式設定通道名稱,必須所有小寫,長度小於250個字符,並與正則表達式[a-z][a-z0-9.-]*匹配 export CHANNEL_NAME=mychannel #將通道配置事務發送給order節點以建立通道,指定order節點的證書以進行TLS握手,執行結束後該節點將收到來自order節點的對應於所建立通道的創世區塊$CHANNEL_NAME.block 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加入通道,注意命令中的$CHANNEL_NAME.block,根據通道名稱而變化 peer channel join -b mychannel.block #指定peer0.org1.example.com做爲組織Org1的錨節點 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 #配置CLI容器做爲peer0.org2.example.com節點執行命令的環境變量 CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/Admin@org2.example.com/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 #將peer0.org2.example.com加入通道,注意命令中的$CHANNEL_NAME.block,根據通道名稱而變化 peer channel join -b mychannel.block #指定peer0.org2.example.com做爲組織Org2的錨節點 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 #下載安裝並定義一個鏈代碼 peer lifecycle chaincode package mycc.tar.gz --path github.com/hyperledger/fabric-samples/chaincode/abstore/go/ --lang golang --label mycc_1
#安裝鏈碼 CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/Admin@org1.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 #安裝鏈碼 peer lifecycle chaincode install mycc.tar.gz #查詢已安裝的鏈碼 peer lifecycle chaincode queryinstalled #後續命令將須要鏈碼包的ID,所以咱們將它保存爲一個環境變量,這個ID是動態的(上面查詢出來的) CC_PACKAGE_ID=mycc_1:3a8c52d70c36313cfebbaf09d8616e7a6318ababa01c7cbe40603c373bcfe173 #制定鏈碼初始化鏈碼TLS後面的命令是要權限才能初始化 #通道中的組織須要就鏈碼的定義達成一致,如下命令用於批准一個chaincode定義,--init-required用於初始化chaincode時使init函數被調用,--package-id指定鏈碼包的ID,咱們還能夠提供--signature-policy或--channel-config-policy參數來設置chaincode背書策略,若未提供將使用默認設置-大多數通道成員背書,這種狀況下若在該渠道中添加或刪除新組織,背書策略將自動更新,以要求更多或更少的背書。在本例中,默認策略將須要來自屬於Org1和Org2的peer的背書(即兩個背書) 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 #更改CLI容器的環境變量後,在其它節點上安裝鏈碼 CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/Admin@org2.example.com/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 #制定鏈碼初始化鏈碼TLS後面的命令是要權限才能初始化 #通道中的組織須要就鏈碼的定義達成一致,如下命令用於批准一個chaincode定義,--init-required用於初始化chaincode時使init函數被調用,--package-id指定鏈碼包的ID,咱們還能夠提供--signature-policy或--channel-config-policy參數來設置chaincode背書策略,若未提供將使用默認設置-大多數通道成員背書,這種狀況下若在該渠道中添加或刪除新組織,背書策略將自動更新,以要求更多或更少的背書。在本例中,默認策略將須要來自屬於Org1和Org2的peer的背書(即兩個背書) 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 #一旦足夠多的通道成員組織批准了chaincode定義,一個成員組織就能夠將定義提交給通道。能夠經過發出如下查詢來檢查chaincode定義是否已準備好提交,並查看當前組織的批准狀況 #查看各組織對chaincode定義的批准情況 peer lifecycle chaincode checkcommitreadiness --channelID $CHANNEL_NAME --name mycc --version 1.0 --init-required --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 --output json #一旦就鏈碼定義達成一致,把兩個組織中的鏈碼提交到order組織--通知給其餘節點我加入了 peer lifecycle chaincode commit -o orderer.example.com:7050 --channelID $CHANNEL_NAME --name mycc --version 1.0 --sequence 1 --init-required --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 --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 #調用chaincode 將--isInit標誌傳遞給鏈碼的第一次調用,並將參數提供給Init函數。第一個調用將啓動chaincode容器。咱們可能須要等待容器啓動。(確保通道名稱和鏈碼名稱正確) peer chaincode invoke -o orderer.example.com:7050 --isInit --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:9051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt -c '{"Args":["Init","a","100","b","100"]}' --waitForEvent #查詢chaincode peer chaincode query -C $CHANNEL_NAME -n mycc -c '{"Args":["query","a"]}' #調用鏈碼的invoke函數,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:9051 --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"]}' --waitForEvent #注:若通道成員組織的其它節點想和區塊鏈網絡進行交互,只須要加入通道並安裝鏈碼包便可,而不須要提交鏈碼定義(每一個組織批准一次鏈碼定義便可)。