hyperledger/fabric · error

nil SignatureHeader provided

Error message

nil SignatureHeader provided

What it means

validateSignatureHeader checks the SignatureHeader portion of a transaction header. A nil SignatureHeader pointer means the header could not be parsed or was never set, so no signature metadata (nonce, creator) exists to validate. The function rejects it immediately.

Source

Thrown at core/common/validation/msgvalidation.go:70

	putilsLogger.Debugf("creator is valid")

	// validate the signature
	err = creator.Verify(msg, sig)
	if err != nil {
		return errors.WithMessage(err, "creator's signature over the proposal is not valid")
	}

	putilsLogger.Debugf("exits successfully")

	return nil
}

// checks for a valid SignatureHeader
func validateSignatureHeader(sHdr *common.SignatureHeader) error {
	// check for nil argument
	if sHdr == nil {
		return errors.New("nil SignatureHeader provided")
	}

	// ensure that there is a nonce
	if len(sHdr.Nonce) == 0 {
		return errors.New("invalid nonce specified in the header")
	}

	// ensure that there is a creator
	if len(sHdr.Creator) == 0 {
		return errors.New("invalid creator specified in the header")
	}

	return nil
}

// checks for a valid ChannelHeader
func validateChannelHeader(cHdr *common.ChannelHeader) error {
	// check for nil argument

View on GitHub (pinned to 2736b63f8f)

Solutions

  1. Populate Header.SignatureHeader (with Nonce and serialized Creator) when constructing the transaction client-side
  2. Check the SDK's transaction-building call to confirm the signature header is set (e.g. TransactionID from nonce+creator)
  3. Verify the envelope bytes were not truncated during transport — re-unmarshal and inspect hdr.SignatureHeader
  4. In tests, construct a valid SignatureHeader via protoutil or the common package helpers

Example fix

// before
hdr := &common.Header{ChannelHeader: chdrBytes} // SignatureHeader missing
// after
shdrBytes := protoutil.MarshalOrPanic(&common.SignatureHeader{Creator: creatorBytes, Nonce: nonce})
hdr := &common.Header{ChannelHeader: chdrBytes, SignatureHeader: shdrBytes}
Defensive patterns

Strategy: validation

Validate before calling

func hasSignatureHeader(hdr *common.Header) bool {
    return hdr != nil && len(hdr.SignatureHeader) > 0
}

Type guard

func signatureHeaderPresent(hdr *common.Header) bool {
    if hdr == nil || len(hdr.SignatureHeader) == 0 {
        return false
    }
    _, err := protoutil.UnmarshalSignatureHeader(hdr.SignatureHeader)
    return err == nil
}

Try / catch

chdr, shdr, err := validation.ValidateTransaction returns wrapped errors; if err.Error() == "nil SignatureHeader provided" {
    // flag envelope as malformed, do not retry
}

Prevention

When it happens

Trigger: validateCommonHeader -> validateSignatureHeader invoked with hdr.SignatureHeader bytes that are nil/empty, or protoutil.UnmarshalSignatureHeader returning a nil pointer in a malformed envelope.

Common situations: Client SDKs omitting the signature header when building proposals/envelopes; corrupted or truncated protobuf payloads; hand-built messages in tests missing the SignatureHeader.

Related errors


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