Fabric账号由cryptogen
命令负责生成。实际上,Fabric账号由一组证书和秘钥文件所组成。
下面是orderer节点账号的目录结构:
├── orderers
│ │ └── orderer.example.com
│ │ ├── msp
│ │ │ ├── admincerts # 管理员证书
│ │ │ │ └── [email protected]
│ │ │ ├── cacerts # 根ca服务器的证书
│ │ │ │ └── ca.example.com-cert.pem
│ │ │ ├── keystore # 节点或者账号的私钥
│ │ │ │ └── e5eb3e35f3a4fcc95d1c084b2abdb233dec556d0b715742c99e7d0d528ad7d40_sk
│ │ │ ├── signcerts # 符合x.509的节点或者用户证书文件
│ │ │ │ └── orderer.example.com-cert.pem
│ │ │ └── tlscacerts # tls根ca证书
│ │ │ └── tlsca.example.com-cert.pem
│ │ └── tls
│ │ ├── ca.crt
│ │ ├── server.crt
│ │ └── server.key
从上面可以看出,这些证书分别存放在msp
文件夹和tls
文件夹中。msp文件夹中存放了签名时使用的证书文件和加密时使用的秘钥文件。tls文件夹存放了加密通信相关的证书文件。
创建fabric网络时主要有以下几个地方需要使用到账号:
启动orderer的时候我们需要通过环境变量或者配置文件给当前启动的Orderer设定相应的账号。
# 启动Orderer节点的账号路径
ORDERER_GENERAL_LOCALMSPDIR=/home/zhongliwen/testwork/crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/msp
启动peer的时候我们需要通过环境变量或者配置文件给当前启动的peer设定相应的账号。
# 启动peer节点的账号路径
ORE_PEER_MSPCONFIGPATH=/home/zhongliwen/testwork/crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/msp
# 创建通道的账号路径
CORE_PEER_MSPCONFIGPATH=/home/zhongliwen/testwork/crypto-config/peerOrganizations/org1.example.com/users/[email protected]/msp
从上面配置可以发现,orderer、peer、user都有自己的账号信息。启动orderer使用orderer节点的账号,启动peer使用了peer节点的账号,创建channel使用了组织用户的账号。
fabric-ca 项目是专门为了解决Fabric账号问题而发起的一个开源项目, 它非常完美的解决了fabric账号生成的问题。
fabric-ca项目由 fabric-server 和fabric-client这两个模块组成。fabric-server是服务端程序,fabric-client是客户端程序。Fabric CA提供了两种访问方式调用Server服务,一种是通过Fabric-client程序,另外一种是使用sdk(nodejs、java、go等等)执行调用。
hyperledger-fabric项目已经自带了fabric-ca的功能。所以,如果要创建ca服务器,只需要在docker-compose.yaml文件的services节点下添加以下内容:
# 配置ca服务器容器
ca.example.com: # 服务名称
image: hyperledger/fabric-ca:latest # 镜像名称:版本号
environment:
# ca容器的home目录
- FABRIC_CA_HOME=/etc/hyperledger/fabric-ca-server
# ca服务器的名字,自己起
- FABRIC_CA_SERVER_CA_NAME=ca.example.com
# ca服务器所属组织的证书路径
- FABRIC_CA_SERVER_CA_CERTFILE=/etc/hyperledger/fabric-ca-server-config/ca.org1.example.com-cert.pem
# ca服务器的私钥文件路径
- FABRIC_CA_SERVER_CA_KEYFILE=/etc/hyperledger/fabric-ca-server-config/b47b6db60368e6e5f598a9002f4c8f93c3d36d7c25d83b4e55338c671bed9ed2_sk
ports:
- "7054:7054" # ca服务器绑定端口
command: sh -c 'fabric-ca-server start -b admin:123456' # 启动fabric-ca-server服务的命令,-b参数为ca服务器登录的用户名和密码
volumes: # 数据卷挂载
- ./crypto-config/peerOrganizations/org1.example.com/ca/:/etc/hyperledger/fabric-ca-server-config
container_name: ca.example.com # 容器名称,自己起
networks:
- byfn # 工作网络
通常情况下, 一个组织会对应一个fabric-server服务器。所以在我们例子中启动了两个ca服务,对应org1和org2两个组织。
下面通过nodejs实现fabric用户的创建、查询操作。
第一步:创建项目。
mkdir fabric-ca-test
cd fabric-ca-test
npm init
第二步:安装包。
npm install --save fabric-ca-client
npm install --save fabric-client
npm install --save grpc
第三步:从github.com上下载示例文件,并拷贝到fabric-ca-test目录中。
enrollAdmin.js:注册组织管理员;
enrollUser.js:注册组织的普通会员,注册前必须完成管理员账号的注册;
query.js:查询数据(关闭了tls功能);
query_tls.js:查询数据(开启了tls功能);
invoke.js:执行交易(关闭了tls功能);
invoke_tls.js:执行交易(开启了tls功能);
第四步:根据实际情况修改js文件的options配置信息(比如ip地址、用户ID等等)。
第五步:通过node xxx.js
命令执行相关操作。
# 注册管理员
node enrollAdmin.js
# 注册用户
node registUser.js
# 查询a的值
node query.js
# 查询a的值(启动了tls功能)
node query_tls.js
# a向b转账10
node invoke.js
# a向b转账10(启动了tls功能)
node invoke_tls.js