hyperledger/fabric · error

failed to deserialize values

Error message

failed to deserialize values

What it means

NewChannelConfig deserializes each config value in the channel group into typed protobuf structs via DeserializeProtoValuesFromGroup; if any value fails to unmarshal, the error is wrapped as "failed to deserialize values". It indicates a value in the Channel group (e.g. HashingAlgorithm, BlockDataHashingStructure, OrdererAddresses, Capabilities) is malformed or of the wrong type.

Source

Thrown at common/channelconfig/channel.go:90

	protos *ChannelProtos

	hashingAlgorithm func(input []byte) []byte

	mspManager msp.MSPManager

	appConfig         *ApplicationConfig
	ordererConfig     *OrdererConfig
	consortiumsConfig *ConsortiumsConfig
}

// NewChannelConfig creates a new ChannelConfig
func NewChannelConfig(channelGroup *cb.ConfigGroup, bccsp bccsp.BCCSP) (*ChannelConfig, error) {
	cc := &ChannelConfig{
		protos: &ChannelProtos{},
	}

	if err := DeserializeProtoValuesFromGroup(channelGroup, cc.protos); err != nil {
		return nil, errors.Wrap(err, "failed to deserialize values")
	}

	channelCapabilities := cc.Capabilities()

	if err := cc.Validate(channelCapabilities); err != nil {
		return nil, err
	}

	mspConfigHandler := NewMSPConfigHandler(channelCapabilities.MSPVersion(), bccsp)

	var err error
	for groupName, group := range channelGroup.Groups {
		switch groupName {
		case ApplicationGroupKey:
			cc.appConfig, err = NewApplicationConfig(group, mspConfigHandler)
		case OrdererGroupKey:
			cc.ordererConfig, err = NewOrdererConfig(group, mspConfigHandler, channelCapabilities)
		case ConsortiumsGroupKey:

View on GitHub (pinned to 2736b63f8f)

Solutions

  1. Round-trip the config through `configtxlator proto_decode` and inspect each value under groups.Channel.values for mismatched/corrupt payloads
  2. Regenerate the channel config with configtxgen from the original configtx.yaml instead of editing blobs
  3. In code, verify each cb.ConfigValue marshals the exact proto type expected for its key (e.g. cb.Capabilities for CapabilitiesKey)
  4. Log the underlying wrapped error to identify which specific value failed

Example fix

// before
values["OrdererAddresses"] = &cb.ConfigValue{Value: protoutil.MarshalOrPanic(&cb.Capabilities{...})} // wrong type

// after
values["OrdererAddresses"] = &cb.ConfigValue{
    Value: protoutil.MarshalOrPanic(&cb.OrdererAddresses{Addresses: []string{"orderer.example.com:7050"}}),
}
Defensive patterns

Strategy: validation

Validate before calling

for name, val := range channelGroup.Values {
    if val == nil || len(val.Value) == 0 {
        return fmt.Errorf("channel value %q has empty payload", name)
    }
}
// prefer round-tripping through configtxlator to catch type mismatches before NewBundle

Try / catch

cc, err := channelconfig.NewChannelConfig(channelGroup, bccsp)
if err != nil {
    var cause string
    if strings.Contains(err.Error(), "failed to deserialize values") {
        cause = "a channel-group value is corrupt or wrong type; regenerate with configtxgen"
    }
    return fmt.Errorf("%s: %w", cause, err)
}

Prevention

When it happens

Trigger: Calling NewChannelConfig (directly, via NewBundle, or via extractChannelConfig) with a channelGroup whose Values contain a Value byte slice that does not unmarshal as the expected message type — e.g. a Capabilities value stored where OrdererAddresses is expected, or a hand-edited/truncated proto payload.

Common situations: Manually editing config after configtxlator decode/encode round-trips; corruption from re-encoding with mismatched field types; copy-pasting value blobs between config keys; building cb.ConfigValue in tests with wrong payload types.

Related errors


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