hyperledger/fabric · error

failed to marshal args

Error message

failed to marshal args

What it means

ApprovedQuerier.createProposal fails when proto.Marshal cannot serialize the request args struct (QueryApprovedChaincodeDefinitionArgs or QueryApprovedChaincodeDefinitionsArgs) into protobuf bytes. Since these are plain generated message structs, this almost never fires and would indicate a programming bug such as a nil args pointer or corrupted generated types.

Source

Thrown at internal/peer/lifecycle/chaincode/queryapproved.go:231

func (a *ApprovedQuerier) createProposal() (*pb.Proposal, error) {
	var function string
	var args proto.Message

	if a.Input.Name != "" {
		function = "QueryApprovedChaincodeDefinition"
		args = &lb.QueryApprovedChaincodeDefinitionArgs{
			Name:     a.Input.Name,
			Sequence: a.Input.Sequence,
		}
	} else {
		function = "QueryApprovedChaincodeDefinitions"
		args = &lb.QueryApprovedChaincodeDefinitionsArgs{}
	}

	argsBytes, err := proto.Marshal(args)
	if err != nil {
		return nil, errors.Wrap(err, "failed to marshal args")
	}
	ccInput := &pb.ChaincodeInput{Args: [][]byte{[]byte(function), argsBytes}}

	cis := &pb.ChaincodeInvocationSpec{
		ChaincodeSpec: &pb.ChaincodeSpec{
			ChaincodeId: &pb.ChaincodeID{Name: lifecycleName},
			Input:       ccInput,
		},
	}

	signerSerialized, err := a.Signer.Serialize()
	if err != nil {
		return nil, errors.WithMessage(err, "failed to serialize identity")
	}

	proposal, _, err := protoutil.CreateProposalFromCIS(cb.HeaderType_ENDORSER_TRANSACTION, a.Input.ChannelID, cis, signerSerialized)
	if err != nil {
		return nil, errors.WithMessage(err, "failed to create ChaincodeInvocationSpec proposal")

View on GitHub (pinned to 2736b63f8f)

Solutions

  1. Check that you are using matching versions of fabric-protos-go and the peer CLI build
  2. Verify Input fields are set consistently so createProposal's branching always assigns args
  3. Rebuild the CLI/client against the same protobuf version used by the peer
  4. If it persists, capture the underlying err wrapped by this message and file it to Fabric maintainers

Example fix

// before
argsBytes, err := proto.Marshal(args)
if err != nil {
	return nil, errors.Wrap(err, "failed to marshal args")
}
// after (caller-side check)
if args == nil {
	return nil, errors.New("no query args constructed: specify channel ID and name")
}
argsBytes, err := proto.Marshal(args)
if err != nil {
	return nil, errors.Wrap(err, "failed to marshal args")
}
Defensive patterns

Strategy: try-catch

Validate before calling

if args == nil {
	return errors.New("query args not constructed")
}

Type guard

func argsReady(args proto.Message) bool { return args != nil && !reflect.ValueOf(args).IsNil() }

Try / catch

argsBytes, err := proto.Marshal(args)
if err != nil {
	return nil, errors.Wrap(err, "failed to marshal args")
}

Prevention

When it happens

Trigger: createProposal is called by Query with args == nil (only when neither Input.Name nor other fields select a branch, or a future code path assigns no args), or the generated protobuf type fails marshaling.

Common situations: Rare; would appear after a fabric-protos version mismatch where the generated message has invalid state, or custom builds of the peer CLI with modified arg structs.

Related errors


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