docker安装fabric链码
docker-compose -f docker-compose-3orderer.yaml up -d
输出结果:
Creating network "docker_default" with the default driver Creating orderer0.example.com ... done Creating orderer1.example.com ... done Creating fabric-cli ... done Creating orderer2.example.com ... done
docker-compose -f docker-compose-org1.yaml up -d
输出结果:
WARNING: Found orphan containers (fabric-cli, orderer0.example.com, orderer2.example.com, orderer1.example.com) for this project. If you removed or renamed this service in your compose file, you can run this command with the --remove-orphans flag to clean it up. Creating peer1.org1.couchdb ... done Creating peer0.org1.couchdb ... done Creating peer0.org1.example.com ... done Creating peer1.org1.example.com ... done
docker-compose -f docker-compose-org2.yaml up -d
输出结果:
WARNING: Found orphan containers (peer0.org1.example.com, peer1.org1.couchdb, orderer2.example.com, peer0.org1.couchdb, orderer0.example.com, fabric-cli, orderer1.example.com, peer1.org1.example.com) for this project. If you removed or renamed this service in your compose file, you can run this command with the --remove-orphans flag to clean it up. Creating peer0.org2.couchdb ... done Creating peer1.org2.couchdb ... done Creating peer0.org2.example.com ... done Creating peer1.org2.example.com ... done
进入fabric-cli:
docker exec -it fabric-cli bash
创建通道,生成bussinesschannel.block文件:
export APP_CHANNEL=businesschannel export TIMEOUT=30 export CORE_PEER_LOCALMSPID=Org1MSP export CORE_PEER_MSPCONFIGPATH=/etc/hyperledger/fabric/crypto-config/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp peer channel create -o orderer0.example.com:7050 -c ${APP_CHANNEL} -f "/tmp/channel-artifacts/$APP_CHANNEL.tx" --timeout "${TIMEOUT}s" --tls --cafile /etc/hyperledger/fabric/crypto-config/ordererOrganizations/example.com/orderers/orderer0.example.com/msp/tlscacerts/tlsca.example.com-cert.pem
mv businesschannel.block /tmp/channel-artifacts/
org1-peer0加入通道:
export CORE_PEER_TLS_ENABLED=true export CORE_PEER_LOCALMSPID="Org1MSP" export CORE_PEER_TLS_ROOTCERT_FILE=/etc/hyperledger/fabric/crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt export CORE_PEER_MSPCONFIGPATH=/etc/hyperledger/fabric/crypto-config/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp export CORE_PEER_ADDRESS=peer0.org1.example.com:7051
peer channel join -b /tmp/channel-artifacts/businesschannel.block
输出结果:
[020 04-14 13:06:58.33 UTC] [channelCmd] executeJoin -> INFO Successfully submitted proposal to join channel
org1-peer1加入通道:
export CORE_PEER_TLS_ENABLED=true export CORE_PEER_LOCALMSPID="Org1MSP" export CORE_PEER_TLS_ROOTCERT_FILE=/etc/hyperledger/fabric/crypto-config/peerOrganizations/org1.example.com/peers/peer1.org1.example.com/tls/ca.crt export CORE_PEER_MSPCONFIGPATH=/etc/hyperledger/fabric/crypto-config/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp export CORE_PEER_ADDRESS=peer1.org1.example.com:8051
peer channel join -b /tmp/channel-artifacts/businesschannel.block
输出结果:
[020 04-14 13:16:46.35 UTC] [channelCmd] executeJoin -> INFO Successfully submitted proposal to join channel
org2-peer0加入通道:
export CORE_PEER_TLS_ENABLED=true export CORE_PEER_LOCALMSPID="Org2MSP" export CORE_PEER_TLS_ROOTCERT_FILE=/etc/hyperledger/fabric/crypto-config/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt export CORE_PEER_MSPCONFIGPATH=/etc/hyperledger/fabric/crypto-config/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp export CORE_PEER_ADDRESS=peer0.org2.example.com:9051
peer channel join -b /tmp/channel-artifacts/businesschannel.block
输出结果:
[020 04-14 13:19:51.05 UTC] [channelCmd] executeJoin -> INFO Successfully submitted proposal to join channel
org2-peer1 加入通道:
export CORE_PEER_TLS_ENABLED=true export CORE_PEER_LOCALMSPID="Org2MSP" export CORE_PEER_TLS_ROOTCERT_FILE=/etc/hyperledger/fabric/crypto-config/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt export CORE_PEER_MSPCONFIGPATH=/etc/hyperledger/fabric/crypto-config/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp export CORE_PEER_ADDRESS=peer1.org2.example.com:10051
peer channel join -b /tmp/channel-artifacts/businesschannel.block
输出结果:
[020 04-14 13:21:11.98 UTC] [channelCmd] executeJoin -> INFO Successfully submitted proposal to join channel
安装链码:在宿主机的/home/lighthouse/fabric3O/chaincodes下载合约代码:
git clone https://gitee.com/kernelHP/hyperledger-fabric-contract-java-demo.git
cd hyperledger-fabric-contract-java-demo/
编译打包源码:
mvn compile package -DskipTests -Dmaven.test.skip=true
mv target/chaincode.jar $PWD
rm -rf target/ src pom.xml
打包链码:
peer lifecycle chaincode package hyperledger-fabric-contract-java-demo.tar.gz --path ./hyperledger-fabric-contract-java-demo/ --lang java --label hyperledger-fabric-contract-java-demo_1
安装链码:org1-peer0:
export CORE_PEER_TLS_ENABLED=true export CORE_PEER_LOCALMSPID="Org1MSP" export CORE_PEER_TLS_ROOTCERT_FILE=/etc/hyperledger/fabric/crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt export CORE_PEER_MSPCONFIGPATH=/etc/hyperledger/fabric/crypto-config/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp export CORE_PEER_ADDRESS=peer0.org1.example.com:7051
peer lifecycle chaincode install hyperledger-fabric-contract-java-demo.tar.gz
输出结果:
[020 04-14 13:34:15.68 UTC] [cli.lifecycle.chaincode] submitInstallProposal -> INFO Installed remotely: response:<status:200 payload:"\nhhyperledger-fabric-contract-java-demo_1:3c28345df18eb39906f49df16a6774392d366ad8a21aa2fa98a3db405ec6db41\022'hyperledger-fabric-contract-java-demo_1" > [021 04-14 13:34:15.68 UTC] [cli.lifecycle.chaincode] submitInstallProposal -> INFO Chaincode code package identifier: hyperledger-fabric-contract-java-demo_1:3c28345df18eb39906f49df16a6774392d366ad8a21aa2fa98a3db405ec6db41
安装org1-peer1:
export CORE_PEER_TLS_ENABLED=true export CORE_PEER_LOCALMSPID="Org1MSP" export CORE_PEER_TLS_ROOTCERT_FILE=/etc/hyperledger/fabric/crypto-config/peerOrganizations/org1.example.com/peers/peer1.org1.example.com/tls/ca.crt export CORE_PEER_MSPCONFIGPATH=/etc/hyperledger/fabric/crypto-config/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp export CORE_PEER_ADDRESS=peer1.org1.example.com:8051
peer lifecycle chaincode install hyperledger-fabric-contract-java-demo.tar.gz
输出结果:
[020 04-14 13:35:51.91 UTC] [cli.lifecycle.chaincode] submitInstallProposal -> INFO Installed remotely: response:<status:200 payload:"\nhhyperledger-fabric-contract-java-demo_1:3c28345df18eb39906f49df16a6774392d366ad8a21aa2fa98a3db405ec6db41\022'hyperledger-fabric-contract-java-demo_1" > [021 04-14 13:35:51.91 UTC] [cli.lifecycle.chaincode] submitInstallProposal -> INFO Chaincode code package identifier: hyperledger-fabric-contract-java-demo_1:3c28345df18eb39906f49df16a6774392d366ad8a21aa2fa98a3db405ec6db41
安装org2-peer0:
export CORE_PEER_TLS_ENABLED=true export CORE_PEER_LOCALMSPID="Org2MSP" export CORE_PEER_TLS_ROOTCERT_FILE=/etc/hyperledger/fabric/crypto-config/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt export CORE_PEER_MSPCONFIGPATH=/etc/hyperledger/fabric/crypto-config/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp export CORE_PEER_ADDRESS=peer0.org2.example.com:9051
peer lifecycle chaincode install hyperledger-fabric-contract-java-demo.tar.gz
输出结果:
[020 04-14 13:37:20.18 UTC] [cli.lifecycle.chaincode] submitInstallProposal -> INFO Installed remotely: response:<status:200 payload:"\nhhyperledger-fabric-contract-java-demo_1:3c28345df18eb39906f49df16a6774392d366ad8a21aa2fa98a3db405ec6db41\022'hyperledger-fabric-contract-java-demo_1" > [021 04-14 13:37:20.18 UTC] [cli.lifecycle.chaincode] submitInstallProposal -> INFO Chaincode code package identifier: hyperledger-fabric-contract-java-demo_1:3c28345df18eb39906f49df16a6774392d366ad8a21aa2fa98a3db405ec6db41
安装org2-peer1:
export CORE_PEER_TLS_ENABLED=true export CORE_PEER_LOCALMSPID="Org2MSP" export CORE_PEER_TLS_ROOTCERT_FILE=/etc/hyperledger/fabric/crypto-config/peerOrganizations/org2.example.com/peers/peer1.org2.example.com/tls/ca.crt export CORE_PEER_MSPCONFIGPATH=/etc/hyperledger/fabric/crypto-config/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp export CORE_PEER_ADDRESS=peer1.org2.example.com:10051
peer lifecycle chaincode install hyperledger-fabric-contract-java-demo.tar.gz
输出结果:
[020 04-14 13:38:49.06 UTC] [cli.lifecycle.chaincode] submitInstallProposal -> INFO Installed remotely: response:<status:200 payload:"\nhhyperledger-fabric-contract-java-demo_1:3c28345df18eb39906f49df16a6774392d366ad8a21aa2fa98a3db405ec6db41\022'hyperledger-fabric-contract-java-demo_1" > [021 04-14 13:38:49.06 UTC] [cli.lifecycle.chaincode] submitInstallProposal -> INFO Chaincode code package identifier: hyperledger-fabric-contract-java-demo_1:3c28345df18eb39906f49df16a6774392d366ad8a21aa2fa98a3db405ec6db41
查询包id:
peer lifecycle chaincode queryinstalled
包ID是链码标签和链码二进制文件的哈希值的组合。每个peer节点将生成相同的包ID。输出结果:
Installed chaincodes on peer:
Package ID: hyperledger-fabric-contract-java-demo_1:3c28345df18eb39906f49df16a6774392d366ad8a21aa2fa98a3db405ec6db41, Label: hyperledger-fabric-contract-java-demo_1
将包ID保存为环境变量:
export CC_PACKAGE_ID=hyperledger-fabric-contract-java-demo_1:3c28345df18eb39906f49df16a6774392d366ad8a21aa2fa98a3db405ec6db41
批准链码定义:org1:
export CORE_PEER_TLS_ENABLED=true export CORE_PEER_LOCALMSPID="Org1MSP" export CORE_PEER_TLS_ROOTCERT_FILE=/etc/hyperledger/fabric/crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt export CORE_PEER_MSPCONFIGPATH=/etc/hyperledger/fabric/crypto-config/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp export CORE_PEER_ADDRESS=peer0.org1.example.com:7051
peer lifecycle chaincode approveformyorg -o orderer0.example.com:7050 --ordererTLSHostnameOverride orderer0.example.com --channelID businesschannel --name hyperledger-fabric-contract-java-demo --version 1.0 --package-id $CC_PACKAGE_ID --sequence 1 --tls --cafile /etc/hyperledger/fabric/crypto-config/ordererOrganizations/example.com/orderers/orderer0.example.com/msp/tlscacerts/tlsca.example.com-cert.pem
输出结果:
[025 04-14 13:51:17.85 UTC] [chaincodeCmd] ClientWait -> INFO txid [c3c375c7b2da9e0048fb71e8be266dfa67db1506643f99f0f5552c10f77f0757] committed with status (VALID) at peer0.org1.example.com:7051
批准org2:
export CORE_PEER_TLS_ENABLED=true export CORE_PEER_LOCALMSPID="Org2MSP" export CORE_PEER_TLS_ROOTCERT_FILE=/etc/hyperledger/fabric/crypto-config/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt export CORE_PEER_MSPCONFIGPATH=/etc/hyperledger/fabric/crypto-config/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp export CORE_PEER_ADDRESS=peer0.org2.example.com:9051
peer lifecycle chaincode approveformyorg -o orderer0.example.com:7050 --ordererTLSHostnameOverride orderer0.example.com --channelID businesschannel --name hyperledger-fabric-contract-java-demo --version 1.0 --package-id $CC_PACKAGE_ID --sequence 1 --tls --cafile /etc/hyperledger/fabric/crypto-config/ordererOrganizations/example.com/orderers/orderer0.example.com/msp/tlscacerts/tlsca.example.com-cert.pem
输出结果:
[025 04-14 13:53:51.84 UTC] [chaincodeCmd] ClientWait -> INFO txid [ac4c08c586a52b51350f8c5a5a5ee01538e77d5c9b9fe1619d58e593626d5662] committed with status (VALID) at peer0.org2.example.com:9051
检查通道成员是否已批准相同的链码定义:
peer lifecycle chaincode checkcommitreadiness --channelID businesschannel --name hyperledger-fabric-contract-java-demo --version 1.0 --sequence 1 --tls --cafile /etc/hyperledger/fabric/crypto-config/ordererOrganizations/example.com/orderers/orderer0.example.com/msp/tlscacerts/tlsca.example.com-cert.pem --output json
输出结果:
153FD955104145BF071844A092819E023D { "approvals": { "Org1MSP": true, "Org2MSP": true } }
将链码提交到通道::
peer lifecycle chaincode commit -o orderer0.example.com:7050 --ordererTLSHostnameOverride orderer0.example.com --channelID businesschannel --name hyperledger-fabric-contract-java-demo --version 1.0 --sequence 1 --tls --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:9051 --tlsRootCertFiles /etc/hyperledger/fabric/crypto-config/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt
输出结果:
[029 04-14 13:56:24.90 UTC] [chaincodeCmd] ClientWait -> INFO txid [c29003a4b848971ca280ad68482c2d009d55ba45788b024411953aaba0a6a0ce] committed with status (VALID) at peer0.org1.example.com:7051 [02a 04-14 13:56:25.09 UTC] [chaincodeCmd] ClientWait -> INFO txid [c29003a4b848971ca280ad68482c2d009d55ba45788b024411953aaba0a6a0ce] committed with status (VALID) at peer0.org2.example.com:9051
调用链码:
peer chaincode invoke -o orderer0.example.com:7050 --ordererTLSHostnameOverride orderer0.example.com --tls --cafile /etc/hyperledger/fabric/crypto-config/ordererOrganizations/example.com/orderers/orderer0.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C businesschannel -n hyperledger-fabric-contract-java-demo --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:9051 --tlsRootCertFiles /etc/hyperledger/fabric/crypto-config/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt -c '{"function":"createCat","Args":["cat-0" , "tom" , "3" , "蓝色" , "大懒猫"]}'
peer chaincode query -C businesschannel -n hyperledger-fabric-contract-java-demo -c '{"Args":["queryCat" , "cat-0"]}'
结束容器:
docker-compose -f docker-compose-3orderer.yaml down docker-compose -f docker-compose-org2.yaml down docker-compose -f docker-compose-org1.yaml down
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?