fix(iota-core,iota-protocol-config): do not lock immutable objects in post-consensus conflict resolution (#12602) - #12661
Open
filipdulic wants to merge 2 commits into
Open
Conversation
filipdulic
force-pushed
the
consensus/bug/12602-immutable-object-locks
branch
2 times, most recently
from
August 13, 2026 11:36
c109c6e to
e7ccaae
Compare
filipdulic
marked this pull request as ready for review
August 13, 2026 12:06
polinikita
reviewed
Aug 13, 2026
bingyanglin
reviewed
Aug 14, 2026
… post-consensus conflict resolution (#12602)
filipdulic
force-pushed
the
consensus/bug/12602-immutable-object-locks
branch
from
August 14, 2026 16:31
e7ccaae to
e377cd8
Compare
bingyanglin
approved these changes
Aug 17, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Description of change
Under the P-COOL flow, post-consensus conflict resolution derives its owned-object lock set from the raw transaction bytes, where
ImmOrOwnedMoveObjectcovers immutable objects too. An immutable object's reference never changes and the per-epoch lock table is insert-only, so the first transaction reading e.g. aCoinMetadatalocks it for the rest of the epoch — every later reader is dropped withObjectLockConflict.The fix, gated behind a new
pcool_skip_immutable_object_locksfeature flag (rides the existing version-33 arm, which is unreleased — devnet still advertises 32; set for all chains, inert withoutenable_pcool_flow):old_object_metadata): every consumed owned input appears there, immutable inputs never do, and effects are identical on every validator regardless of execution progress.handle_transaction_validation_checksnow reports transaction-owned and authenticator-owned references separately. Existing callers (certificate-flow signing, soft locks) consume only the transaction set, so behavior outside P-COOL is unchanged. The authenticator list is provably empty today (validation only admits immutable or shared authenticator inputs); it exists so post-consensus locking keeps covering those inputs if that rule ever changes.Links to any relevant issues
fixes #12602
How the change has been tested
Unit: the repro (two readers of one immutable object), a flag-off counterpart pinning the old behavior, and the already-executed branch — including a failed execution and an owned input the Move call never mutates. E2E: reading the IOTA
CoinMetadatatwice within one epoch, on both schedulers. Protocol-config snapshots regenerated (one line per chain).Release Notes
pcool_skip_immutable_object_locks(protocol version 33): immutable transaction inputs no longer acquire owned-object locks in post-consensus conflict resolution. Inert unless the P-COOL flow is enabled.ObjectLockConflictagainst an immutable input (e.g. aCoinMetadata) for the remainder of an epoch under the P-COOL flow.🤖 Generated with Claude Code
https://claude.ai/code/session_01QHZ8T9kqPKHyM6s7gDuSpr