Fabric是一个联盟链,联盟链的特点是用户非授权时不能接入区块链,因此Fabric系统中存在一套授权体系,我们将这个体系称为Fabric Membership Service Providers
Fabric的账号实际上是根据PKI规范生成的一组证书和秘钥文件。在Fabric中每条交易都会加上发起者的标签(签名证书),同时用发起人的私钥进行加密。如果交易需要其他组织的节点提供背书功能,那么背书节点也会在交易中加入自己的签名。这样每一笔交易过程都会非常清晰并且不可篡改。鉴于传统系统中基于账号和密码的验证体系已经无法完成这样的工作。因此Fabric设计了基于PKI规范的账号系统满足这样的要求。
一个完整的Fabric账号中包含的内容如下所示:
orderer账号orderer.example.com
peer账号peer0.org1.example.com
client账号[email protected],[email protected]
账号目录结构如下
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中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)
--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
第一步,启动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