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

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

MSP是什么?

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

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

orderer账号orderer.example.com

peer账号peer0.org1.example.com

client账号Admin@org1.example.com,User1@org1.example.com

账号目录结构如下

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/Admin@org1.example.com/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:ordererPW@0.0.0.0: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:tls-ca-adminpw@0.0.0.0: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:rca-org0-adminpw@0.0.0.0: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:rca-org1-adminpw@0.0.0.0: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:peer1PW@0.0.0.0: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:peer1PW@0.0.0.0: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:org1AdminPW@0.0.0.0: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:ordererpw@0.0.0.0: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:ordererPW@0.0.0.0: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:org0adminpw@0.0.0.0: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-compose.yaml
CORE_VM_DOCKER_HOSTCONFIG_NETWORKMODE=${COMPOSE_PROJECT_NAME}_test
COMPOSE_PROJECT_NAME这个环境变量,不能包含特殊字符,否则链码容器的网络就匹配不到
当然本例中没有这个变量加上即可(全部)。

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


 

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 要安装Hyperledger Fabric v1.4.4,您可以按照以下步骤操作: 1. 安装必要的软件:您需要在计算机上安装以下软件:Docker,Docker Compose,Go语言环境,Node.js和npm包管理器。 2. 克隆Hyperledger Fabric源代码:使用git工具,您可以克隆Hyperledger Fabric源代码到您的计算机上。使用以下命令: ``` git clone -b v1.4.4 https://github.com/hyperledger/fabric.git ``` 3. 下载所需的Docker镜像:使用以下命令下载所需的Docker镜像: ``` cd fabric curl -sSL https://raw.githubusercontent.com/hyperledger/fabric/v1.4.4/scripts/bootstrap.sh | bash -s -- 1.4.4 ``` 4. 启动Fabric网络:使用以下命令启动Fabric网络: ``` cd fabric-samples/first-network ./byfn.sh generate ./byfn.sh up ``` 这将启动一个由两个组织和四个对等节点组成的Fabric网络。 5. 安装Fabric CLI:使用以下命令安装Fabric CLI: ``` npm install -g fabric-cli ``` 6. 测试Fabric网络:使用以下命令测试Fabric网络: ``` fabric-cli chaincode invoke -o orderer.example.com:7050 -C mychannel -n mycc -c '{"Args":["invoke","a","b","10"]}' ``` 这将在Fabric网络上调用名为“mycc”的智能合约,并将“a”账户中的10个单位的货币转移到“b”账户中。 这些步骤将帮助您在您的计算机上安装Hyperledger Fabric v1.4.4并运行一个简单的Fabric网络。 ### 回答2: 安装Hyperledger Fabric v1.4.4 可以按照以下步骤进行: 1. 首先,确保你已经安装了Docker和Docker Compose。如果没有安装,你可以在官方网站上找到安装教程并按照步骤安装。 2. 进入Hyperledger Fabric官方Github仓库(https://github.com/hyperledger/fabric)并下载Fabric v1.4.4 的发布包。你可以选择下载源码或者已构建好的二进制文件。 3. 解压下载的文件并进入解压后的目录。 4. 打开终端并使用以下命令运行Fabric的二进制文件进行安装: ``` ./scripts/bootstrap.sh ``` 此命令会下载必需的镜像文件、二进制文件和示例代码。 5. 安装完成后,我们可以启动一个示例网络以验证安装成功。使用以下命令启动示例网络: ``` cd fabric-samples/first-network ./byfn.sh generate ./byfn.sh up ``` 这将在本地计算机上启动一个简单的Fabric网络并运行示例链码。 6. 在运行脚本之后,你可以使用以下命令关闭网络: ``` ./byfn.sh down ``` 以上是安装Hyperledger Fabric v1.4.4 的基本步骤。你可以通过阅读官方文档和使用其他资源来深入了解和使用Hyperledger Fabric。 ### 回答3: 要安装Hyperledger Fabric v1.4.4,您可以按照以下步骤进行操作: 1. 首先,确保您的计算机系统满足Hyperledger Fabric的硬件和软件要求。您需要一台运行Linux操作系统的计算机,并安装Docker和Docker Compose。 2. 下载Hyperledger Fabric的二进制文件。您可以从Hyperledger Fabric的官方网站下载适用于Linux的二进制文件。解压缩下载的文件并将其放在您希望安装的位置。 3. 配置Docker和Docker Compose。确保您具有适当的Docker权限,并安装和配置Docker Compose,以便能够运行多个Docker容器。 4. 设置Hyperledger Fabric网络。在您的计算机上创建一个目录,并将其作为Fabric网络的根目录。在此目录中,创建一个配置文件,其中包括网络的拓扑结构、组织、通道和节点等信息。您可以使用Hyperledger Fabric提供的示例配置文件作为参考。 5. 生成加密材料和初始区块。使用Fabric提供的工具生成加密材料,包括证书、私钥和MSP(Membership Service Provider)文件。然后,使用生成的材料创建初始区块。 6. 启动Hyperledger Fabric网络。使用Docker Compose命令在您的计算机上启动Fabric网络。这将根据您在配置文件中定义的拓扑结构创建和运行相应的Docker容器。 7. 部署智能合约。使用Fabric提供的工具,将您的智能合约部署到Fabric网络中的适当通道上。这将包括安装链码、实例化链码和建立合约的版本。 8. 运行和测试Fabric网络。一旦部署了智能合约,您可以使用Fabric提供的SDK或CLI工具与网络进行交互。通过执行交易和查询等操作,测试网络的功能和性能。 以上是安装Hyperledger Fabric v1.4.4的基本步骤。根据您的实际需求,可能还需要进行其他配置和操作。您可以参考Hyperledger Fabric的官方文档和社区资源,以获取更详细的安装说明和教程。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值