1. Fabric 账号
1.1 Fabric账号
-
Fabric账号
-
账号是什么?
Fabric中的账号实际上是根据PKI规范生成的一组证书和秘钥文件
-
fabric中账号的作用
- 保证记录在区块链中的数据具有不可逆、不可篡改
- Fabric中每条交易都会加上发起者的标签(签名证书),同时用发起人的私钥进行加密
- 如果交易需要其他组织的节点提供背书功能,那么背书节点也会在交易中加入自己的签名
# Fabric中的完整账号结构 . ├── Admin@orggo.zjnu.com │ ├── msp │ │ ├── admincerts │ │ │ └── Admin@orggo.zjnu.com-cert.pem │ │ ├── cacerts │ │ │ └── ca.orggo.zjnu.com-cert.pem │ │ ├── keystore │ │ │ └── a2f15f92d1b1733a9a901aa4e6fa6d5910248a967b13a00521ba26068a2bc592_sk │ │ ├── signcerts │ │ │ └── Admin@orggo.zjnu.com-cert.pem │ │ └── tlscacerts │ │ └── tlsca.orggo.zjnu.com-cert.pem │ └── tls │ ├── ca.crt │ ├── client.crt │ └── client.key ├── User1@orggo.zjnu.com │ ├── msp │ │ ├── admincerts │ │ │ └── User1@orggo.zjnu.com-cert.pem │ │ ├── cacerts │ │ │ └── ca.orggo.zjnu.com-cert.pem │ │ ├── keystore │ │ │ └── 889f0029925920dcff610239140bda797e102cda8072a89e2f46c4798bdb5c1d_sk │ │ ├── signcerts │ │ │ └── User1@orggo.zjnu.com-cert.pem │ │ └── tlscacerts │ │ └── tlsca.orggo.zjnu.com-cert.pem │ └── tls │ ├── ca.crt │ ├── client.crt │ └── client.key
- msp文件夹中内容中主要存放签名用的证书文件和加密用的私钥文件。
- admincerts:管理员证书。
- cacerts:根CA服务器的证书。
- keystore:节点或者账号的私钥。
- signcerts:符合x.509的节点或者用户证书文件。
- tlscacerts:TLS根CA的证书。
- tls 文件夹中存放加密通信相关的证书文件。
-
1.2 什么地方需要 Fabric 账号
-
启动orderer
启动orderer的时候我们需要通过环境变量或者配置文件给当前启动的Orderer设定相应的账号。
# 环境变量账号: -> 该路径为宿主机上的路径, 非docker启动的orderer节点内部挂载路径 ORDERER_GENERAL_LOCALMSPDIR=./crypto-config/ordererOrganizations/zjnu.com/orderers/orderer.zjnu.com/msp # 账号目录信息 $ tree msp/ msp/ ├── admincerts │ └── Admin@zjnu.com-cert.pem ├── cacerts │ └── ca.zjnu.com-cert.pem ├── keystore │ └── 4968fd5b3fa14639ba61ec97f745b2e0ce5592e54838493d965a08ac7ad1c8e7_sk ├── signcerts │ └── orderer.zjnu.com-cert.pem └── tlscacerts └── tlsca.zjnu.com-cert.pem
-
启动peer
启动peer的时候我们需要通过环境变量或者配置文件给当前启动的peer设定相应的账号。
# 环境变量账号: -> 该路径为宿主机上的路径, 非docker启动的orderer节点内部挂载路径 CORE_PEER_MSPCONFIGPATH=crypto-config/peerOrganizations/orggo.zjnu.com/peers/peer0.zjnu.itcast.com/msp # 账号目录信息 $ tree msp/ msp/ ├── admincerts │ └── Admin@orggo.zjnu.com-cert.pem ├── cacerts │ └── ca.orggo.zjnu.com-cert.pem ├── config.yaml ├── keystore │ └── a3a19feb11cac708a038d115d26cf96247bcc5821bca3f2b8e9d07847604268b_sk ├── signcerts │ └── peer0.orggo.zjnu.com-cert.pem └── tlscacerts └── tlsca.orggo.zjnu.com-cert.pem
-
创建channel
channel是fabric中的重要组成部分, 创建channel也是需要账号的.
# 环境变量账号: -> 该路径为宿主机上的路径, 非docker启动的orderer节点内部挂载路径 # 在客户端中做的, 客户端要有一个用户的账号信息 CORE_PEER_MSPCONFIGPATH=crypto-config/peerOrganizations/orggo.zjnu.com/users/Admin@orggo.zjnu.com/msp # 账号目录信息 $ tree msp/ msp/ ├── admincerts │ └── Admin@orggo.zjnu.com-cert.pem ├── cacerts │ └── ca.orggo.zjnu.com-cert.pem ├── keystore │ └── a2f15f92d1b1733a9a901aa4e6fa6d5910248a967b13a00521ba26068a2bc592_sk ├── signcerts │ └── Admin@orggo.zjnu.com-cert.pem └── tlscacerts └── tlsca.orggo.zjnu.com-cert.pem
通过上边的内容我们可以发现这些账号的内容是一样的, 都包含是5个不同的文件, 但是仔细观察会发现在文件路径上还是有一些区别的。我们来对比一下:
# Orderer 启动路径
crypto-config/ordererOrganizations/itcast.com/orderers/orderer.itcast.com/msp
# Peer启动的账号路径
crypto-config/peerOrganizations/orggo.itcast.com/peers/peer0.orggo.itcast.com/msp
# 创建channel的账号路径
crypto-config/peerOrganizations/orggo.itcast.com/users/Admin@orggo.itcast.com/msp
我们可以发现Peer和Orderer都有属于自己的账号,创建Channel使用的是用户账号。其中Peer和创建Channel的用户账号属于某个组织,而Orderer的启动账号只属于他自己。这里特别注意,用户账号在很多操作中都会用到,而且很多操作的错误都是用户账号的路径设置不当而引起的。
1.3 Fabric-ca
fabric-ca 项目是专门为了解决Fabric账号问题而发起的一个开源项目, 它非常完美的解决了fabric账号生成的问题。fabric-ca项目由 fabric-server 和fabric-client这两个模块组成。其中fabric-server在 fabric中占有非常重要的作用。我们使用
cryptogen
命令可以同配置文件生成一些账号信息, 但是如果有动态添加账号的需求, 就无法满足, 所以这个时候我们就应该在项目中引入fabric-ca。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-62761Yqj-1586783193113)(assets/1542288702905.png)]
上图中Fabric CA提供了两种访问方式调用Server服务
- 通过Fabric-Client调用
- 通过SDK调用 (node.js,java, go)
通常情况下, 一个组织会对应一个fabric-server服务器, 下面介绍如何将fabric-server加入到网络中
在一个fabric中有多个组织, fabric-Ca如何部署?
- 要在每个组织中部署一个fabric-ca服务器, 给当前组织注册新用户
1.3.1 将fabric-ca加入到网络
在docker-compose启动使用的配置文件docker-compos.yam
中添加如下配置项:
services:
###################### 添加的内容 - START #########################
cago.zjnu.com: # -> fabric-ca的服务器名, 随便起名
image: hyperledger/fabric-ca:latest # fabric-ca的镜像文件
environment:
# fabric-ca容器中的home目录
- FABRIC_CA_HOME=/etc/hyperledger/fabric-ca-server
- FABRIC_CA_SERVER_CA_NAME=cago.zjnu.com # fabric-ca服务器的名字, 自己起
# fabric-ca服务器证书文件目录中的证书文件
# 明确当前fabric-ca属于哪个组织
- FABRIC_CA_SERVER_CA_CERTFILE=/etc/hyperledger/fabric-ca-server-config/ca.orggo.zjnu.com-cert.pem
# fabric-ca服务器的私钥文件
- FABRIC_CA_SERVER_CA_KEYFILE=/etc/hyperledger/fabric-ca-server-config/0445f3d2287580194cb96060b644e560627b180315444fe2c17cbbbfda281c8a_sk
ports:
- 7054:7054 # fabric-ca服务器绑定的端口
# 启动fabric-ca-server服务
# admin:123456
# -- admin: fabric-ca-server的登录用户名
# -- 123456: fabric-ca-server的登录密码
command: sh -c 'fabric-ca-server start -b admin:123456'
volumes:
- ./crypto-config/peerOrganizations/orggo.zjnu.com/ca/:/etc/hyperledger/fabric-ca-server-config
container_name: cago.zjnu.com # 容器名, 自己指定
networks:
- byfn # 工作的网络
cacpp.zjnu.com: # -> fabric-ca的服务器名, 随便起名
image: hyperledger/fabric-ca:latest # fabric-ca的镜像文件
environment:
# fabric-ca容器中的home目录
- FABRIC_CA_HOME=/etc/hyperledger/fabric-ca-server
- FABRIC_CA_SERVER_CA_NAME=cacpp.zjnu.com # fabric-ca服务器的名字, 自己起
# fabric-ca服务器证书文件目录中的证书文件
# 明确当前fabric-ca属于哪个组织
- FABRIC_CA_SERVER_CA_CERTFILE=/etc/hyperledger/fabric-ca-server-config/ca.orgcpp.zjnu.com-cert.pem
# fabric-ca服务器的私钥文件
- FABRIC_CA_SERVER_CA_KEYFILE=/etc/hyperledger/fabric-ca-server-config/eec404e69e144a435abc14caaff1a7adac42f5b63f0a745e22e53fca15ee4adb_sk
ports:
- 8054:7054 # fabric-ca服务器绑定的端口
# 启动fabric-ca-server服务
# admin:123456
# -- admin: fabric-ca-server的登录用户名
# -- 123456: fabric-ca-server的登录密码
command: sh -c 'fabric-ca-server start -b admin:123456'
volumes:
- ./crypto-config/peerOrganizations/orgcpp.zjnu.com/ca/:/etc/hyperledger/fabric-ca-server-config
container_name: cacpp.zjnu.com # 容器名, 自己指定
networks:
- byfn # 工作的网络
###################### 添加的内容 - END #########################
1.3.2 编写node.js客户端
-
初始化node.js项目(在服务器中创建任意一个目录然后进入里面执行下面的代码)
# 创建一个编写node.js客户端的目录, 并进入 # 1. 执行npm init 生成package.json文件, 用于保存更新项目依赖的第三方模块 # 要求输入的信息, 如果你懒, 直接回车就可以了 # package.json配置说明: https://blog.csdn.net/Aurora100/article/details/78590346 $ npm init This utility will walk you through creating a package.json file. It only covers the most common items, and tries to guess sensible defaults. See `npm help json` for definitive documentation on these fields and exactly what they do. Use `npm install <pkg>` afterwards to install a package and save it as a dependency in the package.json file. Press ^C at any time to quit. package name: (nodejs) version: (1.0.0) description: entry point: (index.js) test command: git repository: keywords: author: license: (ISC) About to write to /home/itcast/nodejs/package.json: { "name": "nodejs", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "author": "", "license": "ISC" } Is this ok? (yes)
# 接下来执行如下命令, 安装第三方依赖库: npm install --save fabric-ca-client npm install --save fabric-client npm install --save grpc # 安装过程中, 提示如下log信息, 无需理会 npm WARN nodejs@1.0.0 No description npm WARN nodejs@1.0.0 No repository field.
-
客户端参考API
https://hyperledger.github.io/fabric-sdk-node/