The seam: LineageAnchor
The backend is pluggable through one small trait. Every backend — Sigil’s
GAL, an EAS attestation chain, a certificate transparency log — implements
the same read-only shape:
- check_revocation(did) — revocation-first: is this subject revoked?
- get_hmr / get_mhr / get_enr(did) — the typed root anchor, if any
- get_org_root(org_did) — the org’s Merkle lineage root (optional)
- current_finalized_block() — the backend’s finalized height
Anchor references in the document
A lineage section may carryanchorRefs naming the backends the
registration was anchored to:
- scheme names the backend:
sigil,eas,ctlog, or a future registered name. Unknown schemes are additive, never breaking — a verifier ignores schemes it does not support rather than rejecting the document. - locator addresses the record within the backend: a transaction hash
(
sigil), an attestation UID (eas), a log-id:index (ctlog). - inclusionProof binds the locator to the backend’s canonical root. Self-proving schemes (EAS) carry none; batch-Merkle schemes require one.
anchor:<scheme>:<locator>. Full schema:
specification section 9.2.1.
The verifier’s anchor policy
Which schemes a verifier requires is policy, not document content:The backends
Sigil (reference)
Sigil’s Global Authority Ledger is the reference backend and the home of the lineage economics: typed edges, root anchors, org lineage roots, revocation-first RPC, shard topology, publisher bonds, and generation-decay rewards. The production adapter (mars-protocol::SigilAnchorClient → LineageAnchor) lives in
sigil-sdk.
EAS
The Ethereum Attestation Service is the first foreign anchor. Root anchors are attestations under the OAS lineage schema (string did,string kind,string status,string metadataCommitment,uint64 anchoredAtBlock), addressed to a deterministic per-DID recipient
(blake3(did)[0..20]), newest supersedes oldest. Resolution via EAS
GraphQL plus JSON-RPC finality (oas-anchor-eas in Rust,
@openagentid/anchor-eas in TypeScript, which also publishes via the
maintained EAS SDK). Org roots are not modeled on EAS in v1.
The cost pattern: batch-Merkle
Per-registration chain writes do not scale. Publishers batch: collect an epoch’s registrations, build a Merkle tree, publish the root once, and give every registration its inclusion path in itsanchorRef. One write
commits the epoch; every event verifies offline against it. The full
operational pattern is in ANCHORING.md (in the oas repository), covering
epochs, finality arithmetic, revocation-by-supersession, and why proofs
must never live server-side.
The rules
- Proofs offline, authority anchored. Never confuse the two.
- Trusted schemes are verifier policy. Documents declare anchors; verifiers choose which they trust.
- Unconfirmed is not authoritative. An anchor beyond the finalized block is rejected until confirmed.
- Fail closed on authority. An unreachable anchor means no, never maybe.
Next
- DID resolution — stage 7 uses this layer
- Lineage — the proofs this layer authorities
- Conformance — the vectors gating the semantics