hyperledger/fabric · critical

could not create a signed Deliver SeekInfo message, somethin

Error message

could not create a signed Deliver SeekInfo message, something is critically wrong

What it means

newHeaderClient builds a signed SeekInfo envelope (requesting block headers starting at blockNumber) via m.requester.SeekInfoHeadersFrom before connecting to the orderer. If signing fails, the code wraps the error with this message because a failure to sign a locally constructed message indicates an internal/critical fault (e.g. missing signing identity) rather than a transient network issue.

Source

Thrown at common/deliverclient/blocksprovider/bft_censorship_monitor.go:398

// newHeaderClient connects to the orderer's delivery service and requests a stream of headers.
// Seek from the largest of the block progress and the last good header from the previous header receiver.
func (m *BFTCensorshipMonitor) newHeaderClient(endpoint *orderers.Endpoint, prevHeaderReceiver *BFTHeaderReceiver) (deliverClient orderer.AtomicBroadcast_DeliverClient, clientCloser func(), err error) {
	blockNumber, blockTime := m.progressReporter.BlockProgress()
	if !blockTime.IsZero() {
		blockNumber++ // If blockTime.IsZero(), we request block number 0, else blockNumber+1
	}

	if prevHeaderReceiver != nil {
		hNum, _, errH := prevHeaderReceiver.LastBlockNum()
		if errH == nil && (hNum+1) > blockNumber {
			blockNumber = hNum + 1
		}
	}

	seekInfoEnv, err := m.requester.SeekInfoHeadersFrom(blockNumber)
	if err != nil {
		return nil, nil, errors.Wrap(err, "could not create a signed Deliver SeekInfo message, something is critically wrong")
	}

	deliverClient, clientCloser, err = m.requester.Connect(seekInfoEnv, endpoint)
	if err != nil {
		return nil, nil, errors.Wrap(err, "could not connect to ordering service")
	}

	return deliverClient, clientCloser, nil
}

View on GitHub (pinned to 2736b63f8f)

Solutions

  1. Ensure the requester was created with a valid signing identity (local MSP / correct user context) before connecting.
  2. Verify certificate/key files exist, are readable, and have not expired.
  3. Recreate the signer/signing identity and retry SeekInfoHeadersFrom; inspect the wrapped inner error for the crypto cause.
  4. If in tests, inject a functioning mock/signer into the requester so envelope signing can succeed.

Example fix

// before
requester := &deliverclient.Requester{} // no signer set
env, err := requester.SeekInfoHeadersFrom(n) // wrapped: 'could not create a signed Deliver SeekInfo message'
// after
signer, err := mspmgmt.GetLocalMSP().GetDefaultSigningIdentity()
if err != nil {
    return fmt.Errorf("no signing identity available: %w", err)
}
requester := deliverclient.NewRequester(channelID, csr, signer, ...)
env, err := requester.SeekInfoHeadersFrom(n)
Defensive patterns

Strategy: try-catch

Validate before calling

if signer == nil {
    return fmt.Errorf("no signing identity loaded; cannot build SeekInfo envelope")
}

Try / catch

hdrCli, closer, err := monitor.newHeaderClient(ep)
if err != nil {
    if strings.Contains(err.Error(), "could not create a signed Deliver SeekInfo message") {
        // crypto/identity fault: reload MSP/user context, then retry with backoff
    }
    return err
}

Prevention

When it happens

Trigger: launchHeaderReceivers → newHeaderClient when requester.SeekInfoHeadersFrom(blockNumber) returns an error — typically the signer/identity context is missing or the crypto material cannot produce a signature for the SeekInfo envelope.

Common situations: Client identity/MSPEXPIRED or missing signer (crypto material not loaded); expired or unparseable certificates; requester constructed without a signing identity in tests; local MSP misconfiguration on the peer/client.

Related errors


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