3. Fabric核心模块
Fabric是一个由五个核心模块组成的程序组. 在fabric在成功编译完成之后, 一共会有五个核心模块, 如下:
模块名称 | 功能 |
---|---|
peer |
主节点模块, 负责存储区块链数据, 运行维护链码 |
orderer |
交易打包, 排序模块 |
cryptogen |
组织和证书生成模块 |
configtxgen |
区块和交易生成模块 |
configtxlator |
区块和交易解析模块 |
五个模块中
peer
和orderer
属于系统模块,cryptogen
,configtxgen
,configtxlator
属于工具模块。工具模块负责证书文件、区块链创始块、通道创始块等相关文件和证书的生成工作,但是工具模块不参与系统的运行。peer模块和 orderer 模块作为系统模块是Fabric的核心模块,启动之后会以守护进程的方式在系统后台长期运行。Fabric的5个核心模块都是基于命令行的方式运行的,目前Fabric没有为这些模块提供相关的图形界面,因此想要熟练使用Fabric的这些核心模块,必须熟悉这些模块的命令选项。
3.1 cryptogen
cryptogen模块主要用来生成组织结构和账号相关的文件,任何Fabric系统的开发通常都是从cryptogen模块开始的。在Fabric项目中,当系统设计完成之后第一项工作就是根据系统的设计来编写cryptogen的配置文件,然后通过这些配置文件生成相关的证书文件。
cryptogen模块所使用的配置文件是整个Fabric项目的基石。下面我们将介绍cryptogen模块命令行选项及其使用方式。
cryptogen 模块命令
cryptogen模块是通过命令行的方式运行的,一个cryptogen命令由命令行参数和配置文件两部分组成,通过执行命令
cryptogen --help
可以显示cryptogen模块的命令行选项,执行结果如下所示:
1 | cryptogen --help |
cryptogen 模块配置文件
cryptogen模块的配置文件用来描述需要生成的证书文件的特性,比如:有多少个组织有多少个节点,需要多少个账号等。这里我们通过一个cryptogen模块配置文件的具体例子来初步了解配置文件的结构,该例子是Fabric源代码中自带的示例 - crypto-config.yaml:
这个配置文件的名字可以根据自己的意愿进行自定义, 即: xxx.yaml
1 | OrdererOrgs: # 排序节点的组织定义 |
上述模板文件定义了一个orderer节点,这个orderer节点的名字为orderer,orderer节点的根域名为example.com,主机名为orderer。模板文件同时定义了两个组织,两个组织的名字分别为org1 和 org2,其中组织 org1 包含了2个节点和1个用户,组织 org2 包含2个点和1个用户。
除了Fabric源码中提供的例子,还可以通过命令
cryptogen showtemplate
获取默认的模板文件,在实际项目中稍加修改这些默认的模板文件即可使用。
生成证书文件
在任意目录下创建一个新的目录如: MyTestNetWork, 在该目录下左如下操作:
- 编写yaml配置文件 - crypto-config.yaml
- 一个排序节点: orader
- 根域名:wumansgy.com
- 两个组织: java, go
- go
- peer节点数: 3个
- 用户个数: 2个
- 根域名:go.wumansgy.com
- java
- peer节点数: 3个
- 用户个数: 2个
- 根域名: java.wumansgy.com
命令
1
2
3
4
5
6根据默认模板在对应目录下生成证书
cryptogen generate
根据指定的模板在指定目录下生成证书
cryptogen generate --config=./crycrypto-config.yaml --output ./crypto-config
--config: 指定配置文件
--output: 指定证书文件的存储位置, 可以不指定。会在对应路径生成目录,默认名字为:crypto-configFabric证书文件结构
orderer节点
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33查看TestNetWork目录
sgy@ubuntu:~/TestNetWork$ tree -L 2
.
├── crypto-config
│ ├── ordererOrganizations # orderer节点相关的证书文件
│ └── peerOrganizations # 组织相关的证书文件(组织的节点数, 用户数等证书文件)
└── crypto-config.yaml # 配置文件
查看排序节点的证书目录, 进入到 ordererOrganizations 子目录中
sgy@ubuntu:ordererOrganizations$ tree -L 4
.
└── wumansgy.com # 根域名为wumansgy.com的orderer节点的相关证书文件
├── ca # CA服务器的签名文件
│ ├── 94db924d3be00c5adda6ac3c3cb7a5f8b80868681c3dd04b58c2920cdf56fdc7_sk
│ └── ca.wumansgy.com-cert.pem
├── msp
│ ├── admincerts # orderer管理员的证书
│ │ └── Admin@wumansgy.com-cert.pem
│ ├── cacerts # orderer根域名服务器的签名证书
│ │ └── ca.wumansgy.com-cert.pem
│ └── tlscacerts # tls连接用的身份证书
│ └── tlsca.wumansgy.com-cert.pem
├── orderers # orderer节点需要的相关的证书文件
│ └── ubuntu.wumansgy.com
│ ├── msp # orderer节点相关证书
│ └── tls # orderer节点和其他节点连接用的身份证书
├── tlsca
│ ├── de45aeb112ee820197f7d4d475f2edbeb1705d53a690f3537dd794b66de1d6ba_sk
│ └── tlsca.wumansgy.com-cert.pem
└── users # orderer节点用户相关的证书
└── Admin@wumansgy.com
├── msp
└── tls在实际开发中orderer节点这些证书其实不需要直接使用, 只是在orderer节点启动时指明项目的位置即可。
Peer节点
进入到 peerOrganizations 子目录中, 我们详细介绍这些证书的种类和作用。由于每个组织的目录结构都是一样的, 所以我们只对其中一个组织的目录进行详细介绍。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93查看 peerOrganizations 子目录中内容
sgy@ubuntu:peerOrganizations$ tree -L 1
.
├── go.wumansgy.com # go组织
└── java.wumansgy.com # java组织
进入go.wumansgy.com 组织目录中
sgy@ubuntu:go.wumansgy.com$ tree -L 4
.
├── ca # 根节点签名证书
│ ├── 4a367bf9e43142846e7c851830f69f72483ecb7a6def7c782278a9808bbb5fb0_sk
│ └── ca.go.wumansgy.com-cert.pem
├── msp
│ ├── admincerts # 组织管理员的证书
│ │ └── Admin@go.wumansgy.com-cert.pem
│ ├── cacerts # 组织的根证书
│ │ └── ca.go.wumansgy.com-cert.pem
│ ├── config.yaml
│ └── tlscacerts # TLS连接身份证书
│ └── tlsca.go.wumansgy.com-cert.pem
├── peers
│ ├── peer0.go.wumansgy.com
│ │ ├── msp
│ │ │ ├── admincerts # 组织的管理证书, 创建通道必须要有该证书
│ │ │ ├── cacerts # 组织根证书
│ │ │ ├── config.yaml
│ │ │ ├── keystore # 当前节点的私钥
│ │ │ ├── signcerts # 当前节点签名的数字证书
│ │ │ └── tlscacerts # tls连接的身份证书
│ │ └── tls
│ │ ├── ca.crt # 组织的根证书
│ │ ├── server.crt # 验证本节点签名的证书
│ │ └── server.key # 当前节点的私钥
│ ├── peer1.go.wumansgy.com
│ │ ├── msp
│ │ │ ├── admincerts
│ │ │ ├── cacerts
│ │ │ ├── config.yaml
│ │ │ ├── keystore
│ │ │ ├── signcerts
│ │ │ └── tlscacerts
│ │ └── tls
│ │ ├── ca.crt
│ │ ├── server.crt
│ │ └── server.key
│ └── peer2.go.wumansgy.com
│ ├── msp
│ │ ├── admincerts
│ │ ├── cacerts
│ │ ├── config.yaml
│ │ ├── keystore
│ │ ├── signcerts
│ │ └── tlscacerts
│ └── tls
│ ├── ca.crt
│ ├── server.crt
│ └── server.key
├── tlsca
│ ├── 3273887b1da2f27a6cbad3ac4acb0379df3d7858e0553a91fb9acb93da50b670_sk
│ └── tlsca.go.wumansgy.com-cert.pem
└── users
├── Admin@go.wumansgy.com
│ ├── msp
│ │ ├── admincerts # 组织的根证书, 作为管理身份的验证
│ │ ├── cacerts # 用户所属组织的根证书
│ │ ├── keystore # 用户私钥
│ │ ├── signcerts # 用户的签名证书
│ │ └── tlscacerts # tls连接通信证书, sdk客户端使用
│ └── tls
│ ├── ca.crt # 组织的根证书
│ ├── client.crt # 客户端身份的证书
│ └── client.key # 客户端的私钥
├── User1@go.wumansgy.com
│ ├── msp
│ │ ├── admincerts
│ │ ├── cacerts
│ │ ├── keystore
│ │ ├── signcerts
│ │ └── tlscacerts
│ └── tls
│ ├── ca.crt
│ ├── client.crt
│ └── client.key
└── User2@go.wumansgy.com
├── msp
│ ├── admincerts
│ ├── cacerts
│ ├── keystore
│ ├── signcerts
│ └── tlscacerts
└── tls
├── ca.crt
├── client.crt
└── client.key
3.2 configtxgen
configtxgen 模块的功能一共有两个:
- 生成 orderer 节点的初始化文件
- 生成 channel 的初始化文件
configtxgen 模块命令
configtxgen 模块是通过命令行的方式运行的,通过执行命令
configtxgen --help
可以显示 configtxgen 模块的命令行选项,执行结果如下所示:
1 | configtxgen --help |
configtxgen模块配置文件
configtxgen 模块的配置文件包含Fabric系统初始块、Channel初始块文件等信息。configtxgen 模块的配置文件样例如下所示,以下部分定义了整个系统的配置信息:
1 | Profiles: |
上述配置文件中的 Profiles节点定义了整个系统的结构和channel的结构, 配置文件中的
Profiles
关键字不允许修改,否则配置无效。系统配置信息中设置了系统中orderer节点的信息以及系统中包含的组织数。
configtxgen 的使用
为了统一管理,我们可以将生成的初始块文件放入指定目录中,如:channel-artifacts,我们在TestNetWork目录中创建该子目录。
configtxgen 命令在执行的时候需要加载一个叫做configtx.yaml的配置文件, 如果没有指定默认重命令执行的当前目录查找,我们可以通过参数 `-configPath`进行指定,也可以将这个目录设置到环境变量`FABRIC_CFG_PATH`中。
export FABRIC_CFG_PATH=$(pwd)/networks/config/
创建
orderer
的初始块1
2
3sgy@ubuntu:TestNetWork$ configtxgen -profile ItcastOrgOrdererGenesis -outputBlock ./channel-artifacts/genesis.block
ItcastOrgOrdererGenesis: 要和配置文件中的配置项对应, 可以由数字和字母构成.
orderer初始块文件为genesis.block,生成在channel-artifacts目录中创建
channel
的初始块1
2
3
4sgy@ubuntu:TestNetWork$ configtxgen -profile TwoOrgsChannel -outputCreateChannelTx ./channel-artifacts/channel.tx -channelID mychannel
TwoOrgsChannel: 要和配置文件中的配置项对应
channel.tx 为生成的频道文件, 在channel-artifacts目录中
创建的频道名称为: mychannel创建锚点更新文件 - 每个组织分别进行更新
1
2
3
4
5
6
7
8
9更新第一个组织 OrgGoMSP 的peer节点
sgy@ubuntu:TestNetWork$ configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/GoMSPanchors.tx -channelID mychannel -asOrg OrgGoMSP
TwoOrgsChannel: 要和配置文件中的配置项对应
OrgGoMSP组织使用的频道为 mychannel 生成的配置信息文件名为 GoMSPanchors.tx
==============================================================================
更新第2个组织 OrgJavaMSP 的peer节点
sgy@ubuntu:TestNetWork$ configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/JavaMSPanchors.tx -channelID mychannel -asOrg OrgJavaMSP
TwoOrgsChannel: 要和配置文件中的配置项对应
OrgJavaMSP组织使用的频道为 mychannel 生成的配置信息文件名为 JavaMSPanchors.tx
3.3 orderer
orderer 模块负责对交易进行排序, 并将排序好的交易打包成区块。orderer节点的配置信息通常放在环境变量或者配置文件中,在具体操作中,如果是通过docker镜像文件的方式启动orderer,推荐使用环境变量的方式,如果是采用命令的方式直接启动,推荐将所有的信息放到配置文件中。下面将会详细介绍其用到的环境变量。
orader配置文件可参考实例程序中的
orderer.yaml
~/hyperledger-fabric/fabric-samples/config/orderer.yaml
orderer模块命令
1 | orderer --help |
orderer模块的配置信息
1 | orderer节点运行需要配置一些环境变量 |
3.4 peer
peer模块是Fabric中最重要的模块,也是在Fabric系统使用最多的模块。peer模块在Fabric中被称为主节点模块,主要负责存储区块链数据、运行维护链码、提供对外服务接口等作用。
命令行和常用参数
1 | 通过docker启动peer节点的镜像文件, 可查看相关操作命令 |
peer channel子命令
peer channel的子命令可以通过
peer channel --help
进行查看. 这里介绍一个这些子命令可以共用的一些参数:
--cafile
: 当前orderer节点pem格式的tls证书文件, 要使用绝对路径.
crypto-config/ordererOrganizations/wumansgy.com/orderers/ubuntu.wumansgy.com/msp/tlscacerts/tlsca.wumansgy.com-cert.pem
-o, --orderer
: orderer节点的地址
--tls
: 通信时是否使用tls加密
create - 创建通道
命令:
peer channel create [flags]
, 可用参数为:-c, --channelID
: 要创建的通道的ID, 必须小写, 在250个字符以内-f, --file
: 由configtxgen 生成的通道文件, 用于提交给orderer-t, --timeout
: 创建通道的超时时长
1
peer channel create -o orderer.wumansgy.com:7050 -c wumansgychannel -f ./channel-artifacts/channel.tx --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/wumansgy.com/msp/tlscacerts/tlsca.wumansgy.com-cert.pem
join - 将peer加入到通道中
命令:
peer channel join[flags]
, 可用参数为:-b, --blockpath
: 通道文件
1
peer channel join -b wumansgychannel.block
list - 列出peer加入的通道
1
peer channel list
update - 更新
命令:
peer channel update [flags]
, 可用参数为:-c, --channelID
: 要创建的通道的ID, 必须小写, 在250个字符以内-f, --file
: 由configtxgen 生成的组织锚节点文件, 用于提交给orderer
1
peer channel update -o orderer.example.com:7050 -c wumansgychannel -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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15peer 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
sgy@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的名字。
1
2peer 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 wumansgychannel -n mycc -l golang -v 1.0 -c '{"Args":["init","a","100","b","200"]}' -P "AND ('Org1MSP.member', 'Org2MSP.member')"
instantiate命令成功执行之后,可以通过docker ps命令查看己经启动的运行Chaincode的docker容器。invoke
invoke命令用来调用chaincode。invoke命令的选项如下所示:
-C,--channelID
:当前命令运行的通道,默认值是“testchainid"
-c, --ctor
:JSON格式的构造参数,默认值是“{}"
-n,--name
:Chaincode的名字。
1
2调用示例
peer chaincode invoke -o orderer.test.com:7050 -C testchannel -n testcc --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/test.com/orderers/orderer.test.com/msp/tlscacerts/tlsca.test.com-cert.pem --peerAddresses peer0.orgGo.test.com:7051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/orgGo.test.com/peers/peer0.orgGo.test.com/tls/ca.crt --peerAddresses peer0.orgcpp.test.com:7051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/orgcpp.test.com/peers/peer0.orgcpp.test.com/tls/ca.crt -c '{"Args":["invoke","a","b","10"]}'list
list命令用来查询已经安装的Chaincode,list命令的选项如下所示:
-C,--channelID
:当前命令运行的通道,默认值是“testchainid"
--installed
:获取当前Peer节点已经被安装的chaincode--instantiated
:获取当前channel中已经被实例化的chaincode
1
2调用示例
peer chaincode list --installedpackage
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
等命令
1
2调用示例
peer chaincode package — github.com/hyperledger/fabric/examples/chaincode/go/example —n mycc —v 1.0 -s —S -i "OR ('Org1MSP.member','Org2MSP.member')" mycc.1.0.outquery
query命令用来执行chaincode代码中的query方法。query命令的选项如下:
-C,--channelID
:当前命令运行的通道,默认值是“testchainid"
-c, --ctor
:JSON格式的构造参数,默认值是“{}"
-x,--hex
:是否对输出的内容进行编码处理-n,--name
:Chaincode的名字。-r,--raw
:是否输出二进制内容-t, --tid
: 指定当前查询的编号
1
2调用示例
peer chaincode query -C testchannel -n testcc -c '{"Args":["query","a"]}'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的名字。
1
peer chaincode upgrade -o orderer.example.com:7050 -n mycc -v 1.1 -C mychannel -c '{"Args":["init","a","100","b","200"]}'
peer 的环境变量
1 | 配置文件和环境变量是设置peer启动参数的重要手段, 相关环境变量如下: |
每个 org 会选举出一个 **leader peer**(实际上可以存在多个),负责连接到 orderer。**leader peer**从orderer 拿到新块的信息后分发给其他 peer。
静态选择leader peer
1
2
3
4
5
6 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
1
2
3 export CORE_PEER_GOSSIP_USELEADERELECTION=true
export CORE_PEER_GOSSIP_ORGLEADER=false
peer 默认监听的端口
下面是Hyperledger中相关监听的服务端口(默认)
- 7050: REST 服务端口
- 7051:peer gRPC 服务监听端口
- 7052:peer 代码调试模式使用的端口
- 7053:peer 事件服务端口
- 7054:eCAP
- 7055:eCAA
- 7056:tCAP
- 7057:tCAA
- 7058:tlsCAP
- 7059:tlsCAA