Abstract
Archon is a decentralized identity (DID) protocol implementing the W3C-compliant did:cid scheme. It provides a comprehensive peer-to-peer identity infrastructure that enables secure, verifiable decentralized identities anchored to IPFS and multiple blockchain registries. By separating DID creation (via content-addressable storage) from DID updates (via distributed registries), Archon achieves the unprecedented combination of instant, zero-cost identity creation with cryptographically secure, consensus-driven updates.
The digital age has created an identity paradox. While individuals generate more personal data than ever before, control over that data has concentrated in the hands of a few large platforms. Traditional identity systems—whether government-issued, corporate-managed, or platform-specific—share fundamental limitations: centralized control, single points of failure, and the inability to provide true user sovereignty.
Decentralized Identifiers (DIDs), as specified by the World Wide Web Consortium (W3C), offer a path forward. DIDs are globally unique identifiers that enable verifiable, decentralized digital identity without requiring a centralized registry. However, existing DID implementations face practical challenges: blockchain-based methods incur transaction costs and confirmation delays, while purely peer-to-peer approaches lack the finality guarantees required for high-stakes applications.
Archon addresses these challenges through a novel architectural approach that separates identity creation from identity updates, achieving both instant availability and cryptographic finality through its multi-registry design.
Current digital identity systems concentrate authority in centralized entities. Whether a government agency, a social media platform, or an enterprise identity provider, these systems create:
Existing blockchain-based DID methods face a trilemma between:
Even when decentralized identities exist, verifying them requires:
Many existing systems fail to provide portable, universally verifiable identity documents.
Archon’s fundamental insight is that DID creation and DID updates have fundamentally different requirements:
Creation requires:
Updates require:
By separating these concerns, Archon achieves optimal characteristics for each:

Rather than mandating a single consensus mechanism, Archon supports multiple registries, each with different characteristics:
| Registry | Confirmation Time | Cost | Finality | Best For |
|---|---|---|---|---|
| Hyperswarm | Seconds | Free | Eventual; competing updates resolved deterministically | Development, internal systems |
Bitcoin-family (BTC:mainnet, BTC:testnet4, BTC:signet) |
First confirmation, ~10 minutes on average | Miner fee per batch; testnet/signet use test coins | Strong proof-of-work finality; the mediator rewinds and re-imports after a reorg | Enterprise, legal identity, testing |
Zcash (ZEC:mainnet, ZEC:testnet) |
First confirmation in ~75 seconds | ZIP-317 conventional fee per batch; testnet uses test coins | Strong proof-of-work finality | Transparent Zcash anchoring |
Ethereum (ETH:mainnet, ETH:sepolia) |
After finalization, ~13 minutes | Gas for one ArchonRegistry transaction per batch |
Proof-of-stake finality; anchors are imported only once finalized | EVM anchoring and contract discovery |
Solana (SOL:mainnet-beta, SOL:devnet) |
After finalization, ~13 seconds | Lamports for one Memo transaction per batch | Proof-of-stake finality; anchors are imported only once finalized | High-throughput anchoring |
Users select their registry at DID creation based on their specific requirements, enabling a spectrum of security-cost trade-offs. A DID can later migrate to another registry with a signed update. Nodes also support the unanchored local and pin registries; the Gatekeeper specification describes their semantics.
Archon implements the full W3C DID specification, ensuring interoperability with the broader decentralized identity ecosystem:

The Gatekeeper serves as the authoritative local source for DID state. It:
Two interchangeable implementations exist, one in TypeScript and one in native Rust. They serve the same HTTP API, and a cross-implementation parity suite checks that they accept, reject and resolve operations identically.
The Keymaster is the wallet responsible for:
It runs as a library inside a client, or as a REST service used by the archon CLI, the demo clients and an MCP server for AI agents. TypeScript and Python implementations are kept in parity and read the same wallet format.
Drawbridge is the node’s public API gateway:
#lightning service entries, delegating invoices and payments to the Lightning mediatorHerald is the node’s name service. A user proves control of a DID through challenge-response, claims a short @name handle, and receives a verifiable credential attesting to it. Herald publishes its directory as JSON, IPNS, LUD-16 Lightning addresses, WebFinger and OpenID Connect.
An optional store-and-forward mailbox for DIDComm Messaging v2. Senders post encrypted envelopes; a recipient proves control of its DID and fetches its queued envelopes to decrypt locally. The relay holds no private keys and cannot read what it stores.
Mediators synchronize DID operations across network boundaries:
ArchonRegistry contracts
The did:cid method leverages Content Identifiers (CIDs) from IPFS to create self-certifying, content-addressed DIDs:
did:cid:<cid>[;service][/path][?query][#fragment]
Where:
cid: A CIDv1 encoded in base32 (multibase prefix ‘b’)Example:
did:cid:bafkreig6rjxbv2aopv47dgxhnxepqpb4yrxf2nvzrhmhdqthojfdxuxjbe
Archon supports two fundamental DID types:
Agent DIDs
Asset DIDs
{
"didDocument": {
"@context": ["https://www.w3.org/ns/did/v1"],
"id": "did:cid:bafkreig6rjxbv2aopv47dgxhnxepqpb4yrxf2nvzrhmhdqthojfdxuxjbe",
"verificationMethod": [{
"id": "#key-1",
"controller": "did:cid:bafkreig6rjxbv...",
"type": "EcdsaSecp256k1VerificationKey2019",
"publicKeyJwk": {
"kty": "EC",
"crv": "secp256k1",
"x": "...",
"y": "..."
}
}],
"authentication": ["#key-1"],
"assertionMethod": ["#key-1"],
"capabilityInvocation": ["#key-1"]
},
"didDocumentMetadata": {
"created": "2024-01-15T10:30:00Z",
"versionId": "bafkrei...",
"versionSequence": "1",
"confirmed": true
},
"didDocumentData": {},
"didDocumentRegistration": {
"registry": "hyperswarm",
"type": "agent",
"version": 1
}
}
Metadata members appear only when they apply: updated after the first update, deleted and deactivated: true after a delete, and timestamp when the document’s registry supplies one (§7.4). confirmed means every update in the resolved history was received on the registry its predecessor expects; the create operation counts as confirmed by definition, so confirmed: true does not show that the creation itself was anchored. The Gatekeeper specification defines the full resolution algorithm, and the standards-conformant /1.0/identifiers endpoint returns the W3C resolution subset.
All DID state changes occur through signed operations:
Create Operation
{
"type": "create",
"created": "2024-01-15T10:30:00Z",
"registration": {
"registry": "hyperswarm",
"type": "agent",
"version": 1
},
"publicJwk": {
"kty": "EC",
"crv": "secp256k1",
"x": "...",
"y": "..."
},
"proof": {
"type": "DataIntegrityProof",
"cryptosuite": "archon-ecdsa-secp256k1-jcs-2026",
"created": "2024-01-15T10:30:00Z",
"verificationMethod": "#key-1",
"proofPurpose": "capabilityInvocation",
"proofValue": "..."
}
}
Update Operation
{
"type": "update",
"did": "did:cid:bafkrei...",
"doc": {
"didDocumentData": {
"profile": {
"name": "Alice"
}
}
},
"previd": "bafkrei...",
"proof": {
"type": "DataIntegrityProof",
"cryptosuite": "archon-ecdsa-secp256k1-jcs-2026",
"created": "2024-01-16T14:00:00Z",
"verificationMethod": "did:cid:bafkrei...#key-1",
"proofPurpose": "capabilityInvocation",
"proofValue": "..."
}
}
Delete Operation
{
"type": "delete",
"did": "did:cid:bafkrei...",
"previd": "bafkrei...",
"proof": {
"type": "DataIntegrityProof",
"cryptosuite": "archon-ecdsa-secp256k1-jcs-2026",
"created": "2024-01-17T09:00:00Z",
"verificationMethod": "did:cid:bafkrei...#key-1",
"proofPurpose": "capabilityInvocation",
"proofValue": "..."
}
}
Operations on a blockchain registry may also carry a blockid naming a recent block, which gives the operation a lower timestamp bound (§7.4). Operations anchored before the archon-ecdsa-secp256k1-jcs-2026 suite existed carry the legacy EcdsaSecp256k1Signature2019 proof with proofPurpose: "authentication"; both Gatekeeper implementations accept those indefinitely, because every node replays its own history. The DID scheme specifies both suites and includes a checked, signed example.
One of Archon’s principal extensions is the didDocumentData field—an extension to the standard DID document structure that enables arbitrary application data to be stored alongside the identity itself. While the W3C DID Core specification defines the structure of didDocument and didDocumentMetadata, it also explicitly supports extensibility through additional properties.
The W3C DID specification states that DID methods may add custom properties beyond the core specification, provided they support lossless conversion between representations. Archon leverages this extensibility to introduce didDocumentData: a flexible, schema-free container for application-specific data that travels with the DID throughout its lifecycle.

Traditional DID systems treat identities as static containers for cryptographic keys and service endpoints. Archon recognizes that real-world identities are dynamic, accumulating attributes, relationships, and context over time. The didDocumentData field transforms DIDs from mere identifiers into rich, self-sovereign data containers.
Key Properties:
The didDocumentData extension unlocks an expansive range of applications that would be impossible or impractical with standard DID documents:
Users can publish verified credentials to their DID, creating a public or selectively-disclosed portfolio:
{
"didDocumentData": {
"manifest": {
"did:cid:bafkrei...degree": {
"type": ["VerifiableCredential", "UniversityDegree"],
"issuer": "did:cid:bafkrei...stanford",
"credentialSubject": {
"degree": "Bachelor of Science in Computer Science"
}
},
"did:cid:bafkrei...certification": {
"type": ["VerifiableCredential", "ProfessionalCertification"],
"issuer": "did:cid:bafkrei...aws",
"credentialSubject": {
"certification": "AWS Solutions Architect"
}
}
}
}
}
This enables LinkedIn-style professional profiles that are fully decentralized and cryptographically verifiable. The holder chooses what to disclose: a credential published without being revealed shows only its subject, and its claims appear in the manifest only when the holder reveals it.
The wallet’s seed bank is a DID derived from the recovery phrase itself (§10.1). A backup is an asset DID holding the encrypted wallet, and the seed bank points to it:
{
"didDocumentData": {
"wallet": "did:cid:bafkrei...backup"
}
}
The backup asset’s own data is { "backup": "<ciphertext>" }. Because the seed bank’s DID can be regenerated from the phrase, users can recover every backed-up identity, with its credentials and relationships, from the seed phrase alone.
Images, documents, and structured data become first-class citizens with their own DIDs:
{
"didDocumentData": {
"file": {
"cid": "bafkrei...",
"filename": "profile.png",
"type": "image/png",
"bytes": 48213
},
"image": {
"width": 512,
"height": 512
}
}
}
The bytes themselves live in IPFS under their CID; the asset DID records the reference and metadata, so updating the image is an ordinary signed update.
End-to-end encrypted messages stored with DIDs:
{
"didDocumentData": {
"encrypted": {
"cipher_hash": "a1b2c3...",
"cipher_sender": "encrypted-for-sender...",
"cipher_receiver": "encrypted-for-receiver..."
}
}
}
The sender is the asset’s controller and the creation time is in its metadata, so neither is repeated here. All three members are always serialized: cipher_hash is null unless the sender asks for a digest, as challenge responses do (§8.5), and cipher_sender is null when the sender opts out of a copy for themselves.
Groups with public membership lists, which can nest other groups:
{
"didDocumentData": {
"name": "Engineering Team",
"group": {
"version": 2,
"members": [
"did:cid:bafkrei...alice",
"did:cid:bafkrei...bob",
"did:cid:bafkrei...carol"
]
}
}
}
Short-lived pointers that tell recipients a DID is waiting for them, such as a D-Mail or a poll ballot:
{
"didDocumentData": {
"notice": {
"to": ["did:cid:bafkrei...recipient"],
"dids": ["did:cid:bafkrei...dmail"]
}
}
}
A notice carries no content of its own. It expires through the asset’s validUntil, after which nodes may garbage-collect it.
Polls among the members of a vault and its owner (§8.3). The poll definition is an encrypted vault item, readable only by them:
{
"version": 2,
"name": "budget-q4",
"description": "Approve budget proposal?",
"options": ["Yes", "No", "Abstain"],
"deadline": "2024-02-01T00:00:00Z"
}
The W3C DID Core specification explicitly supports extensibility. Section 4.1 states:
“For maximum interoperability, it is RECOMMENDED that extensions use the W3C DID Specification Registries mechanism… It is always possible for two specific implementations to agree out-of-band to use a mutually understood extension.”
Archon’s didDocumentData follows this guidance:
didDocumentData can still resolve and verify DIDsAll data in didDocumentData inherits the security properties of the DID system:
delete operation, after which resolution returns an empty didDocumentData and marks the document deactivatedRevocation is not erasure. The operation chain is append-only, so a revocation adds a version rather than removing earlier ones. Everything published in an earlier version remains in the operation history, in whatever IPFS pins and caches hold those operations, and in any copies third parties have already retrieved. Time-travel resolution (§8.1) to a version before the revocation still returns the earlier didDocumentData in full — the same property that makes the audit trail trustworthy makes revocation a change of current state, not a deletion.
Controllers should therefore treat anything written to didDocumentData as permanently published. Data that may later need to be withdrawn belongs behind a reference rather than in the field itself: an encrypted payload whose key can be destroyed, or a pointer to storage the controller operates.
| Approach | Storage | Verifiability | Cost | Flexibility |
|---|---|---|---|---|
| didDocumentData | Content-addressed; replication depends on the registry (§3.2) | Signed by the controller | No registry fee on Hyperswarm; per-batch fee on blockchain registries | Schema-free |
| Off-chain with hash | External systems | Hash-only | Variable | Full |
| Service endpoints | External URLs | None | Variable | Full |
| On-chain storage | Blockchain | Full | High | Limited |
The comparisons above are qualitative summaries rather than measurements. The didDocumentData approach trades the availability guarantees of a hosted system for controller-signed verifiability and, on Hyperswarm, no per-operation registry fee.
Archon’s registry system provides a unified interface across different consensus mechanisms:

The Hyperswarm registry provides fast, peer-to-peer operation distribution:
Characteristics:
previd chain, with a deterministic choice between competing updatesMechanism:
Best for: Development, testing, internal organizational use, applications where speed matters more than finality
Blockchain registries order updates through each chain’s consensus. Every chain mediator follows the same pattern:
{ "batch": { "version": 1, "ops": [<CID>, ...] } }Mediators skip batches whose content is not yet available and retry them later, keeping the original chain position.
Bitcoin-family (Satoshi mediator)
OP_RETURN outputZcash
OP_RETURN transaction, verified against a Zebra nodeEthereum
ArchonBatch event from the registry’s one canonical ArchonRegistry contractSolana
ARCHON_BATCH_V1: payload, signed by a deterministic registry signer so nodes can discover anchors by addressArchon provides automatic cryptographic timestamping for DID operations registered on block-producing registries. When a DID operation is anchored to Bitcoin, Zcash, Ethereum, Solana, or another blockchain registry, it inherits an immutable, independently verifiable timestamp from the block in which it was confirmed.

When resolving a DID, the didDocumentMetadata includes timestamp information:
{
"didDocumentMetadata": {
"created": "2024-01-15T10:30:00Z",
"updated": "2024-01-16T14:00:00Z",
"versionId": "bafkrei...",
"versionSequence": "2",
"confirmed": true,
"timestamp": {
"chain": "BTC:signet",
"opid": "bafkrei...",
"lowerBound": {
"time": 1705312800,
"timeISO": "2024-01-15T10:00:00Z",
"blockid": "00000000000000000002a7c4...",
"height": 826000
},
"upperBound": {
"time": 1705316400,
"timeISO": "2024-01-15T11:00:00Z",
"blockid": "00000000000000000001b8f2...",
"height": 826005,
"txid": "a1b2c3d4e5f6...",
"txidx": 42,
"batchid": "bafkrei...",
"opidx": 3
}
}
}
}
Lower Bound (optional): Created when the operation includes a blockid field referencing a recent block at the time of creation. This proves the operation was created after that block existed, establishing a “not before” time.
Upper Bound (present when the anchoring block is known): The block in which the operation batch was anchored. Unanchored registries such as Hyperswarm supply no bounds. This provides:
time: Unix timestamp of the blocktimeISO: Human-readable ISO 8601 formatblockid: The block hash (independently verifiable)height: Block height in the chaintxid: Transaction ID containing the batchtxidx: Transaction index within the blockbatchid: CID of the operation batchopidx: Index of this operation within the batch1. Legal Admissibility
Blockchain timestamps provide cryptographic proof of existence at a specific time. Unlike self-asserted timestamps, blockchain timestamps are:
This makes them suitable for legal contexts where proving “when” something happened matters:
2. Temporal Ordering
Within one chain, the ordinal key {block height, position in block, operation index} orders every anchored operation, resolving any ambiguity about which came first. The position is chain-specific: the transaction index on Bitcoin and Zcash, the log index on Ethereum, and the instruction index on Solana. Ordinals are never compared across chains. Solana instruction indices restart in every transaction, so equal ordinals can occur there, and the canonical CID then decides. This is critical for:
3. Trust Minimization
Traditional timestamping services require trusting a third party. Blockchain timestamps derive their trustworthiness from:
4. Proof of Non-Existence
The timestamp system also enables proving that something didn’t exist before a certain time. If an operation’s lower bound is block N, it cannot have existed before block N was mined.
| Registry | Typical Precision | Verification |
|---|---|---|
| Bitcoin-family | ~10 minutes (block time) | Full-node RPC |
| Zcash | ~75 seconds | Zebra-backed block and transaction checks |
| Ethereum | ~12 seconds | RPC log and block verification |
| Solana | Seconds | RPC signature and block-height verification |
| Hyperswarm | Self-asserted (proof.created) |
None beyond the signature |
Intellectual Property: Prove when a creative work was first registered, establishing priority for copyright or patent claims.
Credential Validity Windows: Verify that a credential was issued before its expiration date and hadn’t been revoked at the time of use.
Audit Compliance: Demonstrate that required attestations or certifications were in place at specific regulatory checkpoints.
Legal Evidence: Provide court-admissible proof of when digital agreements, signatures, or declarations were made.
Version Control: Establish authoritative ordering of document revisions or identity updates, preventing “time-warp” attacks.
Beyond the core DID functionality, Archon includes several advanced features that extend the protocol into a comprehensive identity and communication platform.
Archon supports resolving DIDs at any point in their history, enabling powerful audit and compliance capabilities.
Resolution Options:
// Resolve at a specific point in time
resolveDID(did, { versionTime: "2024-01-15T10:00:00Z" })
// Resolve a specific version number
resolveDID(did, { versionSequence: 3 })
// Stop at the first update not yet confirmed on the DID's registry
resolveDID(did, { confirm: true })
// Verify operation proofs while resolving
resolveDID(did, { verify: true })
How It Works:
Every update and delete operation includes a previd field linking to the previous operation, creating an immutable chain back to the create operation:

The resolver walks this chain, applying operations up to the requested time/version, then returns the reconstructed document state.
Use Cases:
Archon includes a complete decentralized email system built on top of the DID infrastructure:

Each message is a vault (§8.4) owned by the sender, with every to and cc recipient added as a member, so the sender and all recipients can decrypt it and no one else can.
Features:
inbox, sent, draft, archived and deletedunread tag for new messagesreference names the message being replied toMessage Structure (the encrypted dmail vault item):
{
"dmail": {
"to": ["did:cid:bafkrei...bob"],
"cc": ["did:cid:bafkrei...carol"],
"subject": "Meeting Tomorrow",
"body": "See you at ten.",
"reference": "did:cid:bafkrei...earlier-message"
}
}
The sender is the vault’s controller, and the send time comes from its metadata.
A poll is a vault (§8.4). Its eligible voters are the vault’s members plus the poll owner, who is eligible without being listed as a member, so the eligible count is the member count plus one. The poll definition (§6.3) is an encrypted vault item with a description, two to ten options and a deadline.
Voting:
{ poll, vote }, encrypted to the poll owner and to the voterPrivacy properties:
publishPoll publishes the tally alone by default, or every ballot with reveal.0 spoils the ballot. It counts as participation and is tallied separately as spoil, so voters can take part without choosing an option. It does not hide that the voter voted.Vaults are shared encrypted storage. The owner creates a vault, adds members, and adds items (files, messages, poll ballots); every member can decrypt the items.
How vaults work:
Secret membership. With the secretMembers option, the member list is encrypted to the owner alone, so members cannot list who else belongs. This keeps the roster from casual disclosure but is not anonymity: the salt is public, so anyone who can guess a DID can test whether it is a member.
Use cases:
Archon provides a flexible challenge-response system for authentication and authorization:

A challenge is a short-lived asset DID (valid for one hour by default) created by the verifier. Its DID is unique, so it serves as the nonce.
Challenge Types:
Challenge Structure (the challenge asset’s data):
{
"challenge": {
"credentials": [
{
"schema": "did:cid:bafkrei...employee-schema",
"issuers": ["did:cid:bafkrei...acme-corp"]
}
]
}
}
Response Structure (an asset encrypted to the verifier and signed by the holder):
{
"response": {
"challenge": "did:cid:bafkrei...challenge",
"credentials": [
{
"vc": "did:cid:bafkrei...credential",
"vp": "did:cid:bafkrei...presentation"
}
],
"requested": 1,
"fulfilled": 1,
"match": true
}
}
Each vp is the holder’s copy of a credential re-encrypted to the verifier. The verifier checks that it hashes to the same content as the issued credential vc, that the credential’s proof verifies against its issuer, and that the credential DID has not been revoked.
Archon integrates with the Bitcoin Lightning Network to enable instant, low-cost payments between DIDs. By binding Lightning capabilities directly to decentralized identities, Archon creates a payment layer where any DID holder can send and receive satoshis without revealing personal information.
An agent publishes its Lightning receiving capability by registering an invoice key with a Drawbridge gateway and adding a #lightning service entry to its DID document:
{
"didDocument": {
"service": [
{
"id": "did:cid:bafkrei...alice#lightning",
"type": "Lightning",
"serviceEndpoint": "https://drawbridge.example.com/invoice/bafkrei...alice"
}
]
}
}
Any party resolving the DID can discover the Lightning endpoint and initiate a payment without prior coordination. The endpoint host is the Drawbridge’s public address, which may be a Tor .onion address.
The Archon “zap” protocol enables sending satoshis to any DID, alias, or LUD-16 Lightning Address:
zap <recipient> <amount_sats> [memo]
DID/Alias Flow:
POST /lightning/zap), which forwards it to the Lightning mediator#lightning service endpoint.onion endpoints are reached via Tor; clearnet endpoints require HTTPS with SSRF protection)LUD-16 Address Flow (user@domain):
@ in the recipient string and sends the zap through Drawbridge to the Lightning mediatorhttps://domain/.well-known/lnurlp/user for the LNURL-pay metadata (SSRF-protected)Both flows return a paymentHash to the caller for tracking. This unified interface abstracts away the differences between DID-native Lightning endpoints and standard LNURL/Lightning Address recipients.
The wallet lists incoming and outgoing Lightning payments with their status:
{
"paymentHash": "a1b2c3...",
"amount": -1000,
"fee": 2,
"memo": "Thanks for the article",
"time": "2024-01-15T10:30:00Z",
"pending": false,
"status": "success"
}
amount is positive for incoming payments and negative for outgoing ones. status is pending, success or failed, and invoices also carry an expiry.
Drawbridge implements the L402 protocol (formerly LSAT) to enable machine-readable, pay-per-use access to API endpoints. L402 combines HTTP 402 (Payment Required) status codes with Lightning invoices and macaroon-based authentication tokens.
/api/v1 API, other than DID resolution, IPFS reads and status endpoints. The Herald, DIDComm relay, explorer, Lightning invoice and /1.0/identifiers routes are mounted outside the paywallAuthorization: L402 <macaroon>:<preimage>SHA256(preimage) == paymentHash) and validates the macaroon’s HMAC chain and caveats, then grants accessL402 enables fine-grained monetization of identity services:
This allows Archon node operators to charge for DID registration and updates and other /api/v1 operations without requiring user registration or payment processors, while anyone can still resolve DIDs for free.
Archon supports secure key rotation without changing the DID:

Security Properties:
previd namesArchon issues credentials in the W3C Verifiable Credentials Data Model 2.0, secured with Data Integrity proofs:
{
"@context": [
"https://www.w3.org/ns/credentials/v2",
"https://www.w3.org/ns/credentials/examples/v2"
],
"type": ["VerifiableCredential", "UniversityDegreeCredential"],
"id": "did:cid:bafkrei...credential",
"issuer": "did:cid:bafkrei...",
"validFrom": "2024-01-15T00:00:00Z",
"credentialSchema": {
"id": "did:cid:bafkrei...degree-schema",
"type": "JsonSchema"
},
"credentialSubject": {
"id": "did:cid:bafkrei...",
"degree": {
"type": "BachelorDegree",
"name": "Bachelor of Science"
}
},
"proof": [
{
"type": "DataIntegrityProof",
"cryptosuite": "archon-ecdsa-secp256k1-jcs-2026",
"created": "2024-01-15T00:00:00Z",
"verificationMethod": "did:cid:bafkrei...#key-1",
"proofPurpose": "assertionMethod",
"proofValue": "..."
},
{
"type": "DataIntegrityProof",
"cryptosuite": "eddsa-jcs-2022",
"created": "2024-01-15T00:00:00Z",
"verificationMethod": "did:cid:bafkrei...#key-assertion-1",
"proofPurpose": "assertionMethod",
"proofValue": "z..."
}
]
}
Keymaster stores an issued credential as an encrypted asset DID, then re-signs it with that DID as its id. The signature therefore covers where the credential lives, so a revoked credential cannot be copied under a fresh DID and presented as current. Every credential carries the archon-ecdsa-secp256k1-jcs-2026 proof. An issuer that has published an Ed25519 assertion key (publish-assertion-key) also adds an eddsa-jcs-2022 proof, a registered W3C suite that verifiers built for other DID methods, such as did:webvh or did:key tooling, can check without knowing anything about Archon. Credentials issued before either suite existed carry the legacy EcdsaSecp256k1Signature2019 proof and remain verifiable. A schema can set the credential’s context and type; without one, the type is VerifiableCredential alone.

Encryption
Bound Credentials
Hierarchical Deterministic Wallets (BIP-32)
Master Seed (BIP-39 Mnemonic)
│
└── m/44'/0'/{account}' one hardened account per identity
│
├── .../0/{index} signing key (change = 0)
│ rotation advances the index (§8.8)
│
├── .../1'/0' X25519 key agreement for DIDComm v2
│ (SLIP-0010 Ed25519, converted)
│
└── .../2'/0' Ed25519 assertion key (SLIP-0010)
for Data Integrity credential proofs
Each identity occupies its own hardened account. Signing keys live on the change = 0 branch and are indexed, so key rotation advances to the next index rather than deriving from a new account. Keys on other curves derive from the same BIP39 seed through SLIP-0010, which seeds each curve’s master node with a different HMAC key so no curve can reproduce another’s material. Those paths are hardened throughout, as SLIP-0010 requires for Ed25519, and the level below the account separates key types: 1' for key agreement, 2' for assertion. The X25519 key-agreement key used for DIDComm v2 messaging is derived as an Ed25519 key and converted, which is the relationship did:key defines between a z6Mk verification key and the key agreement key it resolves to. Because the derivation is standard rather than Archon-specific, any SLIP-0010 wallet given the mnemonic and the path arrives at the same keys. Both are deterministic from the seed: a given account and index always regenerate the same keys, so the messaging key needs no backup of its own. Recovery builds on the same property. The wallet’s seed bank is a DID whose creation operation is itself derived from the seed, so it resolves to the same identifier every time — a controller who has taken a wallet backup can therefore restore every identity from the mnemonic alone, with no DID, file, or other material to keep alongside it. What the mnemonic cannot do is reconstruct identities that were never backed up: key regeneration is deterministic, but the mapping from name to DID, account and key index lives in wallet metadata and comes back only from a published backup.
Key Types:
eddsa-jcs-2022 proofsOperations are signed with a DataIntegrityProof using the archon-ecdsa-secp256k1-jcs-2026 cryptosuite. The proof configuration is the proof without proofValue, and the signed digest covers both it and the operation:
digest = SHA256(
SHA256(JCS(proof_configuration)) ||
SHA256(JCS(operation_without_proof))
)
signature = ECDSA_sign(private_key, digest) // 64-byte r || s
proofValue = base64url(signature)
Verification recomputes the digest and checks the signature against the key the proof names. Because the configuration is inside the signature, its created time and proofPurpose cannot be altered without breaking it. The legacy EcdsaSecp256k1Signature2019 proofs signed SHA256(JCS(operation)) alone; they remain valid for history anchored before the new suite, and nothing new is signed that way except the seed bank’s deterministic create operation. The DID scheme specifies both suites.
DIDs are derived from content addresses:
operation = create_operation(public_key, registry, ...)
canonical = json_canonicalize(operation)
cid = IPFS_add(canonical) # CIDv1, base32
did = "did:cid:" + cid
This creates a self-certifying identifier: the DID itself proves the integrity of the creation operation.
Full Nodes
Light Clients
Registry Nodes
Tor Hidden Service Nodes
.onion addressHyperswarm DHT
IPFS Network

Individuals create and control their own digital identities without relying on any central authority:
Organizations deploy Archon for decentralized employee and partner identity:
Universities and certification bodies issue verifiable credentials:
Connected devices receive unique, verifiable identities:
Organizations implement transparent voting systems:
Node operators monetize identity services using Lightning micropayments:
Track ownership and authenticity of digital assets:
Autonomous and semi-autonomous AI agents need durable identities, scoped authority, and auditable action histories:
| Feature | did:cid (Archon) | did:btcr | did:webvh | did:key |
|---|---|---|---|---|
| Creation Cost | No registry fee (Hyperswarm) | On-chain transaction fee | No registry fee | No registry fee |
| Creation Speed | Instant | Minutes | Instant | Instant |
| Update Support | Yes | Yes | Yes | No |
| Decentralized | Full | Full | Partial | Full |
| Finality Options | Multiple | Strong | Optional witnesses | N/A |
| Credential Support | Full | Limited | Full | Limited |
| Key Recovery | BIP-39 | Varies | Optional pre-rotation | N/A |
| Arbitrary Data Storage | Yes (didDocumentData) | External only | External only | No |
| Blockchain Timestamps | Automatic (with bounds) | Implicit | No | No |
| Time-Travel Resolution | Yes | No | Yes | No |
| Built-in Messaging | Yes (D-Mail, DIDComm v2) | No | No | No |
| Lightning Payments | Yes (L402 + Zaps) | No | No | No |
| API Monetization | Yes (L402) | No | No | No |
| Tor Hidden Services | Yes | No | No | No |
| Voting/Governance | Yes | No | No | No |
The graded entries above — “Full”, “Partial”, “Strong”, “Limited”, “Multiple”, “Varies” — are the authors’ qualitative reading of each method’s published specification at the time of writing, not measured results, and the columns for other methods summarize their specifications rather than any particular implementation. Cost rows state registry fees only; they exclude the cost of operating or reaching a node, and any domain or hosting a method requires. Readers comparing methods for a specific deployment should consult each method’s specification directly.
did:btcr
OP_RETURN rather than stored on chain, so the document’s availability rests off chain even though its ordering does notdid:ion
did:webvh
did:web plus a verifiable history: every DID document version is chained to its predecessor and to a self-certifying identifier embedded in the DID, so the log of updates can be verified rather than trusteddid:key
did:cid (Archon)
Multi-Signature Support
Zero-Knowledge Proofs
Cross-Network Identity
eddsa-jcs-2022 credential proofs other methods can already verifyA DID can already migrate between registries, including between blockchains, with a signed update.
Schema Registry
Trust Frameworks
Layer 2 Scaling
Archon represents a significant advancement in decentralized identity technology. By separating identity creation from updates and supporting multiple registry options, it solves the fundamental tension between decentralization, cost, and speed that has limited previous approaches.
Key innovations include:
The protocol is production-ready, with interchangeable TypeScript and Rust Gatekeepers, TypeScript and Python Keymasters, multiple clients (CLI, web, mobile, browser extension, and an MCP server for AI agents), a Lightning-enabled API gateway (Drawbridge), a name service (Herald), robust cryptographic foundations, and extensive testing. Organizations seeking to implement decentralized identity infrastructure will find Archon provides the flexibility, security, and performance required for diverse use cases.
As the digital identity landscape continues to evolve, Archon’s modular architecture positions it to adapt to new requirements while maintaining backward compatibility and the core principles of user sovereignty and decentralization.
# Initialize wallet with new seed phrase
./archon create-wallet
# Create a new identity
./archon create-id alice
# Resolve the current identity
./archon resolve-id
# Back up wallet to file
./archon backup-wallet-file wallet-backup.json
Copyright 2026 Archetech. Released under MIT License.