Join our Newsletter — 33% off our NHI Course
Home› FAQ› Foundations & NHI Taxonomy› Why do local proofs in Move not fully…
Foundations & NHI Taxonomy

Why do local proofs in Move not fully establish security properties that depend on transaction history?

← Back to all FAQ
By NHI Mgmt Group Editorial Team Updated October 29, 2026 Domain: Foundations & NHI Taxonomy

Local proofs only cover the current function or module state, so they miss properties that emerge across multiple transactions, such as replay, sequencing, or balance changes over time. If security depends on history, the specification must model persistent state, caller behaviour and cross-transaction invariants, or a locally valid proof can still allow a broken system state.

Why local proofs in Move stop short of history-dependent security guarantees

Local proofs in Move reason about a function or module in isolation, so they establish that the checked code is internally consistent at one point in time. That is useful, but it does not prove properties that only emerge when state evolves across transactions, especially when later calls depend on earlier ones.

In practice, the gap appears whenever correctness depends on replay resistance, sequencing, cumulative balances, or a caller's prior actions. A proof can be locally sound and still leave the system open to a broken global state if the specification never models the persistent state transitions that make the property meaningful.

That is why history-sensitive claims must be written as stateful invariants, not as one-shot function properties. The proof has to describe how storage, caller behaviour, and allowed transitions interact over time, otherwise the verifier can confirm a narrow implementation detail while missing the security condition the protocol actually needs.

Where the proof model and the threat model diverge

The core limitation is not Move itself, but the boundary of the proof obligation. A local proof can show that a transaction respects its preconditions and postconditions, yet it cannot see whether repeated execution, reordered execution, or a prior failed attempt changes the meaning of the next call.

That matters for assets and authorisation flows that accumulate over time. If a transaction is safe only when it is the first one, or only after some previous state has been established, then the proof must include that history in the invariant. Otherwise, a sequence of individually valid actions can still violate the intended security property.

Classic security models are useful here because they separate local step checking from system-wide policy enforcement, which is the same conceptual gap that appears when a proof ignores history.

What a history-aware specification has to capture

A useful specification needs to say what remains true after every transaction, not just what is true inside one call. That usually means modelling persistent storage, permitted caller patterns, and the invariants that survive across repeated execution, rather than treating each transaction as independent.

This is especially important when the security condition depends on ordering, idempotence, or monotonic change. If a resource can be created, consumed, replayed, or transferred multiple times, the proof must track those transitions explicitly so that the verifier can reject states that become unsafe only after a sequence of actions.

Blockchain and Distributed Ledger Security Guide helps frame the broader trust problem, because ledger security depends on the validity of state transitions over time, not just isolated calls.

How to keep local correctness from hiding global failure

When a property depends on transaction history, the practical question is whether the proof language and the spec actually model the history that matters. If they do not, the safest interpretation is that the result is a partial guarantee, not a complete security argument.

That is why stateful invariants, transition rules, and caller assumptions need to be reviewed together. A locally valid proof should be treated as one input to assurance, while the system-level security claim still needs checks for replay, sequencing, and state accumulation across the full transaction lifecycle.

Mainframe and COBOL Application Security Guide is a useful analogy for transaction-sensitive assurance, because it shows why resource and transaction security must be reasoned about at the workflow level, not only at the statement level.

Standards & Framework Alignment

This section maps relevant standards and security frameworks to the operational risks and controls described in this guidance.

NIST SP 800-53 Rev 5, NIST CSF 2.0 and CIS Controls v8 set the governance and control requirements practitioners need to meet.

FrameworkControl / ReferenceRelevance
NIST SP 800-53 Rev 5SI-16 — Memory ProtectionHistory-sensitive proofs rely on persistent state remaining trustworthy across executions.
SA-8 — Security and Privacy Engineering PrinciplesThe question is about proof boundaries and designing assurance around system-level properties.
AU-2 — Event LoggingReplay and sequencing problems require transaction history to be observable for verification and review.
Recommendation — Protect persistent state so later transactions cannot silently alter the assumptions behind a verified action. Design specifications to cover end-to-end security properties, not just isolated functions. Log transaction sequences so reviewers can reconstruct state changes that affect security invariants.
NIST CSF 2.0ID.IM-01 — Improvements are identified from evaluationsHistory-dependent assurance gaps are found by reviewing whether the implemented control matches the intended property.
Recommendation — Review verified behaviour against real transaction history and refine the control when gaps appear.
CIS Controls v8CIS-8 — Audit Log ManagementThe issue hinges on preserving and reviewing transaction history to detect replay or sequencing failures.
Recommendation — Retain transaction history so you can validate whether observed state changes match the intended invariant.

Practitioner Guidance

What to verify: Treat any proof of a history-dependent property as incomplete until the specification explicitly covers persistent state, repeated calls, and the caller sequences that can change the outcome. If the invariant cannot be stated across transactions, the proof scope is too narrow for the security claim.

Decision rule: If the property can be broken by replay, reordering, or cumulative state change, write the spec as a cross-transaction invariant first, then prove the local function against that invariant. If not, do not present the result as a full security guarantee.

Practitioner takeaway: The main failure mode is confusing a correct local proof with a correct system property; history-dependent security only holds when the proof language models the state transitions that create the risk.

Free weekly newsletter

Subscribe to the NHI & AI Identity Journal

The latest on NHI and Agentic AI security – articles, research, breaches, news and events every week.

Bonus 33% off our NHI Course when you subscribe.

NHIMG Editorial Note
Reviewed and updated by the NHIMG editorial team on October 29, 2026.
NHI Mgmt Group — the #1 independent authority on Non-Human Identity, IAM, and Agentic AI security. nhimg.org