DID structure
A Sigil DID has the form:| Kind | Description | Signing material |
|---|---|---|
hmr | Human Master Root. Single accountable human. | Ed25519 keypair, owner-held. |
mhr | Multi-Human Root. Group acting under a FROST threshold. | t-of-n FROST shares. |
agent | Autonomous descendant of an hmr or mhr. | Ed25519 keypair, owner-derived. |
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: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, or0xabc...123are 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 anhmr or mhr root.
A lineage proof is a JCS-canonicalised JSON object signed with the parent’s Ed25519 key:
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:- The user pre-registers
Mguardian DIDs at wallet setup with thresholdN(e.g. 3-of-5). - The wallet generates a panic-abort key and stores it offline.
- The user notifies guardians off-chain that recovery is needed.
- At least
Nguardians sign a FROST recovery authorisation.
InitiateRecoveryis submitted with the guardian threshold signature. A 30-day timelock starts.- During the timelock the original key holder can submit
AbortRecoveryusing the pre-registered panic key. - After the timelock,
FinalizeRecoveryrotates the DID’s signing key to the new public key.
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:- The DID string.
- The DID document.
- The chain of lineage proofs up to the root.
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
@aliceresolves todid: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.
@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.