hyperledger/fabric · error

no policies in config block

Error message

no policies in config block

What it means

After loading the channel bundle, the registrar looks up the BlockValidation policy (/Channel/Orderer/BlockValidation) in the channel's policy manager. A valid config block must define this policy because it is used to verify block signatures; if it is absent the channel cannot be validated and the ledger resources are not created.

Source

Thrown at orderer/common/multichannel/registrar.go:401

	bundle, err := channelconfig.NewBundle(chdr.ChannelId, configEnvelope.Config, r.bccsp)
	if err != nil {
		return nil, errors.WithMessage(err, "error creating channelconfig bundle")
	}

	err = checkResources(bundle)
	if err != nil {
		return nil, errors.WithMessagef(err, "error checking bundle for channel: %s", chdr.ChannelId)
	}

	ledger, err := r.ledgerFactory.GetOrCreate(chdr.ChannelId)
	if err != nil {
		return nil, errors.WithMessagef(err, "error getting ledger for channel: %s", chdr.ChannelId)
	}

	policy, exists := bundle.PolicyManager().GetPolicy(policies.BlockValidation)
	if !exists {
		return nil, errors.New("no policies in config block")
	}

	bftEnabled := bundle.ChannelConfig().Capabilities().ConsensusTypeBFT()

	var consenters []*cb.Consenter
	if bftEnabled {
		cfg, ok := bundle.OrdererConfig()
		if !ok {
			return nil, errors.New("no orderer section in config block")
		}
		consenters = cfg.Consenters()
	}
	signatureVerifier := protoutil.BlockSignatureVerifier(bftEnabled, consenters, policy)

	return &ledgerResources{
		configResources: &configResources{
			mutableResources: channelconfig.NewBundleSource(bundle, r.callbacks...),
			bccsp:            r.bccsp,

View on GitHub (pinned to 2736b63f8f)

Solutions

  1. Add the Orderer-group policies (including BlockValidation) to the configtx.yaml profile and regenerate the genesis/join block
  2. Use the stock sample config (first-network / test-network profiles) as a template for the Orderer group policies
  3. Re-create the channel from a correct config block; an existing bad block cannot be patched in place

Example fix

# before: configtx.yaml Orderer group without policies
Orderer:
  OrdererType: etcdraft

# after
Orderer:
  OrdererType: etcdraft
  Policies:
    Readers:
      Type: ImplicitMeta
      Rule: "ANY Readers"
    Writers:
      Type: ImplicitMeta
      Rule: "ANY Writers"
    Admins:
      Type: ImplicitMeta
      Rule: "MAJORITY Admins"
    BlockValidation:
      Type: ImplicitMeta
      Rule: "ANY Writers"
Defensive patterns

Strategy: validation

Validate before calling

# validate channel config before use with configtxlator
curl -s -X POST --data-binary @config_block.proto \
  http://configtxlator:7059/protolator/decode/common.ConfigBlock
# ensure Orderer group contains Policies.BlockValidation

Type guard

func hasBlockValidationPolicy(bundle channelconfig.Resources) bool {
    _, ok := bundle.PolicyManager().GetPolicy(policies.BlockValidation)
    return ok
}

Try / catch

if err := joinChannel(...); err != nil {
    if strings.Contains(err.Error(), "no policies in config block") {
        // regenerate genesis block from a profile with full Orderer policies
        return regenerateGenesisBlock(profile)
    }
    return err
}

Prevention

When it happens

Trigger: A channel config block (genesis or join block) whose Orderer group lacks the BlockValidation policy, e.g. a configtx.yaml profile that omits Policies for the Orderer group, or a channel created from a custom/legacy config template.

Common situations: Custom genesis profiles missing the default Orderer policies (Readers/Writers/Admins/BlockValidation), config generated by old tooling then imported into newer Fabric, or hand-edited channel config stripped of policy entries.

Related errors


AI-assisted analysis of hyperledger/fabric@2736b63f8f (2026-09-04). Data as JSON: /api/errors/38f777ec7a0800f7. Report an issue: GitHub.