Fabric核心模块之Peer解析
主要講Fabric核心模塊中Peer
Peer模塊命令
peer模塊是Fabric中最重要的模塊,也是在Fabric系統使用最多的模塊。peer模塊在Fabric中被稱為主節點模塊,主要負責存儲區塊鏈數據、運行維護鏈碼、提供對外服務接口等作用。
命令行和常用參數
# 通過docker啟動peer節點的鏡像文件
$ docker run -it hyperledger/fabric-peer bash
$ peer --help
Usage:
? peer [command]
Available Commands:
? `chaincode`?? 相關的子命令:
? ?? ??? ?`install`
? ?? ??? ?`instantiate`
? ?? ??? ?`invoke`
? ?? ??? ?`package`
? ?? ??? ?`query`
? ?? ??? ?`signpackage`
? ?? ??? ?`upgrade`
? ?? ??? ?`list`
? channel???? 通道操作: create|fetch|join|list|update|signconfigtx|getinfo.
? help??????? 查看相關命令的幫助信息
? logging???? 日志級別: getlevel|setlevel|revertlevels.
? node??????? node節點操作: start|status.
? version???? 當前peer的版本.
Flags:
? -h, --help?????????????????? help for peer
????? --logging-level string?? Default logging level and overrides, see core.yaml for full syntax
peer channel子命令
??? peer channel的子命令可以通過 peer channel --help進行查看. 這里介紹一個這些子命令可以共用的一些參數:
??????? --cafile: 當前orderer節點pem格式的tls證書文件, 要使用絕對路徑.
??????? crypto-config/ordererOrganizations/itcast.com/orderers/ubuntu.itcast.com/msp/tlscacerts/tlsca.itcast.com-cert.pem
??????? -o, --orderer: orderer節點的地址
??????? --tls: 通信時是否使用tls加密
??? create - 創建通道
??????? 命令: peer channel create [flags], 可用參數為:
??????????? -c, --channelID: 要創建的通道的ID, 必須小寫, 在250個字符以內
??????????? -f, --file: 由configtxgen 生成的通道文件, 用于提交給orderer
??????????? -t, --timeout: 創建通道的超時時長
??? $ peer channel create -o ubuntu.itcast.com:7050 -c $CHANNEL_NAME -f ./channel-artifacts/channel.tx --tls $CORE_PEER_TLS_ENABLED --cafile $ORDERER_CA
??? join - 將peer加入到通道中
??????? 命令: peer channel join[flags], 可用參數為:
??????????? -b, --blockpath: genesis創始塊文件
??? $ peer channel join -b mychannel.block
??? list - 列出peer加入的通道
??? $ peer channel list
??? update - 更新
??????? 命令: peer channel update [flags], 可用參數為:
??????????? -c, --channelID: 要創建的通道的ID, 必須小寫, 在250個字符以內
??????????? -f, --file: 由configtxgen 生成的組織錨節點文件, 用于提交給orderer
??? $ peer channel update -o orderer.example.com:7050 -c mychannel -f ./channel-artifacts/Org1MSPanchors.tx --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
peer chaincode 子命令
??? chaincode一共有四個公共參數選項, 這些選項所有的子命令都可以使用, 他們分別是:
??????? --cafile: PEM格式證書的位置
??????? -o, --orderer: orderer服務器的訪問地址
??????? --tls: 使用orderer的TLS證書位置
??????? --transient: JSON參數的編碼映射
chaincode命令的運行需要一些參數,這些參數可以是配置文件也可以是環境變量,由于涉及的參數并不是很多,因此大多數時候都會采用環境變量的方式來設置參數。
??? install
??????? install命令負責安裝chaincode,在這個過程中如果chaincode的源代碼存在語法錯誤,install命令會報錯。install命令的選項如下所示:
??????????? -c, --ctor: JSON格式的構造參數, 默認是"{}"
??????????? -l, --lang: 編寫chaincode的編程語言, 默認值是 golang
??????????? -n, --name: chaincode的名字
??????????? -p, --path: chaincode源代碼的名字
??????????? -v, --version: 當前操作的chaincode的版本, 適用這些命令install/instantiate/upgrade
??? $ peer chaincode install -n mycc -v 1.0 -l golang -p github.com/chaincode/chaincode_example02/go/
??? # 安裝成功之后, 會在peer模塊的數據文件中生成一個由 -n 參數和 -v 參數組成的文件,在本例中為:
??? $ docker-compose -f docker-compose-cli.yaml images
????????? Container????????????????? Repository??????????? Tag????? Image Id????? Size ?
??? ------------------------------------------------------------------------------------
??? cli????????????????????? hyperledger/fabric-tools???? 1.2.0?? 379602873003?? 1.41 GB
??? orderer.example.com????? hyperledger/fabric-orderer?? 1.2.0?? 4baf7789a8ec?? 145 MB
??? peer0.org1.example.com?? hyperledger/fabric-peer????? 1.2.0?? 82c262e65984?? 151 MB
??? peer0.org2.example.com?? hyperledger/fabric-peer????? 1.2.0?? 82c262e65984?? 151 MB
??? peer1.org1.example.com?? hyperledger/fabric-peer????? 1.2.0?? 82c262e65984?? 151 MB
??? peer1.org2.example.com?? hyperledger/fabric-peer????? 1.2.0?? 82c262e65984?? 151 MB
??? itcast@ubuntu:first-network$ docker exec -it peer0.org1.example.com bash
??? root@661a44ad6677:/opt/gopath/src/github.com/hyperledger/fabric/peer# find / -name mycc.1.0
??? /var/hyperledger/production/chaincodes/mycc.1.0?? ?# 查詢到的結果 - mycc.1.0
??? # 通過find命令搜索到的 mycc.1.0 文件就是chaincode打包之后的文件
??? instantiate
??????? instantiate可以對已經執行過instanll命令的Chaincode進行實例化,instantiate命令執行完成之后會啟動Chaincode運行的Docker鏡像,同時instantiate命令還會對Chaincode進行初始化。instantiate命令的選項如下所示:
??????????? -C,--channelID:當前命令運行的通道,默認值是“testchainid"。
??????????? -c, --ctor:JSON格式的構造參數,默認值是“{}"
??????????? -E , --escc : 應用于當前Chaincode的系統背書Chaincode的名字。
??????????? -l,--lang:編寫Chaincode的編程語言,默認值是golang
??????????? -n,--name:Chaincode的名字。
??????????? -P,--policy:當前Chaincode的背書策略。
??????????? -v,--version:當前操作的Chaincode的版本,適用于install/instantiate/upgrade等命令
??????????? -V,--vscc:當前Chaincode調用的驗證系統Chaincode的名字。
??? $ peer chaincode instantiate -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 -l golang -v 1.0 -c '{"Args":["init","a","100","b","200"]}' -P "AND ('Org1MSP.member', 'Org2MSP.member')"
??? # instantiate命令成功執行之后,可以通過dockerps命令查看己經啟動的運行Chaincode的docker容器。
??? invoke
??????? invoke命令用來調用chaincode。invoke命令的選項如下所示:
??????????? -C,--channelID:當前命令運行的通道,默認值是“testchainid"
??????????? -c, --ctor:JSON格式的構造參數,默認值是“{}"
??????????? -n,--name:Chaincode的名字。
??? # 調用示例
??? $ peer chaincode invoke -o orderer.example.com:7050? -C mychannel -n mycc -c '{"Args":["invoke","a","b","10"]}'
??? list
??????? list命令用來查詢已經安裝的Chaincode,list命令的選項如下所示:
??????????? -C,--channelID:當前命令運行的通道,默認值是“testchainid"
??????????? --installed:獲取當前Peer節點已經被安裝的chaincode
??????????? --instantiated:獲取當前channel中已經被實例化的chaincode
??? # 調用示例
??? $ peer chaincode list --installed
??? package
??????? package用來將Chaincode打包。package命令的選項如下所示:
??????????? -s,--cc-package:對打包后的Chaincode進行簽名。
??????????? -c, --ctor:JSON格式的構造參數,默認值是“{}"
??????????? -i,--instantiate-policy:Chaincode的權限
??????????? -l,--lang:編寫Chaincode的編程語言,默認值是golang
??????????? -n,--name:Chaincode的名字。
??????????? -p,--path:Chaincode源代碼的路徑。
??????????? -S,--sign:對打包的文件用本地的MSP進行簽名。
??????????? -v,--version:當前操作的Chaincode的版本,適用于install/instantiate/upgrade等命令
??? # 調用示例
??? $ peer chaincode package —P github.com/hyperledger/fabric/examples/chaincode/go/example? —n mycc —v 1.0 -s —S -i "OR ('Org1MSP.member','Org2MSP.member')" mycc.1.0.out
??? query
??????? query命令用來執行chaincode代碼中的query方法。query命令的選項如下:
??????????? -C,--channelID:當前命令運行的通道,默認值是“testchainid"
??????????? -c, --ctor:JSON格式的構造參數,默認值是“{}"
??????????? -x,--hex:是否對輸出的內容進行編碼處理
??????????? -n,--name:Chaincode的名字。
??????????? -r,--raw:是否輸出二進制內容
??????????? -t, --tid: 指定當前查詢的編號
??? # 調用示例
??? $ peer chaincode query -C mychannel -n mycc -c '{"Args":["query","a"]}'
??? signpackage
??? # 對打包好的chaincode進行簽名
??? # 示例調用
??? $ peer chaincode signpackage mycc.1.0.out sign_mycc.1.0.out
??? upgrade
??????? upgrade用來更新已經存在的chaincode。命令選項如下:
??????????? -C,--channelID:當前命令運行的通道,默認值是“testchainid"
??????????? -c, --ctor:JSON格式的構造參數,默認值是“{}"
??????????? -E , --escc : 應用于當前Chaincode的系統背書Chaincode的名字。
??????????? -l,--lang:編寫Chaincode的編程語言,默認值是golang
??????????? -n,--name:Chaincode的名字。
??????????? -p, --path: chaincode源代碼的名字
??????????? -P,--policy:當前Chaincode的背書策略。
??????????? -v,--version:當前操作的Chaincode的版本,適用于install/instantiate/upgrade等命令
??????????? -V,--vscc:當前Chaincode調用的驗證系統Chaincode的名字。
??? $ peer chaincode upgrade -o orderer.example.com:7050 -n mycc -v 1.1 -C mychannel -c '{"Args":["init","a","100","b","200"]}'
peer 的環境變量
# 配置文件和環境變量是設置peer啟動參數的重要手段, 相關環境變量如下:
CORE_VM_ENDPOINT?? ?# docker服務器的Deamon地址, 默認取端口的套接字, 如下:
?? ?- `unix:///var/run/docker.sock
CORE_VM_DOCKER_HOSTCONFIG_NETWORKMODE?? ?# chaincode容器的網絡命名模式, 自己取名即可
?? ?- `節點運行在同一個網絡中才能相互通信, 不同網絡中的節點相互隔離
CORE_PEER_PROFILE_ENABLED?? ?# 使用peer內置的 profile server
?? ?- `fabric的peer內置有profile server,默認時運行在6060端口上的,并且默認關閉。
CORE_LOGGING_LEVEL?? ??? ?# log日志的級別
?? ?- `critical | error | warning | notice | info | debug
CORE_PEER_ID?? ?# peer節點的編號, 自定義一個即可
CORE_PEER_GOSSIP_USELEADERELECTION?? ?# 是否自動選舉leader節點, 自動:true
CORE_PEER_GOSSIP_ORGLEADER?? ??? ??? ?# 當前節點是否為leader節點, 是:true
CORE_PEER_ADDRESS?? ??? ??? ??? ??? ?# 當前peer節點的訪問地址
?? ?- `格式: 域名:端口 / IP:端口
CORE_PEER_CHAINCODELISTENADDRESS?? ?# chaincode的監聽地址
CORE_PEER_GOSSIP_EXTERNALENDPOINT?? ?# 節點被組織外節點感知時的地址
?? ?- `默認為空, 代表不被其他組織節點所感知
CORE_PEER_GOSSIP_BOOTSTRAP?? ?# 啟動節點后向哪些節點發起gossip連接, 以加入網絡
?? ?- `這些節點與本地節點需要屬于同一個網絡
CORE_PEER_LOCALMSPID ?? ?# peer節點所屬的組織的編號, 在configtxgen.yaml中設置的
CORE_CHAINCODE_MODE?? ??? ?# chaincode的運行模式
?? ?- `net: 網絡模式
?? ?- `dev: 開發模式, 該模式下可以在容器外運行chaincode
CORE_PEER_MSPCONFIGPATH?? ?# 當前節點的msp文件路徑
?? ?- `啟動peer的時候需要使用msp賬號文件
?? ?- `crypto-config/peerOrganizations/org1.x.com/peers/peer0.org1.x.com/msp
?? ?- `創建channel的時候需要使用msp賬號文件
?? ?- `crypto-config/peerOrganizations/org1.x.com/users/Admin@org1.x.com/msp
CORE_PEER_TLS_ENABLED?? ?# 是否激活tls, 激活:true, 不激活:false
CORE_PEER_TLS_CERT_FILE?? ?# 服務器身份驗證證書
?? ?- `crypto-config/peerOrganizations/org1.x.com/peers/peer0.org1.x.com/tls/server.crt
CORE_PEER_TLS_KEY_FILE?? ?# 服務器的私鑰文件
?? ?- `crypto-config/peerOrganizations/org1.x.com/peers/peer0.org1.x.com/tls/server.key
CORE_PEER_TLS_ROOTCERT_FILE?? ?# 根服務器證書
?? ?- `crypto-config/peerOrganizations/org1.x.com/peers/peer0.org1.x.com/tls/ca.crt
??? 每個 org 會選舉出一個 leader peer(實際上可以存在多個),負責連接到 orderer。leader peer從orderer 拿到新塊的信息后分發給其他 peer。
??????? 靜態選擇leader peer
??????? export CORE_PEER_GOSSIP_USELEADERELECTION=false
??????? export CORE_PEER_GOSSIP_ORGLEADER=true #指定某一個peer為leader peer
??????? # 1. 如果都配置為 false,那么 peer 不會嘗試變成一個 leader
??????? # 2. 如果都配置為 true,會引發異常
??????? # 3. 靜態配置的方式,需要自行保證 leader 的可用性
??????? 動態選擇leader peer
??????? export CORE_PEER_GOSSIP_USELEADERELECTION=true
??????? export CORE_PEER_GOSSIP_ORGLEADER=false
peer 默認監聽的端口
??? 下面是Hyperledger中相關監聽的服務端口(默認)
??????? 7050: REST 服務端口
??????? 7051:peer gRPC 服務監聽端口
??????? 7052:peer CLI 端口
??????? 7053:peer 事件服務端口
??????? 7054:eCAP
??????? 7055:eCAA
??????? 7056:tCAP
??????? 7057:tCAA
??????? 7058:tlsCAP
??????? 7059:tlsCAA
總結
以上是生活随笔為你收集整理的Fabric核心模块之Peer解析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Gossip 数据传播协议
- 下一篇: Gossip数据传播协议