hyperledger/fabric · error

invalid nonce specified in the header

Error message

invalid nonce specified in the header

What it means

validateSignatureHeader requires a non-empty Nonce in the SignatureHeader. The nonce is essential for uniqueness/replay protection and for computing the TransactionID. An empty nonce is treated as an invalid, unusable signature header.

Source

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

	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
	if cHdr == nil {
		return errors.New("nil ChannelHeader provided")
	}

	// validate the header type

View on GitHub (pinned to 2736b63f8f)

Solutions

  1. Generate a fresh random nonce (e.g. 24+ random bytes) for each transaction before signing
  2. Verify the SDK's proposal/envelope builder sets Nonce — do not construct SignatureHeader literals without it
  3. Reject envelopes with empty nonce client-side before submit to give a clearer error
  4. Fix test fixtures to include a non-empty nonce

Example fix

// before
shdr := &common.SignatureHeader{Creator: creatorBytes} // Nonce empty
// after
nonce := make([]byte, 24)
if _, err := rand.Read(nonce); err != nil {
    return err
}
shdr := &common.SignatureHeader{Creator: creatorBytes, Nonce: nonce}
Defensive patterns

Strategy: validation

Validate before calling

func noncePresent(shdr *common.SignatureHeader) bool {
    return shdr != nil && len(shdr.Nonce) > 0
}

Try / catch

if err != nil && err.Error() == "invalid nonce specified in the header" {
    // regenerate nonce and rebuild the transaction client-side
}

Prevention

When it happens

Trigger: Submitting an envelope whose SignatureHeader.Nonce is a zero-length byte slice — e.g. an SDK generating a zero-value nonce, reusing a struct literal without setting Nonce, or a test fixture with an empty header.

Common situations: Custom client code building envelopes manually; SDK misuse where the nonce generator was not invoked; replay/reuse of a serialized header with the nonce stripped; bad test fixtures.

Related errors


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