You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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};

排查建议

  1. 链码依赖与入口检查

    • 确保链码目录下已执行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());
      
  2. 部署脚本参数修正

    • 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
      
  3. 容器日志与权限排查

    • 通过docker ps -a找到链码容器ID,执行docker logs <容器ID>查看链码启动的具体错误信息
    • 避免使用sudo chmod -R 777 .赋予过宽权限,调整链码目录权限为合理范围,确保容器内进程可正常读取文件

内容的提问来源于stack exchange,提问作者surya narayanan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 10:30:55