Hyperledger Fabric跨机器连接两个组织是否可行及步骤咨询
Hyperledger Fabric跨机器部署多组织方案
当然可以!Hyperledger Fabric的分布式架构天生支持将不同组织部署在独立机器上,这也是它作为联盟链的核心优势之一。下面是一套详细的实现步骤,我会尽量讲得通俗易懂:
一、前提准备
- 两台目标机器(PC1、PC2)都要完成基础环境配置:安装Docker、Docker Compose,以及对应版本的Hyperledger Fabric二进制文件(
peer、orderer、configtxgen等)和官方镜像,确保两台机器的Fabric版本完全一致(推荐用2.x系列稳定版)。 - 两台机器需处于可互相访问的网络环境(同一局域网或公网连通),提前打通必要端口:Orderer节点默认7050,Peer节点默认7051(gRPC)、7052(事件服务),如果端口冲突可自行调整。
- 提前规划好组织与节点信息:比如Org1的MSP ID为
Org1MSP、域名为org1.example.com,Org2的MSP ID为Org2MSP、域名为org2.example.com,Orderer节点域名为orderer.example.com(这里假设Orderer部署在PC1上,也可以单独用第三台机器)。
二、步骤1:在PC1(部署Org1+Orderer)生成核心配置文件
创建工作目录并生成加密材料
- 新建工作目录:
mkdir -p fabric-multi-org && cd fabric-multi-org - 编写
crypto-config.yaml,定义OrdererOrg、Org1、Org2的节点与用户信息,然后用cryptogen工具生成加密材料:cryptogen generate --config=./crypto-config.yaml - 生成的
crypto-config目录里包含所有组织的MSP证书、密钥,后续要把Org2的相关文件复制到PC2。
- 新建工作目录:
生成创世区块与通道配置文件
- 编写
configtx.yaml,配置Orderer共识机制(比如Raft)、Org1和Org2的MSP信息、通道模板。 - 生成创世区块(用于启动Orderer集群):
configtxgen -profile TwoOrgsOrdererGenesis -outputBlock ./channel-artifacts/genesis.block - 生成通道创建交易文件:
configtxgen -profile TwoOrgsChannel -outputCreateChannelTx ./channel-artifacts/channel.tx -channelID mychannel - 生成两个组织的锚节点更新文件:
configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org1MSPanchors.tx -channelID mychannel -asOrg Org1MSP configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org2MSPanchors.tx -channelID mychannel -asOrg Org2MSP
- 编写
启动PC1上的Orderer与Org1 Peer节点
- 编写
docker-compose-org1.yaml,定义Orderer容器、Org1的Peer0容器、Org1的CLI容器。注意配置端口映射(比如Orderer的7050映射到PC1宿主机,Peer0的7051/7052映射到宿主机),并确保容器能被外部机器访问(可使用host网络模式,或配置正确的端口映射)。 - 启动容器:
docker-compose -f docker-compose-org1.yaml up -d
- 编写
三、步骤2:在PC2(部署Org2)同步配置并启动节点
同步配置文件
- 在PC2上创建相同的工作目录:
mkdir -p fabric-multi-org && cd fabric-multi-org - 从PC1复制必要文件:
- 复制加密材料里的Org2目录:
scp -r user@PC1_IP:/path/to/fabric-multi-org/crypto-config/peerOrganizations/org2.example.com ./crypto-config/peerOrganizations/ - 复制通道配置文件:
scp -r user@PC1_IP:/path/to/fabric-multi-org/channel-artifacts ./
- 复制加密材料里的Org2目录:
- 在PC2上创建相同的工作目录:
启动Org2 Peer节点
- 编写
docker-compose-org2.yaml,定义Org2的Peer0容器、Org2的CLI容器。注意端口要和PC1区分开(比如用9051/9052),并在配置中指定Orderer节点的地址为PC1的IP+端口。 - 启动容器:
docker-compose -f docker-compose-org2.yaml up -d
- 编写
四、步骤3:创建通道并让两个组织的Peer加入
在PC1的Org1 CLI中创建通道
- 进入Org1的CLI容器:
docker exec -it cli.org1 bash - 设置环境变量:
export CHANNEL_NAME=mychannel export CORE_PEER_LOCALMSPID="Org1MSP" export CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp export CORE_PEER_ADDRESS=peer0.org1.example.com:7051 export ORDERER_CA=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem - 创建通道:
peer channel create -o orderer.example.com:7050 -c $CHANNEL_NAME -f ./channel-artifacts/channel.tx --tls true --cafile $ORDERER_CA - 把生成的
mychannel.block从容器复制到PC1宿主机,再传到PC2:# 在PC1宿主机执行 docker cp cli.org1:/opt/gopath/src/github.com/hyperledger/fabric/peer/mychannel.block ./ scp mychannel.block user@PC2_IP:/path/to/fabric-multi-org/
- 进入Org1的CLI容器:
让Org1和Org2的Peer加入通道
- 在PC1的Org1 CLI中加入通道:
peer channel join -b mychannel.block - 在PC2的Org2 CLI中加入通道:
# 进入Org2 CLI容器 docker exec -it cli.org2 bash # 设置环境变量 export CHANNEL_NAME=mychannel export CORE_PEER_LOCALMSPID="Org2MSP" export CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp export CORE_PEER_ADDRESS=peer0.org2.example.com:9051 export ORDERER_CA=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem # 复制通道块到容器内 docker cp ./mychannel.block cli.org2:/opt/gopath/src/github.com/hyperledger/fabric/peer/ # 加入通道 peer channel join -b mychannel.block
- 在PC1的Org1 CLI中加入通道:
五、步骤4:更新锚节点并测试链码
更新锚节点
- 在PC1的Org1 CLI中更新Org1的锚节点:
peer channel update -o orderer.example.com:7050 -c $CHANNEL_NAME -f ./channel-artifacts/Org1MSPanchors.tx --tls true --cafile $ORDERER_CA - 在PC2的Org2 CLI中更新Org2的锚节点:
peer channel update -o orderer.example.com:7050 -c $CHANNEL_NAME -f ./channel-artifacts/Org2MSPanchors.tx --tls true --cafile $ORDERER_CA
- 在PC1的Org1 CLI中更新Org1的锚节点:
链码部署与测试
- 在PC1的Org1 CLI中安装链码:
peer chaincode install -n mycc -v 1.0 -p github.com/chaincode/chaincode_example02/go/ - 在PC2的Org2 CLI中安装相同链码:
peer chaincode install -n mycc -v 1.0 -p github.com/chaincode/chaincode_example02/go/ - 在PC1的Org1 CLI中实例化链码(指定背书策略为两个组织的Peer都需背书):
peer chaincode instantiate -o orderer.example.com:7050 --tls true --cafile $ORDERER_CA -C $CHANNEL_NAME -n mycc -v 1.0 -c '{"Args":["init","a","100","b","200"]}' -P "AND ('Org1MSP.peer','Org2MSP.peer')" - 测试链码调用:
- 在PC1的Org1 CLI中发起转账:
peer chaincode invoke -o orderer.example.com:7050 --tls true --cafile $ORDERER_CA -C $CHANNEL_NAME -n mycc -c '{"Args":["invoke","a","b","10"]}' - 在PC2的Org2 CLI中查询余额:
peer chaincode query -C $CHANNEL_NAME -n mycc -c '{"Args":["query","a"]}'
90,说明跨组织部署成功! - 在PC1的Org1 CLI中发起转账:
- 在PC1的Org1 CLI中安装链码:
关键注意事项
- 两台机器的系统时间必须同步,否则会出现TLS证书验证失败或区块同步异常的问题。
- 两台机器的
/etc/hosts文件需添加域名映射,比如PC1和PC2都要添加:PC1_IP orderer.example.com peer0.org1.example.com PC2_IP peer0.org2.example.com - Docker容器的端口映射要确保外部可访问,避免防火墙或安全组拦截端口。
- 所有配置文件中的MSP ID、域名必须保持一致,不能出现拼写错误。
内容的提问来源于stack exchange,提问作者S.M
相关产品推荐
相关产品推荐

