{"record":{"id":"2bc3be9e2dd9f58d","repo":"hyperledger/fabric","slug":"channel-s-doesn-t-exist-2bc3be","errorCode":null,"errorMessage":"channel %s doesn't exist","messagePattern":"channel (.+?) doesn't exist","errorType":"error_code","errorClass":null,"httpStatus":null,"severity":"error","filePath":"orderer/common/cluster/comm.go","lineNumber":98,"sourceCode":"\t\treturn err\n\t}\n\treturn c.H.OnConsensus(reqCtx.channel, reqCtx.sender, request)\n}\n\n// requestContext identifies the sender and channel of the request and returns\n// it wrapped in a requestContext\nfunc (c *Comm) requestContext(ctx context.Context, msg proto.Message) (*requestContext, error) {\n\tchannel := c.ChanExt.TargetChannel(msg)\n\tif channel == \"\" {\n\t\treturn nil, errors.Errorf(\"badly formatted message, cannot extract channel\")\n\t}\n\n\tc.Lock.RLock()\n\tmapping, exists := c.Chan2Members[channel]\n\tc.Lock.RUnlock()\n\n\tif !exists {\n\t\treturn nil, errors.Errorf(\"channel %s doesn't exist\", channel)\n\t}\n\n\tcert := util.ExtractRawCertificateFromContext(ctx)\n\tif len(cert) == 0 {\n\t\treturn nil, errors.Errorf(\"no TLS certificate sent\")\n\t}\n\n\tstub := mapping.LookupByClientCert(cert)\n\tif stub == nil {\n\t\treturn nil, errors.Errorf(\"certificate extracted from TLS connection isn't authorized\")\n\t}\n\treturn &requestContext{\n\t\tchannel: channel,\n\t\tsender:  stub.ID,\n\t}, nil\n}\n\n// Remote obtains a RemoteContext linked to the destination node on the context","sourceCodeStart":80,"sourceCodeEnd":116,"githubUrl":"https://github.com/hyperledger/fabric/blob/2736b63f8fd5932511d56fe68b7039d15977f7f6/orderer/common/cluster/comm.go#L80-L116","documentation":"requestContext successfully extracted a channel name from the message, but c.Chan2Members contains no membership mapping for that channel. The orderer's cluster communication layer only knows about channels it is a member of; a message referencing an unknown channel cannot be attributed to a valid member set, so it is rejected.","triggerScenarios":"DispatchSubmit or DispatchConsensus delivers a message whose channel header names a channel this orderer has no mapping for — e.g. the channel was never joined, was removed, or the channel name is misspelled by the sender.","commonSituations":"An orderer added to a channel without the config update reaching it; sender and receiver disagree on channel name due to config drift; stale nodes sending traffic for deleted channels; genesis/system channel differences after upgrades.","solutions":["Verify this orderer actually belongs to the named channel (check channel participation / genesis block configuration)","Ensure the channel config update that added this orderer was committed and the orderer pulled it","Check the sender's channel name spelling and that it targets the correct channel","Restart the orderer after channel creation so Chan2Members is repopulated from the ledger"],"exampleFix":"// before (sender sends for a channel the orderer isn't part of)\nclusterClient.Step(ctx, makeEnvelope(\"channel-unknown\", msg))\n// after — verify channel membership first\nif ordererIsMemberOf(\"mychannel\") {\n    clusterClient.Step(ctx, makeEnvelope(\"mychannel\", msg))\n}","handlingStrategy":"validation","validationCode":"// Sender-side: only dispatch to channels the target orderer belongs to\nif _, err := os.Stat(channelLedgerPath(targetOrderer, channelName)); err != nil {\n    return fmt.Errorf(\"orderer %s is not a member of channel %s\", targetOrderer, channelName)\n}\n// Receiver-side guard: check channel participation before Step\ncurl -s http://orderer:8443/participation/v1/channels | jq '.channels[].name'","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Verify channel participation (osnadmin / participation API) after every channel change","Keep channel names consistent from config snapshot, never hardcode strings","Commit config updates that add an orderer before routing traffic to it","Monitor orderer logs for 'channel ... doesn't exist' as a config-drift signal"],"tags":["hyperledger-fabric","orderer","channel","membership"],"backgroundTag":"channel-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"}