hyperledger/fabric · error

nil data

Error message

nil data

What it means

During PutChaincodeToFS, after env and depSpec validation pass, the package's data (the unpacked bytes, typically the chaincode install payload) is checked. This error means the package has metadata fields populated but the actual data payload is nil, so it cannot be persisted. The library throws it to prevent writing an empty/invalid chaincode package to disk.

Source

Thrown at core/common/ccprovider/sigcdspackage.go:298

func (ccpack *SignedCDSPackage) PutChaincodeToFS() error {
	if ccpack.buf == nil {
		return errors.New("uninitialized package")
	}

	if ccpack.id == nil {
		return errors.New("id cannot be nil if buf is not nil")
	}

	if ccpack.sDepSpec == nil || ccpack.depSpec == nil {
		return errors.New("depspec cannot be nil if buf is not nil")
	}

	if ccpack.env == nil {
		return errors.New("env cannot be nil if buf and depspec are not nil")
	}

	if ccpack.data == nil {
		return errors.New("nil data")
	}

	if ccpack.datab == nil {
		return errors.New("nil data bytes")
	}

	ccname := ccpack.depSpec.ChaincodeSpec.ChaincodeId.Name
	ccversion := ccpack.depSpec.ChaincodeSpec.ChaincodeId.Version

	// return error if chaincode exists
	path := fmt.Sprintf("%s/%s.%s", chaincodeInstallPath, ccname, ccversion)
	if _, err := os.Stat(path); err == nil {
		return fmt.Errorf("chaincode %s exists", path)
	}

	if err := os.WriteFile(path, ccpack.buf, 0o644); err != nil {
		return err
	}

View on GitHub (pinned to 2736b63f8f)

Solutions

  1. Populate ccpack.data with the unmarshaled package payload before calling PutChaincodeToFS
  2. Regenerate the chaincode package (peer lifecycle chaincode package) and retry the install
  3. Check for disk corruption or interrupted previous install; delete the stale package file and reinstall

Example fix

// before
pack.data = nil
ccprovider.PutChaincodeToFS(pack) // errors: nil data

// after
pack.data, err = ccpack.GetInstantiationPolicy(...) // or set the extracted payload
if err != nil { return err }
ccprovider.PutChaincodeToFS(pack)
Defensive patterns

Strategy: validation

Validate before calling

if pack != nil && pack.Buf != nil && (pack.Data == nil) {
  return errors.New("package has buf but nil data; rebuild package")
}

Type guard

func hasPackageData(p *ccprovider.SignedCDSPackage) bool {
  return p != nil && p.Data != nil
}

Try / catch

err := ccprovider.PutChaincodeToFS(pack)
if err != nil {
  if strings.Contains(err.Error(), "nil data") {
    return fmt.Errorf("package payload missing; repackage chaincode: %w", err)
  }
  return err
}

Prevention

When it happens

Trigger: PutChaincodeToFS is called on a SignedCDSPackage whose data field was never populated — e.g., processSignedCDS failed to extract the payload from the buf bytes, or a caller constructed the package struct manually without data.

Common situations: Truncated or corrupt chaincode install packages on the file system, packages produced by mismatched fabric versions, custom install tooling that sets depSpec but forgets the raw data payload.

Related errors


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