{"record":{"id":"7787ffa2a8a8bdcd","repo":"hyperledger/fabric","slug":"some-orderer-organizations-endpoints-are-empty-s","errorCode":null,"errorMessage":"some orderer organizations endpoints are empty: %s","messagePattern":"some orderer organizations endpoints are empty: (.+?)","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"common/channelconfig/orderer.go","lineNumber":252,"sourceCode":"\t\treturn fmt.Errorf(\"Attempted to set the batch timeout to a invalid value: %s\", err)\n\t}\n\tif oc.batchTimeout <= 0 {\n\t\treturn fmt.Errorf(\"Attempted to set the batch timeout to a non-positive value: %s\", oc.batchTimeout)\n\t}\n\treturn nil\n}\n\nfunc (oc *OrdererConfig) validateAllOrgsHaveEndpoints() error {\n\tvar orgsMissingEndpoints []string\n\n\tfor _, org := range oc.Organizations() {\n\t\tif len(org.Endpoints()) == 0 {\n\t\t\torgsMissingEndpoints = append(orgsMissingEndpoints, org.Name())\n\t\t}\n\t}\n\n\tif len(orgsMissingEndpoints) > 0 {\n\t\treturn errors.Errorf(\"some orderer organizations endpoints are empty: %s\", orgsMissingEndpoints)\n\t}\n\n\treturn nil\n}\n\n// This does just a barebones sanity check.\nfunc brokerEntrySeemsValid(broker string) bool {\n\tif !strings.Contains(broker, \":\") {\n\t\treturn false\n\t}\n\n\tparts := strings.Split(broker, \":\")\n\tif len(parts) > 2 {\n\t\treturn false\n\t}\n\n\thost := parts[0]\n\tport := parts[1]","sourceCodeStart":234,"sourceCodeEnd":270,"githubUrl":"https://github.com/hyperledger/fabric/blob/2736b63f8fd5932511d56fe68b7039d15977f7f6/common/channelconfig/orderer.go#L234-L270","documentation":"When building the OrdererConfig, Fabric checks that every organization in the Orderer group defines at least one endpoint. validateAllOrgsHaveEndpoints collects orgs with empty Endpoints() and fails the whole config if any exist. This guarantees the ordering service membership has reachable endpoints.","triggerScenarios":"Creating/updating a channel whose Orderer group contains an org with no Orderer.Endpoints (no hosts defined) — typically after adding an org to the orderer group without endpoint entries, or removing all endpoints from an existing orderer org.","commonSituations":"Adding a new ordering org to a consortium/orderer group in a config update but forgetting its TLS/endpoint addresses; upgrading configs from older Fabric versions where endpoints lived in the service addresses of the legacy OrdererAddresses; generated configs where an org is referenced but not fully populated.","solutions":["Add Orderer.Endpoints entries (host:port of its ordering nodes) for every org listed in the error","Alternatively remove the org from the Orderer group if it should not be part of the ordering service","Regenerate the config update and revalidate"],"exampleFix":"# before (configtx.yaml)\nOrderer:\n  Organizations:\n    - &OrdererOrg\n      Name: OrdererOrg\n      # no Endpoints defined\n# after\nOrderer:\n  Organizations:\n    - &OrdererOrg\n      Name: OrdererOrg\n      Endpoints:\n        - orderer.example.com:7050","handlingStrategy":"validation","validationCode":"for _, org := range cfg.Orderer.Organizations {\n\tif len(org.OrdererEndpoints) == 0 {\n\t\treturn fmt.Errorf(\"orderer org %q has no Endpoints\", org.Name)\n\t}\n}","typeGuard":null,"tryCatchPattern":"_, err := channelconfig.NewOrdererConfig(ordererGroup, cryptoProvider)\nif err != nil && strings.Contains(err.Error(), \"endpoints are empty\") {\n\treturn fmt.Errorf(\"add Orderer.Endpoints for the listed orgs: %w\", err)\n}","preventionTips":["Whenever adding an org to the Orderer group, add its Endpoints list in the same change","Keep org definitions complete (Name, ID, MSPDir, Endpoints) using a shared template","Run configtxgen validation in CI to catch missing endpoints before channel creation"],"tags":["hyperledger-fabric","channelconfig","orderer","endpoints"],"backgroundTag":"missing-endpoint-config","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"}