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