hyperledger/fabric · error

VSCC error: committing an invocation of function %s of lscc

Error message

VSCC error: committing an invocation of function %s of lscc is invalid

What it means

VSCC only recognizes a fixed set of LSCC functions (deploy/instantiate, upgrade) as valid. If the transaction invokes lscc with any other function name, it is rejected outright as an invalid lscc invocation.

Source

Thrown at core/handlers/validation/builtin/v12/validation_logic.go:746

				polNew := cdRWSet.InstantiationPolicy
				if polNew == nil {
					return policyErr(fmt.Errorf("No instantiation policy was specified"))
				}

				// no point in checking it again if they are the same policy
				if !bytes.Equal(polNew, pol) {
					err = vscc.checkInstantiationPolicy(chid, env, polNew, payl)
					if err != nil {
						return err
					}
				}
			}
		}

		// all is good!
		return nil
	default:
		return policyErr(fmt.Errorf("VSCC error: committing an invocation of function %s of lscc is invalid", lsccFunc))
	}
}

func (vscc *Validator) getInstantiatedCC(chid, ccid string) (cd *ccprovider.ChaincodeData, exists bool, err error) {
	qe, err := vscc.stateFetcher.FetchState()
	if err != nil {
		err = fmt.Errorf("could not retrieve QueryExecutor for channel %s, error %s", chid, err)
		return
	}
	defer qe.Done()
	channelState := &state{qe}
	bytes, err := channelState.GetState("lscc", ccid)
	if err != nil {
		err = fmt.Errorf("could not retrieve state for chaincode %s on channel %s, error %s", ccid, chid, err)
		return
	}

	if bytes == nil {

View on GitHub (pinned to 2736b63f8f)

Solutions

  1. Do not invoke lscc directly for queries; use peer chaincode list / query commands or the appropriate channels (QueryInstalledChaincodes APIs)
  2. Resubmit only deploy/upgrade lifecycle operations through lscc
  3. Remove any custom tooling that sends arbitrary function names to lscc

Example fix

// before
peer chaincode invoke -C mychannel -n lscc -c '{"Args":["getccdata","mychannel","mycc"]}'
// after
peer chaincode list -C mychannel
Defensive patterns

Strategy: try-catch

Try / catch

try {
  await lsccContract.submitTransaction(fn, ...);
} catch (e) {
  if (String(e).includes('committing an invocation of function')) {
    // switch to supported query APIs instead of invoking lscc directly
  }
}

Prevention

When it happens

Trigger: A transaction whose lsccFunc (first argument to lscc) is not one of the supported constants (e.g. lscc.GETCCINFO, GETCCDATA, GETDEPSPEC, or arbitrary strings) reaching commit validation.

Common situations: Directly invoking lscc via an SDK to query chaincode metadata (queries go through different paths in modern Fabric); malicious or experimental transactions calling unknown lscc functions; hand-crafted proposals.

Related errors


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