在之前的文章我们已经介绍了快速在本地运行Fabric,以及介绍了Fabric的模型和工具。本次我们会手工运行Fabric的工具,手动搭建一个Fabric网络,来巩固和熟悉Fabirc。
在开始搭建之前我们需要先提一下Fabric的身份认证。之前我们说过Fabric是支持安全认证的,而Fabric的安全认证则是通过PKI
(Public Key Infrastructure)方式认证的。
Fabric的PKI认证流程
Fabric默认采用业界比较普遍的X.509
协议证书,同时这也是ssl证书普遍采用的格式。这套PKI体系有以下四个关键要素:
- 数字证书
- 公钥私钥对
- 认证中心(CA)
- 证书吊销列表
有关PKI体系的流程可以参考这篇文章。在整套PKI体系中,最重要的莫过于CA
了,CA机构必须具有权威性和公正性,所以在Fabric网络中,直接内置了一个Fabric CA。但是注意,Fabirc CA是可选组件,你完全可以自建CA或者直接使用第三方可靠的CA。
Fabric CA的使用方式参考官方文档
动手自己搭建一个Fabric网络
之前如果运行过官方的Sample的话,会以脚本的形式运行若干个docker容器,组建Fabric网络。但是没有什么比自己动手搭建更快上手的了。在了解了Fabric整个模型和运行方式之后,我们完全可以自己动手搭建一个Fabric网络。
搭建CA与生成组织证书
Fabric是联盟链的解决方案,在联盟链的成员中,必然存在组织
这样的概念。要加入Fabric网络的组织必须有自己的身份标识。所以第一步我们必须为组织生成一个证书,用于确认身份以及加密通信。
Fabric工具中就带一个cryptogen
工具,用于快速批量生成组织证书。当然如果熟悉openssl
的读者完全可以用openssl直接生成x.509格式的证书。
/path/to/cryptogen showtemplate
可以显示默认的证书模板,用于编写配置参考,这个配置文件也充满了大量的注释,帮助用户理解配置文件的含义。也可以直接把这个默认配置导出来在此基础之上修改:
/path/to/cryptogen showtemplate > template.yml
该工具使用的配置格式为yaml
,一个简易的配置片段大致如下:
OrdererOrgs:
- Name: Orderer
Domain: example.com
Specs:
- Hostname: orderer
PeerOrgs:
- Name: Org1
Domain: org1.example.com
EnableNodeOUs: false
之前我们说过,Fabric网络中有三种节点Orderer
,Peer
,Client
,这里就是直接生成Order
和Peer
节点配置的含义,每个OrdererOrgs
或PeerOrgs
下面的list配置大致包含以下几个内容:
- Name: 就是给组织起的名字
- Domain: 组织的域名
- Specs: 就是定义该组织下每个节点的信息,以list形式配置
- Hostname(必选): 主机名
- CommonName(可选): 用于覆盖X509证书中的
CN
配置的 - SANS(可选): 其他x509证书中的
Subject
信息
- Template: 定义模板,批量产生证书
由于cryptogen
工具默认带有一个模板配置文件,因此我们可以直接用它来产生一个Orderer组织,两个Peer组织的证书:
$ cryptogen generate
org1.example.com
org2.example.com
产生的证书位于crypto-config/
目录下,直接用tree
看看都产生了什么玩意吧:
$ tree -L 3 crypto-config
crypto-config
├── ordererOrganizations
│ └── example.com
│ ├── ca
│ ├── msp
│ ├── orderers
│ ├── tlsca
│ └── users
└── peerOrganizations
├── org1.example.com
│ ├── ca
│ ├── msp
│ ├── peers
│ ├── tlsca
│ └── users
└── org2.example.com
├── ca
├── msp
├── peers
├── tlsca
└── users
20 directories, 0 files
最后每个子目录下面就是具体的证书文件了,包含组织的证书,CA证书,管理员证书,以及用户证书等等。所有的身份都是通过PKI
认证的。
当然我们也可以通过使用自己的配置,指定证书产生的目录:
$ /path/to/cryptogen generate --config=config.yml --output=/path/to/outdir
创建交易配置
第一次运行我们需要创建创世纪块
,以后交易我们需要记录到区块中,这些功能都可以通过configtxgen
这个工具来完成。
这个工具就稍微有些繁琐了,首先这个工具必须在当前目录下找到一个名为configtx.yaml
的配置文件,这个配置文件里面存放着各种各样的Profile
。这个配置文件的格式可以参考源码的范例。
configtxgen
每次执行的时候必须有一个-profile
参数,指明使用configtx.yaml
哪个profile,产生什么样的配置(比如创世纪块,交易配置,peer配置等等)。
按照之前的Sample运行的命令,应该是这样:
$ /path/to/configtxgen -profile TwoOrgsOrdererGenesis -outputBlock ./channel-artifacts/genesis.block
2018-05-27 21:28:28.501 CST [common/tools/configtxgen] main -> INFO 001 Loading configuration
2018-05-27 21:28:28.522 CST [common/tools/configtxgen] doOutputBlock -> INFO 002 Generating genesis block
2018-05-27 21:28:28.524 CST [common/tools/configtxgen] doOutputBlock -> INFO 003 Writing genesis block
这条命令会在./channel-artifacts/
目录下产生一个genesis.block
创世纪块,注意./channel-artifacts/
目录必须事先存在,否则会报错。
交易的双方必须加入同一个channel,因此我们还需要产生一个channel配置:
$ configtxgen -profile TwoOrgsChannel -outputCreateChannelTx ./channel-artifacts/channel.tx -channelID mychannel
2018-05-27 21:32:10.966 CST [common/tools/configtxgen] main -> INFO 001 Loading configuration
2018-05-27 21:32:10.978 CST [common/tools/configtxgen] doOutputChannelCreateTx -> INFO 002 Generating new channel configtx
2018-05-27 21:32:11.050 CST [common/tools/configtxgen] doOutputChannelCreateTx -> INFO 003 Writing new channel tx
按照终端日志输出,我们在./channel-artifacts/
产生了一个channel.tx
。我们可以分别用-inspectBlock
参数和-inspectChannelCreateTx
参数分别跟上这两个文件,打印出区块和channel的JSON
配置信息。能看到正确的输出,说明创建成功了。
启动节点
其实这是我最想吐槽官方文档的地方,明知道应该用命令行工具peer
和orderer
启动两种类型的节点,但是官方文档却只字不提。甚至peer
和orderer
的命令行帮助文档也简略到看了也不知道怎么启动。
目前在没有仔细研究官方Docker镜像的前提下,只能通过Docker启动orderer和Peer。
$ docker-compose -f docker-compose-cli.yaml up
这个docker-compose-cli.yaml
文件存在于fabric-samples/first-network/
文件夹中。
好在官方比较良心的出了一个composer工具,否则光运行网络节点这些步骤绝对能让开发者敲桌。后续我们会逐步结合composer与官方文档的内容,讲述利用composer简化Fabric网络的搭建、测试、部署流程。