Skip to content

Nothing supplies a MirrorCoinPointers in production, so every provider record publishes None #435

Description

@MichaelTaylor3d

Parent epic: https://github.com/DIG-Network/dig_ecosystem/issues/3166
Sibling: #422 (which plumbs the pointer this ticket injects)

Task

#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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions