写这篇文章的目的是为了简化繁琐的 Fabric 网络构建过程,在之前的教程中都是一步一步地复制粘贴来构建 Fabric 网络,特别是当网络节点数量很多时,这样使得每次重新启动网络都需要按照教程一步一步执行,变得特别麻烦,所以本文将以之前写的教程《Fabric 2.4.9 单机部署多节点网络(多通道---分片区块链网络)》为例,编写自动化构建脚本。经过测试,Fabric 区块链网络 docker 容器单机部署的节点数量的极限在40-50个左右(包括3个排序节点),节点数量再继续增加就需要多机部署。
1. Fabric 网络构建过程
Fabric 网络的构建过程主要包括以下几个步骤,(1)首先根据自己的需求,确定Fabric网络部署的根目录。(2)生成相关的证书文件,crypto-config.yaml。(3)
生成相关的通道配置文件,configtx.yaml。(4)
生成 docker-compose.yaml
的启动文件。(5)复制链码包,创建和加入通道,链码安装、批准、提交。(6)链码初始化(可选)。
1.1 确定 Fabric 网络的根目录
本文将 ~/go/src/github.com/hyperledger/myfabric/ 作为 Fabric 网络的根目录。后续操作中的所有配置文件:crypto-config.yaml
、configtx.yaml、docker-compose.yaml 都要存放在这个根目录下
。
1.2 生成相关的证书文件
对于 crypto-config.yaml 配置文件,可以编写 python 代码来自动化生成,generate_cryto_config.py:
import yaml
def generate_crypto_config(orderer_orgs, orderers_per_org, peer_orgs, peers_per_org):
config = {
"OrdererOrgs": [],
"PeerOrgs": []
}
# Generate Orderer Organizations
for i in range(orderer_orgs):
orderer_org = {
"Name": f"Orderer",
"Domain": f"idy.com",
"EnableNodeOUs": True,
"Specs": [{"Hostname": f"orderer{j}"} for j in range(orderers_per_org)]
}
config["OrdererOrgs"].append(orderer_org)
# Generate Peer Organizations --- MainChain
for i in range(1, peer_orgs+1):
peer_org = {
"Name": f"Org{i}",
"Domain": f"org{i}.idy.com",
"EnableNodeOUs": True,
"Template": {
"Count": peers_per_org
},
"Users": {
"Count": 1
}
}
config["PeerOrgs"].append(peer_org)
return config
def save_to_yaml(config, filename):
with open(filename, 'w') as file:
yaml.dump(config, file, default_flow_style=False)
# Example usage
orderer_orgs = 1
orderers_per_org = 3
peer_orgs = 5
peers_per_org = 2
config = generate_crypto_config(orderer_orgs, orderers_per_org, peer_orgs, peers_per_org)
save_to_yaml(config, 'crypto-config.yaml')
将生成的配置文件复制到根目录。
生成相关的证书文件:
cryptogen generate --config=crypto-config.yaml
1.3 生成相关的通道配置文件
对于 configtx.yaml 配置文件,这里没有编写自动生成的 python 脚本,个人感觉手动改会快一些,不过节点数量特别多,有需要的话可以自己尝试编写(可以参考自动生成 docker-compose.yaml 的 python 脚本)。
configtx.yaml:
Organizations:
- &OrdererOrg
Name: OrdererOrg
ID: OrdererMSP
MSPDir: crypto-config/ordererOrganizations/idy.com/msp
Policies:
Readers:
Type: Signature
Rule: "OR('OrdererMSP.member')"
Writers:
Type: Signature
Rule: "OR('OrdererMSP.member')"
Admins:
Type: Signature
Rule: "OR('OrdererMSP.admin')"
- &Org1
Name: Org1MSP
ID: Org1MSP
MSPDir: crypto-config/peerOrganizations/org1.idy.com/msp
Policies:
Readers:
Type: Signature
Rule: "OR('Org1MSP.admin', 'Org1MSP.peer', 'Org1MSP.client')"
Writers:
Type: Signature
Rule: "OR('Org1MSP.admin', 'Org1MSP.client')"
Admins:
Type: Signature
Rule: "OR('Org1MSP.admin')"
Endorsement:
Type: Signature
Rule: "OR('Org1MSP.peer')"
- &Org2
Name: Org2MSP
ID: Org2MSP
MSPDir: crypto-config/peerOrganizations/org2.idy.com/msp
Policies:
Readers:
Type: Signature
Rule: "OR('Org2MSP.admin', 'Org2MSP.peer', 'Org2MSP.client')"
Writers:
Type: Signature
Rule: "OR('Org2MSP.admin', 'Org2MSP.client')"
Admins:
Type: Signature
Rule: "OR('Org2MSP.admin')"
Endorsement:
Type: Signature
Rule: "OR('Org2MSP.peer')"
- &Org3
Name: Org3MSP
ID: Org3MSP
MSPDir: crypto-config/peerOrganizations/org3.idy.com/msp
Policies:
Readers:
Type: Signature
Rule: "OR('Org3MSP.admin', 'Org3MSP.peer', 'Org3MSP.client')"
Writers:
Type: Signature
Rule: "OR('Org3MSP.admin', 'Org3MSP.client')"
Admins:
Type: Signature
Rule: "OR('Org3MSP.admin')"
Endorsement:
Type: Signature
Rule: "OR('Org3MSP.peer')"
- &Org4
Name: Org4MSP
ID: Org4MSP
MSPDir: crypto-config/peerOrganizations/org4.idy.com/msp
Policies:
Readers:
Type: Signature
Rule: "OR('Org4MSP.admin', 'Org4MSP.peer', 'Org4MSP.client')"
Writers:
Type: Signature
Rule: "OR('Org4MSP.admin', 'Org4MSP.client')"
Admins:
Type: Signature
Rule: "OR('Org4MSP.admin')"
Endorsement:
Type: Signature
Rule: "OR('Org4MSP.peer')"
- &Org5
Name: Org5MSP
ID: Org5MSP
MSPDir: crypto-config/peerOrganizations/org5.idy.com/msp
Policies:
Readers:
Type: Signature
Rule: "OR('Org5MSP.admin', 'Org5MSP.peer', 'Org5MSP.client')"
Writers:
Type: Signature
Rule: "OR('Org5MSP.admin', 'Org5MSP.client')"
Admins:
Type: Signature
Rule: "OR('Org5MSP.admin')"
Endorsement:
Type: Signature
Rule: "OR('Org5MSP.peer')"
Capabilities:
Channel: &ChannelCapabilities
V2_0: true
Orderer: &OrdererCapabilities
V2_0: true
Application: &ApplicationCapabilities
V2_0: true
Application: &ApplicationDefaults
Organizations:
Policies:
Readers:
Type: ImplicitMeta
Rule: "ANY Readers"
Writers:
Type: ImplicitMeta
Rule: "ANY Writers"
Admins:
Type: ImplicitMeta
Rule: "ANY Admins"
LifecycleEndorsement:
Type: ImplicitMeta
Rule: "ANY Endorsement"
Endorsement:
Type: ImplicitMeta
Rule: "ANY Endorsement"
Capabilities:
<<: *ApplicationCapabilities
Orderer: &OrdererDefaults
OrdererType: etcdraft
Addresses:
- orderer0.idy.com:7050
- orderer1.idy.com:8050
- orderer2.idy.com:9050
EtcdRaft:
Consenters:
- Host: orderer0.idy.com
Port: 7050
ClientTLSCert: crypto-config/ordererOrganizations/idy.com/orderers/orderer0.idy.com/tls/server.crt
ServerTLSCert: crypto-config/ordererOrganizations/idy.com/orderers/orderer0.idy.com/tls/server.crt
- Host: orderer1.idy.com
Port: 8050
ClientTLSCert: crypto-config/ordererOrganizations/idy.com/orderers/orderer1.idy.com/tls/server.crt
ServerTLSCert: crypto-config/ordererOrganizations/idy.com/orderers/orderer1.idy.com/tls/server.crt
- Host: orderer2.idy.com
Port: 9050
ClientTLSCert: crypto-config/ordererOrganizations/idy.com/orderers/orderer2.idy.com/tls/server.crt
ServerTLSCert: crypto-config/ordererOrganizations/idy.com/orderers/orderer2.idy.com/tls/server.crt
BatchTimeout: 2s
BatchSize:
MaxMessageCount: 10
AbsoluteMaxBytes: 99 MB
PreferredMaxBytes: 512 KB
Organizations:
Policies:
Readers:
Type: ImplicitMeta
Rule: "ANY Readers"
Writers:
Type: ImplicitMeta
Rule: "ANY Writers"
Admins:
Type: ImplicitMeta
Rule: "ANY Admins"
BlockValidation:
Type: ImplicitMeta
Rule: "ANY Writers"
Channel: &ChannelDefaults
Policies:
Readers:
Type: ImplicitMeta
Rule: "ANY Readers"
Writers:
Type: ImplicitMeta
Rule: "ANY Writers"
Admins:
Type: ImplicitMeta
Rule: "ANY Admins"
Capabilities:
<<: *ChannelCapabilities
Profiles:
OrgsOrdererGenesis:
<<: *ChannelDefaults
Orderer:
<<: *OrdererDefaults
Organizations:
- *OrdererOrg
Capabilities:
<<: *OrdererCapabilities
Consortiums:
SampleConsortium:
Organizations:
- *Org1
- *Org2
- *Org3
- *Org4
- *Org5
shard1Channel:
Consortium: SampleConsortium
<<: *ChannelDefaults
Application:
<<: *ApplicationDefaults
Organizations:
- *Org1
Capabilities:
<<: *ApplicationCapabilities
shard2Channel:
Consortium: SampleConsortium
<<: *ChannelDefaults
Application:
<<: *ApplicationDefaults
Organizations:
- *Org2
Capabilities:
<<: *ApplicationCapabilities
shard3Channel:
Consortium: SampleConsortium
<<: *ChannelDefaults
Application:
<<: *ApplicationDefaults
Organizations:
- *Org3
Capabilities:
<<: *ApplicationCapabilities
shard4Channel:
Consortium: SampleConsortium
<<: *ChannelDefaults
Application:
<<: *ApplicationDefaults
Organizations:
- *Org4
Capabilities:
<<: *ApplicationCapabilities
shard5Channel:
Consortium: SampleConsortium
<<: *ChannelDefaults
Application:
<<: *ApplicationDefaults
Organizations:
- *Org5
Capabilities:
<<: *ApplicationCapabilities
生成系统通道的创世区块文件:
configtxgen -profile OrgsOrdererGenesis -outputBlock ./channel-artifacts/genesis.block -channelID system-channel
分别生成5个分片的应用通道创建文件:
configtxgen -profile shard1Channel -outputCreateChannelTx ./channel-artifacts/shard1.tx -channelID shard1
configtxgen -profile shard2Channel -outputCreateChannelTx ./channel-artifacts/shard2.tx -channelID shard2
configtxgen -profile shard3Channel -outputCreateChannelTx ./channel-artifacts/shard3.tx -channelID shard3
configtxgen -profile shard4Channel -outputCreateChannelTx ./channel-artifacts/shard4.tx -channelID shard4
configtxgen -profile shard5Channel -outputCreateChannelTx ./channel-artifacts/shard5.tx -channelID shard5
1.4 生成 docker-compose.yaml 的启动文件
对于 docker-compose.yaml 配置文件,可以编写 python 代码来自动化生成,generate_docker_compose.py:
# generate_docker_compose.py
def main(orgs, peers_per_org):
with open('docker-compose.yaml', 'w') as f:
f.write('version: \'2.4\'\n')
f.write('\nvolumes:\n')
f.write(' # orderer\n')
for i in range(3):
f.write(f' orderer{i}.idy.com:\n')
for i in range(orgs):
f.write(f' # org{i+1}\n')
for j in range(peers_per_org):
f.write(f' peer{j}.org{i+1}.idy.com:\n')
f.write('\nnetworks:\n')
f.write(' test:\n')
f.write(' name: Fabric_Sharding\n')
f.write('\nservices:\n')
f.write(' # ordererOrg\n')
for i in range(3):
commands = []
commands.append(f' orderer{i}.idy.com:')
commands.append(f' container_name: orderer{i}.idy.com')
commands.append(f' image: hyperledger/fabric-orderer:latest')
commands.append(f' labels:')
commands.append(f' service: hyperledger-fabric')
commands.append(f' environment:')
commands.append(f' - FABRIC_LOGGING_SPEC=INFO')
commands.append(f' - ORDERER_GENERAL_LISTENADDRESS=0.0.0.0')
commands.append(f' - ORDERER_GENERAL_LISTENPORT={7+i}050')
commands.append(f' - ORDERER_GENERAL_LOCALMSPID=OrdererMSP')
commands.append(f' - ORDERER_GENERAL_LOCALMSPDIR=/var/hyperledger/orderer/msp')
commands.append(f' # enabled TLS')
commands.append(f' - ORDERER_GENERAL_TLS_ENABLED=true')
commands.append(f' - ORDERER_GENERAL_TLS_PRIVATEKEY=/var/hyperledger/orderer/tls/server.key')
commands.append(f' - ORDERER_GENERAL_TLS_CERTIFICATE=/var/hyperledger/orderer/tls/server.crt')
commands.append(f' - ORDERER_GENERAL_TLS_ROOTCAS=[/var/hyperledger/orderer/tls/ca.crt]')
commands.append(f' - ORDERER_GENERAL_CLUSTER_CLIENTCERTIFICATE=/var/hyperledger/orderer/tls/server.crt')
commands.append(f' - ORDERER_GENERAL_CLUSTER_CLIENTPRIVATEKEY=/var/hyperledger/orderer/tls/server.key')
commands.append(f' - ORDERER_GENERAL_CLUSTER_ROOTCAS=[/var/hyperledger/orderer/tls/ca.crt]')
commands.append(f' - ORDERER_GENERAL_GENESISMETHOD=file')
commands.append(f' - ORDERER_GENERAL_GENESISFILE=/var/hyperledger/orderer/orderer.genesis.block')
commands.append(f' - ORDERER_CHANNELPARTICIPATION_ENABLED=true')
commands.append(f' - ORDERER_ADMIN_TLS_ENABLED=true')
commands.append(f' - ORDERER_ADMIN_TLS_CERTIFICATE=/var/hyperledger/orderer/tls/server.crt')
commands.append(f' - ORDERER_ADMIN_TLS_PRIVATEKEY=/var/hyperledger/orderer/tls/server.key')
commands.append(f' - ORDERER_ADMIN_TLS_ROOTCAS=[/var/hyperledger/orderer/tls/ca.crt]')
commands.append(f' - ORDERER_ADMIN_TLS_CLIENTROOTCAS=[/var/hyperledger/orderer/tls/ca.crt]')
commands.append(f' - ORDERER_ADMIN_LISTENADDRESS=0.0.0.0:7053')
commands.append(f' working_dir: /opt/gopath/src/github.com/hyperledger/fabric')
commands.append(f' command: orderer')
commands.append(f' volumes:')
commands.append(f' - ./channel-artifacts/genesis.block:/var/hyperledger/orderer/orderer.genesis.block')
commands.append(f' - ./crypto-config/ordererOrganizations/idy.com/orderers/orderer{i}.idy.com/msp:/var/hyperledger/orderer/msp')
commands.append(f' - ./crypto-config/ordererOrganizations/idy.com/orderers/orderer{i}.idy.com/tls:/var/hyperledger/orderer/tls')
commands.append(f' ports:')
commands.append(f' - {7+i}050:{7+i}050')
commands.append(f' - 705{3+i}:7053')
commands.append(f' networks:')
commands.append(f' - test\n')
f.write('\n'.join(commands) + '\n')
commands.append(f'')
commands.append(f'')
f.write(' # peerOrg\n')
for i in range(orgs):
f.write(f' # org{i+1}, 1{i}051, 1{i}151\n')
for j in range(peers_per_org):
commands = []
commands.append(f' peer{j}.org{i+1}.idy.com:')
commands.append(f' container_name: peer{j}.org{i+1}.idy.com')
commands.append(f' image: hyperledger/fabric-peer:latest')
commands.append(f' labels:')
commands.append(f' service: hyperledger-fabric')
commands.append(f' environment:')
commands.append(f' #Generic peer variables')
commands.append(f' - CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock')
commands.append(f' - CORE_VM_DOCKER_HOSTCONFIG_NETWORKMODE=Fabric_Sharding')
commands.append(f' - FABRIC_LOGGING_SPEC=INFO')
commands.append(f' #- FABRIC_LOGGING_SPEC=DEBUG')
commands.append(f' - CORE_PEER_TLS_ENABLED=true')
commands.append(f' - CORE_PEER_PROFILE_ENABLED=true')
commands.append(f' - CORE_PEER_TLS_CERT_FILE=/etc/hyperledger/fabric/tls/server.crt')
commands.append(f' - CORE_PEER_TLS_KEY_FILE=/etc/hyperledger/fabric/tls/server.key')
commands.append(f' - CORE_PEER_TLS_ROOTCERT_FILE=/etc/hyperledger/fabric/tls/ca.crt')
commands.append(f' # Peer specific variabes')
commands.append(f' - CORE_PEER_ID=peer{j}.org{i+1}.idy.com')
commands.append(f' - CORE_PEER_ADDRESS=peer{j}.org{i+1}.idy.com:1{i}{j}51')
commands.append(f' - CORE_PEER_LISTENADDRESS=0.0.0.0:1{i}{j}51')
commands.append(f' - CORE_PEER_CHAINCODEADDRESS=peer{j}.org{i+1}.idy.com:1{i}{j}52')
commands.append(f' - CORE_PEER_CHAINCODELISTENADDRESS=0.0.0.0:1{i}{j}52')
commands.append(f' - CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer{j}.org{i+1}.idy.com:1{i}{j}51')
commands.append(f' - CORE_PEER_LOCALMSPID=Org{i+1}MSP')
commands.append(f' volumes:')
commands.append(f' - /var/run/docker.sock:/host/var/run/docker.sock')
commands.append(f' - ./crypto-config/peerOrganizations/org{i+1}.idy.com/peers/peer{j}.org{i+1}.idy.com/msp:/etc/hyperledger/fabric/msp')
commands.append(f' - ./crypto-config/peerOrganizations/org{i+1}.idy.com/peers/peer{j}.org{i+1}.idy.com/tls:/etc/hyperledger/fabric/tls')
commands.append(f' - /var/run/:/host/var/run/')
commands.append(f' - ./:/etc/hyperledger/channel/')
commands.append(f' working_dir: /opt/gopath/src/github.com/hyperledger/fabric/peer')
commands.append(f' command: peer node start')
commands.append(f' ports:')
commands.append(f' - 1{i}{j}51:1{i}{j}51')
commands.append(f' networks:')
commands.append(f' - test\n')
f.write('\n'.join(commands) + '\n')
f.write(' # cli\n')
for i in range(orgs):
f.write(f' # org{i+1}, cli{i+1}-0:1{i}051, cli{i+1}-1:1{i}151\n')
for j in range(peers_per_org):
commands = []
commands.append(f' cli{i+1}-{j}:')
commands.append(f' container_name: cli{i+1}-{j}')
commands.append(f' image: hyperledger/fabric-tools:latest')
commands.append(f' tty: true')
commands.append(f' stdin_open: true')
commands.append(f' environment:')
commands.append(f' - GOPATH=/opt/gopath')
commands.append(f' - CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock')
commands.append(f' - FABRIC_LOGGING_SPEC=INFO')
commands.append(f' - CORE_PEER_ID=cli{i+1}-{j}')
commands.append(f' - CORE_PEER_ADDRESS=peer{j}.org{i+1}.idy.com:1{i}{j}51')
commands.append(f' - CORE_PEER_LOCALMSPID=Org{i+1}MSP')
commands.append(f' - CORE_PEER_TLS_ENABLED=true')
commands.append(f' - CORE_PEER_TLS_CERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org{i+1}.idy.com/peers/peer{j}.org{i+1}.idy.com/tls/server.crt')
commands.append(f' - CORE_PEER_TLS_KEY_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org{i+1}.idy.com/peers/peer{j}.org{i+1}.idy.com/tls/server.key')
commands.append(f' - CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org{i+1}.idy.com/peers/peer{j}.org{i+1}.idy.com/tls/ca.crt')
commands.append(f' - CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org{i+1}.idy.com/users/Admin@org{i+1}.idy.com/msp')
commands.append(f' working_dir: /opt/gopath/src/github.com/hyperledger/fabric/peer')
commands.append(f' command: /bin/bash')
commands.append(f' volumes:')
commands.append(f' - /var/run/:/host/var/run/')
commands.append(f' - ./chaincode/go/:/opt/gopath/src/github.com/hyperledger/fabric-cluster/chaincode/go')
commands.append(f' - ./crypto-config:/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/')
commands.append(f' - ./channel-artifacts:/opt/gopath/src/github.com/hyperledger/fabric/peer/channel-artifacts')
commands.append(f' networks:')
commands.append(f' - test\n')
f.write('\n'.join(commands) + '\n')
if __name__ == "__main__":
main(5, 2)
这里说明一下端口号的分配:
3个排序节点:每个排序节点会占用2个端口号,分别是以50和53结尾的端口号,orderer0:7050、7053,orderer1:8050、7054,orderer2:9050、7055。
10个 peer 节点:每个 peer 节点也会占用2个端口号,分别是以51和52结尾的端口号,52结尾的端口号是该 peer 节点的链码容器所占用的端口号。这里 peer 节点的端口号按组织编号来分配,端口号都是5位数,第一位都是1,组织编号为1-5,则第 i 个组织的第 j 个 peer 节点占用的端口号分别为:1{i-1}{j-1}51和1{i-1}{j-1}52,例如 peer0.org1:10051、10052,peer1.org1: 10151、10152。
注意:这里 cli 容器的命名和之前教程中的有些不同,第 i 个组织的第 j 个 peer 节点的 cli 容器名称为:cli{i}-{j-1},例如peer0.org1:cli1-0,peer1.org1:cli1-1。
将生成的配置文件复制到根目录。
启动网络:
docker-compose up -d
1.5 复制链码包,创建和加入通道,链码安装、批准、提交
1.5.1 复制链码包
在根目录下新建一个目录:scripts,在该目录下,创建脚本文件 copy-sacc.sh:
docker cp sacc.tar.gz cli1-0:/opt/gopath/src/github.com/hyperledger/fabric/peer
docker cp sacc.tar.gz cli1-1:/opt/gopath/src/github.com/hyperledger/fabric/peer
docker cp sacc.tar.gz cli2-0:/opt/gopath/src/github.com/hyperledger/fabric/peer
docker cp sacc.tar.gz cli2-1:/opt/gopath/src/github.com/hyperledger/fabric/peer
docker cp sacc.tar.gz cli3-0:/opt/gopath/src/github.com/hyperledger/fabric/peer
docker cp sacc.tar.gz cli3-1:/opt/gopath/src/github.com/hyperledger/fabric/peer
docker cp sacc.tar.gz cli4-0:/opt/gopath/src/github.com/hyperledger/fabric/peer
docker cp sacc.tar.gz cli4-1:/opt/gopath/src/github.com/hyperledger/fabric/peer
docker cp sacc.tar.gz cli5-0:/opt/gopath/src/github.com/hyperledger/fabric/peer
docker cp sacc.tar.gz cli5-1:/opt/gopath/src/github.com/hyperledger/fabric/peer
这里使用的链码包是之前教程中使用的链码包,后续会发布如何打包自己编写的链码的教程。
在根目录路径下,执行如下命令,复制链码包到每个 peer 节点对应的 cli 容器中:
bash scripts/copy-sacc.sh
后续步骤是在各个分片中,创建和加入通道,链码安装、批准、提交。
1.5.2 shard1
进入容器 cli1-0:
docker exec -it cli1-0 bash
复制如下多行命令,并粘贴到终端中直接执行:
peer channel create -o orderer0.idy.com:7050 -c shard1 -f ./channel-artifacts/shard1.tx --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/idy.com/orderers/orderer0.idy.com/msp/tlscacerts/tlsca.idy.com-cert.pem
peer channel join -b shard1.block
peer lifecycle chaincode install sacc.tar.gz
peer lifecycle chaincode approveformyorg --channelID shard1 --name sacc-1 --version 1.0 --sequence 1 --init-required --package-id sacc_1:2975ee7870d40463a45052f874b4d13f11884d405b087d1296e217db3657132c --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/idy.com/orderers/orderer0.idy.com/msp/tlscacerts/tlsca.idy.com-cert.pem
peer lifecycle chaincode commit -o orderer1.idy.com:8050 --channelID shard1 --name sacc-1 --version 1.0 --sequence 1 --init-required --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/idy.com/orderers/orderer1.idy.com/msp/tlscacerts/tlsca.idy.com-cert.pem --peerAddresses peer0.org1.idy.com:10051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.idy.com/peers/peer0.org1.idy.com/tls/ca.crt
exit
相比于之前的教程,这里将链码的名字改成了 sacc-1 ,是为了区分不同分片的链码。
复制分片区块文件,在 scripts 目录下,创建脚本文件 copy-shard1_block.sh:
docker cp cli1-0:/opt/gopath/src/github.com/hyperledger/fabric/peer/shard1.block ./
docker cp ./shard1.block cli1-1:/opt/gopath/src/github.com/hyperledger/fabric/peer
执行如下命令,复制 shard1 分片区块文件:
bash scripts/copy-shard1_block.sh
进入容器 cli1-1:
docker exec -it cli1-1 bash
复制如下多行命令,并粘贴到终端中直接执行:
peer channel join -b shard1.block
peer lifecycle chaincode install sacc.tar.gz
exit
1.5.3 shard2
进入容器 cli2-0:
docker exec -it cli2-0 bash
复制如下多行命令,并粘贴到终端中直接执行:
peer channel create -o orderer0.idy.com:7050 -c shard2 -f ./channel-artifacts/shard2.tx --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/idy.com/orderers/orderer0.idy.com/msp/tlscacerts/tlsca.idy.com-cert.pem
peer channel join -b shard2.block
peer lifecycle chaincode install sacc.tar.gz
peer lifecycle chaincode approveformyorg --channelID shard2 --name sacc-2 --version 1.0 --sequence 1 --init-required --package-id sacc_1:2975ee7870d40463a45052f874b4d13f11884d405b087d1296e217db3657132c --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/idy.com/orderers/orderer0.idy.com/msp/tlscacerts/tlsca.idy.com-cert.pem
peer lifecycle chaincode commit -o orderer1.idy.com:8050 --channelID shard2 --name sacc-2 --version 1.0 --sequence 1 --init-required --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/idy.com/orderers/orderer1.idy.com/msp/tlscacerts/tlsca.idy.com-cert.pem --peerAddresses peer0.org2.idy.com:11051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.idy.com/peers/peer0.org2.idy.com/tls/ca.crt
exit
复制分片区块文件,在 scripts 目录下,创建脚本文件 copy-shard2_block.sh:
docker cp cli2-0:/opt/gopath/src/github.com/hyperledger/fabric/peer/shard2.block ./
docker cp ./shard2.block cli2-1:/opt/gopath/src/github.com/hyperledger/fabric/peer
执行如下命令,复制 shard2 分片区块文件:
bash scripts/copy-shard2_block.sh
进入容器 cli2-1:
docker exec -it cli2-1 bash
复制如下多行命令,并粘贴到终端中直接执行:
peer channel join -b shard2.block
peer lifecycle chaincode install sacc.tar.gz
exit
1.5.4 shard3
进入容器 cli3-0:
docker exec -it cli3-0 bash
复制如下多行命令,并粘贴到终端中直接执行:
peer channel create -o orderer0.idy.com:7050 -c shard3 -f ./channel-artifacts/shard3.tx --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/idy.com/orderers/orderer0.idy.com/msp/tlscacerts/tlsca.idy.com-cert.pem
peer channel join -b shard3.block
peer lifecycle chaincode install sacc.tar.gz
peer lifecycle chaincode approveformyorg --channelID shard3 --name sacc-3 --version 1.0 --sequence 1 --init-required --package-id sacc_1:2975ee7870d40463a45052f874b4d13f11884d405b087d1296e217db3657132c --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/idy.com/orderers/orderer0.idy.com/msp/tlscacerts/tlsca.idy.com-cert.pem
peer lifecycle chaincode commit -o orderer1.idy.com:8050 --channelID shard3 --name sacc-3 --version 1.0 --sequence 1 --init-required --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/idy.com/orderers/orderer1.idy.com/msp/tlscacerts/tlsca.idy.com-cert.pem --peerAddresses peer0.org3.idy.com:12051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org3.idy.com/peers/peer0.org3.idy.com/tls/ca.crt
exit
复制分片区块文件,在 scripts 目录下,创建脚本文件 copy-shard3_block.sh:
docker cp cli3-0:/opt/gopath/src/github.com/hyperledger/fabric/peer/shard3.block ./
docker cp ./shard3.block cli3-1:/opt/gopath/src/github.com/hyperledger/fabric/peer
执行如下命令,复制 shard3 分片区块文件:
bash scripts/copy-shard3_block.sh
进入容器 cli3-1:
docker exec -it cli3-1 bash
复制如下多行命令,并粘贴到终端中直接执行:
peer channel join -b shard3.block
peer lifecycle chaincode install sacc.tar.gz
exit
1.5.5 shard4
进入容器 cli4-0:
docker exec -it cli4-0 bash
复制如下多行命令,并粘贴到终端中直接执行:
peer channel create -o orderer0.idy.com:7050 -c shard4 -f ./channel-artifacts/shard4.tx --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/idy.com/orderers/orderer0.idy.com/msp/tlscacerts/tlsca.idy.com-cert.pem
peer channel join -b shard4.block
peer lifecycle chaincode install sacc.tar.gz
peer lifecycle chaincode approveformyorg --channelID shard4 --name sacc-4 --version 1.0 --sequence 1 --init-required --package-id sacc_1:2975ee7870d40463a45052f874b4d13f11884d405b087d1296e217db3657132c --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/idy.com/orderers/orderer0.idy.com/msp/tlscacerts/tlsca.idy.com-cert.pem
peer lifecycle chaincode commit -o orderer1.idy.com:8050 --channelID shard4 --name sacc-4 --version 1.0 --sequence 1 --init-required --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/idy.com/orderers/orderer1.idy.com/msp/tlscacerts/tlsca.idy.com-cert.pem --peerAddresses peer0.org4.idy.com:13051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org4.idy.com/peers/peer0.org4.idy.com/tls/ca.crt
exit
复制分片区块文件,在 scripts 目录下,创建脚本文件 copy-shard4_block.sh:
docker cp cli4-0:/opt/gopath/src/github.com/hyperledger/fabric/peer/shard4.block ./
docker cp ./shard4.block cli4-1:/opt/gopath/src/github.com/hyperledger/fabric/peer
执行如下命令,复制 shard4 分片区块文件:
bash scripts/copy-shard4_block.sh
进入容器 cli4-1:
docker exec -it cli4-1 bash
复制如下多行命令,并粘贴到终端中直接执行:
peer channel join -b shard4.block
peer lifecycle chaincode install sacc.tar.gz
exit
1.5.6 shard5
进入容器 cli5-0:
docker exec -it cli5-0 bash
复制如下多行命令,并粘贴到终端中直接执行:
peer channel create -o orderer0.idy.com:7050 -c shard5 -f ./channel-artifacts/shard5.tx --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/idy.com/orderers/orderer0.idy.com/msp/tlscacerts/tlsca.idy.com-cert.pem
peer channel join -b shard5.block
peer lifecycle chaincode install sacc.tar.gz
peer lifecycle chaincode approveformyorg --channelID shard5 --name sacc-5 --version 1.0 --sequence 1 --init-required --package-id sacc_1:2975ee7870d40463a45052f874b4d13f11884d405b087d1296e217db3657132c --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/idy.com/orderers/orderer0.idy.com/msp/tlscacerts/tlsca.idy.com-cert.pem
peer lifecycle chaincode commit -o orderer1.idy.com:8050 --channelID shard5 --name sacc-5 --version 1.0 --sequence 1 --init-required --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/idy.com/orderers/orderer1.idy.com/msp/tlscacerts/tlsca.idy.com-cert.pem --peerAddresses peer0.org5.idy.com:14051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org5.idy.com/peers/peer0.org5.idy.com/tls/ca.crt
exit
复制分片区块文件,在 scripts 目录下,创建脚本文件 copy-shard5_block.sh:
docker cp cli5-0:/opt/gopath/src/github.com/hyperledger/fabric/peer/shard5.block ./
docker cp ./shard5.block cli5-1:/opt/gopath/src/github.com/hyperledger/fabric/peer
执行如下命令,复制 shard5 分片区块文件:
bash scripts/copy-shard5_block.sh
进入容器 cli5-1:
docker exec -it cli5-1 bash
复制如下多行命令,并粘贴到终端中直接执行:
peer channel join -b shard5.block
peer lifecycle chaincode install sacc.tar.gz
exit
1.6 链码初始化(可选)
如果链码需要初始化,则需要执行这一步,比如我们这里使用的链码 sacc 就是需要初始化的。如果自定义的链码不需要初始化,则需要将批准 approveformyorg 和提交 commit 这2个命令中的 --init-required 删除。
进入容器 cli1-0:
docker exec -it cli1-0 bash
链码初始化:
peer chaincode invoke -o orderer2.idy.com:9050 --isInit --ordererTLSHostnameOverride orderer2.idy.com --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/idy.com/orderers/orderer2.idy.com/msp/tlscacerts/tlsca.idy.com-cert.pem -C shard1 -n sacc-1 --peerAddresses peer0.org1.idy.com:10051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.idy.com/peers/peer0.org1.idy.com/tls/ca.crt -c '{"Args":["IDY","shard-1"]}'
进入容器 cli2-0:
docker exec -it cli2-0 bash
链码初始化:
peer chaincode invoke -o orderer2.idy.com:9050 --isInit --ordererTLSHostnameOverride orderer2.idy.com --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/idy.com/orderers/orderer2.idy.com/msp/tlscacerts/tlsca.idy.com-cert.pem -C shard2 -n sacc-2 --peerAddresses peer0.org2.idy.com:11051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.idy.com/peers/peer0.org2.idy.com/tls/ca.crt -c '{"Args":["IDY","shard-2"]}'
进入容器 cli3-0:
docker exec -it cli3-0 bash
链码初始化:
peer chaincode invoke -o orderer2.idy.com:9050 --isInit --ordererTLSHostnameOverride orderer2.idy.com --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/idy.com/orderers/orderer2.idy.com/msp/tlscacerts/tlsca.idy.com-cert.pem -C shard3 -n sacc-3 --peerAddresses peer0.org3.idy.com:12051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org3.idy.com/peers/peer0.org3.idy.com/tls/ca.crt -c '{"Args":["IDY","shard-3"]}'
进入容器 cli4-0:
docker exec -it cli4-0 bash
链码初始化:
peer chaincode invoke -o orderer2.idy.com:9050 --isInit --ordererTLSHostnameOverride orderer2.idy.com --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/idy.com/orderers/orderer2.idy.com/msp/tlscacerts/tlsca.idy.com-cert.pem -C shard4 -n sacc-4 --peerAddresses peer0.org4.idy.com:13051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org4.idy.com/peers/peer0.org4.idy.com/tls/ca.crt -c '{"Args":["IDY","shard-4"]}'
进入容器 cli5-0:
docker exec -it cli5-0 bash
链码初始化:
peer chaincode invoke -o orderer2.idy.com:9050 --isInit --ordererTLSHostnameOverride orderer2.idy.com --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/idy.com/orderers/orderer2.idy.com/msp/tlscacerts/tlsca.idy.com-cert.pem -C shard5 -n sacc-5 --peerAddresses peer0.org5.idy.com:14051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org5.idy.com/peers/peer0.org5.idy.com/tls/ca.crt -c '{"Args":["IDY","shard-5"]}'
2. 自动化构建脚本
在完成一遍上面的 Fabric 网络构建过程之后,我们便可以将上面过程中的所有命令和操作都写入一个脚本文件中,以后就可以通过执行该脚本文件来自动化启动 Fabric 网络。
在根目录下,创建脚本文件 build-network.sh :
echo "1. 生成相关的通道配置文件"
echo "1.1 生成系统通道的创世区块文件"
configtxgen -profile OrgsOrdererGenesis -outputBlock ./channel-artifacts/genesis.block -channelID system-channel
echo "1.2 分别生成5个分片的应用通道创建交易"
configtxgen -profile shard1Channel -outputCreateChannelTx ./channel-artifacts/shard1.tx -channelID shard1
configtxgen -profile shard2Channel -outputCreateChannelTx ./channel-artifacts/shard2.tx -channelID shard2
configtxgen -profile shard3Channel -outputCreateChannelTx ./channel-artifacts/shard3.tx -channelID shard3
configtxgen -profile shard4Channel -outputCreateChannelTx ./channel-artifacts/shard4.tx -channelID shard4
configtxgen -profile shard5Channel -outputCreateChannelTx ./channel-artifacts/shard5.tx -channelID shard5
echo "1.3 启动 PCN 网络"
docker-compose up -d
echo "2. 复制链码包"
bash scripts/copy-sacc.sh
echo "3. 创建和加入通道,链码安装、批准、提交"
echo "----------shard-1----------"
echo "(1) 进入容器cli1-0,创建通道、加入通道、链码安装、链码批准、链码提交"
docker exec -it cli1-0 bash -c "
peer channel create -o orderer0.idy.com:7050 -c shard1 -f ./channel-artifacts/shard1.tx --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/idy.com/orderers/orderer0.idy.com/msp/tlscacerts/tlsca.idy.com-cert.pem; \
peer channel join -b shard1.block; \
peer lifecycle chaincode install sacc.tar.gz; \
peer lifecycle chaincode approveformyorg --channelID shard1 --name sacc-1 --version 1.0 --sequence 1 --init-required --package-id sacc_1:2975ee7870d40463a45052f874b4d13f11884d405b087d1296e217db3657132c --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/idy.com/orderers/orderer0.idy.com/msp/tlscacerts/tlsca.idy.com-cert.pem; \
peer lifecycle chaincode commit -o orderer1.idy.com:8050 --channelID shard1 --name sacc-1 --version 1.0 --sequence 1 --init-required --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/idy.com/orderers/orderer1.idy.com/msp/tlscacerts/tlsca.idy.com-cert.pem --peerAddresses peer0.org1.idy.com:10051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.idy.com/peers/peer0.org1.idy.com/tls/ca.crt;
"
echo "(2) 复制分片shard1的应用通道区块文件"
bash scripts/copy-shard1_block.sh
echo "(3) 进入容器cli1-1,加入通道、链码安装"
docker exec -it cli1-1 bash -c "
peer channel join -b shard1.block; \
peer lifecycle chaincode install sacc.tar.gz;
"
echo "----------shard-2----------"
echo "(1) 进入容器cli2-0,创建通道、加入通道、链码安装、链码批准、链码提交"
docker exec -it cli2-0 bash -c "
peer channel create -o orderer0.idy.com:7050 -c shard2 -f ./channel-artifacts/shard2.tx --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/idy.com/orderers/orderer0.idy.com/msp/tlscacerts/tlsca.idy.com-cert.pem; \
peer channel join -b shard2.block; \
peer lifecycle chaincode install sacc.tar.gz; \
peer lifecycle chaincode approveformyorg --channelID shard2 --name sacc-2 --version 1.0 --sequence 1 --init-required --package-id sacc_1:2975ee7870d40463a45052f874b4d13f11884d405b087d1296e217db3657132c --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/idy.com/orderers/orderer0.idy.com/msp/tlscacerts/tlsca.idy.com-cert.pem; \
peer lifecycle chaincode commit -o orderer1.idy.com:8050 --channelID shard2 --name sacc-2 --version 1.0 --sequence 1 --init-required --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/idy.com/orderers/orderer1.idy.com/msp/tlscacerts/tlsca.idy.com-cert.pem --peerAddresses peer0.org2.idy.com:11051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.idy.com/peers/peer0.org2.idy.com/tls/ca.crt;
"
echo "(2) 复制分片shard2的应用通道区块文件"
bash scripts/copy-shard2_block.sh
echo "(3) 进入容器cli2-1,加入通道、链码安装"
docker exec -it cli2-1 bash -c "
peer channel join -b shard2.block; \
peer lifecycle chaincode install sacc.tar.gz;
"
echo "----------shard-3----------"
echo "(1) 进入容器cli3-0,创建通道、加入通道、链码安装、链码批准、链码提交"
docker exec -it cli3-0 bash -c "
peer channel create -o orderer0.idy.com:7050 -c shard3 -f ./channel-artifacts/shard3.tx --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/idy.com/orderers/orderer0.idy.com/msp/tlscacerts/tlsca.idy.com-cert.pem; \
peer channel join -b shard3.block; \
peer lifecycle chaincode install sacc.tar.gz; \
peer lifecycle chaincode approveformyorg --channelID shard3 --name sacc-3 --version 1.0 --sequence 1 --init-required --package-id sacc_1:2975ee7870d40463a45052f874b4d13f11884d405b087d1296e217db3657132c --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/idy.com/orderers/orderer0.idy.com/msp/tlscacerts/tlsca.idy.com-cert.pem; \
peer lifecycle chaincode commit -o orderer1.idy.com:8050 --channelID shard3 --name sacc-3 --version 1.0 --sequence 1 --init-required --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/idy.com/orderers/orderer1.idy.com/msp/tlscacerts/tlsca.idy.com-cert.pem --peerAddresses peer0.org3.idy.com:12051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org3.idy.com/peers/peer0.org3.idy.com/tls/ca.crt;
"
echo "(2) 复制分片shard3的应用通道区块文件"
bash scripts/copy-shard3_block.sh
echo "(3) 进入容器cli3-1,加入通道、链码安装"
docker exec -it cli3-1 bash -c "
peer channel join -b shard3.block; \
peer lifecycle chaincode install sacc.tar.gz;
"
echo "----------shard-4----------"
echo "(1) 进入容器cli4-0,创建通道、加入通道、链码安装、链码批准、链码提交"
docker exec -it cli4-0 bash -c "
peer channel create -o orderer0.idy.com:7050 -c shard4 -f ./channel-artifacts/shard4.tx --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/idy.com/orderers/orderer0.idy.com/msp/tlscacerts/tlsca.idy.com-cert.pem; \
peer channel join -b shard4.block; \
peer lifecycle chaincode install sacc.tar.gz; \
peer lifecycle chaincode approveformyorg --channelID shard4 --name sacc-4 --version 1.0 --sequence 1 --init-required --package-id sacc_1:2975ee7870d40463a45052f874b4d13f11884d405b087d1296e217db3657132c --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/idy.com/orderers/orderer0.idy.com/msp/tlscacerts/tlsca.idy.com-cert.pem; \
peer lifecycle chaincode commit -o orderer1.idy.com:8050 --channelID shard4 --name sacc-4 --version 1.0 --sequence 1 --init-required --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/idy.com/orderers/orderer1.idy.com/msp/tlscacerts/tlsca.idy.com-cert.pem --peerAddresses peer0.org4.idy.com:13051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org4.idy.com/peers/peer0.org4.idy.com/tls/ca.crt;
"
echo "(2) 复制分片shard4的应用通道区块文件"
bash scripts/copy-shard4_block.sh
echo "(3) 进入容器cli4-1,加入通道、链码安装"
docker exec -it cli4-1 bash -c "
peer channel join -b shard4.block; \
peer lifecycle chaincode install sacc.tar.gz;
"
echo "----------shard-5----------"
echo "(1) 进入容器cli5-0,创建通道、加入通道、链码安装、链码批准、链码提交"
docker exec -it cli5-0 bash -c "
peer channel create -o orderer0.idy.com:7050 -c shard5 -f ./channel-artifacts/shard5.tx --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/idy.com/orderers/orderer0.idy.com/msp/tlscacerts/tlsca.idy.com-cert.pem; \
peer channel join -b shard5.block; \
peer lifecycle chaincode install sacc.tar.gz; \
peer lifecycle chaincode approveformyorg --channelID shard5 --name sacc-5 --version 1.0 --sequence 1 --init-required --package-id sacc_1:2975ee7870d40463a45052f874b4d13f11884d405b087d1296e217db3657132c --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/idy.com/orderers/orderer0.idy.com/msp/tlscacerts/tlsca.idy.com-cert.pem; \
peer lifecycle chaincode commit -o orderer1.idy.com:8050 --channelID shard5 --name sacc-5 --version 1.0 --sequence 1 --init-required --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/idy.com/orderers/orderer1.idy.com/msp/tlscacerts/tlsca.idy.com-cert.pem --peerAddresses peer0.org5.idy.com:14051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org5.idy.com/peers/peer0.org5.idy.com/tls/ca.crt;
"
echo "(2) 复制分片shard5的应用通道区块文件"
bash scripts/copy-shard5_block.sh
echo "(3) 进入容器cli5-1,加入通道、链码安装"
docker exec -it cli5-1 bash -c "
peer channel join -b shard5.block; \
peer lifecycle chaincode install sacc.tar.gz;
"
echo "4. 链码初始化"
echo "shard1"
docker exec -it cli1-0 bash -c "
peer chaincode invoke -o orderer2.idy.com:9050 --isInit --ordererTLSHostnameOverride orderer2.idy.com --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/idy.com/orderers/orderer2.idy.com/msp/tlscacerts/tlsca.idy.com-cert.pem -C shard1 -n sacc-1 --peerAddresses peer0.org1.idy.com:10051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.idy.com/peers/peer0.org1.idy.com/tls/ca.crt -c '{\"Args\":[\"IDY\",\"shard-1\"]}';
"
echo "shard2"
docker exec -it cli2-0 bash -c "
peer chaincode invoke -o orderer2.idy.com:9050 --isInit --ordererTLSHostnameOverride orderer2.idy.com --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/idy.com/orderers/orderer2.idy.com/msp/tlscacerts/tlsca.idy.com-cert.pem -C shard2 -n sacc-2 --peerAddresses peer0.org2.idy.com:11051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.idy.com/peers/peer0.org2.idy.com/tls/ca.crt -c '{\"Args\":[\"IDY\",\"shard-2\"]}';
"
echo "shard3"
docker exec -it cli3-0 bash -c "
peer chaincode invoke -o orderer2.idy.com:9050 --isInit --ordererTLSHostnameOverride orderer2.idy.com --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/idy.com/orderers/orderer2.idy.com/msp/tlscacerts/tlsca.idy.com-cert.pem -C shard3 -n sacc-3 --peerAddresses peer0.org3.idy.com:12051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org3.idy.com/peers/peer0.org3.idy.com/tls/ca.crt -c '{\"Args\":[\"IDY\",\"shard-3\"]}';
"
echo "shard4"
docker exec -it cli4-0 bash -c "
peer chaincode invoke -o orderer2.idy.com:9050 --isInit --ordererTLSHostnameOverride orderer2.idy.com --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/idy.com/orderers/orderer2.idy.com/msp/tlscacerts/tlsca.idy.com-cert.pem -C shard4 -n sacc-4 --peerAddresses peer0.org4.idy.com:13051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org4.idy.com/peers/peer0.org4.idy.com/tls/ca.crt -c '{\"Args\":[\"IDY\",\"shard-4\"]}';
"
echo "shard5"
docker exec -it cli5-0 bash -c "
peer chaincode invoke -o orderer2.idy.com:9050 --isInit --ordererTLSHostnameOverride orderer2.idy.com --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/idy.com/orderers/orderer2.idy.com/msp/tlscacerts/tlsca.idy.com-cert.pem -C shard5 -n sacc-5 --peerAddresses peer0.org5.idy.com:14051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org5.idy.com/peers/peer0.org5.idy.com/tls/ca.crt -c '{\"Args\":[\"IDY\",\"shard-5\"]}';
"
启动网络
./build-network-PCN.sh
注意:使用脚本启动时,偶尔可能会出现一些错误,如果发生了错误,关闭网络,重新启动即可。如果经过多次尝试重启,仍存在错误,请仔细检查配置文件。
如果想要关闭网络,也可以编写脚本文件来实现。在根目录下,创建脚本文件 stop-network.sh :
echo "关闭所有docker容器"
docker-compose down
echo "删除所有未被容器使用的卷"
docker volume prune
echo "删除所有容器"
docker rm -f $(docker ps -aq)
关闭网络
./stop-network.sh
3. 链码测试
进入容器 cli1-0:
docker exec -it cli1-0 bash
查询操作:
peer chaincode query -C shard1 -n sacc-1 -c '{"Args":["query","IDY"]}'
进入容器 cli2-0:
docker exec -it cli2-0 bash
查询操作:
peer chaincode query -C shard2 -n sacc-2 -c '{"Args":["query","IDY"]}'
进入容器 cli3-0:
docker exec -it cli3-0 bash
查询操作:
peer chaincode query -C shard3 -n sacc-3 -c '{"Args":["query","IDY"]}'
进入容器 cli4-0:
docker exec -it cli4-0 bash
查询操作:
peer chaincode query -C shard4 -n sacc-4 -c '{"Args":["query","IDY"]}'
进入容器 cli5-0:
docker exec -it cli5-0 bash
查询操作:
peer chaincode query -C shard5 -n sacc-5 -c '{"Args":["query","IDY"]}'
4. 文件目录结构
~/go/src/github.com/hyperledger/myfabric/
scripts