Author

Topic: Hyperledger Fabric 1.0节点配置随记 (Read 119 times)

member
Activity: 140
Merit: 10
January 12, 2018, 03:55:07 AM
#1
经过前几周的学习和总结,架构设计、源码编译、系统搭建、智能合约这四大要点已足以帮助我们在脑子里形成了一个初步的Fabric 1.0轮廓模型或体系结构,剩下的学习和分析基本上都是一些细节问题,相对来说,比较零零碎碎,涉及环境搭建、系统运维、通信协议、参数配置、应用开发等等,官网上也找不到知识体系完备的文档,因为官方文档也正在编写中,若急于掌握Fabric的部署、运维方面的细节配置项,也只能是分析其源代码了,学习进度就慢了下来。因此接下来的文章内容可能会偏向于学习随记性质。下面是前几篇文章的标题和链接,供参考:

《Hyperledger Fabric 1.0架构浅析》

《Hyperledger Fabric 1.0源码编译—解决网络连接问题》

《Hyperledger Fabric 1.0最简区块链系统搭建与智能合约示例》

http://blocknews.io/portal.php?mod=view&aid=121

http://blocknews.io/portal.php?mod=view&aid=139

http://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

Huh? ├── block_00000000000000000000.json

Huh ?? └── 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": {

Huh "dataHash":
"EXJqBtAHZ7PulvKjR4fxbQh5t6Za+oLINlXjJGEDnBc="

? },

? "data": {

Huh "data": [

[root@localhost chain_foobarchannel]# head -n 6
block_00000000000000000001.json

{

? "header": {

Huh "number": "1",

Huh "previousHash":
"C5g03xpNQzeTur5unjZnC8Bp8lJL9O1EOMDUTiqAOPU=",

Huh "dataHash":
"l9kZwABTykpmEBhJNjlnhBvXuxFOH4yje3iBO5lVZ0Y="

? },

[root@localhost chain_foobarchannel]# head -n 6
block_00000000000000000002.json

{

? "header": {

Huh "number": "2",

Huh "previousHash":
"bAy/aQ8XOIxvGREqMNqNY7T0mvF80K/oSu0rpbQpkcs=",

Huh "dataHash":
"JBZg0qU+Dy2Y1hpmd5o8//yTFAChCUSz7BSr81RaDbM="

? },
Jump to: