Hyperledger fabric Hyperledger fabric未能提交事务:错误:没有可用于{“链码”:[{“名称”:“fabcar”}]}的背书计划

Hyperledger fabric Hyperledger fabric未能提交事务:错误:没有可用于{“链码”:[{“名称”:“fabcar”}]}的背书计划,hyperledger-fabric,hyperledger,Hyperledger Fabric,Hyperledger,我正在使用hyperledger结构网络,使用结构示例中的基本网络。基本网络由一个订购方和一个对等方组成。我已经在网络中安装了fab汽车链码并加入了渠道。请建议我如何在链码中添加背书策略,下面是我用来启动链码的命令 1. peer chaincode install -n fabcar -p github.com/ -v 1.1 2. peer chaincode instantiate -o orderer.example.com:7050 -C mychannel -c '{"Args

我正在使用hyperledger结构网络,使用结构示例中的基本网络。基本网络由一个订购方和一个对等方组成。我已经在网络中安装了fab汽车链码并加入了渠道。请建议我如何在链码中添加背书策略,下面是我用来启动链码的命令

 1. peer chaincode install -n fabcar -p github.com/ -v 1.1

 2. peer chaincode instantiate -o orderer.example.com:7050 -C mychannel -c '{"Args":[]}'  -n fabcar -v 1.1 -P "OR('Org1MSP.peer','Org1MSP.admin','Org1MSP.member')"
我正在使用fabric sdk查询fabcar,它运行良好。但如果我试图调用链码,它会给我错误声明

未能提交事务:错误:没有可用于{chaincodes:[{name:fabcar}]}的背书计划

配置发送

 Organizations:

# SampleOrg defines an MSP using the sampleconfig.  It should never be used
# in production but may be used as a template for other definitions
- &OrdererOrg
    # DefaultOrg defines the organization which is used in the sampleconfig
    # of the fabric.git development environment
    Name: OrdererOrg

    # ID to load the MSP definition as
    ID: OrdererMSP

    # MSPDir is the filesystem path which contains the MSP configuration
    MSPDir: crypto-config/ordererOrganizations/example.com/msp

- &Org1
    # DefaultOrg defines the organization which is used in the sampleconfig
    # of the fabric.git development environment
    Name: Org1MSP

    # ID to load the MSP definition as
    ID: Org1MSP

    MSPDir: crypto-config/peerOrganizations/org1.example.com/msp

    AnchorPeers:
        # AnchorPeers defines the location of peers which can be used
        # for cross org gossip communication.  Note, this value is only
        # encoded in the genesis block in the Application section context
        - Host: peer0.org1.example.com
          Port: 7051

     Application: &ApplicationDefaults

    # Organizations is the list of orgs which are defined as participants on
    # the application side of the network
    Organizations:

    Orderer: &OrdererDefaults

# Orderer Type: The orderer implementation to start
# Available types are "solo" and "kafka"
OrdererType: solo

Addresses:
    - orderer.example.com:7050

# Batch Timeout: The amount of time to wait before creating a batch
BatchTimeout: 2s

# Batch Size: Controls the number of messages batched into a block
BatchSize:

    # Max Message Count: The maximum number of messages to permit in a batch
    MaxMessageCount: 10

    # Absolute Max Bytes: The absolute maximum number of bytes allowed for
    # the serialized messages in a batch.
    AbsoluteMaxBytes: 99 MB

    # Preferred Max Bytes: The preferred maximum number of bytes allowed for
    # the serialized messages in a batch. A message larger than the preferred
    # max bytes will result in a batch larger than preferred max bytes.
    PreferredMaxBytes: 512 KB

Kafka:
    # Brokers: A list of Kafka brokers to which the orderer connects
    # NOTE: Use IP:port notation
    Brokers:
        - 127.0.0.1:9092

# Organizations is the list of orgs which are defined as participants on
# the orderer side of the network
Organizations:

Profiles:

OneOrgOrdererGenesis:
    Orderer:
        <<: *OrdererDefaults
        Organizations:
            - *OrdererOrg
    Consortiums:
        SampleConsortium:
            Organizations:
                - *Org1
OneOrgChannel:
    Consortium: SampleConsortium
    Application:
        <<: *ApplicationDefaults
        Organizations:
            - *Org1
调用函数

异步函数Invokeuserwallet、usename、channelName、chaincodeName{ 试一试{

    // Create a new file system based wallet for managing identities.
    const walletPath = path.join(process.cwd(), 'wallet');
    const wallet = new FileSystemWallet(walletPath);
    console.log(`Wallet path: ${walletPath}`);

    // Check to see if we've already enrolled the user.
    const userExists = await wallet.exists(userwallet);
    if (!userExists) {
        console.log('An identity for the user "user1" does not exist in the wallet');
        console.log('Run the registerUser.js application before retrying');
        return;
    }

    // Create a new gateway for connecting to our peer node.
    const gateway = new Gateway();
    await gateway.connect(ccp, { wallet, identity: usename, discovery: { enabled: true, asLocalhost: true} });

    // Get the network (channel) our contract is deployed to.
    const network = await gateway.getNetwork(channelName);

    // Get the contract from the network.
    const contract = network.getContract(chaincodeName);

    // Submit the specified transaction.
    // createCar transaction - requires 5 argument, ex: ('createCar', 'CAR12', 'Honda', 'Accord', 'Black', 'Tom')
    // changeCarOwner transaction - requires 2 args , ex: ('changeCarOwner', 'CAR10', 'Dave')
    await contract.submitTransaction('createCar','CAR12', 'Honda', 'Accord', 'Black', 'Tom');
    //await contract.submitTransaction('changeCarOwner', 'CAR10', 'Dave');
    console.log('Transaction has been submitted');


    // Disconnect from the gateway.
    await gateway.disconnect();

} catch (error) {
    console.error(`Failed to submit transaction: ${error}`);
    process.exit(1);
}
}

 module.exports.Invoke = Invoke

这很奇怪,让我们做一些尝试和错误

尝试在下面的代码段中进行更改。这将删除该策略。不要担心默认策略将适用

peer chaincode instantiate -o orderer.example.com:7050 -C mychannel -c '{"Args":[]}'  -n fabcar -v 1.1 

我使用上面的方法启动了订单tlcacerts和tls,它不起作用,但是如果不使用订单tlscacerts和tls,它会起作用。
peer chaincode instantiate -o orderer.example.com:7050 -C mychannel -c '{"Args":[]}'  -n fabcar -v 1.1