出现错误:验证提案时出错:访问被拒绝:通道 [mainchannel] 创建者组织未知,创建者在结构网关 Nodejs 中格式错误

问题描述 投票:0回答:1

在尝试使用nodejs中的fabric-gateway连接到对等点时,我收到以下错误:

/home/kshitij/Desktop/api/fabric-test-task/node_modules/@hyperledger/fabric-gateway/dist/client.js:36
        return new Promise((resolve, reject) => this.#client.makeUnaryRequest(exports.endorseMethod, serialize, deserializeEndorseResponse, request, buildOptions(this.#defaultOptions.endorseOptions, options), newUnaryCallback(resolve, reject, (err) => new endorseerror_1.EndorseError(Object.assign(err, { transactionId: request.getTransactionId() })))));                                                                                                                                                                                                                                                            ^

EndorseError: 10 ABORTED: failed to endorse transaction, see attached details for more info
    at /home/kshitij/Desktop/api/fabric-test-task/node_modules/@hyperledger/fabric-gateway/dist/client.js:36:253
    at Object.callback (/home/kshitij/Desktop/api/fabric-test-task/node_modules/@hyperledger/fabric-gateway/dist/client.js:101:20)
    at Object.onReceiveStatus (/home/kshitij/Desktop/api/fabric-test-task/node_modules/@grpc/grpc-js/build/src/client.js:192:36)
    at Object.onReceiveStatus (/home/kshitij/Desktop/api/fabric-test-task/node_modules/@grpc/grpc-js/build/src/client-interceptors.js:360:141)
    ... 2 lines matching cause stack trace ...
    at process.processTicksAndRejections (node:internal/process/task_queues:77:11) {

  code: 10,
  details: [
    {
      address: 'FD100.forensic.evidence-vault.com:9051',
      message: 'error validating proposal: access denied: channel [mainchannel] creator org unknown, creator is malformed',
      mspId: 'ForensicMSP'
    },
    {
      address: 'FD101.forensic.evidence-vault.com:10051',
      message: 'rpc error: code = Unknown desc = error validating proposal: access denied: channel [mainchannel] creator org unknown, creator is malformed',
      mspId: 'ForensicMSP'
    }
  ],
  cause: Error: 10 ABORTED: failed to endorse transaction, see attached details for more info
      at callErrorFromStatus (/home/kshitij/Desktop/api/fabric-test-task/node_modules/@grpc/grpc-js/build/src/call.js:31:19)
      at Object.onReceiveStatus (/home/kshitij/Desktop/api/fabric-test-task/node_modules/@grpc/grpc-js/build/src/client.js:192:76)
      at Object.onReceiveStatus (/home/kshitij/Desktop/api/fabric-test-task/node_modules/@grpc/grpc-js/build/src/client-interceptors.js:360:141)
      at Object.onReceiveStatus (/home/kshitij/Desktop/api/fabric-test-task/node_modules/@grpc/grpc-js/build/src/client-interceptors.js:323:181)
      at /home/kshitij/Desktop/api/fabric-test-task/node_modules/@grpc/grpc-js/build/src/resolving-call.js:99:78
      at process.processTicksAndRejections (node:internal/process/task_queues:77:11)
  for call at
      at Client.makeUnaryRequest (/home/kshitij/Desktop/api/fabric-test-task/node_modules/@grpc/grpc-js/build/src/client.js:160:32)
      at /home/kshitij/Desktop/api/fabric-test-task/node_modules/@hyperledger/fabric-gateway/dist/client.js:36:62
      at new Promise (<anonymous>)
      at GatewayClientImpl.endorse (/home/kshitij/Desktop/api/fabric-test-task/node_modules/@hyperledger/fabric-gateway/dist/client.js:36:16)
      at ProposalImpl.endorse (/home/kshitij/Desktop/api/fabric-test-task/node_modules/@hyperledger/fabric-gateway/dist/proposal.js:43:52)
      at async ContractImpl.submitAsync (/home/kshitij/Desktop/api/fabric-test-task/node_modules/@hyperledger/fabric-gateway/dist/contract.js:48:29)
      at async ContractImpl.submit (/home/kshitij/Desktop/api/fabric-test-task/node_modules/@hyperledger/fabric-gateway/dist/contract.js:40:27)
      at async getContractObject (/home/kshitij/Desktop/api/fabric-test-task/server.js:126:18)
      at async main (/home/kshitij/Desktop/api/fabric-test-task/server.js:173:32) {
    code: 10,
    details: 'failed to endorse transaction, see attached details for more info',
    metadata: Metadata {
      internalRepr: Map(2) {
        'content-type' => [ 'application/grpc' ],
        'grpc-status-details-bin' => [
          Buffer(518) [Uint8Array] [
              8,  10,  18,  65, 102,  97, 105, 108, 101, 100,  32, 116,
            111,  32, 101, 110, 100, 111, 114, 115, 101,  32, 116, 114,
             97, 110, 115,  97,  99, 116, 105, 111, 110,  44,  32, 115,
            101, 101,  32,  97, 116, 116,  97,  99, 104, 101, 100,  32,
            100, 101, 116,  97, 105, 108, 115,  32, 102, 111, 114,  32,
            109, 111, 114, 101,  32, 105, 110, 102, 111,  26, 204,   1,
             10,  39, 116, 121, 112, 101,  46, 103, 111, 111, 103, 108,
            101,  97, 112, 105, 115,  46,  99, 111, 109,  47, 103,  97,
            116, 101, 119,  97,
            ... 418 more items
          ]
        ]
      },
      options: {}
    }
  },
  transactionId: 'df30b912f06dca992ed57ec347b100cf7d5ba178138e48315a0b0de3249a26cc'
}

同行日志:

2024-04-27 10:38:22.424 UTC 0040 INFO [gateway] lookupEndorser -> Attempting to connect to endorser endpoint=FD101.forensic.evidence-vault.com:10051

2024-04-27 10:38:22.425 UTC 0041 INFO [gateway] connectChannelPeers -> Added peer to registry: PD101.police.evidence-vault.com:8051

2024-04-27 10:38:22.427 UTC 0042 INFO [gateway] connectChannelPeers -> Added peer to registry: PD100.police.evidence-vault.com:7051

2024-04-27 10:38:22.428 UTC 0043 INFO [gateway] connectChannelPeers -> Added peer to registry: FD101.forensic.evidence-vault.com:10051

2024-04-27 10:38:22.430 UTC 0044 WARN [endorser] Validate -> access denied channel=mainchannel txID=3e73b35f error="could not decode the PEM structure" errorVerbose="could not decode the PEM structure\ngithub.com/hyperledger/fabric/msp.(*bccspmsp).deserializeIdentityInternal\n\t/msp/mspimpl.go:402\ngithub.com/hyperledger/fabric/msp.(*bccspmsp).DeserializeIdentity\n\t/msp/mspimpl.go:394\ngithub.com/hyperledger/fabric/msp/cache.(*cachedMSP).DeserializeIdentity\n\t/msp/cache/cache.go:74\ngithub.com/hyperledger/fabric/msp.(*mspManagerImpl).DeserializeIdentity\n\t/msp/mspmgrimpl.go:98\ngithub.com/hyperledger/fabric/core/endorser.(*UnpackedProposal).Validate\n\t/core/endorser/msgvalidation.go:170\ngithub.com/hyperledger/fabric/core/endorser.(*Endorser).preProcess\n\t/core/endorser/endorser.go:258\ngithub.com/hyperledger/fabric/core/endorser.(*Endorser).ProcessProposal\n\t/core/endorser/endorser.go:335\ngithub.com/hyperledger/fabric/internal/pkg/gateway.(*EndorserServerAdapter).ProcessProposal\n\t/internal/pkg/gateway/gateway.go:41\ngithub.com/hyperledger/fabric/internal/pkg/gateway.(*Server).planFromFirstEndorser.func1\n\t/internal/pkg/gateway/endorse.go:205\nruntime.goexit\n\t/usr/local/go/src/runtime/asm_amd64.s:1650" identity="serialized-identity=0a0b466f72656e7369634d535012a105fbefbef8110620d08445320520201313efbefbe308202773082021ea003020102021407cf6eb652fa849fb8e45fce3a79b147e2eee7ce300a06082a8648ce3d0403023068310b3009060355040613025553311730150603550408130e4e6f727468204361726f6c696e6131143012060355040a130b48797065726c6564676572310f300d060355040b130646616272696331193017060355040313106661627269632d63612d736572766572301e170d3234303432363133323630305a170d3235303432363138353230305a30423130300b060355040b13046f726732300d060355040b1306636c69656e743012060355040b130b6465706172746d656e7431310e300c0603550403130546443130303059301306072a8648ce3d020106082a8648ce3d03010703420004c06f3066e6c00f0938777132c5c6863ed0db825665bc0082519de0d50a2ced5e3238705475bc73f00ba29caead5d03848898951ef64826974c7cf4d6301dd857a381cb3081c8300e0603551d0f0101ff040403020780300c0603551d130101ff04023000301d0603551d0e041604141df3a9f63f9a664e8e18892961300fc1e0899972301f0603551d230418301680143fcec2ba314a1111c5ad11785bb78b2c6913578c306806082a03040506070801045c7b226174747273223a7b2268662e416666696c696174696f6e223a226f7267322e6465706172746d656e7431222c2268662e456e726f6c6c6d656e744944223a224644313030222c2268662e54797065223a22636c69656e74227d7d300a06082a8648ce3d040302034700304402200de0848c68f4a344e29fa970aa4f989945bb4a524181204127571d322a8a60c402202c48117111d3b75434f0e806ddc45c5ee1513808364dcb6ae266282db72b005340fbefbef8434308445320520201313efbefb"

2024-04-27 10:38:22.431 UTC 0045 WARN [endorser] ProcessProposal -> Failed to preProcess proposal error="error validating proposal: access denied: channel [mainchannel] creator org unknown, creator is malformed"

2024-04-27 10:38:22.431 UTC 0046 WARN [gateway] func1 -> Endorse call to endorser failed channel=mainchannel chaincode=evidenceVault txID=3e73b35f027985f551b761bb6a3d1e24760f3c262c8bc01906efa6eb36e46835 endorserAddress=FD100.forensic.evidence-vault.com:9051 endorserMspid=ForensicMSP error="error validating proposal: access denied: channel [mainchannel] creator org unknown, creator is malformed"

2024-04-27 10:38:22.433 UTC 0047 WARN [gateway] func1 -> Endorse call to endorser failed channel=mainchannel chaincode=evidenceVault txID=3e73b35f027985f551b761bb6a3d1e24760f3c262c8bc01906efa6eb36e46835 endorserAddress=FD101.forensic.evidence-vault.com:10051 endorserMspid=ForensicMSP error="rpc error: code = Unknown desc = error validating proposal: access denied: channel [mainchannel] creator org unknown, creator is malformed"

2024-04-27 10:38:22.433 UTC 0048 INFO [gateway] func1 -> Closing connection to remote endorser address=FD101.forensic.evidence-vault.com:10051 mspid=ForensicMSP

2024-04-27 10:38:22.434 UTC 0049 INFO [comm.grpc.server] 1 -> unary call completed grpc.service=gateway.Gateway grpc.method=Endorse grpc.peer_address=172.22.0.1:41668 error="rpc error: code = Aborted desc = failed to endorse transaction, see attached details for more info" grpc.code=Aborted grpc.call_duration=9.994141ms

其代码如下:

const getContractObject = async (wallet, ccp, userName, org, contractName) => {
    let identity = await wallet.get(userName);
    client = await getClient(ccp, userName, org);
    const gateway = connect({
        client,
        identity: await getIdentity(identity),
        signer: getSigner(identity)
    });

    const network = await gateway.getNetwork(process.env.CHANNEL);
    // console.log(network)
    let contract = await network.getContract(contractName);
    // console.log(contract)
    // console.log(contract.getContractName())
    let result = await contract.submitTransaction('CreateEvidence', "xyxyx", userName, "100", "Hacking", "xss.png", "png", "zzzzz");
    console.log(result)
    // return result
}

const getSigner = (identity) => {
    const privateKeyPem = identity.credentials.privateKey;
    const privateKey = crypto.createPrivateKey(privateKeyPem);
    return signers.newPrivateKeySigner(privateKey);
};

const getIdentity = async (identity) => {
    return { mspId: identity.mspId, credentials: identity.credentials.certificate };
};

const getClient = async (ccp, userName, org) => {

    console.log(ccp.peers[`${userName}.${org}.evidence-vault.com`].url)
    const tlsCredentials = grpc.credentials.createSsl(fs.readFileSync(ccp.peers[`${userName}.${org}.evidence-vault.com`].tlsCACerts.pem));

    return new grpc.Client(ccp.peers[`${userName}.${org}.evidence-vault.com`].url, tlsCredentials, {
        'grpc.ssl_target_name_override': ccp.peers[`${userName}.${org}.evidence-vault.com`].grpcOptions.ssl_target_name_override,
    });
};

钱包中存储的用户身份:

{"credentials":{"certificate":"-----BEGIN CERTIFICATE-----\nMIICdzCCAh6gAwIBAgIUB89utlL6hJ+45F/OOnmxR+Lu584wCgYIKoZIzj0EAwIw\naDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK\nEwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt\nY2Etc2VydmVyMB4XDTI0MDQyNjEzMjYwMFoXDTI1MDQyNjE4NTIwMFowQjEwMAsG\nA1UECxMEb3JnMjANBgNVBAsTBmNsaWVudDASBgNVBAsTC2RlcGFydG1lbnQxMQ4w\nDAYDVQQDEwVGRDEwMDBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABMBvMGbmwA8J\nOHdxMsXGhj7Q24JWZbwAglGd4NUKLO1eMjhwVHW8c/ALopyurV0DhIiYlR72SCaX\nTHz01jAd2FejgcswgcgwDgYDVR0PAQH/BAQDAgeAMAwGA1UdEwEB/wQCMAAwHQYD\nVR0OBBYEFB3zqfY/mmZOjhiJKWEwD8HgiZlyMB8GA1UdIwQYMBaAFD/OwroxShER\nxa0ReFu3iyxpE1eMMGgGCCoDBAUGBwgBBFx7ImF0dHJzIjp7ImhmLkFmZmlsaWF0\naW9uIjoib3JnMi5kZXBhcnRtZW50MSIsImhmLkVucm9sbG1lbnRJRCI6IkZEMTAw\nIiwiaGYuVHlwZSI6ImNsaWVudCJ9fTAKBggqhkjOPQQDAgNHADBEAiAN4ISMaPSj\nROKfqXCqT5iZRbtKUkGBIEEnVx0yKopgxAIgLEgRcRHTt1Q08OgG3cRcXuFROAg2\nTctq4mYoLbcrAFM=\n-----END CERTIFICATE-----\n","privateKey":"-----BEGIN PRIVATE KEY-----\r\nMIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgdFY+siLEuWmEjcq0\r\nn8DgkQG1PBz4YcjzhqeFENBHox2hRANCAATAbzBm5sAPCTh3cTLFxoY+0NuCVmW8\r\nAIJRneDVCiztXjI4cFR1vHPwC6Kcrq1dA4SImJUe9kgml0x89NYwHdhX\r\n-----END PRIVATE KEY-----\r\n"},"mspId":"ForensicMSP","type":"X.509","version":1}

我检查了 configtx 中的组织 MSP ID,它与我在这里使用的相同。

configtx.yaml:

Organizations:
  - &OrdererOrg
      Name: OrdererOrg
      ID: OrdererMSP
      MSPDir: crypto-config/ordererOrganizations/evidence-vault.com/msp
      Policies:
          Readers:
              Type: Signature
              Rule: "OR('OrdererMSP.member')"
          Writers:
              Type: Signature
              Rule: "OR('OrdererMSP.member')"
          Admins:
              Type: Signature
              Rule: "OR('OrdererMSP.admin')"

  - &Police
      Name: PoliceMSP
      ID: PoliceMSP
      MSPDir: crypto-config/peerOrganizations/police.evidence-vault.com/msp
      Policies:
          Readers:
              Type: Signature
              Rule: "OR('PoliceMSP.admin', 'PoliceMSP.peer', 'PoliceMSP.client')"
          Writers:
              Type: Signature
              Rule: "OR('PoliceMSP.admin', 'PoliceMSP.client')"
          Admins:
              Type: Signature
              Rule: "OR('PoliceMSP.admin')"
          Endorsement:
              Type: Signature
              Rule: "OR('PoliceMSP.peer')"

      AnchorPeers:
          - Host: PD100.police.evidence-vault.com
            Port: 7051

  - &Forensic
      Name: ForensicMSP
      ID: ForensicMSP
      MSPDir: crypto-config/peerOrganizations/forensic.evidence-vault.com/msp
      Policies:
          Readers:
              Type: Signature
              Rule: "OR('ForensicMSP.admin', 'ForensicMSP.peer', 'ForensicMSP.client')"
          Writers:
              Type: Signature
              Rule: "OR('ForensicMSP.admin', 'ForensicMSP.client')"
          Admins:
              Type: Signature
              Rule: "OR('ForensicMSP.admin')"
          Endorsement:
              Type: Signature
              Rule: "OR('ForensicMSP.peer')"
      AnchorPeers:
          - Host: FD100.forensic.evidence-vault.com
            Port: 9051

Capabilities:
    # Channel capabilities apply to both the orderers and the peers and must be
    # supported by both.
    # Set the value of the capability to true to require it.
    Channel: &ChannelCapabilities
        # V2_0 capability ensures that orderers and peers behave according
        # to v2.0 channel capabilities. Orderers and peers from
        # prior releases would behave in an incompatible way, and are therefore
        # not able to participate in channels at v2.0 capability.
        # Prior to enabling V2.0 channel capabilities, ensure that all
        # orderers and peers on a channel are at v2.0.0 or later.
        V2_0: true
        

    # Orderer capabilities apply only to the orderers, and may be safely
    # used with prior release peers.
    # Set the value of the capability to true to require it.
    Orderer: &OrdererCapabilities
        # V2_0 orderer capability ensures that orderers behave according
        # to v2.0 orderer capabilities. Orderers from
        # prior releases would behave in an incompatible way, and are therefore
        # not able to participate in channels at v2.0 orderer capability.
        # Prior to enabling V2.0 orderer capabilities, ensure that all
        # orderers on channel are at v2.0.0 or later.
        V2_0: true

    # Application capabilities apply only to the peer network, and may be safely
    # used with prior release orderers.
    # Set the value of the capability to true to require it.
    Application: &ApplicationCapabilities
        # V2.5 for Application enables the new non-backwards compatible
        # features of fabric v2.5, namely the ability to purge private data.
        # Prior to enabling V2.5 application capabilities, ensure that all
        # peers on a channel are at v2.5.0 or later.
        V2_5: true

Application: &ApplicationDefaults
    ACLs: &ACLsDefault
        # This section provides defaults for policies for various resources
        # in the system. These "resources" could be functions on system chaincodes
        # (e.g., "GetBlockByNumber" on the "qscc" system chaincode) or other resources
        # (e.g.,who can receive Block events). This section does NOT specify the resource's
        # definition or API, but just the ACL policy for it.
        #
        # User's can override these defaults with their own policy mapping by defining the
        # mapping under ACLs in their channel definition

        #---New Lifecycle System Chaincode (_lifecycle) function to policy mapping for access control--#

        # ACL policy for _lifecycle's "CommitChaincodeDefinition" function
        _lifecycle/CommitChaincodeDefinition: /Channel/Application/Writers

        # ACL policy for _lifecycle's "QueryChaincodeDefinition" function
        _lifecycle/QueryChaincodeDefinition: /Channel/Application/Readers

        # ACL policy for _lifecycle's "QueryNamespaceDefinitions" function
        _lifecycle/QueryNamespaceDefinitions: /Channel/Application/Readers

        #---Lifecycle System Chaincode (lscc) function to policy mapping for access control---#

        # ACL policy for lscc's "getid" function
        lscc/ChaincodeExists: /Channel/Application/Readers

        # ACL policy for lscc's "getdepspec" function
        lscc/GetDeploymentSpec: /Channel/Application/Readers

        # ACL policy for lscc's "getccdata" function
        lscc/GetChaincodeData: /Channel/Application/Readers

        # ACL Policy for lscc's "getchaincodes" function
        lscc/GetInstantiatedChaincodes: /Channel/Application/Readers

        #---Query System Chaincode (qscc) function to policy mapping for access control---#

        # ACL policy for qscc's "GetChainInfo" function
        qscc/GetChainInfo: /Channel/Application/Readers

        # ACL policy for qscc's "GetBlockByNumber" function
        qscc/GetBlockByNumber: /Channel/Application/Readers

        # ACL policy for qscc's  "GetBlockByHash" function
        qscc/GetBlockByHash: /Channel/Application/Readers

        # ACL policy for qscc's "GetTransactionByID" function
        qscc/GetTransactionByID: /Channel/Application/Readers
        # qscc/GetTransactionByID: /Channel/Application/CustomPolicy

        # ACL policy for qscc's "GetBlockByTxID" function
        qscc/GetBlockByTxID: /Channel/Application/Readers

        #---Configuration System Chaincode (cscc) function to policy mapping for access control---#

        # ACL policy for cscc's "GetConfigBlock" function
        cscc/GetConfigBlock: /Channel/Application/Readers

        # ACL policy for cscc's "GetConfigTree" function
        cscc/GetConfigTree: /Channel/Application/Readers

        # ACL policy for cscc's "SimulateConfigTreeUpdate" function
        cscc/SimulateConfigTreeUpdate: /Channel/Application/Readers

        #---Miscellanesous peer function to policy mapping for access control---#

        # ACL policy for invoking chaincodes on peer
        peer/Propose: /Channel/Application/Writers
        # peer/Propose: /Channel/Application/Restrict

        # ACL policy for chaincode to chaincode invocation
        peer/ChaincodeToChaincode: /Channel/Application/Readers

        #---Events resource to policy mapping for access control###---#

        # ACL policy for sending block events
        event/Block: /Channel/Application/Readers

        # ACL policy for sending filtered block events
        event/FilteredBlock: /Channel/Application/Readers


    Organizations:
    Policies:
        Readers:
            Type: ImplicitMeta
            Rule: "ANY Readers"
        Writers:
            Type: ImplicitMeta
            Rule: "ANY Writers"
        Admins:
            Type: ImplicitMeta
            Rule: "MAJORITY Admins"
        LifecycleEndorsement:
            Type: ImplicitMeta
            Rule: "MAJORITY Endorsement"
        Endorsement:
            Type: ImplicitMeta
            Rule: "MAJORITY Endorsement"

    Capabilities:
        <<: *ApplicationCapabilities

Orderer: &OrdererDefaults

    OrdererType: etcdraft

    EtcdRaft:
        Consenters:
        - Host: orderer.evidence-vault.com
          Port: 7050
          ClientTLSCert: crypto-config/ordererOrganizations/evidence-vault.com/orderers/orderer.evidence-vault.com.com/tls/server.crt
          ServerTLSCert: crypto-config/ordererOrganizations/evidence-vault.com/orderers/orderer.evidence-vault.com.com/tls/server.crt

    Addresses:
        - orderer.evidence-vault:7050

    BatchTimeout: 2s

    BatchSize:
        MaxMessageCount: 10
        AbsoluteMaxBytes: 99 MB
        PreferredMaxBytes: 512 KB

    Organizations:

    Policies:
        Readers:
            Type: ImplicitMeta
            Rule: "ANY Readers"
        Writers:
            Type: ImplicitMeta
            Rule: "ANY Writers"
        Admins:
            Type: ImplicitMeta
            Rule: "MAJORITY Admins"
        BlockValidation:
            Type: ImplicitMeta
            Rule: "ANY Writers"

Channel: &ChannelDefaults
    Policies:
        Readers:
            Type: ImplicitMeta
            Rule: "ANY Readers"
        Writers:
            Type: ImplicitMeta
            Rule: "ANY Writers"
        Admins:
            Type: ImplicitMeta
            Rule: "MAJORITY Admins"

    Capabilities:
        <<: *ChannelCapabilities


Profiles:
    EvidenceVaultOrdererGenesis:
        <<: *ChannelDefaults
        Orderer:
            <<: *OrdererDefaults
            OrdererType: etcdraft
            EtcdRaft:
                Consenters:
                - Host: orderer.evidence-vault.com
                  Port: 7050
                  ClientTLSCert: crypto-config/ordererOrganizations/evidence-vault.com/orderers/orderer.evidence-vault.com/tls/server.crt
                  ServerTLSCert: crypto-config/ordererOrganizations/evidence-vault.com/orderers/orderer.evidence-vault.com/tls/server.crt
            Addresses:
                - orderer.evidence-vault.com:7050
            Organizations:
                - *OrdererOrg
            Capabilities: *OrdererCapabilities
        Application:
            <<: *ApplicationDefaults
            Organizations:
                - *Police
                - *Forensic
            Capabilities: *ApplicationCapabilities

Docker 为对等方编写代码:

services:
  FD100.forensic.evidence-vault.com:
container_name: FD100.forensic.evidence-vault.com
image: hyperledger/fabric-peer:2.5.6
labels:
  service: hyperledger-fabric
environment:
  - CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock
  - FABRIC_LOGGING_SPEC=info
  - ORDERER_GENERAL_LOGLEVEL=info
  - CORE_PEER_LOCALMSPID=ForensicMSP
  - CORE_VM_DOCKER_HOSTCONFIG_NETWORKMODE=docker_evidence

  - CORE_PEER_ID=FD100.forensic.evidence-vault.com
  - CORE_PEER_ADDRESS=FD100.forensic.evidence-vault.com:9051
  - CORE_PEER_LISTENADDRESS=0.0.0.0:9051
  - CORE_PEER_CHAINCODEADDRESS=FD100.forensic.evidence-vault.com:9052
  - CORE_PEER_CHAINCODELISTENADDRESS=0.0.0.0:9052
  # Peer used to bootstrap gossip within organisation

  - CORE_PEER_GOSSIP_BOOTSTRAP=FD101.forensic.evidence-vault.com:10051

  # Exposed for discovery Service
  - CORE_PEER_GOSSIP_EXTERNALENDPOINT=FD100.forensic.evidence-vault.com:9051

  # - CORE_OPERATIONS_LISTENADDRESS=0.0.0.0:9440

  - CORE_LEDGER_STATE_STATEDATABASE=CouchDB
  - CORE_LEDGER_STATE_COUCHDBCONFIG_COUCHDBADDRESS=couchdbFD100:5984
  - CORE_LEDGER_STATE_COUCHDBCONFIG_USERNAME=fd100
  - CORE_LEDGER_STATE_COUCHDBCONFIG_PASSWORD=fd100

  - CORE_PEER_TLS_ENABLED=true
  - CORE_PEER_TLS_CERT_FILE=/etc/hyperledger/peer/forensic.evidence-vault.com/peers/FD100.forensic.evidence-vault.com/tls/server.crt
  - CORE_PEER_TLS_KEY_FILE=/etc/hyperledger/peer/forensic.evidence-vault.com/peers/FD100.forensic.evidence-vault.com/tls/server.key
  - CORE_PEER_TLS_ROOTCERT_FILE=/etc/hyperledger/peer/forensic.evidence-vault.com/peers/FD100.forensic.evidence-vault.com/tls/ca.crt
  - CORE_PEER_MSPCONFIGPATH=/etc/hyperledger/peer/forensic.evidence-vault.com/peers/FD100.forensic.evidence-vault.com/msp
# depends_on:
#   - couchdbFD100
ports:
  - 9051:9051
volumes:
  - ../artifacts/crypto-config/peerOrganizations:/etc/hyperledger/peer
  - /var/run/:/host/var/run/
  - /var/evidence-vault/peer/FD100:/var/hyperledger/production
networks:
  - evidence

以下是通用连接配置文件 json:

{
    "name": "EvidenceVault-Forensic",
    "version": "1.0.0",
    "client": {
        "organization": "Forensic",
        "connection": {
            "timeout": {
                "peer": {
                    "endorser": "300"
                }
            }
        }
    },
    "organizations": {
        "Police": {
            "mspid": "ForensicMSP",
            "peers": [
                "FD100.forensic.evidence-vault.com",
                "FD101.forensic.evidence-vault.com"
            ],
            "certificateAuthorities": [
                "ca.forensic.evidence-vault.com"
            ]
        }
    },
    "peers": {
        "FD100.forensic.evidence-vault.com": {
            "url": "localhost:9051",
            "tlsCACerts": {
                "pem": "/home/kshitij/Desktop/EvidenceVault/artifacts/crypto-config/peerOrganizations/forensic.evidence-vault.com/peers/FD100.forensic.evidence-vault.com/msp/tlscacerts/tlsca.forensic.evidence-vault.com-cert.pem"
            },
            "grpcOptions": {
                "ssl-target-name-override": "FD100.forensic.evidence-vault.com",
                "hostnameOverride": "FD100.forensic.evidence-vault.com"
            }
        },
        "FD101.forensic.evidence-vault.com": {
            "url": "localhost:10051",
            "tlsCACerts": {
                "pem": "/home/kshitij/Desktop/EvidenceVault/artifacts/crypto-config/peerOrganizations/forensic.evidence-vault.com/peers/FD100.forensic.evidence-vault.com/msp/tlscacerts/tlsca.forensic.evidence-vault.com-cert.pem"
            },
            "grpcOptions": {
                "ssl-target-name-override": "FD101.forensic.evidence-vault.com",
                "hostnameOverride": "FD101.forensic.evidence-vault.com"
            }
        }
    },
    "certificateAuthorities": {
        "ca.forensic.evidence-vault.com": {
            "url": "https://localhost:8054",
            "caName": "ca.forensic.evidence-vault.com",
            "tlsCACerts": {
                "pem": "/home/kshitij/Desktop/EvidenceVault/artifacts/crypto-config/peerOrganizations/forensic.evidence-vault.com/ca/ca.forensic.evidence-vault.com-cert.pem"
            },
            "httpOptions": {
                "verify": false
            }
        }
    }
}

组织名称是否不匹配,或者我是否通过通用连接配置文件传递了任何错误的凭据?

我认为可能的一个错误是,我没有将它们更改为从属关系 匹配我的组织名称(警察和法医),它们是默认名称(Org1 和 Org2)这会导致任何错误吗?

node.js hyperledger-fabric hyperledger hyperledger-fabric-sdk-js
1个回答
0
投票

从背书节点返回的

access denied: channel [mainchannel] creator org unknown, creator is malformed
错误消息表明交易提案中提供的客户身份信息无效。两个背书节点的日志应该包含有关问题所在的更多详细信息。

我确实注意到您在应用程序代码中创建客户端身份信息的方式存在潜在错误。你有:

const getIdentity = async (identity) => {
    return { mspId: identity.mspId, credentials: identity.credentials.certificate };
};

这里传入一个 X509Identity (来自 fabric-network 包),并返回一个 Identity (来自 @hyperledger/fabric-gateway 包)。请注意,在链接的 API 文档中,X509Identity

credentials.certificate
属性的类型为
string
,并且您将其分配给 Identity
credentials
属性,该属性的类型应为
Uint8Array
。我怀疑这会导致客户端凭据错误(或丢失)。

您可以将字符串转换为 Uint8Array,如下所示:

const utf8Encoder = new TextEncoder();

const getIdentity = async (identity) => {
    const credentials = utf8Encoder.encode(identity.credentials.certificate);
    return { mspId: identity.mspId, credentials };
};

fabric-network@hyperledger/fabric-gateway 包都包含完整的 TypeScript 类型定义。利用这些类型(也许您自己使用 TypeScript)可以避免这些问题,因为 TypeScript 编译器(可能还有您的 IDE)会立即警告您存在类型不一致。

© www.soinside.com 2019 - 2024. All rights reserved.