{"record":{"id":"9d25a41e7fbdd920","repo":"hyperledger/fabric","slug":"global-ordereraddresses-are-not-allowed-with-v3-0","errorCode":null,"errorMessage":"global OrdererAddresses are not allowed with V3_0 capability, use org specific addresses only","messagePattern":"global OrdererAddresses are not allowed with V3_0 capability, use org specific addresses only","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"common/channelconfig/channel.go","lineNumber":228,"sourceCode":"}\n\nfunc (cc *ChannelConfig) validateBlockDataHashingStructure() error {\n\tif cc.protos.BlockDataHashingStructure.Width != math.MaxUint32 {\n\t\treturn fmt.Errorf(\"BlockDataHashStructure width only supported at MaxUint32 in this version\")\n\t}\n\treturn nil\n}\n\nfunc (cc *ChannelConfig) validateOrdererAddresses() error {\n\tif len(cc.protos.OrdererAddresses.Addresses) == 0 {\n\t\treturn fmt.Errorf(\"Must set some OrdererAddresses\")\n\t}\n\treturn nil\n}\n\nfunc (cc *ChannelConfig) validateNoOrdererAddresses() error {\n\tif len(cc.protos.OrdererAddresses.Addresses) > 0 {\n\t\treturn fmt.Errorf(\"global OrdererAddresses are not allowed with V3_0 capability, use org specific addresses only\")\n\t}\n\treturn nil\n}\n","sourceCodeStart":210,"sourceCodeEnd":232,"githubUrl":"https://github.com/hyperledger/fabric/blob/2736b63f8fd5932511d56fe68b7039d15977f7f6/common/channelconfig/channel.go#L210-L232","documentation":"With the V3_0 channel capability enabled, Fabric no longer allows global OrdererAddresses at the channel level; ordering endpoints must be declared per-organization in the orderer group instead. validateNoOrdererAddresses returns this error when a V3_0-capable channel config still contains a non-empty global OrdererAddresses list, because Validate branches to the V3_0 validation path.","triggerScenarios":"A channel whose Capabilities value includes V3_0 runs Validate, which calls validateNoOrdererAddresses; cc.protos.OrdererAddresses.Addresses is non-empty — i.e. upgrading to V3_0 without removing the legacy global OrdererAddresses value.","commonSituations":"Upgrading a long-running network from v2.x to v3.x: the old config carries global OrdererAddresses that must be migrated to Orderer: Endpoints per organization; configtx.yaml still setting Channel-level OrdererAddresses while Channel capabilities specify V3_0; mixed configtx.yaml versions.","solutions":["Remove the global OrdererAddresses value from the channel group and set per-organization endpoints under the Orderer group (Orderer: Endpoints / Organizations: Endpoints in configtx.yaml) using configtxgen","Only enable the V3_0 capability after migrating endpoints; or temporarily stay on a pre-V3_0 capability if global addresses are still needed","Decode the current config with configtxlator to locate and delete the OrdererAddresses value, then re-encode and submit the update"],"exampleFix":"# before (V3_0)\nChannel:\n    Capabilities: [V3_0]\n    OrdererAddresses:\n        - orderer.example.com:7050  # not allowed\n\n# after\nChannel:\n    Capabilities: [V3_0]\nOrderer:\n    Endpoints:\n        - Host: orderer.example.com\n          Port: 7050\n          Organization: OrdererOrg","handlingStrategy":"validation","validationCode":"func v3Compatible(cfg *cb.Config) error {\n    caps := channelCapabilities(cfg) // decode Capabilities value\n    if !slices.Contains(caps, \"V3_0\") { return nil }\n    if oa := globalOrdererAddresses(cfg); len(oa) > 0 {\n        return errors.New(\"remove global OrdererAddresses before enabling V3_0\")\n    }\n    return nil\n}","typeGuard":null,"tryCatchPattern":"cc, err := channelconfig.NewChannelConfig(channelGroup, bccsp)\nif err != nil {\n    if strings.Contains(err.Error(), \"not allowed with V3_0 capability\") {\n        return fmt.Errorf(\"migrate to per-org endpoints before enabling V3_0\")\n    }\n    return err\n}","preventionTips":["Plan the V3_0 upgrade as: move endpoints to Orderer: Endpoints per org, then enable V3_0","Remove global OrdererAddresses from configtx.yaml when targeting V3_0","Round-trip the candidate config through a v3.x peer/orderer config validation before submitting"],"tags":["fabric","channelconfig","capabilities","v3","orderer-addresses","migration"],"backgroundTag":"capability-order-violation","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"}