# fabric-work **Repository Path**: cekongsb/fabric-work ## Basic Information - **Project Name**: fabric-work - **Description**: fabric生产网络 - **Primary Language**: Unknown - **License**: MulanPSL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2022-10-19 - **Last Updated**: 2022-11-20 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 设置网络(两台虚拟机都需要设置) vim /etc/hosts # 新增 192.168.133.128 orderer0.example.com 192.168.133.128 orderer1.example.com 192.168.133.128 orderer2.example.com 192.168.133.128 peer0.org1.example.com 192.168.133.128 peer1.org1.example.com 192.168.133.129 peer0.org2.example.com 192.168.133.129 peer1.org2.example.com # 手动拉取fabric-tools:2.4.6的镜像(具体可访问https://hub.docker.com/u/hyperledger) docker pull hyperledger/fabric-tools:2.4.6 # 创建身份证书 cryptogen generate --config=crypto-config.yaml # 生成创块 configtxgen -profile TwoOrgsOrdererGenesis -channelID fabric-channel -outputBlock ./channel-artifacts/genesis.block # 生成通道文件 configtxgen -profile TwoOrgsChannel -outputCreateChannelTx ./channel-artifacts/channel.tx -channelID mychannel # 为 Org1 定义锚节点 configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org1MSPanchors.tx -channelID mychannel -asOrg Org1MSP # 为 Org2 定义锚节点 configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org2MSPanchors.tx -channelID mychannel -asOrg Org2MSP # 复制身份证书及创世块文件至虚拟机2 scp -r channel-artifacts/ root@192.168.133.129:/opt/fabric-work/ scp -r crypto-config/ root@192.168.133.129:/opt/fabric-work/ # 启动orderer集群 docker-compose -f docker-compose-orderer.yaml up -d # 关闭orderer集群 docker-compose -f docker-compose-orderer.yaml down # 启动组织Org1 docker-compose -f docker-compose-org1.yaml up -d # 关闭组织Org1 docker-compose -f docker-compose-org1.yaml down # 启动组织Org2 docker-compose -f docker-compose-org2.yaml up -d # 关闭组织Org2 docker-compose -f docker-compose-org2.yaml down # 创建通道 docker exec -it cli1 bash peer channel create -o orderer0.example.com:7050 -c mychannel -f "/tmp/channel-artifacts/channel.tx" --tls true --cafile /etc/hyperledger/fabric/crypto-config/ordererOrganizations/example.com/orderers/orderer0.example.com/msp/tlscacerts/tlsca.example.com-cert.pem mv mychannel.block /tmp/channel-artifacts/ # 复制通道文件至虚拟机2 scp ./channel-artifacts/mychannel.block root@192.168.133.129:/opt/fabric-work/channel-artifacts/ # 加入通道 # org1-peer0 docker exec -it cli1 bash peer channel join -b /tmp/channel-artifacts/mychannel.block # org1-peer1 docker exec -it cli2 bash peer channel join -b /tmp/channel-artifacts/mychannel.block # org2-peer0 docker exec -it cli1 bash peer channel join -b /tmp/channel-artifacts/mychannel.block # org2-peer1 docker exec -it cli2 bash peer channel join -b /tmp/channel-artifacts/mychannel.block # 验证是否加入通道 peer channel getinfo -c mychannel # 更新锚节点 # org1 docker exec -it cli1 bash peer channel update -o orderer0.example.com:7050 -c mychannel -f "/tmp/channel-artifacts/Org1MSPanchors.tx" --tls true --cafile /etc/hyperledger/fabric/crypto-config/ordererOrganizations/example.com/orderers/orderer0.example.com/msp/tlscacerts/tlsca.example.com-cert.pem # org2 docker exec -it cli1 bash peer channel update -o orderer0.example.com:7050 -c mychannel -f "/tmp/channel-artifacts/Org2MSPanchors.tx" --tls true --cafile /etc/hyperledger/fabric/crypto-config/ordererOrganizations/example.com/orderers/orderer0.example.com/msp/tlscacerts/tlsca.example.com-cert.pem # 返回结果 [022 10-18 14:32:19.10 UTC] [channelCmd] update -> INFO Successfully submitted channel update # 安装调用智能合约 # 复制官方示例智能合约 cp -r /opt/fabric-samples/chaincode/sacc/ ./chaincodes/ # 容器内设置go语言依赖包 docker exec -it cli1 bash cd /etc/hyperledger/fabric/chaincodes/sacc go env -w GOPROXY=https://goproxy.cn,direct go env -w GO111MODULE=auto go mod init sacc go mod tidy go mod vendor # 打包链码 docker exec -it cli1 bash peer lifecycle chaincode package sacc.tar.gz --path /etc/hyperledger/fabric/chaincodes/sacc --label sacc_1 # 将虚拟机1打包好的链码复制到虚拟机2 # 虚拟机1 docker cp cli1:/opt/gopath/src/github.com/hyperledger/fabric/peer/sacc.tar.gz ./chaincodes/ scp ./chaincodes/sacc.tar.gz root@192.168.133.129:/opt/fabric-work/chaincodes/ # 虚拟机2 docker cp /opt/fabric-work/chaincodes/sacc.tar.gz cli1:/opt/gopath/src/github.com/hyperledger/fabric/peer/ # 安装链码 # org1 docker exec -it cli1 bash peer lifecycle chaincode install sacc.tar.gz # org2 docker exec -it cli1 bash peer lifecycle chaincode install sacc.tar.gz # 查询确认一下 peer lifecycle chaincode queryinstalled # 返回结果 Package ID: sacc_1:e41b3eed3a4f952e82acd9e61b537c0215776f20219878972f211299336d3834, Label: sacc_1 # 批准链码 # org1 docker exec -it cli1 bash peer lifecycle chaincode approveformyorg --channelID mychannel --name sacc --version 1.0 --init-required --package-id sacc_1:e41b3eed3a4f952e82acd9e61b537c0215776f20219878972f211299336d3834 --sequence 1 --tls true --cafile /etc/hyperledger/fabric/crypto-config/ordererOrganizations/example.com/orderers/orderer0.example.com/msp/tlscacerts/tlsca.example.com-cert.pem # 返回结果 [09f 10-19 00:43:53.66 UTC] [chaincodeCmd] ClientWait -> INFO txid [3d2bd22935926fce53955e7403532af7bc4cecf1fc8cdc21a18bf1430ef44a81] committed with status (VALID) at peer0.org1.example.com:7051 # org2 docker exec -it cli1 bash peer lifecycle chaincode approveformyorg --channelID mychannel --name sacc --version 1.0 --init-required --package-id sacc_1:e41b3eed3a4f952e82acd9e61b537c0215776f20219878972f211299336d3834 --sequence 1 --tls true --cafile /etc/hyperledger/fabric/crypto-config/ordererOrganizations/example.com/orderers/orderer0.example.com/msp/tlscacerts/tlsca.example.com-cert.pem # 报错 Error: timed out waiting for txid on all peers # 原因:在crypto-config.yaml中,org2的字段EnableNodeOUs值为false,正常应该为true,否则org2中的peer节点无法与orderer通信链接。 # 返回结果 [09f 10-19 00:44:28.88 UTC] [chaincodeCmd] ClientWait -> INFO txid [bba3a5b4e3b30305345f501d182ef91105a24dbbf672d3cd334042eb5920980e] committed with status (VALID) at peer0.org2.example.com:7051 # 查看链码是否就绪 docker exec -it cli1 bash peer lifecycle chaincode checkcommitreadiness --channelID mychannel --name sacc --version 1.0 --init-required --sequence 1 --tls true --cafile /etc/hyperledger/fabric/crypto-config/ordererOrganizations/example.com/orderers/orderer0.example.com/msp/tlscacerts/tlsca.example.com-cert.pem --output json # 返回结果 { "approvals": { "Org1MSP": true, "Org2MSP": true } } # 提交链码 docker exec -it cli1 bash peer lifecycle chaincode commit -o orderer0.example.com:7050 --channelID mychannel --name sacc --version 1.0 --sequence 1 --init-required --tls true --cafile /etc/hyperledger/fabric/crypto-config/ordererOrganizations/example.com/orderers/orderer0.example.com/msp/tlscacerts/tlsca.example.com-cert.pem --peerAddresses peer0.org1.example.com:7051 --tlsRootCertFiles /etc/hyperledger/fabric/crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt --peerAddresses peer0.org2.example.com:7051 --tlsRootCertFiles /etc/hyperledger/fabric/crypto-config/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt # 返回结果 [029 10-19 00:57:05.37 UTC] [chaincodeCmd] ClientWait -> INFO txid [a308aa35bedc321e309c2be6d96364b449972ba8ea6bee908a19314e12d22c04] committed with status (VALID) at peer0.org1.example.com:7051 [02a 10-19 00:57:05.61 UTC] [chaincodeCmd] ClientWait -> INFO txid [a308aa35bedc321e309c2be6d96364b449972ba8ea6bee908a19314e12d22c04] committed with status (VALID) at peer0.org2.example.com:7051 # 链码初始化 docker exec -it cli1 bash peer chaincode invoke -o orderer0.example.com:7050 --isInit --ordererTLSHostnameOverride orderer0.example.com --tls true --cafile /etc/hyperledger/fabric/crypto-config/ordererOrganizations/example.com/orderers/orderer0.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C mychannel -n sacc --peerAddresses peer0.org1.example.com:7051 --tlsRootCertFiles /etc/hyperledger/fabric/crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt --peerAddresses peer0.org2.example.com:7051 --tlsRootCertFiles /etc/hyperledger/fabric/crypto-config/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt -c '{"Args":["a","bb"]}' # 报错1 [023 10-19 02:07:53.27 UTC] [chaincodeCmd] chaincodeInvokeOrQuery -> DEBU ESCC invoke result: response: Error: endorsement failure during invoke. response: status:500 message:"error in simulation: failed to execute transaction 7bec060f8034009a78ef5629a22f0cd5f1d36486fea2635c61b02bc0e0ea580b: could not launch chaincode sacc_1:84ca9adc1a80b0964ac0b8bad50042a75dbd8aa25bb4df8f4073e9818d17f1e6: chaincode registration failed: container exited with 0" # 原因:peer节点以容器运行,但环境变量CORE_PEER_ADDRESSAUTODETECT的值默认设置为false,则无法将实例化节点的域名转换为IP。 # 解决:将CORE_PEER_ADDRESSAUTODETECT的值设置为true。 # 报错2 [023 10-20 01:48:33.93 UTC] [chaincodeCmd] chaincodeInvokeOrQuery -> DEBU ESCC invoke result: response: Error: endorsement failure during invoke. response: status:500 message:"make sure the chaincode sacc has been successfully defined on channel mychannel and try again: chaincode definition for 'sacc' exists, but chaincode is not installed" # 原因:peer节点和fabric-tools从2.4.1更换为2.4.6后,链码打包后的id也会更换,而后续安装,审批和提交链码还是使用原来2.4.1版本的id,所以报错。 # 解决:及时更新链码的id。 # 返回结果 [026 10-19 03:06:23.58 UTC] [chaincodeCmd] chaincodeInvokeOrQuery -> INFO Chaincode invoke successful. result: status:200 # 查询数据 docker exec -it cli1 bash peer chaincode query -C mychannel -n sacc -c '{"Args":["query","a"]}' # 返回结果:bb # 调用链码,新增数据 docker exec -it cli1 bash peer chaincode invoke -o orderer0.example.com:7050 --tls true --cafile /etc/hyperledger/fabric/crypto-config/ordererOrganizations/example.com/orderers/orderer0.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C mychannel -n sacc --peerAddresses peer0.org1.example.com:7051 --tlsRootCertFiles /etc/hyperledger/fabric/crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt --peerAddresses peer0.org2.example.com:7051 --tlsRootCertFiles /etc/hyperledger/fabric/crypto-config/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt -c '{"Args":["set","a","cc"]}' # 返回结果 [026 10-19 03:33:50.55 UTC] [chaincodeCmd] chaincodeInvokeOrQuery -> INFO Chaincode invoke successful. result: status:200 payload:"cc" # 查询数据 peer chaincode query -C mychannel -n sacc -c '{"Args":["query","a"]}' # 返回结果:cc # 搭建区块浏览器 cd /opt/fabric-work mkdir explorer cd explorer # 下载相关配置文件 wget https://raw.githubusercontent.com/hyperledger/blockchain-explorer/main/examples/net1/config.json wget https://raw.githubusercontent.com/hyperledger/blockchain-explorer/main/examples/net1/connection-profile/test-network.json -P connection-profile wget https://raw.githubusercontent.com/hyperledger/blockchain-explorer/main/docker-compose.yaml # 复制相关身份证书到organizations目录 cp -r ../crypto-config ./organizations # 修改docker-compose.yaml相关参数(必须) # 修改位置: mynetwork.com: external: name: net_test #修改点1:与当前fabric网络使用docker桥接网络名称相匹配(docker network ls查询) ... services: explorer.mynetwork.com: ... environment: ... - PORT=8080 #修改点2:修改服务监听端口 volumes: #修改点3:修改数据卷挂着路径,按实际路径修改 - ./config.json:/opt/explorer/app/platform/fabric/config.json - ./connection-profile:/opt/explorer/app/platform/fabric/connection-profile - ./organizations:/tmp/crypto - walletstore:/opt/explorer/wallet # 修改config.json相关参数(非必须) { "network-configs": { "test-network": { #可修改点:与connection-porfile中的配置文件中字段name名称相同 "name": "Test Network", #可修改点:设定在浏览器中显示当前fabric网络的名称 "profile": "./connection-profile/test-network.json" #可修改点:配置文件实际路径及名称 } }, "license": "Apache-2.0" } # 修改网络连接配置文件test-network.json相关参数(重点关注) { "name": "test-network", #可修改点:与config.json关联的名称,可按实际需求修改,非必须。 "version": "1.0.0", "client": { "tlsEnable": true, "adminCredential": { #可修改点:浏览器默认登录用户名和密码 "id": "exploreradmin", "password": "exploreradminpw" }, "enableAuthentication": true, "organization": "Org1MSP", #关注:组织名称与实际fabric网络中的名称是否一致 "connection": { "timeout": { "peer": { "endorser": "300" }, "orderer": "300" } } }, "channels": { "mychannel": { "peers": { "peer0.org1.example.com": {} #关注:peer名称与实际fabric网络中的名称是否一致 } } }, "organizations": { "Org1MSP": { "mspid": "Org1MSP", #关注:组织名称与实际fabric网络中的名称是否一致 "adminPrivateKey": { "path": "/tmp/crypto/peerOrganizations/org1.example.com/users/User1@org1.example.com/msp/keystore/priv_sk" #重点关注:此路径是docker容器中的路径,而非宿主主机身份证书的路径 }, "peers": ["peer0.org1.example.com"], #关注:peer名称与实际fabric网络中的名称是否一致 "signedCert": { "path": "/tmp/crypto/peerOrganizations/org1.example.com/users/User1@org1.example.com/msp/signcerts/User1@org1.example.com-cert.pem" #重点关注:此路径是docker容器中的路径,而非宿主主机身份证书的路径 } } }, "peers": { "peer0.org1.example.com": { #关注:peer名称与实际fabric网络中的名称是否一致 "tlsCACerts": { "path": "/tmp/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt" #重点关注:此路径是docker容器中的路径,而非宿主主机身份证书的路径 }, "url": "grpcs://peer0.org1.example.com:7051" #关注:peer名称与实际fabric网络中的名称是否一致 } } } # 启动区块链浏览器 cd /opt/fabric-work/explorer/ docker-compose up -d