{"record":{"id":"31a5ba0b126f1f26","repo":"hyperledger/fabric","slug":"pkiid-wasn-t-found","errorCode":null,"errorMessage":"PKIID wasn't found","messagePattern":"PKIID wasn't found","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"gossip/identity/identity.go","lineNumber":156,"sourceCode":"\t\t// Identity would be wiped out a millisecond after its expiration date\n\t\ttimeToLive := time.Until(expirationDate.Add(time.Millisecond))\n\t\texpirationTimer = time.AfterFunc(timeToLive, func() {\n\t\t\tis.delete(pkiID, identity)\n\t\t})\n\t}\n\n\tis.pkiID2Cert[string(id)] = newStoredIdentity(pkiID, identity, expirationTimer, is.sa.OrgByPeerIdentity(identity))\n\treturn nil\n}\n\n// get returns the identity of a given pkiID, or error if such an identity\n// isn't found\nfunc (is *identityMapperImpl) Get(pkiID common.PKIidType) (api.PeerIdentityType, error) {\n\tis.RLock()\n\tdefer is.RUnlock()\n\tstoredIdentity, exists := is.pkiID2Cert[string(pkiID)]\n\tif !exists {\n\t\treturn nil, errors.New(\"PKIID wasn't found\")\n\t}\n\treturn storedIdentity.fetchIdentity(), nil\n}\n\n// Sign signs a message, returns a signed message on success\n// or an error on failure\nfunc (is *identityMapperImpl) Sign(msg []byte) ([]byte, error) {\n\treturn is.mcs.Sign(msg)\n}\n\nfunc (is *identityMapperImpl) Stop() {\n\tis.once.Do(func() {\n\t\tclose(is.stopChan)\n\t})\n}\n\n// Verify verifies a signed message\nfunc (is *identityMapperImpl) Verify(vkID, signature, message []byte) error {","sourceCodeStart":138,"sourceCodeEnd":174,"githubUrl":"https://github.com/hyperledger/fabric/blob/2736b63f8fd5932511d56fe68b7039d15977f7f6/gossip/identity/identity.go#L138-L174","documentation":"identityMapperImpl.Get looks up a peer identity by PKI-ID in pkiID2Cert and returns this error when no identity has been stored under that key. It is thrown by Get (called from Verify), meaning the code attempted to verify a message signed by a peer whose identity was never registered (or was already evicted by the expiration timer).","triggerScenarios":"Calling Verify (or Get) with a pkiID that was never passed to Put, or whose identity expired and was deleted by the time.AfterFunc expiration timer, or after a purge.","commonSituations":"Gossip message arrives from an unknown/removed peer; identity expiry timer deleted the entry before verification; channel membership changed; persisted identity store was cleared; peer joined before identity dissemination completed.","solutions":["Ensure the peer's identity is registered via Put before verifying messages from it","Wait for / trigger gossip identity pull so the unknown peer's cert is disseminated","Check expiration timers — if entries vanish too early, review expirationDate values and clock sync","Filter or re-fetch messages from peers that are not in the mapper instead of verifying blindly"],"exampleFix":"// before\nif err := mapper.Verify(pkiID, sig, msg); err != nil { return err }\n// after\nif _, err := mapper.Get(pkiID); err != nil {\n    // identity unknown: pull identity first or ignore message\n    return nil // or trigger identity pull\n}\nreturn mapper.Verify(pkiID, sig, msg)","handlingStrategy":"try-catch","validationCode":"if _, err := mapper.Get(pkiID); err != nil {\n    // identity unknown — pull disseminated identity before verifying\n}","typeGuard":null,"tryCatchPattern":"_, err := mapper.Get(pkiID)\nif err != nil && err.Error() == \"PKIID wasn't found\" {\n    // request identity via gossip identity pull, or skip message\n    return ErrUnknownPeer\n}\nif err := mapper.Verify(pkiID, signature, msg); err != nil {\n    return err\n}\nreturn nil","preventionTips":["Ensure gossip identity dissemination completes before processing peer messages","Monitor for entries disappearing early — review expirationDate values and timers","Persist/restore identity mapper contents across peer restarts","Ignore (don't fail hard on) messages from unregistered peers"],"tags":["gossip","identity","lookup-miss"],"backgroundTag":"peer-identity-not-found","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"}