Hyperledger Fabric链码Invoke无语法错误但报错求助
Hyperledger Fabric ERC721链码Invoke初始化失败排查请求
我是区块链研究者,基于Hyperledger Fabric开发ERC721代币功能时遇到问题。从启动网络到querycommitted的部署流程均正常,但执行invoke初始化账本操作失败。Docker日志显示链码注册失败,容器以退出码1终止,Invoke返回背书失败错误。以下是相关文件,恳请帮忙排查问题:
部署脚本
#!/bin/sh ./network.sh down sudo ./network.sh up -ca -s couchdb sudo ./network.sh createChannel -c samplechannel sudo chmod 666 /var/run/docker.sock docker exec peer0.org1.example.com peer channel list source ./lifecycle_setup_org1.sh sudo chmod -R 777 . peer lifecycle chaincode package chaincode1.tar.gz --path chaincode --lang node --label surya peer lifecycle chaincode install chaincode1.tar.gz --peerAddresses localhost:7051 --tlsRootCertFiles $CORE_PEER_TLS_ROOTCERT_FILE peer lifecycle chaincode queryinstalled --peerAddresses localhost:7051 --tlsRootCertFiles $CORE_PEER_TLS_ROOTCERT_FILE source ./lifecycle_setup_org2.sh peer lifecycle chaincode install chaincode1.tar.gz --peerAddresses localhost:9051 --tlsRootCertFiles $CORE_PEER_TLS_ROOTCERT_FILE peer lifecycle chaincode queryinstalled --peerAddresses localhost:9051 --tlsRootCertFiles $CORE_PEER_TLS_ROOTCERT_FILE peer lifecycle chaincode getinstalledpackage --package-id surya:95f3c2d3f1fbc5cb69e9b6d85e6807d7e8786da5ecc2be24d38759cbc08a3636 ouput-directory . source ./lifecycle_setup_org1.sh peer lifecycle chaincode approveformyorg -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --tls --cafile $ORDERER_CA -C samplechannel --name suryacode --version 1.0 --init-required --package-id surya:95f3c2d3f1fbc5cb69e9b6d85e6807d7e8786da5ecc2be24d38759cbc08a3636 --sequence 1 source ./lifecycle_setup_org2.sh peer lifecycle chaincode approveformyorg --channelID samplechannel --name chaincode1 --version 1.0 --init-required --package-id -o localhost:7050 --ordererTLSHostnameOverride orderer.exmaple.com surya:95f3c2d3f1fbc5cb69e9b6d85e6807d7e8786da5ecc2be24d38759cbc08a3636 --sequence 1 --tls --cafile $ORDERER_CA --name suryacode source ./lifecycle_setup_org1.sh peer lifecycle chaincode checkcommitreadiness --channelID samplechannel --name suryacode --version 1.0 --sequence 1 --output json --init-required source ./lifecycle_setup_org2.sh peer lifecycle chaincode checkcommitreadiness --channelID samplechannel --name suryacode --version 1.0 --sequence 1 --output json --init-required source ./lifecycle_setup_channel_commit.sh peer lifecycle chaincode commit -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --tls --cafile $ORDERER_CA --channelID samplechannel --name suryacode --version 1.0 --sequence 1 --init-required --peerAddresses localhost:7051 --tlsRootCertFiles $CORE_PEER_TLS_ROOTCERT_FILE_ORG1 --peerAddresses localhost:9051 --tlsRootCertFiles $CORE_PEER_TLS_ROOTCERT_FILE_ORG2 peer lifecycle chaincode querycommitted --channelID samplechannel --name suryacode peer chaincode invoke -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --tls --cafile $ORDERER_CA -C samplechannel -n suryacode --peerAddresses localhost:7051 --tlsRootCertFiles $CORE_PEER_TLS_ROOTCERT_FILE_ORG1 --peerAddresses localhost:9051 --tlsRootCertFiles $CORE_PEER_TLS_ROOTCERT_FILE_ORG2 --isInit -c '{"function":"initLedger","Args":[]}'
Docker日志
2024-06-11 09:22:23.878 UTC 0087 WARN [endorser] ProcessProposal -> Failed to invoke chaincode channel=samplechannel chaincode=suryacode error="error in simulation: failed to execute transaction 64e63ec8fb698931b0ca8d76c164fd0d691fd47c54c7017de53c36634827264b: could not launch chaincode surya:95f3c2d3f1fbc5cb69e9b6d85e6807d7e8786da5ecc2be24d38759cbc08a3636: chaincode registration failed: container exited with 1" 2024-06-11 09:22:23.878 UTC 0088 INFO [comm.grpc.server] 1 -> unary call completed grpc.service=protos.Endorser grpc.method=ProcessProposal grpc.peer_address=172.25.0.1:57644 grpc.code=OK grpc.call_duration=1.066760198s
Invoke错误信息
Error: endorsement failure during invoke. response: status:500 message:"error in simulation: failed to execute transaction 64e63ec8fb698931b0ca8d76c164fd0d691fd47c54c7017de53c36634827264b: could not launch chaincode surya:95f3c2d3f1fbc5cb69e9b6d85e6807d7e8786da5ecc2be24d38759cbc08a3636: chaincode registration failed: container exited with 1"
NFT合约代码
import TokenERC721Contract from './tokenERC721Contract'; class NFTMinter extends TokenERC721Contract { async InitLedger(ctx) { try{ console.info('============= START : Initialize Ledger ==========='); await super.InitLedger(ctx); console.info('============= END : Initialize Ledger ==========='); } catch (error) { console.info(`Error in Initialize Ledger: ${error}`); } } async MintNFT(ctx, tokenId, tokenURI) { console.info('============= START : MintNFT ==========='); await super.Mint(ctx, tokenId, tokenURI); console.info('============= END : MintNFT ==========='); } async BurnNFT(ctx, tokenId) { console.info('============= START : BurnNFT ==========='); await super.Burn(ctx, tokenId); console.info('============= END : BurnNFT ==========='); } async TransferNFT(ctx, tokenId, to) { console.info('============= START : TransferNFT ==========='); await super.Transfer(ctx, tokenId, to); console.info('============= END : TransferNFT ==========='); } async GetNFT(ctx, tokenId) { console.info('============= START : GetNFT ==========='); let result = await super.Get(ctx, tokenId); console.info('============= END : GetNFT ==========='); return result; } async GetAllNFTs(ctx) { console.info('============= START : GetAllNFTs ==========='); let result = await super.GetAll(ctx); console.info('============= END : GetAllNFTs ==========='); return result; } async NFTExists(ctx, tokenId) { console.info('============= START : NFTExists ==========='); let result = await super.Exists(ctx, tokenId); console.info('============= END : NFTExists ==========='); return result; } } export {NFTMinter};
排查建议
链码依赖与入口检查
- 确保链码目录下已执行
npm install安装所有依赖,包括fabric-shim和自定义的TokenERC721Contract模块,打包时node_modules需包含在链码包内 - Node.js链码需要入口文件(如
index.js)启动链码,补充以下代码:const { Shim } = require('fabric-shim'); import { NFTMinter } from './nft-minter'; // 替换为实际文件名 Shim.start(new NFTMinter());
- 确保链码目录下已执行
部署脚本参数修正
- Org2的approve命令中存在拼写错误:
orderer.exmaple.com应改为**orderer.example.com** - Org2的approve命令参数顺序混乱,
--package-id参数后错误插入了-o,调整为正确顺序:peer lifecycle chaincode approveformyorg -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --tls --cafile $ORDERER_CA --channelID samplechannel --name suryacode --version 1.0 --init-required --package-id surya:95f3c2d3f1fbc5cb69e9b6d85e6807d7e8786da5ecc2be24d38759cbc08a3636 --sequence 1
- Org2的approve命令中存在拼写错误:
容器日志与权限排查
- 通过
docker ps -a找到链码容器ID,执行docker logs <容器ID>查看链码启动的具体错误信息 - 避免使用
sudo chmod -R 777 .赋予过宽权限,调整链码目录权限为合理范围,确保容器内进程可正常读取文件
- 通过
内容的提问来源于stack exchange,提问作者surya narayanan
相关产品推荐
相关产品推荐

