在尝试使用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)这会导致任何错误吗?
从背书节点返回的
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)会立即警告您存在类型不一致。