主要讲Fabric核心模块中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 --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
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启动参数的重要手段, 相关环境变量如下:
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/[email protected]/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
下面是Hyperledger中相关监听的服务端口(默认)
- 7050: REST 服务端口
- 7051:peer gRPC 服务监听端口
- 7052:peer CLI 端口
- 7053:peer 事件服务端口
- 7054:eCAP
- 7055:eCAA
- 7056:tCAP
- 7057:tCAA
- 7058:tlsCAP
- 7059:tlsCAA