Skip to content

Nothing binds a mirror coin's owner to a DHT peer id — verification cannot name a claimant #473

Description

@MichaelTaylor3d

Task

The hint-scan fallback that both dig-node#466 and dig-dht's record.rs prescribe cannot be initiated from a provider record. Give the verifier a way to reach it.

The gap

dig_mirror_coin::discover requires owner_puzzle_hash — the namespace hint is morphed from it, so there is nothing to scan without it. A dig_dht::ProviderRecord carries a peer id, addresses, an expiry, and the optional unverified_mirror_coin_id. It carries no owner, and no peer_id → owner_puzzle_hash resolution exists anywhere in the repo.

So the fallback is unreachable from the only place that needs it.

Why this matters more than it looks

The contract is explicit that absence of the pointer is NORMAL — a publisher that has not created its coin yet, an older publisher, and one mid-epoch-rollover all legitimately omit it — and that a verifier MUST fall back to the hint scan, "slower, not weaker".

With no fallback, that inverts: a publisher who omits the pointer can never be positively verified, only left Unverified. The pointer becomes effectively mandatory for ranking, which is exactly what the contract says it must not be. The field is named unverified_ because it is meant to be an optional shortcut; today it is the only road.

PR #467 delivers the correct effect for the absent case — zero chain reads, holder unmoved, ranked Unverified — and its lane declared this limitation rather than faking a fallback. That is the right call; this ticket is the follow-through.

Two shapes, and the choice is not obvious

  1. Add an owner field to ProviderRecord. Direct, but it is a wire change in dig-dht (release-first, §4.1), it grows every record whether or not anyone verifies, and the owner would be self-declared by the announcing peer — so it is another untrusted input, not an authority. A lying owner sends the verifier scanning the wrong hint bucket, which fails closed but wastes the read.
  2. Resolve peer_id → owner out of band. No wire change, but it needs a source of truth that does not exist yet, and a lookup on the read path is the cost the pointer was introduced to avoid.

Settle it before building (§1.10). Whichever is chosen, state what happens when the owner is wrong or absent — a scan against a wrong owner must be indistinguishable in outcome from no scan at all.

Two adjacent findings from the same lane, recorded so they are not rediscovered

  • ProviderRecord::content_key is a hash, not the content id. A verifier can only obtain (store, root) from the id the caller asked about — so any future consumer holding only a record, with no caller context, cannot verify at all. That constrains where verification can ever live.
  • A ContentId::Store-granularity claim is unverifiable by construction. A coin bonds (store, root, owner, epoch), so a store-wide claim names no generation. It is currently Unverified; whether that should be stated normatively is worth deciding.

Acceptance

A provider record with no unverified_mirror_coin_id whose publisher does hold a valid mirror coin is positively verified as Bonded — proven by a test with exactly that setup. Plus the control: a record whose publisher holds no coin stays Unverified or Unbonded, and a wrong owner yields no worse than the absent case.

Parent

Verification #466 · epic https://github.com/DIG-Network/dig_ecosystem/issues/3166

Metadata

Metadata

Assignees

No one assigned

    Labels

    kind:businessa person can DO something new, or money moves, or a shipped surface stops lying to them

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions