Fabric v2.3 手动模拟(三)- 创建通道./network.sh createChannel命令 - 设置锚节点

本文详细指导了在Fabric v2.3中如何手动操作,包括注释设置锚节点、关闭与开启网络、创建通道,并着重讲解了如何在org1和org2中设置锚节点的过程。涉及环境配置、通道配置更新和交易Envelopes的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

1. 前提条件

(1)注释设置锚节点命令

(2)关闭网络

(3)开启网络

(4)创建通道

2. 设置org1中的锚节点

(1)进入client客户端

(2)设置环境变量

(3)获取通道配置

(4)将配置块protobuf格式转成json格式

(5)将锚节点添加至配置文件中

(6)设置环境变量

(7)将原始和修改的通道配置都转换回protobuf格式

(8)将配置更新包装在交易Envelope中

(9)更新通道配置添加Peer 锚节点

3. 设置org2中的锚节点

4. 将注释锚节点的命令解开


在上一篇创建通道中,创建通道最后一步是设置锚节点,是通过执行

docker exec cli ./scripts/setAnchorPeer.sh 1 mychannel 完成对组织org1中的锚节点设置,这里调用./scripts/setAnchorPeer.sh脚本文件,下面对将模拟脚本中的内容进行锚节点设置。

1. 前提条件

注释掉设置锚节点命令,关闭网络,重新开启网络并创建通道。

(1)注释设置锚节点命令

[root@localhost test-network-myself]# vi network-myself.sh

回车,按键盘上的 i 键或 Insert 功能键,进入编辑状态,注释设置锚节点,只显示如注释部分,内容如下:

	# 将org2节点加入通道
	peer channel join -b $BLOCKFILE
 
	# 设置组织org1的锚节点,docker exec命令中使用setAnchorPeer.sh脚本返回的信息作为参数部分
	#docker exec cli ./scripts/setAnchorPeer.sh 1 mychannel
 
	# 设置组织org2的锚节点,docker exec命令中使用setAnchorPeer.sh脚本返回的信息作为参数部分
	#docker exec cli ./scripts/setAnchorPeer.sh 2 mychannel

按ESC,输入:wq保存退出

(2)关闭网络

[root@localhost test-network-myself]# ./network-myself.sh down
关闭自己的测试网络
+ export DOCKER_SOCK=/var/run/docker.sock
+ DOCKER_SOCK=/var/run/docker.sock
+ docker-compose -f docker/docker-compose-test-net.yaml down --volumes --remove-orphans
Stopping cli                    ... done
Stopping peer0.org2.example.com ... done
Stopping orderer.example.com    ... done
Stopping peer0.org1.example.com ... done
Removing cli                    ... done
Removing peer0.org2.example.com ... done
Removing orderer.example.com    ... done
Removing peer0.org1.example.com ... done
Removing network fabric_test
Removing volume docker_orderer.example.com
Removing volume docker_peer0.org1.example.com
Removing volume docker_peer0.org2.example.com
+ rm -rf ./organizations/ordererOrganizations ./organizations/peerOrganizations
+ rm -rf ./system-genesis-block/genesis.block
+ set +x

(3)开启网络

[root@localhost test-network-myself]# ./network-myself.sh up
开启自己的测试网络
+ export DOCKER_SOCK=/var/run/docker.sock
+ DOCKER_SOCK=/var/run/docker.sock
+ docker-compose -f docker/docker-compose-test-net.yaml down --volumes --remove-orphans
Removing network fabric_test
WARNING: Network fabric_test not found.
Removing volume docker_orderer.example.com
WARNING: Volume docker_orderer.example.com not found.
Removing volume docker_peer0.org1.example.com
WARNING: Volume docker_peer0.org1.example.com not found.
Removing volume docker_peer0.org2.example.com
WARNING: Volume docker_peer0.org2.example.com not found.
+ rm -rf './organizations/*Organizations'
+ rm -rf './system-genesis-block/*.block'
+ set +x
+ cryptogen generate --config=./crypto-config.yaml --output=organizations
org1.example.com
org2.example.com
+ ./organizations/ccp-generate.sh
+ export DOCKER_SOCK=/var/run/docker.sock
+ DOCKER_SOCK=/var/run/docker.sock
+ docker-compose -f docker/docker-compose-test-net.yaml up -d
Creating network "fabric_test" with the default driver
Creating volume "docker_orderer.example.com" with default driver
Creating volume "docker_peer0.org1.example.com" with default driver
Creating volume "docker_peer0.org2.example.com" with default driver
Creating orderer.example.com    ... done
Creating peer0.org2.example.com ... done
Creating peer0.org1.example.com ... done
Creating cli                    ... done
+ set +x

(4)创建通道

此时创建通道中没有设置锚节点

[root@localhost test-network-myself]# ./network-myself.sh createChannel
创建通道
2021-11-22 18:55:14.649 CST [common.tools.configtxgen] main -> INFO 001 Loading configuration
2021-11-22 18:55:14.655 CST [common.tools.configtxgen.localconfig] completeInitialization -> INFO 002 orderer type: etcdraft
2021-11-22 18:55:14.655 CST [common.tools.configtxgen.localconfig] completeInitialization -> INFO 003 Orderer.EtcdRaft.Options unset, setting to tick_interval:"500ms" election_tick:10 heartbeat_tick:1 max_inflight_blocks:5 snapshot_interval_size:16777216 
2021-11-22 18:55:14.655 CST [common.tools.configtxgen.localconfig] Load -> INFO 004 Loaded configuration: /home/gopath/src/github.com/hyperledger/fabric/scripts/fabric-samples/test-network-myself/configtx/configtx.yaml
2021-11-22 18:55:14.657 CST [common.tools.configtxgen] doOutputBlock -> INFO 005 Generating genesis block
2021-11-22 18:55:14.657 CST [common.tools.configtxgen] doOutputBlock -> INFO 006 Creating application channel genesis block
2021-11-22 18:55:14.658 CST [common.tools.configtxgen] doOutputBlock -> INFO 007 Writing genesis block
Status: 201
{
	"name": "mychannel",
	"url": "/participation/v1/channels/mychannel",
	"consensusRelation": "consenter",
	"status": "active",
	"height": 1
}

2021-11-22 18:55:20.760 CST [channelCmd] InitCmdFactory -> INFO 001 Endorser and orderer connections initialized
2021-11-22 18:55:20.774 CST [channelCmd] executeJoin -> INFO 002 Successfully submitted proposal to join channel
2021-11-22 18:55:23.810 CST [channelCmd] InitCmdFactory -> INFO 001 Endorser and orderer connections initialized
2021-11-22 18:55:23.824 CST [channelCmd] executeJoin -> INFO 002 Successfully submitted proposal to join channel

2. 设置org1中的锚节点

(1)进入client客户端

[root@localhost test-network-myself]# docker exec -it cli /bin/bash  #进入客户端
bash-5.1# ls  #查看客户端目录
organizations  scripts

(2)设置环境变量

bash-5.1# export ORG=1    #传递的参数
bash-5.1# export CHANNEL_NAME=mychannel   #传递的参数
bash-5.1# export CORE_PEER_TLS_ENABLED=true
bash-5.1# export ORDERER_CA=${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem
bash-5.1# export PEER0_ORG1_CA=${PWD}/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt
bash-5.1# export PEER0_ORG2_CA=${PWD}/organizations/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt
bash-5.1# export PEER0_ORG3_CA=${PWD}/organizations/peerOrganizations/org3.example.com/peers/peer0.org3.example.com/tls/ca.crt
bash-5.1# export ORDERER_ADMIN_TLS_SIGN_CERT=${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/tls/server.crt
bash-5.1# export ORDERER_ADMIN_TLS_PRIVATE_KEY=${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/tls/server.key
bash-5.1# export CORE_PEER_LOCALMSPID="Org1MSP"
bash-5.1# export CORE_PEER_TLS_ROOTCERT_FILE=$PEER0_ORG1_CA
bash-5.1# export CORE_PEER_MSPCONFIGPATH=${PWD}/organizations/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp
bash-5.1# export CORE_PEER_ADDRESS=localhost:7051
bash-5.1# export OUTPUT=${CORE_PEER_LOCALMSPID}config.json
bash-5.1# export HOST="peer0.org1.example.com"
bash-5.1# export PORT=7051

(3)获取通道配置

bash-5.1# peer channel fetch config config_block.pb -o orderer.example.com:7050 --ordererTLSHostnameOverride orderer.example.com -c mychannel --tls --cafile "$ORDERER_CA"
2021-11-22 10:57:38.039 UTC [channelCmd] InitCmdFactory -> INFO 001 Endorser and orderer connections initialized
2021-11-22 10:57:38.040 UTC [cli.common] readBlock -> INFO 002 Received block: 0
2021-11-22 10:57:38.041 UTC [channelCmd] fetch -> INFO 003 Retrieving last config block: 0
2021-11-22 10:57:38.041 UTC [cli.common] readBlock -> INFO 004 Received block: 0

由于最新的通道配置块是通道创世块,因此该通道的命令返回块0

(4)将配置块protobuf格式转成json格式

bash-5.1# configtxlator proto_decode --input config_block.pb --type common.Block | jq .data.data[0].payload.data.config >"${OUTPUT}"
bash-5.1# ls
Org1MSPconfig.json  config_block.pb     organizations       scripts

(5)将锚节点添加至配置文件中

bash-5.1# jq '.channel_group.groups.Application.groups.'${CORE_PEER_LOCALMSPID}'.values += {"AnchorPeers":{"mod_policy": "Admins","value":{"anchor_peers": [{"host": "'$HOST'","port": '$PORT'}]},"version": "0"}}' ${CORE_PEER_LOCALMSPID}config.json > ${CORE_PEER_LOCALMSPID}modified_config.json
bash-5.1# ls
Org1MSPconfig.json           organizations
Org1MSPmodified_config.json  scripts
config_block.pb

(6)设置环境变量

bash-5.1# export CHANNEL=mychannel
bash-5.1# export ORIGINAL=${CORE_PEER_LOCALMSPID}config.json
bash-5.1# export MODIFIED=${CORE_PEER_LOCALMSPID}modified_config.json
bash-5.1# export OUTPUT=${CORE_PEER_LOCALMSPID}anchors.tx

(7)将原始和修改的通道配置都转换回protobuf格式

并计算它们之间的差异

bash-5.1# configtxlator proto_encode --input "${ORIGINAL}" --type common.Config >original_config.pb
onfig.pb --updated modified_config.pb >config_update.pbbash-5.1# configtxlator proto_encode --input "${MODIFIED}" --type common.Config >modified_config.pb
bash-5.1# configtxlator compute_update --channel_id "${CHANNEL}" --original original_config.pb --updated modified_config.pb >config_update.pb
bash-5.1# ls
Org1MSPconfig.json           modified_config.pb
Org1MSPmodified_config.json  organizations
config_block.pb              original_config.pb
config_update.pb             scripts

(8)将配置更新包装在交易Envelope中

为了创建通道配置更新交易,将配置更新包装在交易Envelope中

bash-5.1# configtxlator proto_decode --input config_update.pb --type common.ConfigUpdate >config_update.json
bash-5.1# configtxlator proto_encode --input config_update_in_envelope.json --type common.Envelope >"${OUTPUT}"
configtxlator: error: open config_update_in_envelope.json: no such file or directory, try --help
bash-5.1# ls
Org1MSPanchors.tx            config_update.pb
Org1MSPconfig.json           modified_config.pb
Org1MSPmodified_config.json  organizations
config_block.pb              original_config.pb
config_update.json           scripts

(9)更新通道配置添加Peer 锚节点

bash-5.1# peer channel update -o orderer.example.com:7050 --ordererTLSHostnameOverride orderer.example.com -c $CHANNEL_NAME -f ${CORE_PEER_LOCALMSPID}anchors.tx --tls --cafile "$ORDERER_CA" >&log.txt

3. 设置org2中的锚节点

设置org2使用的环境变量,执行步骤与设置org1中的锚节点一样,此处不再赘述。

4. 将注释锚节点的命令解开

[root@localhost test-network-myself]# vi network-myself.sh

回车,按键盘上的 i 键或 Insert 功能键,进入编辑状态,注释设置锚节点,只显示如注释部分,内容如下:

	# 将org2节点加入通道
	peer channel join -b $BLOCKFILE
 
	# 设置组织org1的锚节点,docker exec命令中使用setAnchorPeer.sh脚本返回的信息作为参数部分
	docker exec cli ./scripts/setAnchorPeer.sh 1 mychannel
 
	# 设置组织org2的锚节点,docker exec命令中使用setAnchorPeer.sh脚本返回的信息作为参数部分
	docker exec cli ./scripts/setAnchorPeer.sh 2 mychannel

按ESC,输入:wq保存退出

上一篇:Fabric v2.3 手动模拟(二)- 创建通道./network.sh createChannel命令

下一篇:Fabric v2.3 测试网络 - 脚本分析(四)- 安装部署链码deployCC.sh解析

### 解决 Hyperledger Fabric 中由于 MSP 文件夹缺失导致 Peer 初始化失败的问题 在 Hyperledger Fabric 的环境中,当指定的 `msp` 路径不存在或不可访问时,会触发类似于以下错误: > Cannot run peer because cannot init crypto, specified path "/home/yujialing/go/src/github.com/hyperledger/fabric-samples/config/msp" does not exist or cannot be accessed: stat /home/yujialing/go/src/github.com/hyperledger/fabric-samples/config/msp: no such file or directory [^2] 此问题的根本原因在于 Crypto 配置路径未正确定义或生成。以下是详细的解决方案。 #### 1. 确认 Crypto 材料是否存在 Crypto 材料通常由 **cryptogen 工具** 或者通过 **Fabric-CA** 自动生成。如果这些材料尚未生成,则需要执行以下命令来生成它们: ```bash cd $FABRIC_SAMPLES_PATH/first-network ./byfn.sh generate ``` 上述脚本会在当前目录下生成所需的加密材料,并将其存储到 `crypto-config` 文件夹中[^5]。 #### 2. 修改配置文件中的 MSP 路径 确保 Docker 容器内的 Peer 和 Orderer 使用的是正确的 MSP 路径。这一步可以通过更新 `core.yaml` 文件或者对应的环境变量实现。例如,在启动 Peer 前,确认以下环境变量已设置正确: ```bash export CORE_PEER_MSPCONFIGPATH=/path/to/crypto-config/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp ``` 对于多节点部署场景,建议检查所有的 YAML 配置文件(如 `docker-compose-cli.yaml`),以验证容器挂载的卷是否指向实际存在的 `crypto-config` 文件夹[^5]。 #### 3. 启动网络前清理旧数据 为了避免残留数据引发冲突,推荐在网络重启之前清除之前的 Peer 数据。可以运行如下命令完成清理工作: ```bash cd $FABRIC_SAMPLES_PATH/first-network ./byfn.sh down rm -rf ./crypto-config/ ``` 随后再次调用 `generate` 脚本来重新构建整个网络结构及其依赖项[^5]。 #### 4. 创建新的通道 (Channel) 如果仍然存在权限拒绝类错误消息,可能是因为尝试加入已有名称的通道所引起。此时应考虑创建一个新的唯一命名通道,例如命名为 `newchannel.tx` 并按照官方文档指导完成交易提交过程[^4]: ```bash # 替代原有的 onechannel 示例 CHANNEL_NAME="newchannel" echo "Creating a new channel named ${CHANNEL_NAME}" configtxgen -profile TwoOrgsChannel -outputCreateChannelTx ./${CHANNEL_NAME}.tx -channelID ${CHANNEL_NAME} ``` 接着利用 CLI 提交该事务至区块链上: ```bash peer channel create -o orderer.example.com:7050 -c ${CHANNEL_NAME} -f ./${CHANNEL_NAME}.tx --tls true --cafile /path/to/orderer/tls/ca.crt ``` 最后让各参与方加入刚刚建立的新通道之中即可继续正常运作[^4]。 --- ### 总结 综上所述,针对因缺少必要 MSP 文件而产生的初始化异常情况,需依次采取措施包括但不限于重新生成全部所需密钥资料、调整关联参数设定以及适时销毁重建测试环境等手段加以应对处理[^2][^5]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值