Fabric本地测试网络test-network搭建

使用最新的github上fabric-samples/master项目

测试网络说明

  • solo共识模式:1 orderer, 2 orgs [ 1 peer / org]

参考文档

默认版本:deployCC是装的asset合约

一、使用fabric源码编译相关的工具

  1. 下载源码
$ cd $GOPATH/src/github.com/hyperledger
$ git clone https://github.com/hyperledger/fabric.git
$ git checkout release-2.2

$ git clone https://github.com/hyperledger/fabric-samples.git
  1. 修改Docker的镜像

参考:Docker和alpine镜像内国内源配置

  1. 编译相关工具
$ cd $GOPATH/src/github.com/hyperledger/fabric
$ make checks
$ make configtxgen cryptogen orderer peer docker
  1. 拷贝其他环境
$ cd $GOPATH/src/github.com/hyperledger/fabric
$ mkdir ../fabric-samples/bin 
$ mkdir ../fabric-samples/config 
$ cp build/bin/* ../fabric-samples/bin
$ cp sampleconfig/* ../fabric-samples/config

$ export PATH=PATH:$GOPATH/src/github.com/hyperledger/fabric-samples/bin

二、network.sh 使用说明

$ ./network.sh -h
Usage:
  network.sh <Mode> [Flags]
    <Mode>
      - 'up' - bring up fabric orderer and peer nodes. No channel is created
      - 'up createChannel' - bring up fabric network with one channel
      - 'createChannel' - create and join a channel after the network is created
      - 'deployCC' - deploy the fabcar chaincode on the channel
      - 'down' - clear the network with docker-compose down
      - 'restart' - restart the network

    Flags:
    -ca <use CAs> -  create Certificate Authorities to generate the crypto material
    -c <channel name> - channel name to use (defaults to "mychannel")
    -s <dbtype> - the database backend to use: goleveldb (default) or couchdb
    -r <max retry> - CLI times out after certain number of attempts (defaults to 5)
    -d <delay> - delay duration in seconds (defaults to 3)
    -l <language> - the programming language of the chaincode to deploy: go (default), javascript, or java
    -v <version>  - chaincode version. Must be a round number, 1, 2, 3, etc
    -i <imagetag> - the tag to be used to launch the network (defaults to "latest")
    -verbose - verbose mode
  network.sh -h (print this message)

 Possible Mode and flags
  network.sh up -ca -c -r -d -s -i -verbose
  network.sh up createChannel -ca -c -r -d -s -i -verbose
  network.sh createChannel -c -r -d -verbose
  network.sh deployCC -l -v -r -d -verbose

 Taking all defaults:
    network.sh up

 Examples:
  network.sh up createChannel -ca -c mychannel -s couchdb -i 2.0.0
  network.sh createChannel -c channelName
  network.sh deployCC -l javascript

三、启动测试网络

./network.sh up

  • 只启动节点,没有通道
  • 目前启动的网络是solo模式(1个orderer、2个peer)
  • ./network.sh up createChannel mychannel启动网络时同时启动mychannel

创建channel

  • ./network.sh createChannel
  • 启动了mychannel
  • ./network.sh createChannel -c channel1 指定channel的名称,通道名称只能小写

./network.sh createChannel -c newchannel的具体过程(链码生命周期管理过程)如下:

verayy@verayy-VirtualBox:~/codes/go/src/github.com/hyperledger/fabric-samples/test-network$ ./network.sh createChannel -c newchannel
Creating channel 'newchannel'.
If network is not up, starting nodes with CLI timeout of '5' tries and CLI delay of '3' seconds and using database 'leveldb 
Generating channel create transaction 'newchannel.tx'
+ configtxgen -profile TwoOrgsChannel -outputCreateChannelTx ./channel-artifacts/newchannel.tx -channelID newchannel
2020-10-11 12:14:49.406 CST [common.tools.configtxgen] main -> INFO 001 Loading configuration
2020-10-11 12:14:49.448 CST [common.tools.configtxgen.localconfig] Load -> INFO 002 Loaded configuration: /home/verayy/codes/go/src/github.com/hyperledger/fabric-samples/test-network/configtx/configtx.yaml
2020-10-11 12:14:49.448 CST [common.tools.configtxgen] doOutputChannelCreateTx -> INFO 003 Generating new channel configtx
2020-10-11 12:14:49.452 CST [common.tools.configtxgen] doOutputChannelCreateTx -> INFO 004 Writing new channel tx
+ res=0
Generating anchor peer update transactions
Generating anchor peer update transaction for Org1MSP
+ configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org1MSPanchors.tx -channelID newchannel -asOrg Org1MSP
2020-10-11 12:14:49.496 CST [common.tools.configtxgen] main -> INFO 001 Loading configuration
2020-10-11 12:14:49.539 CST [common.tools.configtxgen.localconfig] Load -> INFO 002 Loaded configuration: /home/verayy/codes/go/src/github.com/hyperledger/fabric-samples/test-network/configtx/configtx.yaml
2020-10-11 12:14:49.539 CST [common.tools.configtxgen] doOutputAnchorPeersUpdate -> INFO 003 Generating anchor peer update
2020-10-11 12:14:49.541 CST [common.tools.configtxgen] doOutputAnchorPeersUpdate -> INFO 004 Writing anchor peer update
+ res=0
Generating anchor peer update transaction for Org2MSP
+ configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org2MSPanchors.tx -channelID newchannel -asOrg Org2MSP
2020-10-11 12:14:49.593 CST [common.tools.configtxgen] main -> INFO 001 Loading configuration
2020-10-11 12:14:49.637 CST [common.tools.configtxgen.localconfig] Load -> INFO 002 Loaded configuration: /home/verayy/codes/go/src/github.com/hyperledger/fabric-samples/test-network/configtx/configtx.yaml
2020-10-11 12:14:49.637 CST [common.tools.configtxgen] doOutputAnchorPeersUpdate -> INFO 003 Generating anchor peer update
2020-10-11 12:14:49.639 CST [common.tools.configtxgen] doOutputAnchorPeersUpdate -> INFO 004 Writing anchor peer update
+ res=0
Creating channel newchannel
Using organization 1
+ peer channel create -o localhost:7050 -c newchannel --ordererTLSHostnameOverride orderer.example.com -f ./channel-artifacts/newchannel.tx --outputBlock ./channel-artifacts/newchannel.block --tls --cafile /home/verayy/codes/go/src/github.com/hyperledger/fabric-samples/test-network/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem
+ res=0
2020-10-11 12:14:52.710 CST [channelCmd] InitCmdFactory -> INFO 001 Endorser and orderer connections initialized
2020-10-11 12:14:52.766 CST [cli.common] readBlock -> INFO 002 Expect block, but got status: &{NOT_FOUND}
2020-10-11 12:14:52.770 CST [channelCmd] InitCmdFactory -> INFO 003 Endorser and orderer connections initialized
2020-10-11 12:14:52.971 CST [cli.common] readBlock -> INFO 004 Expect block, but got status: &{SERVICE_UNAVAILABLE}
2020-10-11 12:14:52.975 CST [channelCmd] InitCmdFactory -> INFO 005 Endorser and orderer connections initialized
2020-10-11 12:14:53.176 CST [cli.common] readBlock -> INFO 006 Expect block, but got status: &{SERVICE_UNAVAILABLE}
2020-10-11 12:14:53.179 CST [channelCmd] InitCmdFactory -> INFO 007 Endorser and orderer connections initialized
2020-10-11 12:14:53.380 CST [cli.common] readBlock -> INFO 008 Expect block, but got status: &{SERVICE_UNAVAILABLE}
2020-10-11 12:14:53.383 CST [channelCmd] InitCmdFactory -> INFO 009 Endorser and orderer connections initialized
2020-10-11 12:14:53.584 CST [cli.common] readBlock -> INFO 00a Expect block, but got status: &{SERVICE_UNAVAILABLE}
2020-10-11 12:14:53.589 CST [channelCmd] InitCmdFactory -> INFO 00b Endorser and orderer connections initialized
2020-10-11 12:14:53.790 CST [cli.common] readBlock -> INFO 00c Expect block, but got status: &{SERVICE_UNAVAILABLE}
2020-10-11 12:14:53.794 CST [channelCmd] InitCmdFactory -> INFO 00d Endorser and orderer connections initialized
2020-10-11 12:14:53.999 CST [cli.common] readBlock -> INFO 00e Received block: 0
Channel 'newchannel' created
Join Org1 peers to the channel...
Using organization 1
+ peer channel join -b ./channel-artifacts/newchannel.block
+ res=0
2020-10-11 12:14:57.102 CST [channelCmd] InitCmdFactory -> INFO 001 Endorser and orderer connections initialized
2020-10-11 12:14:57.214 CST [channelCmd] executeJoin -> INFO 002 Successfully submitted proposal to join channel
Join Org2 peers to the channel...
Using organization 2
+ peer channel join -b ./channel-artifacts/newchannel.block
+ res=0
2020-10-11 12:15:00.333 CST [channelCmd] InitCmdFactory -> INFO 001 Endorser and orderer connections initialized
2020-10-11 12:15:00.421 CST [channelCmd] executeJoin -> INFO 002 Successfully submitted proposal to join channel
Updating anchor peers for org1...
Using organization 1
+ peer channel update -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com -c newchannel -f ./channel-artifacts/Org1MSPanchors.tx --tls --cafile /home/verayy/codes/go/src/github.com/hyperledger/fabric-samples/test-network/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem
+ res=0
2020-10-11 12:15:03.519 CST [channelCmd] InitCmdFactory -> INFO 001 Endorser and orderer connections initialized
2020-10-11 12:15:03.547 CST [channelCmd] update -> INFO 002 Successfully submitted channel update
Anchor peers updated for org 'Org1MSP' on channel 'newchannel'
Updating anchor peers for org2...
Using organization 2
+ peer channel update -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com -c newchannel -f ./channel-artifacts/Org2MSPanchors.tx --tls --cafile /home/verayy/codes/go/src/github.com/hyperledger/fabric-samples/test-network/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem
+ res=0
2020-10-11 12:15:09.637 CST [channelCmd] InitCmdFactory -> INFO 001 Endorser and orderer connections initialized
2020-10-11 12:15:09.671 CST [channelCmd] update -> INFO 002 Successfully submitted channel update
Anchor peers updated for org 'Org2MSP' on channel 'newchannel'
Channel successfully joined

安装链码

  • 安装fabcar链码
$ ~/codes/go/src/github.com/hyperledger/fabric-samples/test-network$ ls ../chaincode 
abac  abstore  fabcar  marbles02  marbles02_private  README.md  sacc

$ ./network.sh deployCC -ccn fabcar -ccp ../chaincode/fabcar/go -ccv 1 -ccl go

上述命令的实际执行过程如下:

verayy@verayy-VirtualBox:~/codes/go/src/github.com/hyperledger/fabric-samples/test-network$ ./network.sh deployCC -ccn fabcar -ccp ../chaincode/fabcar/go -ccv 1 -ccl go
deploying chaincode on channel 'mychannel'
executing with the following
- CHANNEL_NAME: mychannel
- CC_NAME: fabcar
- CC_SRC_PATH: ../chaincode/fabcar/go
- CC_SRC_LANGUAGE: go
- CC_VERSION: 1
- CC_SEQUENCE: 1
- CC_END_POLICY: NA
- CC_COLL_CONFIG: NA
- CC_INIT_FCN: NA
- DELAY: 3
- MAX_RETRY: 5
- VERBOSE: false
Vendoring Go dependencies at ../chaincode/fabcar/go
~/codes/go/src/github.com/hyperledger/fabric-samples/chaincode/fabcar/go ~/codes/go/src/github.com/hyperledger/fabric-samples/test-network
~/codes/go/src/github.com/hyperledger/fabric-samples/test-network
Finished vendoring Go dependencies
Using organization 1
+ peer lifecycle chaincode package fabcar.tar.gz --path ../chaincode/fabcar/go --lang golang --label fabcar_1
+ res=0
Chaincode is packaged on peer0.org1
Installing chaincode on peer0.org1...
Using organization 1
+ peer lifecycle chaincode install fabcar.tar.gz
+ res=0
2020-10-11 11:55:11.161 CST [cli.lifecycle.chaincode] submitInstallProposal -> INFO 001 Installed remotely: response:<status:200 payload:"\nIfabcar_1:762e0fe3dbeee0f7b08fb6200adeb4a3a20f649a00f168c0b3c2257e53b6e506\022\010fabcar_1" > 
2020-10-11 11:55:11.162 CST [cli.lifecycle.chaincode] submitInstallProposal -> INFO 002 Chaincode code package identifier: fabcar_1:762e0fe3dbeee0f7b08fb6200adeb4a3a20f649a00f168c0b3c2257e53b6e506
Chaincode is installed on peer0.org1
Install chaincode on peer0.org2...
Using organization 2
+ peer lifecycle chaincode install fabcar.tar.gz
+ res=0
2020-10-11 11:55:41.818 CST [cli.lifecycle.chaincode] submitInstallProposal -> INFO 001 Installed remotely: response:<status:200 payload:"\nIfabcar_1:762e0fe3dbeee0f7b08fb6200adeb4a3a20f649a00f168c0b3c2257e53b6e506\022\010fabcar_1" > 
2020-10-11 11:55:41.818 CST [cli.lifecycle.chaincode] submitInstallProposal -> INFO 002 Chaincode code package identifier: fabcar_1:762e0fe3dbeee0f7b08fb6200adeb4a3a20f649a00f168c0b3c2257e53b6e506
Chaincode is installed on peer0.org2
Using organization 1
+ peer lifecycle chaincode queryinstalled
+ res=0
Installed chaincodes on peer:
Package ID: fabcar_1:762e0fe3dbeee0f7b08fb6200adeb4a3a20f649a00f168c0b3c2257e53b6e506, Label: fabcar_1
Query installed successful on peer0.org1 on channel
Using organization 1
+ peer lifecycle chaincode approveformyorg -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --tls --cafile /home/verayy/codes/go/src/github.com/hyperledger/fabric-samples/test-network/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem --channelID mychannel --name fabcar --version 1 --package-id fabcar_1:762e0fe3dbeee0f7b08fb6200adeb4a3a20f649a00f168c0b3c2257e53b6e506 --sequence 1
+ res=0
2020-10-11 11:55:44.318 CST [chaincodeCmd] ClientWait -> INFO 001 txid [c318490e21c3c33212cc52415eb183e7851ecc5e4775b048978dc88e4d1144ed] committed with status (VALID) at localhost:7051
Chaincode definition approved on peer0.org1 on channel 'mychannel'
Using organization 1
Checking the commit readiness of the chaincode definition on peer0.org1 on channel 'mychannel'...
Attempting to check the commit readiness of the chaincode definition on peer0.org1, Retry after 3 seconds.
+ peer lifecycle chaincode checkcommitreadiness --channelID mychannel --name fabcar --version 1 --sequence 1 --output json
+ res=0
{
    
    
	"approvals": {
    
    
		"Org1MSP": true,
		"Org2MSP": false
	}
}
Checking the commit readiness of the chaincode definition successful on peer0.org1 on channel 'mychannel'
Using organization 2
Checking the commit readiness of the chaincode definition on peer0.org2 on channel 'mychannel'...
Attempting to check the commit readiness of the chaincode definition on peer0.org2, Retry after 3 seconds.
+ peer lifecycle chaincode checkcommitreadiness --channelID mychannel --name fabcar --version 1 --sequence 1 --output json
+ res=0
{
    
    
	"approvals": {
    
    
		"Org1MSP": true,
		"Org2MSP": false
	}
}
Checking the commit readiness of the chaincode definition successful on peer0.org2 on channel 'mychannel'
Using organization 2
+ peer lifecycle chaincode approveformyorg -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --tls --cafile /home/verayy/codes/go/src/github.com/hyperledger/fabric-samples/test-network/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem --channelID mychannel --name fabcar --version 1 --package-id fabcar_1:762e0fe3dbeee0f7b08fb6200adeb4a3a20f649a00f168c0b3c2257e53b6e506 --sequence 1
+ res=0
2020-10-11 11:55:52.867 CST [chaincodeCmd] ClientWait -> INFO 001 txid [7694a74c7cdb5f08402ce2183bf70754d4abb95d58ecace82a6a460f5baf2442] committed with status (VALID) at localhost:9051
Chaincode definition approved on peer0.org2 on channel 'mychannel'
Using organization 1
Checking the commit readiness of the chaincode definition on peer0.org1 on channel 'mychannel'...
Attempting to check the commit readiness of the chaincode definition on peer0.org1, Retry after 3 seconds.
+ peer lifecycle chaincode checkcommitreadiness --channelID mychannel --name fabcar --version 1 --sequence 1 --output json
+ res=0
{
    
    
	"approvals": {
    
    
		"Org1MSP": true,
		"Org2MSP": true
	}
}
Checking the commit readiness of the chaincode definition successful on peer0.org1 on channel 'mychannel'
Using organization 2
Checking the commit readiness of the chaincode definition on peer0.org2 on channel 'mychannel'...
Attempting to check the commit readiness of the chaincode definition on peer0.org2, Retry after 3 seconds.
+ peer lifecycle chaincode checkcommitreadiness --channelID mychannel --name fabcar --version 1 --sequence 1 --output json
+ res=0
{
    
    
	"approvals": {
    
    
		"Org1MSP": true,
		"Org2MSP": true
	}
}
Checking the commit readiness of the chaincode definition successful on peer0.org2 on channel 'mychannel'
Using organization 1
Using organization 2
+ peer lifecycle chaincode commit -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --tls --cafile /home/verayy/codes/go/src/github.com/hyperledger/fabric-samples/test-network/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem --channelID mychannel --name fabcar --peerAddresses localhost:7051 --tlsRootCertFiles /home/verayy/codes/go/src/github.com/hyperledger/fabric-samples/test-network/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt --peerAddresses localhost:9051 --tlsRootCertFiles /home/verayy/codes/go/src/github.com/hyperledger/fabric-samples/test-network/organizations/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt --version 1 --sequence 1
+ res=0
2020-10-11 11:56:02.104 CST [chaincodeCmd] ClientWait -> INFO 001 txid [e4b46f28e6e2f1b872fae356d9bdb5b1ad7827f31dd67342d5ac9aad54106922] committed with status (VALID) at localhost:7051
2020-10-11 11:56:02.133 CST [chaincodeCmd] ClientWait -> INFO 002 txid [e4b46f28e6e2f1b872fae356d9bdb5b1ad7827f31dd67342d5ac9aad54106922] committed with status (VALID) at localhost:9051
Chaincode definition committed on channel 'mychannel'
Using organization 1
Querying chaincode definition on peer0.org1 on channel 'mychannel'...
Attempting to Query committed status on peer0.org1, Retry after 3 seconds.
+ peer lifecycle chaincode querycommitted --channelID mychannel --name fabcar
+ res=0
Committed chaincode definition for chaincode 'fabcar' on channel 'mychannel':
Version: 1, Sequence: 1, Endorsement Plugin: escc, Validation Plugin: vscc, Approvals: [Org1MSP: true, Org2MSP: true]
Query chaincode definition successful on peer0.org1 on channel 'mychannel'
Using organization 2
Querying chaincode definition on peer0.org2 on channel 'mychannel'...
Attempting to Query committed status on peer0.org2, Retry after 3 seconds.
+ peer lifecycle chaincode querycommitted --channelID mychannel --name fabcar
+ res=0
Committed chaincode definition for chaincode 'fabcar' on channel 'mychannel':
Version: 1, Sequence: 1, Endorsement Plugin: escc, Validation Plugin: vscc, Approvals: [Org1MSP: true, Org2MSP: true]
Query chaincode definition successful on peer0.org2 on channel 'mychannel'
Chaincode initialization is not required

四、Interacting with the network

1. 设置变量

Make sure that you are operating from the test-network directory

export PATH=${PWD}/../bin:${PWD}:$PATH
export FABRIC_CFG_PATH=$PWD/../config/

# 下面Org1和Org2选择一个配置即可

# Environment variables for Org1
export CORE_PEER_TLS_ENABLED=true
export CORE_PEER_LOCALMSPID="Org1MSP"
export CORE_PEER_TLS_ROOTCERT_FILE=${PWD}/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt
export CORE_PEER_MSPCONFIGPATH=${PWD}/organizations/peerOrganizations/org1.example.com/users/[email protected]/msp
export CORE_PEER_ADDRESS=localhost:7051

# Environment variables for Org2
export CORE_PEER_TLS_ENABLED=true
export CORE_PEER_LOCALMSPID="Org2MSP"
export CORE_PEER_TLS_ROOTCERT_FILE=${PWD}/organizations/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt
export CORE_PEER_MSPCONFIGPATH=${PWD}/organizations/peerOrganizations/org2.example.com/users/[email protected]/msp
export CORE_PEER_ADDRESS=localhost:9051

2. 查询fabcar链码

$ peer chaincode query -C mychannel -n fabcar -c '{"Args":["QueryAllCars"]}' 

3. 调用fabcar链码

peer chaincode invoke \
-o localhost:7050 \
--ordererTLSHostnameOverride orderer.example.com \
--tls --cafile ${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem \
--peerAddresses localhost:7051 \
--tlsRootCertFiles ${PWD}/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt \
--peerAddresses localhost:9051 \
--tlsRootCertFiles ${PWD}/organizations/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt \
-C mychannel \
-n fabcar \
-c '{"function":"InitLedger","Args":[]}'

4. 创建新的通道

// 生成通道配置文件
$ configtxgen -profile TwoOrgsChannel -outputCreateChannelTx ./channel-artifacts/testchannel.tx -channelID testchannel  -configPath ./configtx/

// 生成org1的锚节点配置文件
$ configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org1MSPanchors.tx -channelID testchannel -asOrg Org1MSP -configPath ./configtx/

// 生成org2的锚节点配置文件
$ configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org2MSPanchors.tx -channelID testchannel -asOrg Org2MSP -configPath ./configtx/

// 创建通道
$ peer channel create -o localhost:7050 -c testchannel --ordererTLSHostnameOverride orderer.example.com \
-f ./channel-artifacts/testchannel.tx \
--outputBlock ./channel-artifacts/testchannel.block \
--tls --cafile /home/verayy/codes/go/src/github.com/hyperledger/fabric-samples/test-network/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem

// 每个org加入通道,需要切换上述的配置文件
$ peer channel join -b ./channel-artifacts/testchannel.block

// 使用每个org的管理员身份更新锚节点配置
$ peer channel update -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com -c testchannel -f ./channel-artifacts/Org1MSPanchors.tx --tls --cafile /home/verayy/codes/go/src/github.com/hyperledger/fabric-samples/test-network/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem

猜你喜欢

转载自blog.csdn.net/shuizhongmose/article/details/109056691