Skip to content

NC-12: the anchored root — the fact content-serve pins on — comes from ONE hardcoded HTTP third party #365

Description

@MichaelTaylor3d

Task

The anchored-root chain fact — the one the content-serve pin acts on — is resolved from a SINGLE
hardcoded HTTP third party on every default install.
Corroborate it, or state honestly that it is not.

The path

dig-node-core/src/lib.rs:4460, :4731
  -> default_anchored_resolver()
  -> seams/chia_peer/coinset_resolver.rs:120
  -> resolution_coinset()  (:17 — hardcoded HTTP coinset)

Also single-sourced, same enumeration: lib.rs:2724, :3650, :3709, and melt confirmation
seams/dig_peer/store_melted.rs:588 (partly https://github.com/DIG-Network/dig_ecosystem/issues/2093).

Why this is the NC-12 blocker rather than a nice-to-have

https://github.com/DIG-Network/dig_ecosystem/issues/2790's acceptance requires that every chain fact
the node acts on is corroborated across several concurrently-queried untrusted peers. Measured against
origin/main @ 4efa57fc, most are: peak_height (chain.rs:196-201), coin_record_by_id (:339),
coin_spend (:348) and their cached variants (:359-372) all go through the corroborated path.

The anchored root does not — and it is the fact that decides which bytes a user is served. A single
third party that lies about it redirects content on every default install, with the pin fail-closed
against the wrong root rather than the right one.

NC-12 exists precisely to stop one voice determining a chain fact. This is one voice deciding the
most user-visible fact the node holds.

Also uncorroborated, and in scope

coin_records_by_puzzle_hashes (chain.rs:327), _by_hints (:333), _by_parent (:374), and
mempool submission (:285-291).

Scope — a finite checklist so this can close

  • Anchored-root resolution corroborated across several independently-held sources, or the
    single-source property stated in SPEC.md as a named, accepted limitation with its blast radius
  • coin_records_by_puzzle_hashes / _by_hints / _by_parent — corroborated, or same treatment
  • Mempool submission — corroborated, or stated
  • A test per corroborated path proving a single dissenting source causes a refusal, not a repaired
    value
    , each with a control that kills the always-refuse implementation

"State it honestly" is a real option and sometimes the right one. What is not acceptable is a SPEC
that implies corroboration the code does not perform — that is the false-satisfaction class #2790 was
opened to end.

The trap to avoid

Do not add corroboration by consulting the same endpoint twice. Two providers that both resolve to
api.coinset.org are one voice — that exact defect was found and fixed in dig-wallet on
#354, where a 2-of-2 "independent-group" quorum was satisfied
by one endpoint with max_peers: 0. Independence must be derived from what a fabric can reach, not
from its type.

Context

Effort

High — this is the largest remaining piece of NC-12, and the anchored-root half touches the content-serve
trust boundary.

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