hyperledger/fabric · error

lscc's state for [%s] is invalid, vscc field must be set

Error message

lscc's state for [%s] is invalid, vscc field must be set

What it means

lscc state for the chaincode unmarshaled successfully, but its ChaincodeData has an empty Vscc field. Every deployed chaincode record must name the validation system chaincode (normally 'vscc') used to validate its transactions; a missing vscc field makes the record invalid and validation fails with this error.

Source

Thrown at core/committer/txvalidator/v14/vscc_validator.go:318

	bytes, err := qe.GetState("lscc", ccid)
	if err != nil {
		return nil, &commonerrors.VSCCInfoLookupFailureError{
			Reason: fmt.Sprintf("Could not retrieve state for chaincode %s, error %s", ccid, err),
		}
	}

	if bytes == nil {
		return nil, errors.Errorf("lscc's state for [%s] not found.", ccid)
	}

	cd := &ccprovider.ChaincodeData{}
	err = proto.Unmarshal(bytes, cd)
	if err != nil {
		return nil, errors.Wrap(err, "unmarshalling ChaincodeQueryResponse failed")
	}

	if cd.Vscc == "" {
		return nil, errors.Errorf("lscc's state for [%s] is invalid, vscc field must be set", ccid)
	}

	if len(cd.Policy) == 0 {
		return nil, errors.Errorf("lscc's state for [%s] is invalid, policy field must be set", ccid)
	}

	return cd, err
}

// GetInfoForValidate gets the ChaincodeInstance(with latest version) of tx, vscc and policy from lscc
func (v *VsccValidatorImpl) GetInfoForValidate(chdr *common.ChannelHeader, ccID string) (*sysccprovider.ChaincodeInstance, *sysccprovider.ChaincodeInstance, []byte, error) {
	cc := &sysccprovider.ChaincodeInstance{
		ChannelID:     chdr.ChannelId,
		ChaincodeName: ccID,
	}
	vscc := &sysccprovider.ChaincodeInstance{
		ChannelID:     chdr.ChannelId,
		ChaincodeName: "vscc", // default vscc for system chaincodes

View on GitHub (pinned to 2736b63f8f)

Solutions

  1. Re-instantiate or upgrade the chaincode so lscc writes a complete ChaincodeData including the vscc field
  2. Repair/rebuild the state database if records were corrupted
  3. Verify the deployment path used to deploy the chaincode wrote full ChaincodeData
  4. Audit any custom tooling that modifies lscc state directly

Example fix

// before: incomplete ChaincodeData
cd := &ChaincodeData{Name: "mycc", Version: "1.0"}
// after
cd := &ChaincodeData{Name: "mycc", Version: "1.0", Vscc: "vscc", Policy: policyBytes}
Defensive patterns

Strategy: validation

Validate before calling

// pre-deploy sanity: ensure lifecycle writes vscc
// after instantiate, verify record:
const cd = await channel.queryByChaincode({chaincodeId:'lscc', fcn:'getchaincodes'});

Type guard

function hasVsccField(cd) {
  return cd && typeof cd.vscc === 'string' && cd.vscc.length > 0;
}

Try / catch

try { await validate(); } catch (e) {
  if (String(e).includes('vscc field must be set')) { /* re-instantiate/upgrade chaincode to rewrite ChaincodeData */ }
}

Prevention

When it happens

Trigger: getCDataForCC unmarshals ChaincodeData with cd.Vscc == "" — the lscc record was created or modified without setting the vscc field.

Common situations: Corrupted or hand-crafted lscc records; lifecycle code bugs writing incomplete ChaincodeData; partial writes during chaincode deployment failures; state tampering.

Related errors


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