经过前几周的学习和总结,架构设计、源码编译、系统搭建、智能合约这四大要点已足以帮助我们在脑子里形成了一个初步的Fabric 1.0轮廓模型或体系结构,剩下的学习和分析基本上都是一些细节问题,相对来说,比较零零碎碎,涉及环境搭建、系统运维、通信协议、参数配置、应用开发等等,官网上也找不到知识体系完备的文档,因为官方文档也正在编写中,若急于掌握Fabric的部署、运维方面的细节配置项,也只能是分析其源代码了,学习进度就慢了下来。因此接下来的文章内容可能会偏向于学习随记性质。下面是前几篇文章的标题和链接,供参考:
《Hyperledger Fabric 1.0架构浅析》
《Hyperledger Fabric 1.0源码编译—解决网络连接问题》
《Hyperledger Fabric 1.0最简区块链系统搭建与智能合约示例》
http://blocknews.io/portal.php?mod=view&aid=121http://blocknews.io/portal.php?mod=view&aid=139http://blocknews.io/portal.php?mod=view&aid=164本篇先简述一下Fabric区块链网络节点的构成,再给出节点配置文件相关的内容。
?
Fabric区块链网络节点关系:
?
A组织成员和B组织成员都分别拥有多个Peer节点,并接入Ordering Service(共识排序系统),这些节点中又有所区分,总结如下:
若成员X需要和Ordering Service通信,那就必须拥有Leading Peer节点,Leading Peer节点可以被动态选举出来,也可以静态指定;
若成员X需要同一通道内的其他成员知道其存在,并为其他成员的节点提供区块数据同步服务,就必须拥有Anchor
Peer节点;
成员X还可以拥有其他备份节点,既不是Leading Peer节点也不是Anchor Peer节点,但是可以和成员X的其他节点同步并备份区块数据,并作为Leading Peer的候选者;
同一成员或不同成员的Peer节点都是通过Gossip协议交换数据。若某成员只有一个Peer节点,那么这个Peer节点可以被配置成既是Leading Peer节点又是Anchor Peer节点,但这有单点故障风险。
?
Ordering Service (Orderer)可以有多种类型,目前官方支持的有单节点(SOLO),Kafka集群,SBFT共识网络。Ordering Service被Fabric 1.0 设计与实现者单独抽取出来,提供共识排序服务,SOLO类型一般只在研究学习、开发、测试的场景下使用。
?
Fabric区块链网络节点配置:
?
Peer节点的配置文件core.yaml和Orderer节点的配置文件orderer.yaml里的配置项比较多,官方还找不到详细的文档描述,只有配置文件里出现了一些注释性质的描述,只能分析代码之后才能得出精确含义,这需要一段时间之后才能写出文章分享之。下面给先出一点实践内容,可供Fabric初学者参考,这些都是一点一点分析出来的:
?
用“lsof -p 进程号”查看peer进程打开的文件,可以发现Peer节点的配置文件在Fabric源码目录下的路径为:
/opt/gopath/src/github.com/hyperledger/fabric/peer/core.yaml,同样的方法可以找到Orderer的配置文件路径为:
/opt/gopath/src/github.com/hyperledger/fabric/orderer/orderer.yaml
?
Orderer节点可以选择将账本记录在内存或文件系统中,配置文件中提供了三种类型的账本记录方式:ram(区块存储在内存中)、json(以JSON格式存储区块到文件中)、file(二进制格式存储区块到文件中)。ram和json可以用于开发测试,实际生产环境用file类型。
?
Orderer节点在内存模式下运行,这时候若用“lsof -p orderer进程号”查看,就会发现orderer进程没有打开任何数据文件。刚开始搭建区块链网络的时候,发现只要重启Orderer服务后,再启动Peer节点时,就会报错,原因就是因为在源码目录下的配置文件里默认生效的是ram模式,修改为file模式,重启服务后,启动Peer节点就不会再报相同的错误了。
?
打开文件orderer.yaml,找到General的配置子项LedgerType,将其设置为json类型:
LedgerType: json
然后再找到FileLedger的配置子项Location,为账本区块指定某个存储位置:
Location:
/var/hyperledger-orderer
按照上一篇文章给出的步骤,搭建一个最简系统测试一下,可以看到JSON格式的区块文件:
[root@localhost hyperledger-orderer]# pwd
/var/hyperledger-orderer
[root@localhost hyperledger-orderer]# tree
.
├── chain_foobarchannel
│?? ├── block_00000000000000000000.json
│?? ├── block_00000000000000000001.json
│?? ├── block_00000000000000000002.json
│?? └── block_00000000000000000003.json
└── chain_testchainid
? ├── block_00000000000000000000.json
?? └── block_00000000000000000001.json
?
2 directories, 6 files
?
因为文件内容可能比较多,可以用“head -n 6 xxx.json”查看一下文件头部,就可以看到xxx区块文件中的区块链接Hash值:
?
[root@localhost chain_foobarchannel]# head -n 6 block_00000000000000000000.json
{
? "header": {
"dataHash":
"EXJqBtAHZ7PulvKjR4fxbQh5t6Za+oLINlXjJGEDnBc="
? },
? "data": {
"data": [
[root@localhost chain_foobarchannel]# head -n 6
block_00000000000000000001.json
{
? "header": {
"number": "1",
"previousHash":
"C5g03xpNQzeTur5unjZnC8Bp8lJL9O1EOMDUTiqAOPU=",
"dataHash":
"l9kZwABTykpmEBhJNjlnhBvXuxFOH4yje3iBO5lVZ0Y="
? },
[root@localhost chain_foobarchannel]# head -n 6
block_00000000000000000002.json
{
? "header": {
"number": "2",
"previousHash":
"bAy/aQ8XOIxvGREqMNqNY7T0mvF80K/oSu0rpbQpkcs=",
"dataHash":
"JBZg0qU+Dy2Y1hpmd5o8//yTFAChCUSz7BSr81RaDbM="
? },