账号:Fabric中的账号实际上是根据PKI规范生成的一组证书和密钥文件
账号的作用:
需要找谁/哪个组织的证书,就去改目录下找其MSP文件夹即可!
启动orderer
启动peer
直接就把msp文件挂载在容器中了
创建channel
创建通道是在客户端完成的,并且必须是Admin创建
当需要动态的添加用户的时候,使用cryptogen就过于繁琐了,Fabric提供了fabric-ca机制
可以通过fabric-ca-client连接fabric-ca注册账号,但是弊端是使用命令行的方式,这对用户来说是难以接受的。
官方提供了已经写好的二进制可执行文件供我们访问:
一般我们会通过一些sdk调用
通过sdk编写客户端实现:
以此来代替之前配置的cli容器
在一个fabric网络中有多个组织,那么fabric-ca该如何部署?
从图中还可以看出,fabric-ca服务器还可以设置代理,使用一些关系型的数据库。
进入fabric-samples/basic-network
文件夹中:
vim docker-compose.yml
官方实例中配置了有关fabric-ca的一些相关配置
12 ca.example.com: # fabric-ca的服务名,自定义
13 image: hyperledger/fabric-ca # 依赖的镜像
14 environment:
15 - FABRIC_CA_HOME=/etc/hyperledger/fabric-ca-server # 不需要改,容器中的home目录
16 - FABRIC_CA_SERVER_CA_NAME=ca.example.com # 服务器名字,自定义
# fabric-ca服务器证书文件目录中的证书文件
# 要明确当前的fabric-ca属于哪个组织!!
17 - FABRIC_CA_SERVER_CA_CERTFILE=/etc/hyperledger/fabric-ca-server-config/ca.org1.example.com-cert.pem
# 私钥文件
# 这两个文件的路径只需要写文件名即可,因为下方的数据卷映射
18 - FABRIC_CA_SERVER_CA_KEYFILE=/etc/hyperledger/fabric-ca-server-config/4239aa0dcd76daeeb8ba0cda701851d14504d31aad1b2ddddbac6a57365e497c_sk
19 ports:
20 - "7054:7054" # fabric-ca绑定的端口,不改
#启动命令, admin:adminpw前面是用户名后面是密码
21 command: sh -c 'fabric-ca-server start -b admin:adminpw'
22 volumes:
# 修改自己的路径,实现数据卷
23 - ./crypto-config/peerOrganizations/org1.example.com/ca/:/etc/hyperledger/fabric-ca-server-config
24 container_name: ca.example.com # 容器名,自己指定
25 networks:
26 - basic # 工作的网络
27
修改:
分别给两个组织加上fabric-ca服务器
cppca.xwj.com:
image: hyperledger/fabric-ca
environment:
- FABRIC_CA_HOME=/etc/hyperledger/fabric-ca-server
- FABRIC_CA_SERVER_CA_NAME=cppca.xwj.com
- FABRIC_CA_SERVER_CA_CERTFILE=ca.orgcpp.xwj.com-cert.pem
- FABRIC_CA_SERVER_CA_KEYFILE=c2568c1f148e548dc09eadf76e351a466df3ae8ab18dadba132cf6f1809a2dbc_sk
ports:
- "7054:7054"
command: sh -c 'fabric-ca-server start -b admin:adminpw'
volumes:
- ./crypto-config/peerOrganizations/orgcpp.xwj.com/ca/:/etc/hyperledger/fabric-ca-server-config
container_name: cppca.xwj.com
networks:
- byfn
goca.xwj.com:
image: hyperledger/fabric-ca
environment:
- FABRIC_CA_HOME=/etc/hyperledger/fabric-ca-server
- FABRIC_CA_SERVER_CA_NAME=goca.xwj.com
- FABRIC_CA_SERVER_CA_CERTFILE=ca.orggo.xwj.com-cert.pem
- FABRIC_CA_SERVER_CA_KEYFILE=b44962fdc3416c9342bba9a13ca91d40876398740f68031a0be77191c0d7a0b1_sk
ports:
- "8054:7054" # 端口映射前面的是宿主机端口,不能重复
command: sh -c 'fabric-ca-server start -b admin:adminpw'
volumes:
- ./crypto-config/peerOrganizations/orggo.xwj.com/ca/:/etc/hyperledger/fabric-ca-server-config
container_name: goca.xwj.com
networks:
- byfn
这样显示就是启动成功
启动成功后重新创建网络,进入客户端…..等一系列操作
在bin目录下有一个命令fabric-ca-client时官方给用户注册账户提供的工具
Hyperledger Fabric Certificate Authority Client
Usage:
fabric-ca-client [command]
Available Commands:
affiliation Manage affiliations
enroll Enroll an identity
gencrl Generate a CRL
gencsr Generate a CSR
getcacert Get CA certificate chain
identity Manage identities
reenroll Reenroll an identity
register Register an identity
revoke Revoke an identity
version Prints Fabric CA Client version
Flags:
--caname string Name of CA
--csr.cn string The common name field of the certificate signing request
--csr.hosts stringSlice A list of space-separated host names in a certificate signing request
--csr.names stringSlice A list of comma-separated CSR names of the form = (e.g. C=CA,O=Org1)
--csr.serialnumber string The serial number in a certificate signing request
-d, --debug Enable debug level logging
--enrollment.attrs stringSlice A list of comma-separated attribute requests of the form [:opt] (e.g. foo,bar:opt)
--enrollment.label string Label to use in HSM operations
--enrollment.profile string Name of the signing profile to use in issuing the certificate
-H, --home string Client's home directory (default "$HOME/.fabric-ca-client")
--id.affiliation string The identity's affiliation
--id.attrs stringSlice A list of comma-separated attributes of the form = (e.g. foo=foo1,bar=bar1)
--id.maxenrollments int The maximum number of times the secret can be reused to enroll (default CA's Max Enrollment)
--id.name string Unique name of the identity
--id.secret string The enrollment secret for the identity being registered
--id.type string Type of identity being registered (e.g. 'peer, app, user') (default "client")
-M, --mspdir string Membership Service Provider directory (default "msp")
-m, --myhost string Hostname to include in the certificate signing request during enrollment (default "$HOSTNAME")
-a, --revoke.aki string AKI (Authority Key Identifier) of the certificate to be revoked
-e, --revoke.name string Identity whose certificates should be revoked
-r, --revoke.reason string Reason for revocation
-s, --revoke.serial string Serial number of the certificate to be revoked
--tls.certfiles stringSlice A list of comma-separated PEM-encoded trusted certificate files (e.g. root1.pem,root2.pem)
--tls.client.certfile string PEM-encoded certificate file when mutual authenticate is enabled
--tls.client.keyfile string PEM-encoded key file when mutual authentication is enabled
-u, --url string URL of fabric-ca-server (default "http://localhost:7054")
Use "fabric-ca-client [command] --help" for more information about a command.
注册一个管理员账号:
fabric-ca-client enroll -u http://admin:[email protected]:8054
会在用户目录下生成.fabric-ca-client的文件夹其中就包含了msp
客户端参考API:
https://hyperledger.github.io/fabric-sdk-node/
1.4 版本fabric地址: https://hyperledger.github.io/fabric-sdk-node/release-1.4/module-fabric-network.html
2.2版本:https://hyperledger.github.io/fabric-sdk-node/release-2.2/FabricCAServices.html#register
(1.2已经被删除了)
创建一个空目录
mkdir node-client
cd node-client
初始化,创建package.json配置文件
npm init # 一路回车,后头直接在文件中写
切换淘宝源,加速下载
npm config -g set registry https://registry.npm.taobao.org
检查是否切换到位
npm config -g get registry # 看到源地址就ok
或者换淘宝的cnpm
npm install -g cnpm -registry=https://registry.npm.taobao.org
查看版本,以后就用cnpm下载依赖
cnpm -v
执行如下命令,安装第三方依赖库
npm install --save fabric-ca-client # --save参数表示将该模块写入dependencies属性
npm install --save fabric-client
npm install --save grpc
==============================================
cnpm install --save fabric-ca-client
cnpm install --save fabric-client
cnpm install --save grpc
下载需要一定的时间,稍作等待
package.json配置说明:https://blog.csdn.net/Aurora100/article/details/78590346
dependencies,devDependencies: :分别是项目在生产环境中和开发测试环境中依赖的包它们都指向一个对象。该对象的各个成员,分别由模块名和对应的版本要求组成,表示依赖的模块及其版本范围。
--save
参数表示将该模块写入dependencies
属性,--save-dev
表示将该模块写入devDependencies
属性。
安装完毕后打开package.json可以看到:
(这里的版本没按视频课的来,是最新版本,因为老版本文档都没了)
复制fabric-samples/fabcar文件夹中的内容到新创建的文件夹环境中
获取其中需要的安装包
官方测试用例中的package.json文件:
1 {
2 "name": "fabcar",
3 "version": "1.0.0",
4 "description": "Hyperledger Fabric Car Sample Application",
5 "main": "fabcar.js",
6 "scripts": {
7 "test": "echo \"Error: no test specified\" && exit 1"
8 },
9 "dependencies": {
10 "fabric-ca-client": "unstable",
11 "fabric-client": "unstable",
12 "grpc": "^1.6.0"
13 },
14 "author": "Anthony O'Dowd",
15 "license": "Apache-2.0",
16 "keywords": [
17 "Hyperledger",
18 "Fabric",
19 "Car",
20 "Sample",
21 "Application"
22 ]
23 }
所有的节点分离部署,每台主机上有一个节点
名称 | ip | HostName | 组织机构 |
---|---|---|---|
orderer | 10.0.2.5 | orderer.example.com | / |
peer0 | 10.0.2.6 | peer0.orgbmw.example.com | OrgBmw宝马 |
peer1 | peer1.orgbmw.example.com | 宝马 | |
peer0 | 10.0.2.7 | peer0.orgbenz.example.com | OrgBenz奔驰 |
peer1 | peer0.orgbenz.example.com | 奔驰 |
没有多台实体主机,那么可以采用虚拟集群来实现。具体可以看我写的这一篇:
https://blog.csdn.net/weixin_43988498/article/details/109159785
我使用虚拟集群来体验测试多几多节点部署
n台主机需要创建一个名字相同的工作目录,为的是能够连接上同一个网络
10.0.2.5
mkdir ~/carFabric
10.0.2.6
mkdir ~/carFabric
10.0.2.7
mkdir ~/carFabric
生成证书模板
cryptogen showtemplate > crypto-config.yaml
修改配置
vim crypto-config.yaml
生成证书
cryptogen generate --config=crypto-config.yaml
生成通道文件、创世块
cp ~/fabric-1.2/fabric-samples/first-network/configtx.yaml . # 复制一份
修改配置文件
vim configtx.yaml
生成创世快
configtxgen -profile CarOrgsOrdererGenesis -outputBlock ./channel-artifacts/genesis.block
生成通道文件
configtxgen -profile TwoOrgsChannel -outputCreateChannelTx ./channel-artifacts/channel.tx -channelID carChannel
编写docker-compose文件:
version: '2'
services:
orderer.example.com:
container_name: orderer.example.com
image: hyperledger/fabric-orderer:latest
environment:
- ORDERER_GENERAL_LOGLEVEL=INFO
- ORDERER_GENERAL_LISTENADDRESS=0.0.0.0
- ORDERER_GENERAL_GENESISMETHOD=file
- ORDERER_GENERAL_GENESISFILE=/var/hyperledger/orderer/orderer.genesis.block
- ORDERER_GENERAL_LOCALMSPID=OrdererMSP
- ORDERER_GENERAL_LOCALMSPDIR=/var/hyperledger/orderer/msp
- ORDERER_GENERAL_TLS_ENABLED=true
- ORDERER_GENERAL_TLS_PRIVATEKEY=/var/hyperledger/orderer/tls/server.key
- ORDERER_GENERAL_TLS_CERTIFICATE=/var/hyperledger/orderer/tls/server.crt
- ORDERER_GENERAL_TLS_ROOTCAS=[/var/hyperledger/orderer/tls/ca.crt]
working_dir: /opt/gopath/src/github.com/hyperledger/fabric
command: orderer
volumes:
- ./channel-artifacts/genesis.block:/var/hyperledger/orderer/orderer.genesis.block
- ./crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/msp:/var/hyperledger/orderer/msp
- ./crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/tls/:/var/hyperledger/orderer/tls
ports:
- 7050:7050
networks:
default:
aliases:
- carFabric
不在继承,在继承的文件中摘出来,写到一个文件
注意networks的写法,表示使用默认的网络,所有节点加入到这个默认的网络中,aliases起别名,这里的网络名字不要瞎写,要写工作文件的目录名
网络同名,这样多个节点才能互相访问!
Failed to connect to bus: Host is down
问题原因:
我启动centos容器的命令是:
docker run -d --name centos_1 -it centos:latest /bin/bash
需要修改为
docker run -tid --name centos_1 --privileged=true centos:latest /sbin/init
也就是加–privileged=true,修改/binbash 为/sbin/init
修改后,就可以正常启动服务了
systemctl 命令时出现(System has not been booted with systemd as init system (PID 1). Can’t operat….信息。
解决方案:/sbin/init
例如:Centos8
docker run -itd --name centos --privileged=true centos /sbin/init # 使用这个命令
docker exec -it centos /bin/bash
注意:–privileged=true一定要加上的。
docker的engine基于Device Mapper提供的一种存储驱动,而它又依赖与 devicemapper,存储的数据目录在/var/lib/docker下。
首先进入docker存储数据目录。
cd /var/lib/docker
rm -rf *
删除的时候,可能会出现设备或者资源忙的情况。
fuser -m aufs/
fuser -k aufs/
umount aufs/
rm -rf aufs/
sudo systemctl restart docker