Every account on Sigil is a W3C Decentralised Identifier (DID) under the Open Agent Specification. The chain enforces identity at three layers: the DID itself, a lineage anchor (GAL), and a recovery group.

DID structure

A Sigil DID has the form:
did:oas:sigil:<kind>:<identifier>
Three kinds are lineage-bearing:
KindDescriptionSigning material
hmrHuman Master Root. Single accountable human.Ed25519 keypair, owner-held.
mhrMulti-Human Root. Group acting under a FROST threshold.t-of-n FROST shares.
agentAutonomous descendant of an hmr or mhr.Ed25519 keypair, owner-derived.
Other OAS kinds (tool, skill, workflow, model, dataset, service) are recognised but do not hold balances or sign transactions.

Address derivation

Sigil derives addresses from the DID, not from the public key:
address = blake3(did_canonical_form_bytes)[..32]
did_canonical_form_bytes is the lowercased, whitespace-stripped UTF-8 serialisation. The canonicalisation algorithm is pub fn canonicalize_did in node/sigil-core/src/address.rs (re-exported from node/sigil-core/src/lib.rs). This scheme has three consequences:
  • Stable under key rotation. Rotating signing material (key update, MHR threshold reconfiguration, or HMR→MHR transition) does not change the address. Balances stay where they are.
  • Globally derivable. Anyone who knows your DID can compute your address. Privacy is opt-in: mint a fresh did:oas:sigil:agent:<random> per use case.
  • Wallet UX unified. Sending to @alice, did:oas:sigil:agent:alice, or 0xabc...123 are computationally identical. Wallets surface all three at confirmation time.

Lineage and GAL anchors

Every agent DID carries a signed lineage proof linking it to a parent. The parent’s DID document carries its own lineage proof. The chain terminates at an hmr or mhr root. A lineage proof is a JCS-canonicalised JSON object signed with the parent’s Ed25519 key:
{
  "parent": "did:oas:sigil:hmr:alice",
  "child": "did:oas:sigil:agent:alice-trader",
  "child_pubkey": "ed25519:Bx9...",
  "issued_at": 1715000000,
  "anchor_height": 1024533
}
The anchor is committed on-chain via RegisterGalAnchor. Verifiers walk the chain offline using stored Ed25519 keys; no consensus interaction is required after registration.

Recovery ceremony

When the user loses their primary signing key, recovery is coordinated by a guardian group. Setup:
  1. The user pre-registers M guardian DIDs at wallet setup with threshold N (e.g. 3-of-5).
  2. The wallet generates a panic-abort key and stores it offline.
  3. The user notifies guardians off-chain that recovery is needed.
  4. At least N guardians sign a FROST recovery authorisation.
On-chain flow:
  1. InitiateRecovery is submitted with the guardian threshold signature. A 30-day timelock starts.
  2. During the timelock the original key holder can submit AbortRecovery using the pre-registered panic key.
  3. After the timelock, FinalizeRecovery rotates the DID’s signing key to the new public key.
Because addresses derive from DIDs, balances and all state references move automatically. Implementation: aegis/aegis-keys/src/{threshold,recovery}.rs (FROST primitives), node/sigil-core/src/recovery.rs (on-chain types), node/sigil-node/src/executor_recovery.rs (state transitions).

OAS off-chain verification

DID documents are persisted off-chain (CAS) but committed on-chain. The off-chain documents include public keys, lineage proofs, and capability declarations. They are content-addressed and signed. Offline verification of a Sigil identity requires:
  1. The DID string.
  2. The DID document.
  3. The chain of lineage proofs up to the root.
The verification algorithm is open-sourced in oas/oas-sdk-rust and is identical across all OAS SDKs (Rust, TypeScript, Go, Python, Swift, Kotlin, vanilla JS). For the peer-to-peer side — how the same DIDs propagate across nodes, sign Strand blocks, and gate replication — see Weave’s identity adapters and the Ed25519 reference implementation.

Privacy posture

Sigil prioritises human-readable identity over wallet privacy. The tradeoffs:
  • Username @alice resolves to did:oas:sigil:agent:alice, which derives to an address. All three are publicly linked.
  • Full transaction history is queryable from any of the three.
  • For privacy-sensitive activity, users mint a fresh agent DID per context.
Wallets that ship @username support must display the public-identity warning at first-time send (defined in node/sigil-core/src/username.rs). See usernames for the full wallet UX requirement.