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
- 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.
- 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
Task
The hint-scan fallback that both dig-node#466 and
dig-dht'srecord.rsprescribe cannot be initiated from a provider record. Give the verifier a way to reach it.The gap
dig_mirror_coin::discoverrequiresowner_puzzle_hash— the namespace hint is morphed from it, so there is nothing to scan without it. Adig_dht::ProviderRecordcarries a peer id, addresses, an expiry, and the optionalunverified_mirror_coin_id. It carries no owner, and nopeer_id → owner_puzzle_hashresolution 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 namedunverified_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
ProviderRecord. Direct, but it is a wire change indig-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.peer_id → ownerout 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_keyis 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.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 currentlyUnverified; whether that should be stated normatively is worth deciding.Acceptance
A provider record with no
unverified_mirror_coin_idwhose publisher does hold a valid mirror coin is positively verified asBonded— proven by a test with exactly that setup. Plus the control: a record whose publisher holds no coin staysUnverifiedorUnbonded, and a wrong owner yields no worse than the absent case.Parent
Verification #466 · epic https://github.com/DIG-Network/dig_ecosystem/issues/3166