did:cid design: content-addressed creation, registry-backed updates.This deck is for engineers, architects, and technical product leaders who already understand public-key cryptography, content addressing, distributed systems, or decentralized identity at a high level. The goal is to make the did:cid method concrete enough that they can reason about its security model and implementation trade-offs.
did:cid separates identity creation from identity mutation.
Creation is instant and free because the DID is derived from the CID of a canonicalized create operation stored in IPFS. Updates are ordered and confirmed by a registry selected at creation time, such as hyperswarm for fast peer gossip or Bitcoin registries for stronger finality. Resolution reconstructs the current or historical DID document by combining the immutable IPFS seed with valid registry events.
did:cid: Content-addressed decentralized identifiers
Speaker note:
Introduce did:cid as the DID method implemented by Archon. The technical thesis is simple: identifiers can be self-certifying at creation while still supporting mutable, verifiable identity history.
Speaker note:
Most DID methods pay the same cost for every lifecycle stage. did:cid treats creation and updates as different distributed-systems problems.
| Lifecycle stage | Requirement | did:cid mechanism |
|---|---|---|
| Create | Fast, free, decentralized | Canonical JSON operation pinned to IPFS; CID becomes DID suffix |
| Update | Ordered, auditable, replay-resistant | Signed operation anchored to selected registry |
| Resolve | Deterministic reconstruction | Seed + ordered valid updates |
| Verify | Historical key correctness | Resolve signer at proof.created |
Speaker note: The important move is avoiding a blockchain write for the initial identity. The initial DID is a content address, so the identifier itself commits to the creation operation.
did:cid:<cid>[;service][/path][?query][#fragment]
Example:
did:cid:bagaaieratxbzo7e4dqup37h7j6hs7kzpamevy4qud4psj23p3r3grzd2rjca
Key properties:
did:cidSpeaker note: The suffix is not an arbitrary identifier. It is a content identifier for the canonicalized create operation.
| Type | Has keys? | Controlled by | Typical uses |
|---|---|---|---|
| Agent | Yes | Its own private key holder | users, services, issuers, verifiers, nodes |
| Asset | No | A controller agent DID | credentials, schemas, files, groups, challenges, responses |
Speaker note: This is an important modeling choice. Not everything needs to sign. Assets are addressable, resolvable, and controllable without pretending every object is an autonomous principal.
Create operation ingredients:
type: "create"registration.version: 1registration.type: "agent"registration.registry, such as hyperswarm or BTC:signetpublicJwk with secp256k1 public key materialcreated timestampproof signed by the corresponding private keyNode behavior:
did:cid:<cid>.Speaker note:
For an agent create operation, the proof uses #key-1 as a relative verification method because the DID does not exist until after the CID is computed.
Asset create operation ingredients:
type: "create"registration.type: "asset"controller: "did:cid:..."dataNode behavior:
Speaker note: Asset DIDs make credentials, schemas, group definitions, vault metadata, and similar objects first-class identity-layer objects.
Update operation ingredients:
type: "update"diddoc, containing any changed document fieldsprevid, the previous operation CID or version identifierblockid for blockchain anchoring contextValidation checks:
previd matches the latest known version.Speaker note:
previd gives each update a parent. The registry gives ordering and confirmation. Together, they make replay and fork handling explicit.
Delete is a terminal update:
type: "delete"didprevidResolution after revocation:
deactivated: true.Speaker note: Revocation is intentionally final. If you need recoverability, solve key recovery before deletion, not after deletion.
Pseudocode:
resolve(did, versionTime = now):
cid = suffix(did)
seed = ipfs.get(cid)
registry = seed.registration.registry
events = registry_events_for(did, registry)
doc = document_from_seed(seed)
for event in chronological(events):
if event.time > versionTime:
break
if valid_proof(event, doc) and valid_previd(event, doc):
doc = apply(event, doc)
return doc
Speaker note: Resolution is deterministic reconstruction, not a database lookup of the latest blob. A resolver can answer “what is true now?” and “what was true then?”
When verifying a signed object:
verifyProof(object):
signerDid = proof.verificationMethod.did
signerDoc = resolve(signerDid, versionTime = proof.created)
publicKey = signerDoc.verificationMethod[keyId]
verify signature with publicKey
Why it matters:
Speaker note: This is the security detail worth slowing down for. The verifier must resolve the signer at the proof time, not only at the current time.
| Registry | Strength | Latency | Cost | Best fit |
|---|---|---|---|---|
local |
Local-only | Immediate | Free | development, isolated testing |
hyperswarm |
Peer-distributed eventual consistency | Seconds | Free | fast P2P environments |
BTC:signet / BTC:testnet4 |
Blockchain-style ordering for test networks | Block cadence | Test funds | staging and protocol tests |
BTC:mainnet |
Bitcoin-anchored ordering and timestamping | Block cadence | Batch fee | high-value updates |
Speaker note:
did:cid does not make every identity pay for maximum finality. The registry is selected based on the risk and cost profile.
Core services:
Speaker note: Gatekeeper is the protocol enforcement point. Keymaster is the private-key boundary. Mediators are how registry-specific networking stays modular.
Minimal technical demo:
./archon create-id --registry hyperswarm alice
./archon resolve-id
./archon create-schema --registry hyperswarm ./schema.json
./archon rotate-keys
./archon backup-wallet-did
Alternative API-level demo:
POST /api/v1/did/generate -> deterministic DID preview
POST /api/v1/did -> create/update/delete operation
GET /api/v1/did/:did -> resolution
GET /api/v1/registries -> supported registries
Speaker note: Pick one path. CLI demos are easier for flow; API demos are better if the audience wants implementation details.
Security relies on:
previd continuity across updates and deletes.Speaker note: This is where to be precise: IPFS gives content integrity and retrieval; registries give update ordering and finality; signatures give controller authorization.
Strengths:
Trade-offs:
Speaker note: This is not magic decentralization dust. The value is that each responsibility is assigned to a mechanism with suitable properties.
| Method family | Creation cost | Updates | Availability model |
|---|---|---|---|
did:key |
Free | None / immutable | Embedded key material |
did:web |
Cheap | Web server / DNS / TLS | Domain control |
| blockchain DID methods | Transaction cost | On-chain or layer-specific | Chain availability |
did:cid |
Free via IPFS CID | Pluggable registry | IPFS seed + registry history |
Speaker note: The useful contrast is not “which method wins everywhere.” It is where each method puts trust, cost, and mutability.
Takeaways:
did:cid makes the initial DID self-certifying through content addressing.Speaker note:
End with the architectural sentence: did:cid is a DID method where creation is a content-addressed fact and updates are a registry-ordered history.
previd.docs/scheme.md: did:cid method specification.docs/WHITEPAPER.md: protocol rationale and architecture.docs/services/gatekeeper/README.md: service contract, deterministic DID generation, proof rules, and resolution algorithm.README.md: project overview and component framing.