hyperledger/fabric · warning

attempted to redefine the current committed sequence (%d) fo

Error message

attempted to redefine the current committed sequence (%d) for namespace %s

What it means

The org attempted to approve a definition whose sequence equals the currently committed sequence, and the content is identical to what is already committed (isAttemptToRedefine detected no change). Re-approving the same committed definition unchanged would produce an empty write set, so lifecycle rejects it.

Source

Thrown at core/chaincode/lifecycle/lifecycle.go:474

		definedChaincode := &ChaincodeDefinition{}
		if err := ef.Resources.Serializer.Deserialize(NamespacesName, ccname, metadata, definedChaincode, publicState); err != nil {
			return errors.WithMessagef(err, "could not deserialize namespace %s as chaincode", ccname)
		}

		if err := definedChaincode.Parameters().Equal(cd.Parameters()); err != nil {
			return errors.WithMessagef(err, "attempted to redefine the current committed sequence (%d) for namespace %s with different parameters", currentSequence, ccname)
		}
		// it might be the case that some organization just installed
		// the chaincode and now would like to approve, therefore we
		// need to check to distinguish the case. hence need to read from
		// the orgState metadata and see whenever this is the case
		redefine, err := ef.isAttemptToRedefine(privateName, packageID, requestedSequence, cd, orgState)
		if err != nil {
			return err
		}
		if redefine {
			return errors.Errorf("attempted to redefine the current committed sequence (%d) for namespace %s", currentSequence, ccname)
		}
	}

	// if requested sequence is not committed, and attempt is made to update its content,
	// we need to check whether new definition actually contains updated content, to avoid
	// empty write set.
	if requestedSequence == currentSequence+1 {
		redefine, err := ef.isAttemptToRedefine(privateName, packageID, requestedSequence, cd, orgState)
		if err != nil {
			return err
		}
		if redefine {
			return errors.Errorf("attempted to redefine uncommitted sequence (%d) for namespace %s with unchanged content", requestedSequence, ccname)
		}
	}

	if err := ef.Resources.Serializer.Serialize(NamespacesName, privateName, cd.Parameters(), orgState); err != nil {
		return errors.WithMessage(err, "could not serialize chaincode parameters to state")

View on GitHub (pinned to 2736b63f8f)

Solutions

  1. Skip the approval — check 'peer lifecycle chaincode checkcommitreadiness' to confirm the org already approved
  2. If a change is intended, increment the sequence by 1 and change the definition (package ID, parameters, or policy)
  3. Make deployment scripts idempotent by comparing committed state before approving

Example fix

// before
approve(seq=currentSequence, samePackageID) // rejected as redefine
// after
if !alreadyApproved(org, cc, currentSequence) { approve(currentSequence, packageID) } else { proceed to commit }
Defensive patterns

Strategy: validation

Validate before calling

// Skip approval if org already approved identical definition at this sequence
readiness := checkCommitReadiness(ch, ccname, def) // returns org approvals
if readiness[myOrg] == true {
    return nil // already approved; go straight to commit
}

Try / catch

err := ef.ApproveChaincodeDefinitionForOrg(...)
if err != nil && strings.Contains(err.Error(), "attempted to redefine the current committed sequence") {
    // treat as success: definition already committed and approved
    return nil
}

Prevention

When it happens

Trigger: Re-running 'peer lifecycle chaincode approveformyorg' with the same sequence and identical package/parameters as already committed for the org.

Common situations: Idempotent CI re-runs; operators re-running a deployment script end-to-end after a partial failure elsewhere in the flow; accidental double-execution of approve commands.

Related errors


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