{"record":{"id":"26be2707cdfeeba3","repo":"hyperledger/fabric","slug":"node-with-id-of-d-doesn-t-exist","errorCode":null,"errorMessage":"node with id of %d doesn't exist","messagePattern":"node with id of (.+?) doesn't exist","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"orderer/consensus/smartbft/verifier.go","lineNumber":148,"sourceCode":"\tif block.Data == nil {\n\t\treturn []types.RequestInfo{}\n\t}\n\n\tvar res []types.RequestInfo\n\tfor _, txn := range block.Data.Data {\n\t\treq := v.ReqInspector.RequestID(txn)\n\t\tres = append(res, req)\n\t}\n\n\treturn res\n}\n\n// VerifySignature verifies signature\nfunc (v *Verifier) VerifySignature(signature types.Signature) error {\n\tid2Identity := v.RuntimeConfig.Load().(RuntimeConfig).ID2Identities\n\tidentity, exists := id2Identity[signature.ID]\n\tif !exists {\n\t\treturn errors.Errorf(\"node with id of %d doesn't exist\", signature.ID)\n\t}\n\n\treturn v.ConsenterVerifier.Evaluate([]*protoutil.SignedData{\n\t\t{Identity: identity, Data: signature.Msg, Signature: signature.Value},\n\t})\n}\n\n// VerifyRequest verifies raw request\nfunc (v *Verifier) VerifyRequest(rawRequest []byte) (types.RequestInfo, error) {\n\treturn v.verifyRequest(rawRequest, false)\n}\n\nfunc (v *Verifier) verifyRequest(rawRequest []byte, noConfigAllowed bool) (types.RequestInfo, error) {\n\treq, err := v.ReqInspector.unwrapReq(rawRequest)\n\tif err != nil {\n\t\treturn types.RequestInfo{}, err\n\t}\n","sourceCodeStart":130,"sourceCodeEnd":166,"githubUrl":"https://github.com/hyperledger/fabric/blob/2736b63f8fd5932511d56fe68b7039d15977f7f6/orderer/consensus/smartbft/verifier.go#L130-L166","documentation":"VerifySignature looks up the signer's identity in the runtime config's ID-to-identities map using signature.ID. If the ID is not present — i.e. the signer is not a known consenter of the channel in the current config — this error is returned before cryptographic evaluation.","triggerScenarios":"A signature received from a node whose ID is not in the channel's current consenter set (removed consenter still signing, message from a node of another channel, or IDs diverged after a config update).","commonSituations":"Consenter removed via config update but still broadcasting; miscomputed node IDs after adding a consenter; cross-channel message leakage in multi-channel deployments.","solutions":["Commit a config update that adds the missing node to the channel's consenters","Ensure every consenter's TLS certificates are correctly listed in the channel config so its ID maps to an identity","Confirm all nodes use the same config block generation; a stale node sees an outdated ID map","Check for duplicate/wrong TLS certs causing unstable ID derivation"],"exampleFix":null,"handlingStrategy":"validation","validationCode":"rc := v.RuntimeConfig.Load().(RuntimeConfig)\nif _, ok := rc.ID2Identities[signature.ID]; !ok {\n    return fmt.Errorf(\"unknown signer id %d\", signature.ID)\n}","typeGuard":"func knownNode(rc RuntimeConfig, id uint64) bool {\n    _, ok := rc.ID2Identities[id]\n    return ok\n}","tryCatchPattern":"if err := VerifySignature(sig); err != nil {\n    if strings.Contains(err.Error(), \"doesn't exist\") {\n        // refresh config / ignore message from removed consenter\n    }\n}","preventionTips":["Keep consenter sets consistent across the network via config updates","Ensure unique TLS certs per consenter so IDs are stable","Ignore/expect messages from recently removed consenters until they restart"],"tags":["hyperledger-fabric","smartbft","signature","consenter"],"backgroundTag":"unknown-node-id","analyzedSha":"2736b63f8fd5932511d56fe68b7039d15977f7f6","analyzedAt":"2026-09-04T08:52:36.465Z","contentChangedAt":"2026-09-04T08:52:36.465Z","schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}