Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
30 commits
Select commit Hold shift + click to select a range
e749884
chore(wallet): open the #502 lane -- bound total reservation hold
MichaelTaylor3d Sep 2, 2026
b579f64
test(wallet): pin the total reservation hold a repushed bundle may take
MichaelTaylor3d Sep 2, 2026
2728e57
fix(wallet): bound the total hold a repushed bundle may take on its i…
MichaelTaylor3d Sep 2, 2026
be772fb
chore: bump to 0.256.0, clear of #506's 0.251.0
MichaelTaylor3d Sep 2, 2026
fce2358
fix(wallet): drop the reason-conditional re-arm, keep the total-hold …
MichaelTaylor3d Sep 2, 2026
68ed674
Merge remote-tracking branch 'origin/main' into loop/502-reservation-…
MichaelTaylor3d Sep 3, 2026
10f0533
chore: renumber to 0.252.8, under the MSI ProductVersion ceiling (#521)
MichaelTaylor3d Sep 3, 2026
d1baaad
Merge remote-tracking branch 'origin/main' into loop/502-reservation-…
MichaelTaylor3d Sep 3, 2026
11d46af
style(wallet): rustfmt the two reserve_spend test call sites
MichaelTaylor3d Sep 3, 2026
e01173c
docs(wallet): drop a comment left behind by the reverted re-arm field
MichaelTaylor3d Sep 3, 2026
5c77870
Merge remote-tracking branch 'origin/main' into loop/502-reservation-…
MichaelTaylor3d Sep 3, 2026
00b7c7a
Merge remote-tracking branch 'origin/main' into loop/502-reservation-…
MichaelTaylor3d Sep 3, 2026
15341ee
Merge remote-tracking branch 'origin/main' into loop/502-reservation-…
MichaelTaylor3d Sep 3, 2026
f0a9726
chore(wallet): open the lane for dig-node#525 (clock-anchored reserva…
MichaelTaylor3d Sep 3, 2026
ffa907f
fix(wallet): repair a reservation whose deadline contradicts the cloc…
MichaelTaylor3d Sep 3, 2026
2edd624
style(wallet): rustfmt the two files touched by #525
MichaelTaylor3d Sep 3, 2026
ccea3a2
fix(wallet): correct the clock-anchor SPEC claim and pin the 110-minu…
MichaelTaylor3d Sep 3, 2026
4e356de
Merge remote-tracking branch 'origin/main' into loop/525-clock-anchor…
MichaelTaylor3d Sep 3, 2026
2979ec5
Merge remote-tracking branch 'origin/main' into loop/525-clock-anchor…
MichaelTaylor3d Sep 3, 2026
2d86761
Merge remote-tracking branch 'origin/main' into loop/525-clock-anchor…
MichaelTaylor3d Sep 3, 2026
4b64a89
chore(release): bump to 0.252.96 to clear sibling lanes
MichaelTaylor3d Sep 3, 2026
429c7bf
chore(release): merge main into loop/525-clock-anchor-bound (keep 0.2…
MichaelTaylor3d Sep 3, 2026
02aa836
chore(release): merge main into loop/525-clock-anchor-bound (keep 0.2…
MichaelTaylor3d Sep 3, 2026
04efa6e
chore(release): merge main into loop/525-clock-anchor-bound (keep 0.2…
MichaelTaylor3d Sep 3, 2026
b9a284a
chore(release): bump to 0.253.7 to avoid collision with sibling relea…
MichaelTaylor3d Sep 3, 2026
ee54274
chore(release): merge main into loop/525-clock-anchor-bound (keep 0.2…
MichaelTaylor3d Sep 3, 2026
e52ba43
chore(release): merge main into loop/525-clock-anchor-bound (keep 0.2…
MichaelTaylor3d Sep 3, 2026
4dc5d32
chore(release): bump to 0.254.3, resolve collision with #533 (0.254.1)
MichaelTaylor3d Sep 3, 2026
8699860
chore(release): merge main into loop/525-clock-anchor-bound (keep 0.2…
MichaelTaylor3d Sep 3, 2026
2ef052a
chore(release): merge main into loop/525-clock-anchor-bound (keep 0.2…
MichaelTaylor3d Sep 3, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ edition = "2021"
# the ROOT manifest (`[workspace.package].version`), so it MUST be set here for a
# release to fire (§3.6). The library crates (dig-node-core/dig-runtime/dig-wallet)
# keep their own independent versions — only the released binary tracks the workspace version.
version = "0.254.2"
version = "0.254.13"

# Release hardening, matching digstore: keep integer-overflow checks ON in release.
# The node parses untrusted serialized input and does offset/length arithmetic over
Expand Down
29 changes: 29 additions & 0 deletions SPEC.md
Original file line number Diff line number Diff line change
Expand Up @@ -5820,6 +5820,35 @@ MUST increment the attempt count, and MUST NOT rewrite the anchor. A re-push MUS
recorded deadline EARLIER, so that a clock which steps backwards cannot shorten a hold that is
already live.

The anchor and the deadline are both recorded from a wall clock, so a single bad clock reading can
record a deadline no honest push could have produced. A recorded deadline that exceeds the current
instant by more than `MAX_RESERVATION_HOLD_MS` MUST be treated as CONTRADICTING the clock, because a
deadline recorded honestly never exceeds its own anchor by more than that bound and an anchor never
follows the present moment. Such a reservation MUST be re-anchored to the current instant and granted
a fresh reservation lifetime — as though pushed now — before any expiry is evaluated, and the same
treatment MUST be applied to a client build-window hold, which MUST be re-granted its own maximum
lifetime from the current instant. Without this, a deadline recorded far in the future never
arrives, no re-push can move it inwards, and the coin is withheld from selection permanently with no
recovery available inside the product -- the lockout this section names as the worse failure, in its
unrecoverable form.

**The residual bound, stated exactly.** This repair does NOT reduce the worst case to
`MAX_RESERVATION_HOLD_MS`, and a node MUST NOT claim that it does. A forward clock glitch smaller
than `MAX_RESERVATION_HOLD_MS - RESERVATION_TTL_MS` is invisible to the test above by construction:
the first push records `expires_at = submitted_at + RESERVATION_TTL_MS`, so while the anchor leads
true time by at most that difference the recorded deadline never exceeds the observing instant by
more than the cap, and every later re-push carries a deadline drawn from the true clock, which
cannot exceed it either. The anchor therefore survives, and the total-hold cap pins the deadline at
`submitted_at + MAX_RESERVATION_HOLD_MS`. **A node MUST NOT hold a reservation beyond
`2 * MAX_RESERVATION_HOLD_MS - RESERVATION_TTL_MS` (110 minutes) measured from an instant the node
has actually observed**, and that bound is TIGHT: it is attained exactly when the forward glitch
equals `MAX_RESERVATION_HOLD_MS - RESERVATION_TTL_MS` and the caller keeps re-pushing.

That same difference is the bound seen from its other side: it is also the smallest BACKWARDS clock
step that can make the test fire on a reservation recorded honestly. The evasion window for a
forward glitch and the false-fire floor for a backwards step are one constant, and neither can be
narrowed without widening the other.

This bound is on CONTINUOUS hold. Once the deadline passes, the reservation and its coin claims are
released and the inputs become selectable again; a subsequent push of the same transaction is a new
reservation with a new anchor and MAY hold the inputs for a further full period. A node MUST NOT
Expand Down
Loading
Loading