{"record":{"id":"c4b715ef03417578","repo":"hyperledger/fabric","slug":"chaincode-s-is-already-initialized-but-called-a","errorCode":null,"errorMessage":"chaincode '%s' is already initialized but called as init","messagePattern":"chaincode '(.+?)' is already initialized but called as init","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"core/chaincode/chaincode_support.go","lineNumber":251,"sourceCode":"\n\t\tvalue, err := txParams.TXSimulator.GetState(chaincodeName, InitializedKeyName)\n\t\tif err != nil {\n\t\t\treturn \"\", 0, errors.WithMessage(err, \"could not get 'initialized' key\")\n\t\t}\n\n\t\tneedsInitialization = !bytes.Equal(value, []byte(cii.Version))\n\t}\n\n\t// Note, IsInit is a new field for v2.0 and should only be set for invocations of non-legacy chaincodes.\n\t// Any invocation of a legacy chaincode with IsInit set will fail.  This is desirable, as the old\n\t// InstantiationPolicy contract enforces which users may call init.\n\tif input.IsInit {\n\t\tif !cii.EnforceInit {\n\t\t\treturn \"\", 0, errors.Errorf(\"chaincode '%s' does not require initialization but called as init\", chaincodeName)\n\t\t}\n\n\t\tif !needsInitialization {\n\t\t\treturn \"\", 0, errors.Errorf(\"chaincode '%s' is already initialized but called as init\", chaincodeName)\n\t\t}\n\n\t\terr = txParams.TXSimulator.SetState(chaincodeName, InitializedKeyName, []byte(cii.Version))\n\t\tif err != nil {\n\t\t\treturn \"\", 0, errors.WithMessage(err, \"could not set 'initialized' key\")\n\t\t}\n\n\t\treturn cii.ChaincodeID, pb.ChaincodeMessage_INIT, nil\n\t}\n\n\tif needsInitialization {\n\t\treturn \"\", 0, errors.Errorf(\"chaincode '%s' has not been initialized for this version, must call as init first\", chaincodeName)\n\t}\n\n\treturn cii.ChaincodeID, pb.ChaincodeMessage_TRANSACTION, nil\n}\n\n// execute executes a transaction and waits for it to complete until a timeout value.","sourceCodeStart":233,"sourceCodeEnd":269,"githubUrl":"https://github.com/hyperledger/fabric/blob/2736b63f8fd5932511d56fe68b7039d15977f7f6/core/chaincode/chaincode_support.go#L233-L269","documentation":"Returned by lifecycle CheckInvocation when a chaincode invocation carries IsInit=true but the chaincode is already initialized (the ledger's 'initialized' key matches the current version). Re-running init on an already-initialized chaincode is rejected to preserve the init/normal-call contract.","triggerScenarios":"Thrown at core/chaincode/chaincode_support.go:251 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Invoke the chaincode normally (without the --isInit flag) after first initialization","If re-initialization is genuinely needed, use a new chaincode version or an explicit upgrade/init flow"],"exampleFix":null,"handlingStrategy":"validation","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"2736b63f8fd5932511d56fe68b7039d15977f7f6","analyzedAt":"2026-09-04T08:52:36.465Z","contentChangedAt":"2026-09-04T08:52:36.465Z","schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}