Hyperledger Fabric 一文了解MSP的目录结构

Fabric是一个联盟链,联盟链的特点是用户非授权时不能接入区块链,因此Fabric系统中存在一套授权体系,我们将这个体系称为Fabric Membership Service Providers

MSP是什么?

Fabric的账号实际上是根据PKI规范生成的一组证书和秘钥文件。在Fabric中每条交易都会加上发起者的标签(签名证书),同时用发起人的私钥进行加密。如果交易需要其他组织的节点提供背书功能,那么背书节点也会在交易中加入自己的签名。这样每一笔交易过程都会非常清晰并且不可篡改。鉴于传统系统中基于账号和密码的验证体系已经无法完成这样的工作。因此Fabric设计了基于PKI规范的账号系统满足这样的要求。

一个完整的Fabric账号中包含的内容如下所示:

Hyperledger Fabric 一文了解MSP的目录结构_第1张图片

orderer账号orderer.example.com

peer账号peer0.org1.example.com

client账号[email protected],[email protected]

账号目录结构如下

Hyperledger Fabric 一文了解MSP的目录结构_第2张图片

1.msp目录中存放签名用的证书文件和加密用的私钥文件。msp包含以下5个部分:

admincerts: 管理员证书。从其它msp的signcerts复制而来,目录内的证书代表管理员身份。

cacerts: 根CA服务器的证书。即为组织颁发证书的CA server目录下的ca-cert.pem

keystore:节点或者账号的私钥。

signcerts: 符合X.509的节点或者账户证书文件。可以理解为账户的ID,将其复制到某个peer或Org的admincerts目录下代表管理员账号。

tlscacerts:  TLS根CA的证书。即颁发TLS证书的CA server目录下的ca-cert.pem

2.tls文件夹中存放加密通信相关的证书文件。一个联盟链中要有一个专门用于颁发传输所需tls证书的CA server。

什么样的操作需要使用Fabric的账号?

Fabric中Orderer、Peer、客户端SDK、CLI接口等所有操作都需要账号。Fabric中每个具体的动作,创建通道、部署chaincode、调用chaincode等都需要指定的账号。每个Peer向Orderer发送请求的时候也需要Peer的账号。

启动order设置msp目录的路径
ordererOrganizations/example.com/orderers/orderer.example.com/msp

启动peer设置msp目录的路径
peerOrganizations/org1.example.com/peers/peer0.org1.example.com/msp

创建channel需要设置client,即Admin的msp路径
peerOrganizations/org1.example.com/users/[email protected]/msp

动态添加账号

cryptogen的操作每次都会重置证书,因此要动态添加账号需要使用Fabric CA

1.启动一个CA server,来颁发TLS证书,假设称为tls-ca
产生的ca-cert.pem就是client使用tls传输的证书,
2.在tls-ca上登陆admin账号,然后注册多个账号,用于生成各自的证书
3.安装组织(OrderOrg,PeerOrg)的CA server,颁发组织的msp,假设称为msp-ca
4.在msp-ca上注册所需角色的账号,orderer,peer,user。
5.在各自client的目录下,复制server的ca-cert.pem后,就可以登录账号。来获取msp
6.最后拼凑组织的msp

各个CA server启动后产生的ca-cert.pem,都是client连接此server的FABRIC_CA_CLIENT_TLS_CERTFILES。
每个组织会各自生成自己的ca-cert.pem,并注册自己的账号如orderer,peer,user,client
颁发证书,就是使用在CA server注册的账号来登陆,其中登陆时使用的tls证书,就是对应的server目录下产生的ca-cert.pem
peer,Org,admin在和orderer传输时,需要的tls证书,是单独的CA Server中颁发。
最后在msp目录中添加admin的账号(admincerts),账号身份就是使用同一个server注册的其它账号登陆后获取的msp/signcerts/cert.pem
最后拼凑组织的msp如 org1/msp,需要组织的管理员证书admincerts(一般也是peer的管理员证书),组织的根证书cacerts(即组织的CA server目录下的cert.pem),节点传输使用的根tls证书tlscacerts(就是TLS的CA server目录下的ca-cert.pem)

CA server下的 ca-cert.pem两个作用
1.ca client链接server时的TLS证书,变量FABRIC_CA_CLIENT_TLS_CERTFILES
2.如果此server是为组织颁发证书的,那么此文件也是组织的根证书,放在组织Org1/msp/cacerts下



后面加了--tls.enabled后会产生一个tls-cert.pem,可以用作FABRIC_CA_CLIENT_TLS_CERTFILES
fabric-ca-server start -d -b admin:adminpw --port 7053 --tls.enabled

export FABRIC_CA_CLIENT_HOME=$PWD
export FABRIC_CA_CLIENT_TLS_CERTFILES=${PWD}/../server/ca-cert.pem
export FABRIC_CA_CLIENT_TLS_CERTFILES=${PWD}/../server/tls-cert.pem
fabric-ca-client enroll -d -u https://admin:adminpw@localhost:7053


fabric-ca-client enroll  -u https://orderer1-org0:[email protected]:7052  --enrollment.profile tls --csr.hosts orderer1-org0
后面加这个命令--enrollment.profile tls --csr.hosts orderer1-org0,目录结构会变化
1.cacerts目录空,原0-0-0-0-7052.pem丢失(此证书为ca server下的ca-cert.pem)
2.多出一个tlscacerts目录包含tls-0-0-0-0-7052.pem (经测试此证书也为ca server下的ca-cert.pem)

使用Fabric CA官方文档总结

--id.type peer,app,user,orderer,admin  这个参数是不是自定义的
如果传输所需的证书配置错误,生成的msp中只有keystore有值,其余文件皆为空

第一步 启动Fabric TLS CA容器,用于颁发TLS证书
	普通初始化启动,账号tls-ca-admin:tls-ca-adminpw
	端口: 7052
	容器: ca-tls

	client登陆TLS CA client
	首先将ca-tls的server产生的/tmp/hyperledger/tls-ca/crypto/ca-cert.pem复制到client所在主机上,当做TLS证书。路径/tmp/hyperledger/tls-ca/crypto/tls-ca-cert.pem
	使用tls-ca-admin:tls-ca-adminpw登陆ca-tls的容器server,
	获取msp的目录:/tmp/hyperledger/tls-ca/crypto

	且注册以下账号
	peer1-org1:peer1PW   peer 
	peer2-org1:peer2PW   peer 
	peer1-org2:peer1PW   peer 
	peer2-org2:peer2PW   peer 
	orderer1-org0:ordererPW   orderer

第二步,安装order的CA server
	每个组织必须有自己的CA颁发机构,用来签发组织内的peer和client。
	组织名Org0
	目录: /tmp/hyperledger/org0/ca/crypto   #此目录下的ca-cert.pem证书是Org0的orderer在获取msp时传输所需的tls的根证书
	端口:7053
	账号: rca-org0-admin:rca-org0-adminpw
	容器: rca-org0

	登陆Org0的CA client
	因server和client在一个电脑上,所以路径直接有了/tmp/hyperledger/org0/ca/crypto/ca-cert.pem证书(order server产生)
	获取msp的目录: /tmp/hyperledger/org0/ca/admin
	账号: rca-org0-admin:rca-org0-adminpw

	注册以下账号
	orderer1-org0:ordererpw  orderer 
	admin-org0:org0adminpw   admin 


第三步,安装Org1的CA server
	目录: /tmp/hyperledger/org1/ca/crypto   #此目录下的ca-cert.pem证书是Org1的peer在获取msp时传输所需的tls的根证书
	端口: 7054
	账号: rca-org1-admin:rca-org1-adminpw
	容器: rca-org1

	登录Org1的CA client
	因server和client在一个电脑上,所以以下路径直接用
	FABRIC_CA_CLIENT_TLS_CERTFILES=/tmp/hyperledger/org1/ca/crypto/ca-cert.pem
	获取msp目录: /tmp/hyperledger/org1/ca/admin  #此目录下的msp/signcerts/cert.pem证书是Org1的组织管理证书,即Peer的msp中所需的admincerts
	注册以下账号:
	peer1-org1:peer1PW   peer
	peer2-org1:peer2PW   peer 
	admin-org1:org1AdminPW   user 
	user-org1:org1UserPW    user 


第四步,安装Org2的CA server    #此目录下的ca-cert.pem证书是Org2的peer在获取msp时传输所需的tls的根证书
	目录:/tmp/hyperledger/org2/ca/crypto
	端口: 7055
	账号: rca-org2-admin:rca-org2-adminpw
	容器: rca-org2

	登陆Org2的CA admin
	FABRIC_CA_CLIENT_TLS_CERTFILES=/tmp/hyperledger/org2/ca/crypto/ca-cert.pem 同一个主机直接用即可
	获取msp目录: /tmp/hyperledger/org2/ca/admin  #此目录下的msp/signcerts/cert.pem证书是Org2的组织管理证书,即Peer的msp中所需的admincerts
	注册以下账号:
	peer1-org2   peer
	peer2-org2   peer 
	admin-org2   user 
	user-org2    user 


第五步,安装Org1 Peer 容器
	首先,获取peer的CA证书
		Peer1:
			1.首先将Org1的根证书复制到peer1主机所在的/tmp/hyperledger/org1/peer1/assets/ca/org1-ca-cert.pem。
			此处Org1的根证书推测是/tmp/hyperledger/org1/ca/crypto/ca-cert.pem
			
			2.获取msp目录: /tmp/hyperledger/org1/peer1   /msp
			FABRIC_CA_CLIENT_TLS_CERTFILES=/tmp/hyperledger/org1/peer1/assets/ca/org1-ca-cert.pem
			ca client登陆账号: peer1-org1:peer1PW,在目录下获取到msp文件夹。
			
			3.然后需要获取peer1的TLS加密素材,这次从tls CA(端口7052,容器:ca-tls)的配置文件登录。
			假设已经将TLS根证书复制到/tmp/hyperledger/org1/peer1/assets/tls-ca/tls-ca-cert.pem
			根证书推测应是: /tmp/hyperledger/tls-ca/crypto/ca-cert.pem
			登陆账号:peer1-org1:peer1PW,ca-tls:7052中注册的账号
			获取目录: /tmp/hyperledger/org1/peer1     /tls-msp
			将/tmp/hyperledger/org1/peer1/tls-msp/keystore 中key改名为key.pem

			4.在msp中添加admincerts(包含了Org1的admin证书)

		Peer2:
			1.首先将Org1的根证书复制到peer2的/tmp/hyperledger/org1/peer2/assets/ca/org1-ca-cert.pem
			此处Org1根证书推测是/tmp/hyperledger/org1/ca/crypto/ca-cert.pem
			2.获取msp目录: /tmp/hyperledger/org1/peer2  /msp
			FABRIC_CA_CLIENT_TLS_CERTFILES=/tmp/hyperledger/org1/peer2/assets/ca/org1-ca-cert.pem
			ca client 登录账号: peer2-org1:peer2PW
			3.获取peer2的TLS,从tls CA(端口7052,容器:ca-tls)获取。
			假设将TLS CA根证书复制到 /tmp/hyperledger/org1/peer2/assets/tls-ca/tls-ca-cert.pem
			根证书推测应是:/tmp/hyperledger/tls-ca/crypto/ca-cert.pem
			登录账号: peer2-org1:peer2PW   ca-tls:7052中注册的账号
			获取后目录: /tmp/hyperledger/org1/peer2   /tls-msp
			将/tmp/hyperledger/org1/peer2/tls-msp/keystore 改名为key.pem
			4.在msp中添加admincerts(包含了Org1的admin证书)

	获取Org1的admin证书
		假设在peer1主机上运行。
		获取MSP目录: /tmp/hyperledger/org1/admin   /msp
		FABRIC_CA_CLIENT_TLS_CERTFILES=/tmp/hyperledger/org1/peer1/assets/ca/org1-ca-cert.pem
		登录: admin-org1:org1AdminPW 登录的端口7054
		将admin的msp的证书复制到peer1和peer2的admincerts上

		以peer1举例:
		mkdir /tmp/hyperledger/org1/peer1/msp/admincerts
		cp /tmp/hyperledger/org1/admin/msp/signcerts/cert.pem /tmp/hyperledger/org1/peer1/msp/admincerts/org1-admin-cert.pem
		peer2也要复制到相应目录


	启动Org1的peer1容器:
		容器: peer1-org1
		目录: /tmp/hyperledger/org1/peer1

	启动Org1的peer2容器:
		容器: peer2-org1
		目录: /tmp/hyperledger/org1/peer2

第六步,安装Org2的peer容器
	首先获取peer的CA证书。
		Peer1:
			1.首先获取Org2的根证书复制到peer1的主机上/tmp/hyperledger/org2/peer1/assets/ca/org2-ca-cert.pem
			此处Org2的根证书推测是/tmp/hyperledger/org2/ca/crypto/ca-cert.pem
			2.获取peer的msp目录   /tmp/hyperledger/org2/peer1  /msp
			export FABRIC_CA_CLIENT_TLS_CERTFILES=/tmp/hyperledger/org2/peer1/assets/ca/org2-ca-cert.pem
			ca client登陆账号: peer1-org2:peer1PW,在目录下获取到msp文件夹。
			3.然后需要获取peer1的TLS加密素材,这次从tls CA(端口7052,容器:ca-tls)的配置文件登录。
			假设已经将TLS根证书复制到/tmp/hyperledger/org2/peer1/assets/tls-ca/tls-ca-cert.pem
			TLS根证书推测应是: /tmp/hyperledger/tls-ca/crypto/ca-cert.pem
			登录账号: peer1-org2:peer1PW   ca-tls:7052中注册的账号
			获取后目录: /tmp/hyperledger/org2/peer1  /tls-msp
			将/tmp/hyperledger/org2/peer1/tls-msp/keystore 改名为key.pem
			4.在msp中添加admincerts(包含了Org2的admin证书)
		Peer2:
			1.首先获取Org2的根证书复制到peer2的主机上/tmp/hyperledger/org2/peer2/assets/ca/org2-ca-cert.pem
			此处Org2的根证书推测是/tmp/hyperledger/org2/ca/crypto/ca-cert.pem
			2.获取peer的msp目录   /tmp/hyperledger/org2/peer2  /msp
			export FABRIC_CA_CLIENT_TLS_CERTFILES=/tmp/hyperledger/org2/peer2/assets/ca/org2-ca-cert.pem
			ca client登陆账号: peer2-org2:peer2PW,在目录下获取到msp文件夹。
			3.然后获取peer2的TLS加密素材,这次从tls CA(端口7052,容器:ca-tls)的配置文件登录。
			cp /tmp/hyperledger/tls-ca/crypto/ca-cert.pem /tmp/hyperledger/org2/peer2/assets/tls-ca/tls-ca-cert.pem
			登录账号: peer2-org2:peer2PW   ca-tls:7052中注册的账号
			获取后目录: /tmp/hyperledger/org2/peer1  /tls-msp
			将/tmp/hyperledger/org2/peer2/tls-msp/keystore 改名为key.pem
			4.在msp中添加admincerts(包含了Org2的admin证书)
	获取Org2的admin证书
		假设在peer1主机上运行。
		获取MSP目录: /tmp/hyperledger/org2/admin   /msp
		FABRIC_CA_CLIENT_TLS_CERTFILES=/tmp/hyperledger/org2/peer1/assets/ca/org1-ca-cert.pem
		登录: admin-org2:org2AdminPW 登录的端口7055
		将admin的msp的证书复制到peer1和peer2的admincerts上

		以peer1举例:
		mkdir /tmp/hyperledger/org2/peer1/msp/admincerts
		cp /tmp/hyperledger/org2/admin/msp/signcerts/cert.pem /tmp/hyperledger/org2/peer1/msp/admincerts/org2-admin-cert.pem
		peer2也要复制到相应目录

第七步,登陆orderer
	1.首先获取orderer的MSP。Org0的根证书已经复制到/tmp/hyperledger/org0/orderer/assets/ca/org0-ca-cert.pem
	Org0的根证书是/tmp/hyperledger/org0/ca/crypto/ca-cert.pem
	2.获取orderer的msp目录  /tmp/hyperledger/org0/orderer  /msp
	ca client登陆账号: orderer1-org0:ordererpw,在目录下获取到msp文件夹。
	3.获取TLS的msp,复制TLS根证书
	cp /tmp/hyperledger/tls-ca/crypto/ca-cert.pem /tmp/hyperledger/org0/orderer/assets/tls-ca/tls-ca-cert.pem
	登陆账号: orderer1-org0:ordererPW  ca-tls:7052中注册的账号
	获取后目录 /tmp/hyperledger/org0/orderer  /tls-msp
	到目录/tmp/hyperledger/org0/orderer/tls-msp/keystore然后改名为key.pem
	4.在msp中添加admincerts(包含了Org0的admin证书)
	获取MSP目录: /tmp/hyperledger/org0/admin  /msp
	FABRIC_CA_CLIENT_TLS_CERTFILES=/tmp/hyperledger/org0/orderer/assets/ca/org0-ca-cert.pem
	登录 admin-org0:org0adminpw  登录的端口7053
	将admin下的证书复制到orderer的msp的admincerts
	mkdir /tmp/hyperledger/org0/orderer/msp/admincerts
	cp /tmp/hyperledger/org0/admin/msp/signcerts/cert.pem /tmp/hyperledger/org0/orderer/msp/admincerts/orderer-admin-cert.pem

Fabric CA官方文档总结代码

第一步,启动TLS CA
docker-compose up ca-tls

cd /tmp/hyperledger/tls-ca/crypto
cp ca-cert.pem tls-ca-cert.pem

export FABRIC_CA_CLIENT_TLS_CERTFILES=/tmp/hyperledger/tls-ca/crypto/tls-ca-cert.pem
export FABRIC_CA_CLIENT_HOME=/tmp/hyperledger/tls-ca/admin

fabric-ca-client enroll -d -u https://tls-ca-admin:[email protected]:7052
fabric-ca-client register -d --id.name peer1-org1 --id.secret peer1PW --id.type peer -u https://0.0.0.0:7052
fabric-ca-client register -d --id.name peer2-org1 --id.secret peer2PW --id.type peer -u https://0.0.0.0:7052
fabric-ca-client register -d --id.name peer1-org2 --id.secret peer1PW --id.type peer -u https://0.0.0.0:7052
fabric-ca-client register -d --id.name peer2-org2 --id.secret peer2PW --id.type peer -u https://0.0.0.0:7052
fabric-ca-client register -d --id.name orderer1-org0 --id.secret ordererPW --id.type orderer -u https://0.0.0.0:7052

第二步 Orderer CA server启动

docker-compose up rca-org0

export FABRIC_CA_CLIENT_TLS_CERTFILES=/tmp/hyperledger/org0/ca/crypto/ca-cert.pem
export FABRIC_CA_CLIENT_HOME=/tmp/hyperledger/org0/ca/admin
fabric-ca-client enroll -d -u https://rca-org0-admin:[email protected]:7053
fabric-ca-client register -d --id.name orderer1-org0 --id.secret ordererpw --id.type orderer -u https://0.0.0.0:7053
#fabric-ca-client register -d --id.name admin-org0 --id.secret org0adminpw --id.type admin --id.attrs "hf.Registrar.Roles=client,hf.Registrar.Attributes=*,hf.Revoker=true,hf.GenCRL=true,admin=true:ecert,abac.init=true:ecert" -u https://0.0.0.0:7053
此处先擅自改type为user
fabric-ca-client register -d --id.name admin-org0 --id.secret org0adminpw --id.type user --id.attrs "hf.Registrar.Roles=client,hf.Registrar.Attributes=*,hf.Revoker=true,hf.GenCRL=true,admin=true:ecert,abac.init=true:ecert" -u https://0.0.0.0:7053

第三步,Org1 CA server 启动
docker-compose up rca-org1

export FABRIC_CA_CLIENT_TLS_CERTFILES=/tmp/hyperledger/org1/ca/crypto/ca-cert.pem
export FABRIC_CA_CLIENT_HOME=/tmp/hyperledger/org1/ca/admin
fabric-ca-client enroll -d -u https://rca-org1-admin:[email protected]:7054
fabric-ca-client register -d --id.name peer1-org1 --id.secret peer1PW --id.type peer -u https://0.0.0.0:7054
fabric-ca-client register -d --id.name peer2-org1 --id.secret peer2PW --id.type peer -u https://0.0.0.0:7054
fabric-ca-client register -d --id.name admin-org1 --id.secret org1AdminPW --id.type user -u https://0.0.0.0:7054
fabric-ca-client register -d --id.name user-org1 --id.secret org1UserPW --id.type user -u https://0.0.0.0:7054

以下属于测试
fabric-ca-client register -d --id.name test1 --id.secret test --id.type test1 -u https://0.0.0.0:7054
fabric-ca-client register -d --id.name test2 --id.secret test2 --id.type admin --id.attrs "hf.Registrar.Roles=admin,hf.Registrar.Attributes=*,hf.Revoker=true,hf.GenCRL=true,admin=true:ecert,abac.init=true:ecert" -u https://0.0.0.0:7054

第四步,获取Org1 peer1的msp
cd /tmp/hyperledger/org1
mkdir -p peer1/assets/ca
cp /tmp/hyperledger/org1/ca/crypto/ca-cert.pem /tmp/hyperledger/org1/peer1/assets/ca/org1-ca-cert.pem
export FABRIC_CA_CLIENT_HOME=/tmp/hyperledger/org1/peer1
export FABRIC_CA_CLIENT_TLS_CERTFILES=/tmp/hyperledger/org1/peer1/assets/ca/org1-ca-cert.pem
export FABRIC_CA_CLIENT_MSPDIR=msp
fabric-ca-client enroll -d -u https://peer1-org1:[email protected]:7054

mkdir -p peer1/assets/tls-ca/
cp /tmp/hyperledger/tls-ca/crypto/ca-cert.pem /tmp/hyperledger/org1/peer1/assets/tls-ca/tls-ca-cert.pem
export FABRIC_CA_CLIENT_MSPDIR=tls-msp
export FABRIC_CA_CLIENT_TLS_CERTFILES=/tmp/hyperledger/org1/peer1/assets/tls-ca/tls-ca-cert.pem
fabric-ca-client enroll -d -u https://peer1-org1:[email protected]:7052 --enrollment.profile tls --csr.hosts peer1-org1
mv peer1/tls-msp/keystore/bcd24f6a1f03189f8850226099b9427ff65161ae7961553fba8fb2b3ae915009_sk peer1/tls-msp/keystore/key.pem
mkdir peer1/msp/admincerts

export FABRIC_CA_CLIENT_HOME=/tmp/hyperledger/org1/admin
export FABRIC_CA_CLIENT_TLS_CERTFILES=/tmp/hyperledger/org1/peer1/assets/ca/org1-ca-cert.pem
export FABRIC_CA_CLIENT_MSPDIR=msp
fabric-ca-client enroll -d -u https://admin-org1:[email protected]:7054
cp /tmp/hyperledger/org1/admin/msp/signcerts/cert.pem /tmp/hyperledger/org1/peer1/msp/admincerts/org1-admin-cert.pem

启动peer1
docker-compose up peer1-org1

第五步,获取Org0 orderer的msp
cd /tmp/hyperledger/org0
mkdir -p orderer/assets/ca/
cp /tmp/hyperledger/org0/ca/crypto/ca-cert.pem /tmp/hyperledger/org0/orderer/assets/ca/org0-ca-cert.pem
export FABRIC_CA_CLIENT_HOME=/tmp/hyperledger/org0/orderer
export FABRIC_CA_CLIENT_TLS_CERTFILES=/tmp/hyperledger/org0/orderer/assets/ca/org0-ca-cert.pem
fabric-ca-client enroll -d -u https://orderer1-org0:[email protected]:7053

mkdir -p orderer/assets/tls-ca/
cp /tmp/hyperledger/tls-ca/crypto/ca-cert.pem /tmp/hyperledger/org0/orderer/assets/tls-ca/tls-ca-cert.pem
export FABRIC_CA_CLIENT_MSPDIR=tls-msp
export FABRIC_CA_CLIENT_TLS_CERTFILES=/tmp/hyperledger/org0/orderer/assets/tls-ca/tls-ca-cert.pem
fabric-ca-client enroll -d -u https://orderer1-org0:[email protected]:7052 --enrollment.profile tls --csr.hosts orderer1-org0
mv /tmp/hyperledger/org0/orderer/tls-msp/keystore/* /tmp/hyperledger/org0/orderer/tls-msp/keystore/key.pem

export FABRIC_CA_CLIENT_HOME=/tmp/hyperledger/org0/admin
export FABRIC_CA_CLIENT_TLS_CERTFILES=/tmp/hyperledger/org0/orderer/assets/ca/org0-ca-cert.pem
export FABRIC_CA_CLIENT_MSPDIR=msp
fabric-ca-client enroll -d -u https://admin-org0:[email protected]:7053
mkdir /tmp/hyperledger/org0/orderer/msp/admincerts
cp /tmp/hyperledger/org0/admin/msp/signcerts/cert.pem /tmp/hyperledger/org0/orderer/msp/admincerts/orderer-admin-cert.pem

第六步,生成org0的msp
mkdir /tmp/hyperledger/org0/msp
cd /tmp/hyperledger/org0/msp
mkdir admincerts cacerts tlscacerts users
cp /tmp/hyperledger/org0/orderer/msp/admincerts/orderer-admin-cert.pem admincerts/admin-org0-cert.pem
cp /tmp/hyperledger/org0/ca/crypto/ca-cert.pem cacerts/org0-ca-cert.pem
cp /tmp/hyperledger/tls-ca/crypto/ca-cert.pem tlscacerts/tls-ca-cert.pem

第七步,生成org1的msp
mkdir /tmp/hyperledger/org1/msp
cd /tmp/hyperledger/org1/msp
mkdir admincerts cacerts tlscacerts users
cp /tmp/hyperledger/org1/peer1/msp/admincerts/org1-admin-cert.pem admincerts/admin-org1-cert.pem
cp /tmp/hyperledger/org1/ca/crypto/ca-cert.pem cacerts/org1-ca-cert.pem
cp /tmp/hyperledger/tls-ca/crypto/ca-cert.pem tlscacerts/tls-ca-cert.pem

第八步,创建创始区块


configtxgen -profile OrgsOrdererGenesis -outputBlock /tmp/hyperledger/org0/orderer/genesis.block -channelID syschannel
configtxgen -profile OrgsChannel -outputCreateChannelTx /tmp/hyperledger/org0/orderer/channel.tx -channelID mychannel
cp /tmp/hyperledger/org0/orderer/channel.tx /tmp/hyperledger/org1/peer1/assets/channel.tx


第九步,启动orderer
docker-compose up orderer1-org0
此处长时间卡住过不去,在于configtx.yaml文件中
Orderer.EtcdRaft.ClientTLSCert  /tmp/hyperledger/org0/orderer/tls-msp/signcerts/cert.pem
Orderer.EtcdRaft.ServerTLSCert  /tmp/hyperledger/org0/orderer/tls-msp/signcerts/cert.pem




第十步,启动
docker-compose up cli-org1


docker exec -it cli-org1 sh
在cli-org1中执行安装链码流程

export CORE_PEER_MSPCONFIGPATH=/tmp/hyperledger/org1/admin/msp

peer channel create -c mychannel -f /tmp/hyperledger/org1/peer1/assets/channel.tx -o orderer1-org0:7050 --outputBlock /tmp/hyperledger/org1/peer1/assets/mychannel.block --tls --cafile /tmp/hyperledger/org1/peer1/tls-msp/tlscacerts/tls-0-0-0-0-7052.pem
	这里长时间卡主,在于历史数据,需要删除这些数据
	docker rm $(docker ps -a -q) #删除容器
	rm /tmp/hyperledger/org0/orderer/genesis.block
	rm /tmp/hyperledger/org0/orderer/channel.tx
	rm /tmp/hyperledger/org1/peer1/assets/channel.tx

	rm -rf /tmp/hyperledger/org1/peer1/chaincode/sacc/

peer加入通道
peer channel join -b /tmp/hyperledger/org1/peer1/assets/mychannel.block

设置锚节点
mkdir channel-artifacts
peer channel fetch config channel-artifacts/config_block.pb -o orderer1-org0:7050  -c mychannel --tls --cafile /tmp/hyperledger/org1/peer1/tls-msp/tlscacerts/tls-0-0-0-0-7052.pem
cd channel-artifacts
configtxlator proto_decode --input config_block.pb --type common.Block --output config_block.json
jq .data.data[0].payload.data.config config_block.json > config.json
cp config.json config_copy.json
jq '.channel_group.groups.Application.groups.org1.values += {"AnchorPeers":{"mod_policy": "Admins","value":{"anchor_peers": [{"host": "peer1-org1","port": 7051}]},"version": "0"}}' config_copy.json > modified_config.json
configtxlator proto_encode --input config.json --type common.Config --output config.pb
configtxlator proto_encode --input modified_config.json --type common.Config --output modified_config.pb

configtxlator compute_update --channel_id mychannel --original config.pb --updated modified_config.pb --output config_update.pb
configtxlator proto_decode --input config_update.pb --type common.ConfigUpdate --output config_update.json
echo '{"payload":{"header":{"channel_header":{"channel_id":"mychannel", "type":2}},"data":{"config_update":'$(cat config_update.json)'}}}' | jq . > config_update_in_envelope.json
configtxlator proto_encode --input config_update_in_envelope.json --type common.Envelope --output config_update_in_envelope.pb
cd ..
peer channel update -f channel-artifacts/config_update_in_envelope.pb -c mychannel -o orderer1-org0:7050 --tls --cafile /tmp/hyperledger/org1/peer1/tls-msp/tlscacerts/tls-0-0-0-0-7052.pem

第十一步,链码操作
cp -r /home/dev3/work/fabric-samples/chaincode/sacc/ /tmp/hyperledger/org1/peer1/chaincode/sacc


在cli-org1中执行安装链码流程
go env -w GO111MODULE=on
go env -w GOPROXY=https://goproxy.io
cd /tmp/hyperledger/org1/peer1/chaincode/sacc
go mod init
go mod tidy
go mod vendor

peer lifecycle chaincode package /tmp/hyperledger/org1/peer1/chaincode/sacc.tar.gz --path /tmp/hyperledger/org1/peer1/chaincode/sacc --lang golang --label sacc_1
安装链码到peer上
peer lifecycle chaincode install /tmp/hyperledger/org1/peer1/chaincode/sacc.tar.gz
获取链码的packageid
peer lifecycle chaincode queryinstalled
export CC_PACKAGE_ID=sacc_1:b33357c4012471d8bd96ba48fd2a12ada5fedfbfd6d623590295778500a0368d
链码审议
peer lifecycle chaincode approveformyorg -o orderer1-org0:7050  --channelID mychannel --init-required --name sacc --version 1.0 --package-id $CC_PACKAGE_ID --sequence 1 --tls --cafile /tmp/hyperledger/org1/peer1/tls-msp/tlscacerts/tls-0-0-0-0-7052.pem
查看审议结果
peer lifecycle chaincode checkcommitreadiness --channelID mychannel --init-required --name sacc --version 1.0 --sequence 1 --tls --cafile /tmp/hyperledger/org1/peer1/tls-msp/tlscacerts/tls-0-0-0-0-7052.pem --output json


向通道提交链码
peer lifecycle chaincode commit -o orderer1-org0:7050 --channelID mychannel --init-required --name sacc --version 1.0 --sequence 1 --tls --cafile /tmp/hyperledger/org1/peer1/tls-msp/tlscacerts/tls-0-0-0-0-7052.pem --peerAddresses peer1-org1:7051 --tlsRootCertFiles $CORE_PEER_TLS_ROOTCERT_FILE 
查看提交结果
peer lifecycle chaincode querycommitted --channelID mychannel --name sacc --cafile /tmp/hyperledger/org1/peer1/tls-msp/tlscacerts/tls-0-0-0-0-7052.pem


调用链码
如果报错network guide_fabric-ca not found则执行docker network create guide_fabric-ca
但仍然报其它错误,尚未解决

peer chaincode invoke -o orderer1-org0:7050 --tls --cafile /tmp/hyperledger/org1/peer1/tls-msp/tlscacerts/tls-0-0-0-0-7052.pem -C mychannel -n sacc --peerAddresses peer1-org1:7051 --tlsRootCertFiles $CORE_PEER_TLS_ROOTCERT_FILE --isInit -c '{"Args":["a","bb"]}'

peer chaincode query -o orderer1-org0:7050 --tls --cafile /tmp/hyperledger/org1/peer1/tls-msp/tlscacerts/tls-0-0-0-0-7052.pem -C mychannel -n sacc  -c '{"Args":["query","a"]}'

peer chaincode invoke -o orderer1-org0:7050 --tls --cafile /tmp/hyperledger/org1/peer1/tls-msp/tlscacerts/tls-0-0-0-0-7052.pem -C mychannel -n sacc --peerAddresses peer1-org1:7051 --tlsRootCertFiles $CORE_PEER_TLS_ROOTCERT_FILE -c '{"Args":["set","a","cc"]}'


#CORE_OPERATIONS_TLS_CLIENTAUTHREQUIRED


docker network create guide_fabric-ca

*********指定将容器加入网络,如何加

############以下为非容器启动操作记录##############

rm /tmp/hyperledger/org0/orderer/genesis.block
rm /tmp/hyperledger/org0/orderer/channel.tx
rm /tmp/hyperledger/org1/peer1/assets/channel.tx
rm -rf etcdraft production
rm -rf /tmp/hyperledger/channel-artifacts
rm -rf /tmp/hyperledger/org1/peer1/chaincode/sacc

configtxgen -profile OrgsOrdererGenesis -outputBlock /tmp/hyperledger/org0/orderer/genesis.block -channelID syschannel
configtxgen -profile OrgsChannel -outputCreateChannelTx /tmp/hyperledger/org0/orderer/channel.tx -channelID mychannel

cp /tmp/hyperledger/org0/orderer/channel.tx /tmp/hyperledger/org1/peer1/assets/channel.tx
orderer start


到peer目录中
export FABRIC_CFG_PATH=$PWD
 
export CORE_PEER_TLS_ENABLED=true
export CORE_PEER_LOCALMSPID="org1MSP"

export CORE_PEER_TLS_ROOTCERT_FILE=/tmp/hyperledger/org1/peer1/tls-msp/tlscacerts/tls-0-0-0-0-7052.pem

#export CORE_PEER_MSPCONFIGPATH=/tmp/hyperledger/org1/admin/msp
export CORE_PEER_MSPCONFIGPATH=/tmp/hyperledger/org1/peer1/msp

export CORE_PEER_ADDRESS=peer1-org1:7051
 

启动peer
peer node start >> log_peer.log 2>&1 &

export FABRIC_CFG_PATH=$PWD
export CORE_PEER_TLS_ENABLED=true
export CORE_PEER_LOCALMSPID="org1MSP"
export CORE_PEER_TLS_ROOTCERT_FILE=/tmp/hyperledger/org1/peer1/tls-msp/tlscacerts/tls-0-0-0-0-7052.pem
export CORE_PEER_MSPCONFIGPATH=/tmp/hyperledger/org1/admin/msp
export CORE_PEER_ADDRESS=peer1-org1:7051



peer channel create -c mychannel -f /tmp/hyperledger/org1/peer1/assets/channel.tx -o orderer1-org0:7050 --outputBlock /tmp/hyperledger/org1/peer1/assets/mychannel.block --tls --cafile /tmp/hyperledger/org1/peer1/tls-msp/tlscacerts/tls-0-0-0-0-7052.pem

当启动peer时,使用export CORE_PEER_MSPCONFIGPATH=/tmp/hyperledger/org1/admin/msp则会创建通道失败。
启动peer时用export CORE_PEER_MSPCONFIGPATH=/tmp/hyperledger/org1/peer1/msp


 

你可能感兴趣的:(区块链,Hyperledger,Fabric)