You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
#422 plumbs unverified_mirror_coin_id through the DHT provider announce and proves the epoch
re-announce. Nothing in production supplies a pointer.DhtHandle::new publishes none, so on a
real node every provider record carries None. Wire a real MirrorCoinPointers so the node
publishes the coin ids it actually holds.
Why this is a separate ticket and not a gap in #422
It is a layering boundary, not an oversight. dig-node-core holds no collateral-epoch
knowledge — constructing a real pointer source needs the mirror observation, which lives in dig-node-service (server.rs, mirror/). #422 correctly stopped at the seam rather than reaching
up a layer, and no surface claims the pointer is published, so the dormant state is honest rather
than a false capability.
Filing it because a dormant producer is exactly the thing that stays dormant: #422's acceptance —
a peer discovering this node's bond through the DHT — is not met by that merge alone, and without
a named ticket the gap lives only in a PR comment.
What must stay true when it is wired
The pointer is UNTRUSTED (NC-12). It tells a verifier where to look, never what the coin is.
A receiving peer must still accept a coin only on the coin's own evidence — at the mirror puzzle
hash, genuinely $DIG with the asset id re-derived from the creating spend, carrying the declared
collateral, and MirrorCoin::advertises(store, root, epoch) passing. Publishing a real pointer must
not tempt anything downstream into treating it as proof.
Its absence must keep meaning nothing is wrong. Nodes without a bond, and nodes that have not
observed one yet, publish None forever. That must remain an ordinary provider record, never a
fault and never a discovery penalty.
Re-announce on epoch rollover.dig-dht has no clock and republish re-attaches whatever was
recorded at announce time, so an un-refreshed pointer is wrong one epoch after publication and a correctly-collateralised node reads as uncollateralised. Attach unverified_mirror_coin_id at the DHT announce (blocked on the dig-dht 0.15 cascade) #422 built and proved this machinery;
this ticket must feed it fresh values rather than bypass it.
Blocked on, and the order
The pointer can only name a coin the node actually holds, so this needs the observation to be real on
a live node. Today it is not: #433 — dign mirror bond-states answers chain_unreadable on a synced node — and #424, since nothing can create a bond until a
broadcaster exists.
Do not wire this against a fabricated or optimistic source. A published pointer naming a coin this
node does not hold is a claim about money on a public DHT, and it is worse than publishing nothing.
Acceptance
On a real node holding a mirror coin, its DHT provider record carries that coin's id, and after an
epoch rollover the re-announced record carries the new epoch's coin — verified by reading the
record from a second node, not from the publishing node's own logs.
Parent epic: https://github.com/DIG-Network/dig_ecosystem/issues/3166
Sibling: #422 (which plumbs the pointer this ticket injects)
Task
#422plumbsunverified_mirror_coin_idthrough the DHT provider announce and proves the epochre-announce. Nothing in production supplies a pointer.
DhtHandle::newpublishes none, so on areal node every provider record carries
None. Wire a realMirrorCoinPointersso the nodepublishes the coin ids it actually holds.
Why this is a separate ticket and not a gap in #422
It is a layering boundary, not an oversight.
dig-node-coreholds no collateral-epochknowledge — constructing a real pointer source needs the mirror observation, which lives in
dig-node-service(server.rs,mirror/). #422 correctly stopped at the seam rather than reachingup a layer, and no surface claims the pointer is published, so the dormant state is honest rather
than a false capability.
Filing it because a dormant producer is exactly the thing that stays dormant:
#422's acceptance —a peer discovering this node's bond through the DHT — is not met by that merge alone, and without
a named ticket the gap lives only in a PR comment.
What must stay true when it is wired
A receiving peer must still accept a coin only on the coin's own evidence — at the mirror puzzle
hash, genuinely $DIG with the asset id re-derived from the creating spend, carrying the declared
collateral, and
MirrorCoin::advertises(store, root, epoch)passing. Publishing a real pointer mustnot tempt anything downstream into treating it as proof.
observed one yet, publish
Noneforever. That must remain an ordinary provider record, never afault and never a discovery penalty.
dig-dhthas no clock and republish re-attaches whatever wasrecorded at announce time, so an un-refreshed pointer is wrong one epoch after publication and a
correctly-collateralised node reads as uncollateralised. Attach unverified_mirror_coin_id at the DHT announce (blocked on the dig-dht 0.15 cascade) #422 built and proved this machinery;
this ticket must feed it fresh values rather than bypass it.
Blocked on, and the order
The pointer can only name a coin the node actually holds, so this needs the observation to be real on
a live node. Today it is not: #433 —
dign mirror bond-statesanswerschain_unreadableon a synced node — and#424, since nothing can create a bond until a
broadcaster exists.
Do not wire this against a fabricated or optimistic source. A published pointer naming a coin this
node does not hold is a claim about money on a public DHT, and it is worse than publishing nothing.
Acceptance
On a real node holding a mirror coin, its DHT provider record carries that coin's id, and after an
epoch rollover the re-announced record carries the new epoch's coin — verified by reading the
record from a second node, not from the publishing node's own logs.