hyperledger/fabric · error
failed parsing orderer endpoint %s
Error message
failed parsing orderer endpoint %s
What it means
This error means an entry in the global orderer address list could not be split into host and port with net.SplitHostPort, so the discovery service cannot build discovery.Endpoint entries. Because per-org endpoints are absent, globalEndpoints falls back to the channel-level orderer addresses (orderer.group values / general orderer addresses), and any malformed address aborts the whole computation. The message includes the offending endpoint string.
Source
Thrown at discovery/support/config/support.go:188
return nil, errors.Wrap(err, "failed unmarshalling orderer addresses")
}
// Override the mapping because this orderer org config contains org-specific endpoints.
res[fabricConfig.Name] = ordererEndpoints.Addresses
}
}
return res, nil
}
func globalEndpoints(endpointsByMSPID map[string][]string, ordererAddresses []string) (map[string]*discovery.Endpoints, error) {
res := make(map[string]*discovery.Endpoints)
for mspID := range endpointsByMSPID {
res[mspID] = &discovery.Endpoints{}
for _, endpoint := range ordererAddresses {
host, portStr, err := net.SplitHostPort(endpoint)
if err != nil {
return nil, errors.Errorf("failed parsing orderer endpoint %s", endpoint)
}
port, err := strconv.ParseInt(portStr, 10, 32)
if err != nil {
return nil, errors.Errorf("%s is not a valid port number", portStr)
}
res[mspID].Endpoint = append(res[mspID].Endpoint, &discovery.Endpoint{
Host: host,
Port: uint32(port),
})
}
}
return res, nil
}
func appendMSPConfigs(ordererGrp, appGrp map[string]*common.ConfigGroup, output map[string]*msp.FabricMSPConfig) error {
for _, group := range []map[string]*common.ConfigGroup{ordererGrp, appGrp} {
for _, grp := range group {
mspConfig := &msp.MSPConfig{}View on GitHub (pinned to 2736b63f8f)
Solutions
- Correct the orderer address in channel config / configtx.yaml to include an explicit port, e.g. orderer.example.com:7050.
- Regenerate and update the channel config with configtxgen/configtxlator after fixing the addresses.
- Validate each address with net.SplitHostPort locally before submitting config updates.
- Check for whitespace or bad IPv6 bracket formatting in OrdererAddresses values.
Example fix
// before (configtx.yaml / channel config) OrdererAddresses: - orderer.example.com // after OrdererAddresses: - orderer.example.com:7050
Defensive patterns
Strategy: validation
Validate before calling
func validateOrdererAddresses(addrs []string) error {
for _, a := range addrs {
if _, _, err := net.SplitHostPort(a); err != nil {
return fmt.Errorf("orderer address %q must be host:port", a)
}
}
return nil
}
// call before invoking discovery / before config update:
// err := validateOrdererAddresses(globalOrdererAddresses) Type guard
func isHostPort(s string) bool {
host, port, err := net.SplitHostPort(s)
if err != nil || host == "" || port == "" {
return false
}
n, err := strconv.Atoi(port)
return err == nil && n > 0 && n < 65536
} Try / catch
eps, err := support.OrdererEndpoints()
if err != nil {
if strings.Contains(err.Error(), "failed parsing orderer endpoint") {
// fall back to known-good statically configured orderer list
}
return err
} Prevention
- Always specify orderer addresses as host:port in configtx.yaml OrdererAddresses and General.ListenAddress.
- Run a config lint (net.SplitHostPort over all addresses) before channel creation/update.
- Watch for migrations from older Fabric configs that used host-only addresses.
- Trim whitespace and verify IPv6 bracket syntax when generating addresses from templates.
When it happens
Trigger: globalEndpoints (called by computeOrdererEndpoints when no per-org endpoints exist) iterates ordererAddresses; net.SplitHostPort returns an error for addresses missing a port ('orderer.example.com'), using brackets incorrectly, containing spaces, or otherwise not host:port.
Common situations: Orderer.General.ListenAddress or channel config OrdererAddresses values set without :port; migration from older Fabric configs where addresses were host-only; configtx.yaml typos; environment variable substitution dropping the port.
Related errors
- %s is not a valid port number
- organization %s not found
- reading http response body: %s
- some orderer organizations endpoints are empty: %s
- Value of File: was nil
AI-assisted analysis of hyperledger/fabric@2736b63f8f (2026-09-04).
Data as JSON: /api/errors/ab35e9b20a49cf12.
Report an issue: GitHub.