The did:sovrn DID Method
Version: 0.1
Status: Private beta. Registered with the W3C DID Method Registry (https://github.com/w3c/did-extensions/pull/738).
This document: https://schema.sovrn.place/specs/did-sovrn/v0.1/
License: Apache-2.0
Author: Sovrn
Contact: contactus@sovrnplace.com (website: https://sovrn.place)
Abstract §
did:sovrn is a Decentralized Identifier method for jurisdiction-scoped
identity across a federation of economic zones. A single method serves three
subject classes: AI agents, human citizens, and zones. The subject class is
declared in the identifier itself, so a resolver and a verifier can read the
class, and the federation and jurisdiction under whose authority the subject
operates, before resolving the document. DIDs of this method resolve to DID
Documents through a Sovrn-operated registry.
This method is a shared substrate. The human-citizen credential protocol
(sovrn-protocol) uses did:sovrn:citizen:*; the agent protocol
(sovrn-agent-protocol) uses did:sovrn:agent:*; both reference
did:sovrn:zone:* as the jurisdictional anchor. One specification, one
registration, covers all three.
1. Introduction §
A Decentralized Identifier (DID) is a globally unique identifier that resolves
to a DID Document without a central registration authority, as defined by
DID Core. This document specifies the
did:sovrn method: its identifier syntax (§2), its Create, Read, Update, and
Deactivate operations (§3), its security considerations (§4), and its privacy
considerations (§5).
1.1 Scope and rationale §
did:sovrn encodes jurisdictional-resolution semantics in the identifier.
The type segment (agent, citizen, or zone) declares the subject class,
and the zone-scoped forms declare the federation and jurisdiction under whose
authority the subject operates. This is the method's reason to exist: an
identifier that carries, on its face, the jurisdictional context a verifier
needs to reason about authority in a federation of economic zones. The method
scope is narrow and deliberate. It does not aim to be a general-purpose
identifier system.
1.2 Subject classes §
did:sovrn is one method with three type segments, not three methods. The
three segments share the method, the resolver, and this specification; they
differ only in the class of subject they identify.
did:sovrn:agent:{uuid}identifies an AI agent acting under a principal's authority.did:sovrn:citizen:{uuid}identifies a natural or legal person (the principal).did:sovrn:zone:{code}identifies a zone or zone authority, the jurisdictional anchor.
1.3 Conformance §
The key words MUST, MUST NOT, REQUIRED, SHALL, SHALL NOT, SHOULD, SHOULD NOT, RECOMMENDED, MAY, and OPTIONAL in this document are to be interpreted as described in RFC 2119 and RFC 8174 when, and only when, they appear in all capitals.
This specification conforms to the method-definition requirements of DID Core: method syntax (§2 here), method operations (§3 here), security requirements (§4 here), and privacy requirements (§5 here).
2. Method Syntax §
The method name that identifies this DID method is sovrn. A DID that uses
this method MUST begin with the prefix did:sovrn:. That prefix is
case-sensitive.
The method-specific identifier is a type segment, a colon, and a type-specific identifier:
sovrn-did = "did:sovrn:" type-segment ":" type-specific-id
type-segment = "agent" / "citizen" / "zone"
type-specific-id = uuid / zone-code
; uuid for the "agent" and "citizen" segments;
; zone-code for the "zone" segment
uuid = 8hexDigit "-" 4hexDigit "-" 4hexDigit "-"
4hexDigit "-" 12hexDigit
; a UUID as defined by RFC 9562, lowercase canonical form
zone-code = 1*( lc-alpha / DIGIT / "-" )
; a zone slug; opaque in public examples (e.g. zone-a)
hexDigit = DIGIT / "a" / "b" / "c" / "d" / "e" / "f"
lc-alpha = %x61-7A ; a-z
DIGIT = %x30-39
2.1 Canonical form and comparison §
Identifiers are case-sensitive and are compared by exact string equality. This method defines no case-folding and no other normalization at resolution time. The canonical form is the form under which the DID was provisioned by the registry:
- For
agentandcitizen, the UUID is emitted in lowercase (RFC 9562 lowercase hexadecimal). A verifier MUST NOT assume two identifiers that differ only in case denote the same subject. - For
zone, the zone code is a lowercase alphanumeric slug with optional internal hyphens.
2.2 Examples §
did:sovrn:agent:3f2a1c8e-9b4d-4e21-a7c6-1d0e5f6a2b3c
did:sovrn:citizen:8c1e0a4b-2f37-4d59-b0a2-6e9f1c3d4a5b
did:sovrn:zone:zone-a
Zone codes in these examples are opaque placeholders. Production zone codes are not enumerated in this specification.
2.3 Validation and the resolver's accepted input §
The ABNF above is the normative syntax. A conforming producer MUST mint only identifiers that match it.
A resolver MAY accept a syntactic superset of the normative form as input:
the reference resolver admits any did:sovrn:{type-segment}:{id} where the
type-specific identifier contains no colon, and then resolves it against the
registry. This is a deliberate fail-closed posture, not a widening of the
syntax. Resolution of an identifier that is syntactically admitted but was
never provisioned in the registry MUST return a not-found result (§3.2). Loose
input acceptance
therefore never widens trust: an identifier resolves if and only if the
registry holds a document for it.
An identifier that lacks a recognized type segment (for example, a bare
did:sovrn:{uuid} with no agent/citizen/zone segment) is not a valid
did:sovrn identifier and MUST be rejected as malformed (§3.2). Earlier
non-segmented identifier forms are out of scope for this method and do not
resolve.
3. Operations §
did:sovrn is a registry-backed method. DID Documents are created,
resolved, updated, and deactivated through a Sovrn-operated registry, which is
the verifiable data registry for the method. The four DID Core operations are
specified below. Operations that provision or mutate a document are performed
by the registry; resolution is a public read.
3.0 Key material and DID Document shape (common to all classes) §
Every did:sovrn DID is provisioned with an Ed25519 key pair. The public
key is placed in the DID Document as a single verification method:
verificationMethod[0]has id{did}#key-1, typeJsonWebKey2020, controller{did}, and apublicKeyJwkcarrying the Ed25519 public key.assertionMethodandauthenticationboth reference{did}#key-1.- The document
@contextis["https://www.w3.org/ns/did/v1", "https://w3id.org/security/jwk/v1"].
Verification-method identifiers are always full-form ({did}#key-1), not
relative fragments.
Private keys are held custodially by the registry operator; the registry signs on the subject's behalf. Agent and citizen private keys are stored in the registry's data store, encrypted under a key-encryption key; authority (zone and oracle) private keys are held as deployment secrets outside the data store and never enter it. This is a deliberate operational model for a managed federation registry, and its consequences are stated in the Security Considerations (§4.1, §4.2).
3.1 Create §
A DID is minted at a specific lifecycle moment for each subject class. In all three cases the registry generates the Ed25519 key pair (§3.0), constructs the DID Document, and records the creation in an append-only ledger. Identifiers are never reassigned: agent and citizen UUIDs are single-use by construction, and a zone code, once bound to a real-world authority, MUST NOT be reassigned to a different one.
did:sovrn:agent:{uuid}. Minted when a principal registers an agent. The{uuid}is a freshly generated UUID. The agent DID Document additionally advertises service endpoints (§3.2.1). Registering an agent first ensures the principal has a citizen DID (below), so an agent is always bound to a resolvable principal.did:sovrn:citizen:{uuid}. Minted for a principal (a natural or legal person) the first time the principal needs a protocol key: at agent registration, or when the principal claims a.siname. Provisioning is idempotent per principal: a principal has at most one citizen DID, and a repeat request returns the existing one. The citizen DID Document carries key material only and advertises no service endpoints at v0.1.did:sovrn:zone:{code}. Provisioned by the registry operator, not self-served. A zone DID is backed by a registry issuer record that also carries the authority's credential status list and akeyGenerationcounter (§3.3). Zone authorities issue and co-sign credentials; the Sovrn reputation oracle is a zone-segment DID of this class (did:sovrn:zone:sovrn), provisioned by an operator script, whose DID Document advertises the oracle's trust-profile endpoint.
3.2 Read (Resolve) §
Resolution is a public HTTP GET against the Sovrn-operated registry. The
reference implementation exposes it at /api/dids/{did}, where {did} is
percent-encoded. Resolution proceeds as follows:
- Syntax check. If the identifier does not match a recognized
did:sovrn:{agent|citizen|zone}:{id}shape, the registry returns HTTP 400 (invalidDid). This is the malformed case of §2.3. - Lookup by class. The registry looks the identifier up in the store for its type segment and returns the stored DID Document.
- Not found. If no document is returned for the identifier, the registry
returns HTTP 404 (
notFound). Resolution is hard-fail: the method defines no fallback to any other DID method (§4.4). A separately presenteddid:webidentifier, where a deployment accepts one, is an independent input, never a fallback reached by a faileddid:sovrnresolution.
Resolution-integrity contract. A resolved DID Document MUST have an id
equal to the exact identifier that was queried. A verifier MUST reject a
document whose id does not match the queried DID.
Caching. Resolution responses are served with Cache-Control: public, max-age=60. Consumers that need to observe a rotation, deactivation, or
alias change promptly SHOULD account for this window.
Status gating (which documents resolve). Resolvability is gated on the subject's registry status, and the gate differs by class:
- Agent. An agent DID resolves while its status is
ACTIVEorSUSPENDED. It stops resolving (404) once the status isDEACTIVATED(§3.4). Suspension is an operational flag on the agent's standing; it does not remove the DID Document, so a suspended agent remains resolvable and its credentials remain independently checkable. - Zone. A zone DID resolves only while its backing issuer record is
ACTIVE. Any non-ACTIVEissuer status yields 404. - Citizen. A citizen DID resolves whenever its key record exists. The current method defines no citizen deactivation operation (§3.4).
3.2.1 Service endpoints in the resolved document §
Discovery runs through the DID Document service property, not through any
.well-known-by-DID path. Agent DID Documents advertise a typed Sovrn service
entry (sovrn-mcp/1.0) and standard credential endpoints (OID4VCI), with the
typed Sovrn endpoint listed before generic ones. Zone DID Documents advertise a
trust-establishment endpoint. The service-type registration status and ordering
rules are specified by the agent protocol; this method only requires that the
service property is where endpoints are advertised.
3.2.2 The .si alias in the resolved document §
A resolved agent or citizen DID Document MAY carry an alsoKnownAs array with a
single sovrn:si:{name} URI. This is the DID Core §5.1.2 alias for the
subject's human-readable .si name, resolvable through the registry's .si
resolver. The alias is a current-state assertion, not a stable identifier:
it is set and cleared over the subject's lifetime, and .si names are
reusable. The correlation and reuse consequences are stated in the Privacy
Considerations (§5.3).
3.3 Update §
DID Documents are immutable after creation except for two sanctioned mutations. No other operation modifies a resolved document.
- Authority key rotation. A zone or oracle authority rotates its signing
key by incrementing its
keyGenerationcounter; the registry rebuilds the authority's DID Document with the new public key and the same identifier. Rotation is generation-tracked so that credentials signed under a prior generation stay addressable for the authority-key-generation revocation cascade specified by the agent protocol. In v0.1 this rotation path is defined for the authority (zone/oracle) key material; agent and citizen key rotation is not a v0.1 operation. .sialias synchronization. Claiming or releasing a.siname sets or clears thealsoKnownAsentry (§3.2.2) on the bound agent or citizen DID Document. This mutation changes onlyalsoKnownAsand preserves every other field of the document byte-for-byte.
Beyond these two, a resolved DID Document does not change.
3.4 Deactivate §
An agent DID is deactivated by setting its registry status to DEACTIVATED; a
zone DID is retired by setting its backing issuer status to a non-ACTIVE
value. After deactivation the identifier resolves to HTTP 404, identical to
the response for an identifier that was never provisioned. The registry does
not emit a tombstone document or deactivated: true resolution metadata.
This diverges, deliberately, from the DID Core convention. DID Core
resolution recommends that a deactivated DID resolve to its last DID Document
with resolution metadata deactivated: true. did:sovrn does not do this. The
divergence is an anti-enumeration design choice, consistent with the
fail-closed posture of §2.3: a probe of the registry cannot distinguish a
deactivated identifier from one that was never issued, so the registry does not
confirm the prior existence of a retired subject or expose a
deactivation-history oracle. A consumer that requires proof a specific
identifier was once active obtains it from the append-only ledger or from
credentials the subject issued, not from the resolver.
The current method defines no citizen deactivation operation; a citizen DID remains resolvable for the life of its key record.
Deactivation at the DID layer is distinct from credential revocation, which operates on issued credentials through their own status mechanisms (the agent protocol's credential status list and delegation revocation) and is not a DID-method operation.
4. Security Considerations §
did:sovrn is a registry-backed method operated by a single party. Several of
the considerations below follow directly from that model. They are stated
plainly: this section describes what a relying party actually gets from the
method as shipped, not an idealized version of it.
4.1 Custodial key management §
The registry holds the private keys of the subjects it provisions. Agent, citizen, and authority key pairs are generated by the registry at Create time (§3.1); the registry operator holds the private halves (§3.0) and signs on the subject's behalf. Subjects do not hold their own key material at v0.1.
This is a real centralization and compromise surface, and it should be evaluated as one:
- The key-encryption key is a catastrophic surface. Agent and citizen private keys are encrypted under a key-encryption key held separately from the data store. Compromise of that key, together with the encrypted records, exposes every store-custodied private key at once: all agents and citizens provisioned by that registry. It is the single most consequential secret in the deployment. Authority (zone and oracle) private keys sit outside that blast radius, held as deployment secrets that never enter the data store (§3.0). They are a far smaller set, and each is individually catastrophic in its own right: an authority key signs credentials for an entire zone.
- Registry compromise is subject compromise. An attacker with signing access inside the registry can sign as any custodially-held subject. No protocol mechanism above this method can detect a signature made with the subject's genuine key by the wrong party.
The operational mitigations are conventional and are named as what they are (risk reduction, not risk elimination): private keys are never stored or transmitted in the clear; the key-encryption key is held apart from the database and backed up off-platform; keys are rotated on suspected exposure; authority keys are generation-tracked (§3.3) so a rotation event is visible to verifiers through the credential-status machinery.
The custodial model is an operational property of the v0.1 registry, chosen
for a managed federation deployment. The method syntax and resolution contract
do not themselves require custody, but a relying party evaluating did:sovrn
today MUST assume it: control of an agent or citizen subject is control of the
principal's registry account, control of an authority subject is control of
the registry deployment itself, and the registry is a trusted party in every
signature attributed to a custodially-held subject.
4.2 Proof of control §
Because keys are custodial, proof of control of a did:sovrn DID is
mediated by account authentication: the registry authenticates the
principal's account before performing any operation or signature on the
subject's behalf. The consequence is stated directly: compromise of the
principal's registry account is compromise of the principal's DIDs and of the
agents bound to them. Deployments SHOULD treat account-takeover defenses as
part of the DID trust surface, not as a separate product concern.
4.3 Resolver integrity: what the registry is trusted for §
The Sovrn-operated registry is a single point of resolution. A relying party trusts it for exactly two things: liveness (returning documents for provisioned identifiers) and current state (the document served reflects the registry's present record, within the §3.2 cache window). Two integrity properties bound that trust:
- Exact-identifier binding. A resolved document's
idMUST equal the queried DID (§3.2). This prevents a substituted or mis-served document from being accepted for the wrong subject, but it does not authenticate the registry itself. - Transport authenticity. Authenticity of a resolution response rests on the TLS channel to the registry origin. Resolved DID Documents are not independently signed at v0.1: there is no document-level proof a verifier can check offline. A party who can impersonate the registry origin can serve forged documents; TLS and origin integrity are therefore part of the method's trust base.
What the resolver does not guarantee: that a resolvable subject is in good standing (§4.5); that the key in a document was never compromised (§4.1); or that any credential presented alongside the DID is valid. Credential validity has its own verification path in the layers above.
4.4 No downgrade: accepted inputs are never fallbacks §
Resolution failure is hard-fail (§3.2). A verifier MUST NOT respond to a
failed did:sovrn resolution by falling back to any other identifier or
method for the same subject. Automatic fallback would create a downgrade
attack: an adversary who can induce a did:sovrn resolution failure could
steer verification onto a weaker, separately-controlled identifier.
Deployments MAY accept a did:web identifier as a separately presented
input with its own provenance; that acceptance is an independent decision by
the verifier, reached before resolution begins, never a degradation path out
of a failed one. Web-anchored inputs carry the DNS-class attack surface
(DNS hijacking, BGP hijacking, certificate mis-issuance), which end-to-end
DNSSEC validation, below 1% as measured, does little to blunt in practice.
Operators of any web-anchored surface in a did:sovrn deployment SHOULD run a
DNSSEC-signed zone, and relying parties should weight web-anchored provenance
accordingly.
4.5 Resolvability is not standing §
A resolvable DID is not a trust signal. In particular, a suspended agent still resolves (§3.2): suspension is an operational standing flag, and the DID Document remains served so the subject's history and credentials stay independently checkable. A verifier MUST NOT infer good standing, active status, or any level of trust from the fact that resolution returned a document. Standing is checked separately, through the credential-status and reputation surfaces the layers above this method define. Resolution answers "what is this identifier's key material and service surface" and nothing more.
4.6 Signed agent cards §
Where an agent advertises a capability card, the card is JWS-signed with the agent's key from v0.1. The signature binds the card's content to the agent DID, so a card fetched from any location can be checked against the key in the resolved DID Document; a forged or tampered card fails verification. This closes the impersonation class in which unsigned discovery metadata is substituted at a look-alike origin.
The signature authenticates origin, not content quality. A validly signed card can still carry content chosen to manipulate downstream consumers. Consumers feeding card fields into model context or automated decisions SHOULD sanitize them; a card is a capability advertisement, never a trusted instruction.
4.7 On-chain discovery is discoverability, not adversarial resistance §
A did:sovrn subject MAY additionally register in an on-chain agent registry
(the agent protocol integrates ERC-8004 as an optional, RECOMMENDED
discovery surface). On-chain registration is a discoverability signal
only. The registry class carries known open attack surfaces (registration
front-running, Sybil registration at negligible cost, unfiltered feedback
spam), and a verifier MUST NOT treat the existence of an on-chain registration
as
evidence of identity assurance, standing, or trust beyond "this entry exists."
Trust decisions run through resolution (§3.2) and the credential layers above,
not through the on-chain registry. On-chain anchoring of credential hashes is
a deployment roadmap item outside the scope of this method.
4.8 Key rotation and the cross-layer cascade: an open problem §
Rotation of a DID's signing key invalidates, in principle, everything signed under the prior key: credentials issued to or by the subject, delegations witnessed by those credentials, and reputation computed from them. This specification does not solve that cascade, and does not claim to. What v0.1 provides is the credential-layer slice: authority keys are generation-tracked (§3.3), and the layers above use the generation counter to flip the status of credentials signed under a rotated-out generation. What remains open is the full chain: historically-correct resolution ("which key was valid at time T"), the stale-resolver false-accept window between a rotation event and its observation (bounded, at the resolver, only by the §3.2 cache window), and the downstream re-issuance of dependent artifacts. Verifiers with high-assurance requirements should treat a recently-rotated authority conservatively until dependent status surfaces have converged.
4.9 DID layer versus credential layer §
This method carries identity and key material only. Credentials, delegations, reputation, and memory are artifacts of the layers above, each with its own integrity and status mechanisms, and this specification references them only at their public interface: opaque status entries, opaque reputation tokens, and hash anchors. Deactivation here (§3.4) does not revoke credentials; credential revocation does not deactivate a DID. A verifier composes the two signals; neither substitutes for the other.
5. Privacy Considerations §
The DID Document of every subject class is deliberately minimal: key
material; for agents and zones, service endpoints; for agents and citizens,
optionally one .si alias. No name, no personal attribute, no credential
payload, and no compliance state appears in any resolved document. The privacy
properties below concern what the identifier and the document nonetheless
reveal, and what accumulates around them.
5.1 What an identifier and its document reveal §
- Subject class is public. The type segment (
agent/citizen/zone) is readable in the identifier itself, before resolution. - Jurisdiction is public where jurisdiction is the point. A zone-segment DID declares its jurisdiction openly. That is its function: verifiers need the jurisdictional anchor in the clear. Agent and citizen identifiers are opaque UUIDs that embed no zone; their jurisdictional context attaches above the DID layer, through the credentials and capability scopes that reference zone DIDs. Both facts are design choices with a stated cost: a subject operating under a zone's authority cannot present the artifacts that prove it without disclosing the zone. Jurisdictional transparency is the semantic this method exists to carry, and it is also a correlation surface; a subject for whom jurisdiction disclosure is unacceptable should not present zone-bound artifacts, and this method will serve it poorly.
- Service endpoints are a correlation surface. An agent's advertised endpoints can reveal infrastructure, hosting, and communication patterns, and two agents sharing distinctive endpoints are correlatable. Deployments SHOULD advertise only the endpoints a verifier actually needs. Citizen documents advertise no endpoints at all (§3.1); the minimal-document discipline is the mitigation applied by default to the human subject class.
5.2 Principal–agent linkability and cross-zone correlation §
An agent and its principal are linkable by design: the agent protocol binds each agent to a principal DID, and accountability is the point of the binding. Anyone who observes an agent's credentials learns its principal's citizen DID.
At v0.1, the reference behavior is one principal DID across all zones. A principal operating agents in several zones is therefore correlatable across those zones by the shared principal DID: cross-zone activity aggregates onto one identifier. This is stated as a property of the current version, not defended as ideal: per-zone principal personas (breaking cross-zone correlation at the cost of naive cross-zone aggregation) are named future work in the agent protocol's open design questions, and this method's syntax does not preclude them. Until then, a privacy-sensitive principal should understand that zone-scoped activity under one principal DID composes into a cross-zone profile for any observer who sees enough of it.
5.3 The .si alias: current-state assertion, reusable name §
A .si name resolved from alsoKnownAs (§3.2.2) is a current-state
assertion verified against the registry, not a stable identifier. Names are
released and re-enter the pool; a name that designated one subject last year
may designate a different subject today.
Both directions of this property matter:
- As a privacy property: a
.siname is not a durable handle. Releasing a name removes the human-readable alias from the subject's DID Document, and the name's future use by another subject does not trace back. A system that keys long-lived records to.sinames will mis-attribute them; identity belongs to the DID, and only the DID is durable. - As a verification rule: a consumer MUST treat an
alsoKnownAsalias as true only at resolution time, MUST re-verify the name→DID binding through the registry's.siresolver rather than caching it as permanent, and MUST NOT assume that two appearances of the same.siname at different times denote the same subject.
5.4 Permanence of citizen identifiers §
The current method defines no deactivation operation for citizen DIDs (§3.4): once minted, a natural or legal person's identifier resolves for the life of its key record. For a human subject class this is a real privacy and erasure concern, and it is stated as one rather than explained away.
What bounds the concern today: the citizen document is the most minimal in the
method: key material and at most one releasable alias. No personal attribute
is resolvable from the DID. The identifier is pseudonymous, and what a citizen
can remove is the linkage that makes it recognizable: release the .si
alias (§3.3), and revoke or let expire the credentials that connect the DID to
attributes and zones. What a citizen cannot do at v0.1 is retire the
identifier itself, and the registry's append-only ledger and hash-anchored
artifacts mean history referencing the DID is tamper-evident by design, which
is in structural tension with erasure of that history. A
deployment's obligations under data-protection law attach to the personal data
it holds around the identifier, not to the pseudonymous identifier alone; this
specification does not resolve that tension and flags citizen deactivation as
expected future work for the method.
5.5 The DID layer is minimal; disclosure decisions live above it §
This method deliberately keeps sensitive attributes out of resolution. Verification status, KYC posture, capabilities, jurisdictional bindings, reputation, and memory all live in credentials and artifacts above the DID layer, where the subject controls disclosure, including selectively via the agent protocol's SD-JWT-VC envelope, which lets a holder reveal individual claims (such as the principal binding) to one verifier and withhold them from another. A resolved DID Document is the same for every resolver and contains nothing to selectively disclose; that is what makes the public resolution endpoint safe. Reputation and memory surface in those upper layers only as opaque tokens, banded values, and hash anchors. Nothing about their underlying computation is resolvable from, or expressible in, this method.
5.6 Resolution traffic is observable by the registry §
As the single resolution endpoint, the registry can observe who resolves which DIDs, when, and how often; this is standard metadata exposure for any hosted resolver. Response caching (§3.2) absorbs some repeat traffic, and resolution requires no authentication, so queries are not bound to a verifier identity; but a relying party with strict query-privacy requirements should assume resolution patterns are visible to the registry operator and mediate its queries accordingly.