Copyright © 2026 World Wide Web Consortium . W3C ® liability , trademark and permissive document license rules apply.
Decentralized
identifier
(DID)
resolution
is
the
process
of
obtaining
a
DID
document
and
accompanying
metadata
for
a
specific
DID.
The
process
takes
a
DID
and
a
set
of
resolution
options
as
its
input
and
returns
a
the
authoritative
DID
document
and
associated
metadata
about
the
resolved
metadata,
taking
into
account
any
query
parameters
that
affect
DID
document
and
the
resolution
request.
A
resolved
selection.
The
resulting
DID
document
is
a
set
of
contains
information
which
that
enables
cryptographically
verifiable
interactions
with
the
DID
controller
related
to
the
DID
subject,
including
mechanisms
such
as
including,
e.g.,
cryptographic
public
keys.
This
specification
covers
the
algorithms
and
guidelines
to
be
used
for
DID
resolution
and
relies
dereferencing
DID
URLs,
relying
on
the
core
DID
specification,
specification
Decentralized
Identifiers
(DIDs)
v1.0
,
which
describes
for
DID
and
DID
URL
syntax
and
the
underlying
DID
architecture
in
full
detail.
document
data
format.
This section describes the status of this document at the time of its publication. A list of current W3C publications and the latest revision of this technical report can be found in the W3C standards and drafts index .
Comments regarding this document are welcome. Please file issues directly on GitHub , or send them to public-did-wg@w3.org ( subscribe , archives ).
Portions of the work on this specification have been funded by the United States Department of Homeland Security's Science and Technology Directorate under contracts HSHQDC-17-C-00019. The content of this specification does not necessarily reflect the position or the policy of the U.S. Government and no official endorsement should be inferred.
Work on this specification has also been supported by the Rebooting the Web of Trust community facilitated by Christopher Allen, Shannon Appelcline, Kiara Robles, Brian Weller, Betty Dhamers, Kaliya Young, Kim Hamilton Duffy, Manu Sporny, Drummond Reed, Joe Andrieu, and Heather Vescent.
This document was published by the Decentralized Identifier Working Group as an Editor's Draft.
Publication as an Editor's Draft does not imply endorsement by W3C and its Members.
This is a draft document and may be updated, replaced, or obsoleted by other documents at any time. It is inappropriate to cite this document as other than a work in progress.
This document was produced by a group operating under the W3C Patent Policy . W3C maintains a public list of any patent disclosures made in connection with the deliverables of the group; that page also includes instructions for disclosing a patent. An individual who has actual knowledge of a patent that the individual believes contains Essential Claim(s) must disclose the information in accordance with section 6 of the W3C Patent Policy .
This document is governed by the 18 August 2025 W3C Process Document .
DID
resolution
Resolution
is
the
process
of
obtaining
first
step
in
dereferencing
a
DID
document
for
URL
Client
software
dereferences
identifiers
to
retrieve
the
value
of
a
reference
and
bring
it
into
the
current
computational
context.
Dereferencing
a
given
DID
.
This
URL
is
one
what
a
DID-enabled
application
does
to
bring
the
referent
of
four
required
operations
that
can
be
performed
on
any
DID
("Read";
URL
into
the
other
ones
being
"Create",
"Update",
current
context.
In
programming
languages
like
c
and
"Deactivate").
The
details
of
these
operations
differ
depending
on
the
DID
method
.
Building
on
top
of
DID
resolution
,
DID
URL
c++
,
dereferencing
is
a
pointer
means
accessing,
interpreting,
or
applying
the
process
of
value
pointed
to
by
that
pointer
in
the
current
computational
context.
On
the
Web,
dereferencing
a
URL
means
retrieving
a
representation
of
a
resource
and
returning
it
for
interactions
in
the
local
context.
For
web
pages,
that
means
displaying
the
retrieved
HTML
in
the
browser,
with
an
appropriate
view.
For
asynchronous
JavaScript,
aka
AJAX
requests,
it
means
bringing
the
result
from
an
HTTP
request
into
the
current
JavaScript
context
for
processing,
often
to
change
the
content
of
the
page.
Dereferencing
a
given
DID
URL
.
Software
and/or
hardware
that
is
able
means
retrieving
the
appropriate
resource
referred
to
execute
these
processes
is
called
a
by
the
DID
resolver
.
URL
and
applying
it
in
the
current
context.
This
specification
defines
a
standard
interface
Resolution
acquires
the
authoritative
metadata
that
clients
can
use
enables
resource
retrieval.
Resolving
an
HTTP
URL
means
resolving
the
authority
part
(typically
a
host
or
domain
name)
to
execute
get
the
IP
address
to
use
for
the
HTTP
request.
Resolving
a
DID
URL
gets
the
DID
document
and
associated
metadata
that
defines
the
cryptographic
material
and
service
endpoints
for
securely
interacting
with
the
associated
resource.
The
client
dereferencing
the
DID
URL
uses
the
result
returned
from
resolution
to
retrieve
the
actual
resource
and
apply
it
to
the
current
computational
context,
either
by
displaying
the
resulting
resource
or
by
extracting
information
from
the
DID
document
to
perform
some
other
function,
such
as
evaluating
a
given
proof
against
verification
methods
in
the
DID
document.
DID
URL
dereferencing
requests,
independent
of
any
specific
resolution
depends
on
method-specific
interactions
with
the
DID
method's
"Resolve"
operation
that
a
Verifiable
Data
Registry.
Every
DID
resolver
supports.
Additionally,
this
specification
method
defines
requirements,
algorithms
including
their
inputs
its
own
approach
to
retrieving
DID
state
from
a
VDR.
DID
Resolvers
provide
a
standard
interface
to
abstract
those
VDR
interactions
away,
enabling
any
DID-enabled
application
to
rely
on
a
consistent
API,
regardless
of
how
the
method
interacts
with
a
VDR.
DIDs
can
be
used
as
identifiers
for
both
subjects
and
results,
architectural
options,
issuers
of
Verifiable
Credentials
and
various
security
can
anchor
any
number
of
cryptographic
verification
relationships,
such
as
assertion,
authentication,
capability
invocation
and
privacy
considerations
relevant
to
implementing
delegation,
and
key
agreement.
A discussion of Decentralized Identifier use cases can be found in the W3C 's Use Cases and Requirements for Decentralized Identifiers .
This
specification
defines
how
DID
URL
enabled
applications
can
dereference
a
DID
resolver
or
URL
into
the
current
context,
including
how
to
resolve
the
DID
URL
dereferencer
.
to
get
the
authoritative
DID
document
used
for
retrieving
the
actual
resource.
Note
that
while
this
specification
defines
some
base-level
functionality
for
DID
resolution,
the
actual
steps
required
to
communicate
with
a
DID's
verifiable
data
registry
are
defined
by
the
applicable
DID
method
specification.
specification
and
implemented
by
resolvers
that
support
those
methods.
This section is non-normative.
When using a DID URL to interact with a resource, first perform resolution, then apply that result to the relevant workflow.
By
invoking
a
DID
resolver
using
the
standard
interface
(as
defined
in
the
DID
Resolution
section
),
one
resolve(did,
resolve(didURL,
resolutionOptions)
can
obtain
a
obtains
the
authoritative
DID
document
and
accompanying
metadata
(e.g.,
contentType
,
proof,
versioning),
which
an
application
metadata.
With
that
DID
document,
clients
can
use
to
validate
a
user's
cryptographic
keys,
service
endpoints,
do
any
combination
of
zero
or
status.
For
example,
to
retrieve
the
state
more
of
the
following:
The
resolving
client
MAY
choose
any
of
these
options
depending
on
the
context
in
which
the
DID
document.
URL
is
used.
Further,
For
example,
the
specification's
following
HTML
snippet
would
cause
the
associated
image
to
be
shown
in
the
browser
displaying
the
HTML
page
containing
it.
<img src="did:example:abc/image.png?service=pathService">
Alternatively,
a
fragment
(e.g.,
verifier
working
with
the
following
verifiable
credential
proof
property
would
evaluate
the
proof
using
the
#key-1
)
to
extract
a
particular
verification
method
from
the
DID
document
(see
here
for
detailed
example
).
In
practice,
implementers
validate
their
resolver
against
returned
from
passing
the
BASE
DID
Resolution
Test
Suite
which
exercises
normative
MUSTs
and
error
conditions
(such
as
invalid
DIDs,
deactivated
DIDs,
unsupported
methods,
relative
URL
expansion,
etc.)
did:example:abc
to
ensure
that
client
applications
can
reliably
depend
on
correct
resolution
behavior
across
different
DID
methods.
a
resolver.
{
"proof": {
"type": "DataIntegrityProof",
"cryptosuite": "eddsa-rdfc-2022",
"created": "2021-11-13T18:19:39Z",
"verificationMethod": "did:example:abc#key-1",
"proofPurpose": "assertionMethod",
"proofValue": "z58DAdFfa9SkqZMVPxAQp...jQCrfFPP2oumHKtz"
}
}
As well as sections marked as non-normative, all authoring guidelines, diagrams, examples, and notes in this specification are non-normative. Everything else in this specification is normative.
The key words MAY , MUST , MUST NOT , NOT REQUIRED , OPTIONAL , RECOMMENDED , REQUIRED , and SHOULD in this document are to be interpreted as described in BCP 14 [ RFC2119 ] [ RFC8174 ] when, and only when, they appear in all capitals, as shown here.
A
conforming
DID
resolver
is
any
algorithm
realized
as
software
and/or
hardware
that
complies
with
the
relevant
normative
statements
in
4.
7.
DID
Resolution
.
A
conforming
network-based
DID
resolver
is
a
conforming
DID
resolver
that
additionally
complies
with
the
normative
statements
in
10.1
13.1
HTTP(S)
Binding
.
A
conforming
DID
URL
dereferencer
client
is
any
algorithm
realized
as
software
and/or
hardware
that
complies
with
the
relevant
normative
statements
in
5.
8.
DID
URL
Dereferencing
.
There
is
no
network-based
DID
URL
dereferencer
client
as
dereferencing
is
fundamentally
a
conforming
DID
URL
dereferencer
that
additionally
complies
with
the
normative
statements
client-side
function
in
which
the
software
retrieves
(or
interacts
with)
a
remote
resource
and
applies
it
to
the
current
context.
This section is non-normative.
This specification has three primary audiences: implementers of conformant DID methods; implementers of conformant DID resolvers; and implementers of systems and services that wish to resolve DIDs using DID resolvers. The intended audience includes, but is not limited to, software architects, data modelers, application developers, service developers, testers, operators, and user experience (UX) specialists. Other people involved in a broad range of standards efforts related to decentralized identity, verifiable credentials, and secure storage might also be interested in reading this specification.
This section is non-normative.
The
DID
resolution
specification
is
intended
to
support
a
broad
range
of
use
cases
by
defining
a
standardized
interface
to
resolve
DIDs
and
dereference
DID
URLs
independent
of
the
DID
method
of
any
particular
DID.
These
usecases
use
cases
include:
This section defines the terms used in this specification and throughout decentralized identifier infrastructure. A link to these terms is included whenever they appear in this specification.
input
DID
A set of parameters that can be used together with a process to independently verify a proof. For example, a cryptographic public key can be used as a verification method with respect to a digital signature; in such usage, it verifies that the signer possessed the associated cryptographic private key.
"Verification" and "proof" in this definition are intended to apply broadly. For example, a cryptographic public key might be used during Diffie-Hellman key exchange to negotiate a shared symmetric key for encryption. This guarantees the integrity of the key agreement process. It is thus another type of verification method, even though descriptions of the process might not use the words "verification" or "proof."
The DID URL syntax supports a simple format for parameters (see section Query in [ DID-CORE ]). Adding a DID parameter to a DID URL means that the parameter becomes part of the identifier for a resource .
did:example:123?versionTime=2021-05-10T17:00:00Z
did:example:123?service=files&relativeRef=/resume.pdf
For each DID parameter that is present, its associated value MUST be a scalar value string serialized into ASCII according to section 3.1 of RFC3987.
Some DID parameters are completely independent of any specific DID method and function the same way for all DIDs . Other DID parameters are not supported by all DID methods . Where optional parameters are supported, they are expected to operate uniformly across the DID methods that do support them. The following table provides common DID parameters that function the same way across all DID methods . Support for all DID Parameters is OPTIONAL .
| Parameter Name | Description |
|---|---|
service
|
Identifies a service from the DID document by service ID. |
serviceType
|
Identifies a set of one or more services from the DID document by service type. |
relativeRef
|
A
relative
service
parameter.
|
versionId
|
Identifies a specific version of a DID document to be resolved (the version ID could be sequential, or a UUID , or method-specific). |
versionTime
|
Identifies
a
certain
version
timestamp
of
a
DID
document
to
be
resolved.
That
is,
the
most
recent
version
of
the
DID
document
that
was
valid
for
a
DID
before
the
specified
versionTime
.
If
present,
the
associated
value
MUST
be
represented
in
the
datetime
format
as
defined
in
|
Implementers as well as DID method specification authors might use additional DID parameters that are not listed here. For maximum interoperability, it is RECOMMENDED that DID parameters use the DID Document Properties Extensions mechanism [ DID-EXTENSIONS-PROPERTIES ], to avoid collision with other uses of the same DID parameter with different semantics.
DID parameters might be used if there is a clear use case where the parameter needs to be part of a URL that references a resource with more precision than using the DID alone. It is expected that DID parameters are not used if the same functionality can be expressed by passing input metadata to a DID resolver .
The
DID
resolution
and
the
DID
URL
dereferencing
functions
can
be
influenced
by
passing
4.1
7.1
DID
Resolution
Options
or
5.1
DID
URL
Dereferencing
Options
to
a
DID
resolver
that
are
not
part
of
the
DID
URL
.
This
is
comparable
to
HTTP,
where
certain
parameters
could
either
be
included
in
an
HTTP
URL,
or
alternatively
passed
as
HTTP
headers
during
the
dereferencing
process.
The
important
distinction
is
that
DID
parameters
that
are
part
of
the
DID
URL
should
be
used
to
specify
what
resource
is
being
identified
,
whereas
input
metadata
that
is
not
part
of
the
DID
URL
should
be
used
to
control
how
that
resource
is
resolved
or
dereferenced
.
All
datetime
values
in
this
specification
MUST
be
an
ASCII
string
which
is
a
valid
XML
datetime
value
defined
by
the
[
VC-DATA-MODEL
]
in
Verifiable
Credentials
Data
Model
v2.0
.
Additionally,
timestamps
used
in
DID
Resolution
MUST
be
adjusted
to
UTC
without
sub-second
decimal
precision.
For
example:
2020-12-20T19:17:47Z
The
DID
resolution
function
resolves
a
DID
URL
into
a
the
authoritative
DID
document
by
using
the
"Resolve"
operation
of
defined
by
the
applicable
DID
method
as
described
identified
in
the
DID
itself.
See
Method
Operations
.
in
the
DID
Core
specification
for
more
details.
All conforming DID resolvers implement the function below, which has the following abstract form:
resolve(didUrl, resolutionOptions) →
«
didResolutionMetadata,
didDocument,
didDocumentMetadata
»
All conforming DID resolvers MUST implement the DID resolution function for at least one DID method and MUST be able to return a DID document .
Conforming
DID
resolver
implementations
do
not
alter
the
signature
of
this
function
in
any
way.
DID
resolver
implementations
might
map
the
resolve
function
to
a
method-specific
internal
function
to
perform
the
actual
DID
resolution
process.
DID
resolver
implementations
might
implement
and
expose
additional
functions
with
different
signatures
in
addition
to
the
resolve
function
specified
here.
The
input
variables
of
the
resolve
function
are
as
follows:
A
metadata
structure
consisting
of
input
options
to
the
resolve
function
in
addition
to
the
did
itself.
This
structure
is
further
defined
in
4.1
7.1
DID
Resolution
Options
.
This
input
is
REQUIRED
,
but
the
structure
MAY
be
empty.
This
function
returns
multiple
values,
and
no
limitations
are
placed
on
how
these
values
are
returned
together.
The
return
values
of
resolve
are
didResolutionMetadata
,
didDocument
,
and
didDocumentMetadata
.
These
values
are
described
below:
error
property
describing
the
error.
See
Section
id
in
the
resolved
DID
document
MUST
be
string
equal
to
the
DID
that
was
resolved.
If
the
resolution
is
unsuccessful,
this
value
MUST
be
empty.
didDocument
property.
If
the
resolution
is
unsuccessful,
this
output
MUST
be
an
empty
metadata
structure
.
This
structure
is
further
defined
in
This is a metadata structure that contains input options for the DID Resolution process.
The possible properties within this structure and their possible values SHOULD be registered in the DID Resolution Extensions [ DID-EXTENSIONS-RESOLUTION ]. This specification defines the following common input options:
Accept
header
value
as
defined
in
HTTP
Semantics
,
Section
12.5.1
.
The
DID
resolver
implementation
SHOULD
use
this
value
to
determine
the
representation
of
the
returned
didDocument
if
such
a
representation
is
supported
and
available.
This
property
is
OPTIONAL
.
versionId
versionTime
This is a metadata structure that contains metadata about the DID Resolution process.
This metadata typically changes between invocations of the DID Resolution function as it represents data about the resolution process itself.
The source of this metadata is the DID resolver .
Examples of DID Resolution Metadata include:
contentType
).
error
)
(see
Section
The possible properties within this structure and their possible values SHOULD be registered in the DID Resolution Extensions [ DID-EXTENSIONS-RESOLUTION ]. This specification defines the following common metadata properties:
didDocument
.
This
property
is
OPTIONAL
.
If
present,
the
value
of
this
property
MUST
be
an
ASCII
string
that
is
the
Media
Type
of
the
conformant
representations
.
In
this
case,
the
caller
of
the
resolve
function
MUST
use
this
value
when
determining
how
to
parse
and
process
the
didDocument
.
Some
DID
resolvers
and
DID
URL
dereferencers
use
proofs
when
executing
the
DID
Resolution
or
DID
URL
Dereferencing
functions.
See
7.2
10.2
Resolver
Architectures
for
details.
DID
resolution
metadata
MAY
include
a
proof
property.
If
present,
the
value
MUST
be
a
set
where
each
item
is
a
map
that
represents
a
proof.
The
use
of
this
property
and
the
types
of
proofs
are
DID
method
-independent.
This is a metadata structure that contains metadata about the DID Resolution process.
This metadata typically does not change between invocations of the DID Resolution function unless the DID document changes, as it represents data about the DID document .
The sources of this metadata are the DID controller and/or the DID method . DID document metadata attested to by the DID controller comes with no inherent guarantee of accuracy. Clients are advised to proceed with caution when relying on DID document metadata to inform business logic.
Examples of DID document metadata include:
created
,
updated
,
nextUpdate
).
versionId
,
nextVersionId
).
proof
).
The possible properties within this structure and their possible values SHOULD be registered in the DID Document Properties Extensions [ DID-EXTENSIONS-PROPERTIES ]. This specification defines the following common metadata properties.
created
property
to
indicate
the
timestamp
of
the
Create
operation
.
The
value
of
the
property
MUST
be
represented
in
the
datetime
format
as
defined
in
updated
property
to
indicate
the
timestamp
of
the
last
Update
operation
for
the
document
version
which
was
resolved.
The
value
of
the
property
MUST
be
represented
in
the
datetime
format
as
defined
in
updated
property
is
omitted
if
an
Update
operation
has
never
been
performed
on
the
DID
document
.
If
an
updated
property
exists,
it
can
be
the
same
value
as
the
created
property
when
the
difference
between
the
two
timestamps
is
less
than
one
second.
true
.
If
a
DID
has
not
been
deactivated,
this
property
is
OPTIONAL
,
but
if
included,
MUST
have
the
boolean
value
false
.
nextUpdate
property
if
the
resolved
document
version
is
not
the
latest
version
of
the
document.
It
indicates
the
timestamp
of
the
next
Update
operation
.
The
value
of
the
property
MUST
be
represented
in
the
datetime
format
as
defined
in
versionId
property
to
indicate
the
version
of
the
last
Update
operation
for
the
document
version
which
was
resolved.
The
value
of
the
property
MUST
be
an
ASCII
string
.
nextVersionId
property
if
the
resolved
document
version
is
not
the
latest
version
of
the
document.
It
indicates
the
version
of
the
next
Update
operation
.
The
value
of
the
property
MUST
be
an
ASCII
string
.
A
DID
method
can
define
different
forms
of
a
DID
that
are
logically
equivalent.
An
example
is
when
a
DID
takes
one
form
prior
to
registration
in
a
verifiable
data
registry
and
another
form
after
such
registration.
In
this
case,
the
DID
method
specification
might
need
to
express
one
or
more
DIDs
that
are
logically
equivalent
to
the
resolved
DID
as
a
property
of
the
DID
document
.
This
is
the
purpose
of
the
equivalentId
property.
DID
document
metadata
MAY
include
an
equivalentId
property.
If
present,
the
value
MUST
be
a
set
where
each
item
is
a
string
that
conforms
to
the
rules
in
Section
Decentralized
Identifiers
(DIDs)
v1.0
.
The
relationship
is
a
statement
that
each
equivalentId
value
is
logically
equivalent
to
the
id
property
value
and
thus
refers
to
the
same
DID
subject
.
Each
equivalentId
DID
value
MUST
be
produced
by,
and
a
form
of,
the
same
DID
method
as
the
id
property
value.
(e.g.,
did:example:abc
==
did:example:ABC
)
A
conforming
DID
method
specification
MUST
guarantee
that
each
equivalentId
value
is
logically
equivalent
to
the
id
property
value.
A
requesting
party
is
expected
to
retain
the
values
from
the
id
and
equivalentId
properties
to
ensure
any
subsequent
interactions
with
any
of
the
values
they
contain
are
correctly
handled
as
logically
equivalent
(e.g.,
retain
all
variants
in
a
database
so
an
interaction
with
any
one
maps
to
the
same
underlying
account).
equivalentId
is
a
much
stronger
form
of
equivalence
than
alsoKnownAs
because
the
equivalence
MUST
be
guaranteed
by
the
governing
DID
method
.
The
use
of
equivalentId
means
that
the
same
DID
document
describes
both
the
equivalentId
DID
and
the
id
property
DID
.
If
a
requesting
party
does
not
retain
the
values
from
the
id
and
equivalentId
properties
and
ensure
any
subsequent
interactions
with
any
of
the
values
they
contain
are
correctly
handled
as
logically
equivalent,
there
might
be
negative
or
unexpected
issues
that
arise.
Implementers
are
strongly
advised
to
observe
the
directives
related
to
this
metadata
property.
The
canonicalId
property
is
identical
to
the
equivalentId
property
except:
a)
it
is
associated
with
a
single
value
rather
than
a
set,
and
b)
the
DID
is
defined
to
be
the
canonical
ID
for
the
DID
subject
within
the
scope
of
the
containing
DID
document
.
DID
document
metadata
MAY
include
a
canonicalId
property.
If
present,
the
value
MUST
be
a
string
that
conforms
to
the
rules
in
Section
Decentralized
Identifiers
(DIDs)
v1.0
.
The
relationship
is
a
statement
that
the
canonicalId
value
is
logically
equivalent
to
the
id
property
value
and
that
the
canonicalId
value
is
defined
by
the
DID
method
to
be
the
canonical
ID
for
the
DID
subject
in
the
scope
of
the
containing
DID
document
.
A
canonicalId
value
MUST
be
produced
by,
and
a
form
of,
the
same
DID
method
as
the
id
property
value.
(e.g.,
did:example:abc
==
did:example:ABC
).
A
conforming
DID
method
specification
MUST
guarantee
that
the
canonicalId
value
is
logically
equivalent
to
the
id
property
value.
A
requesting
party
is
expected
to
use
the
canonicalId
value
as
its
primary
ID
value
for
the
DID
subject
and
treat
all
other
equivalent
values
as
secondary
aliases
(e.g.,
update
corresponding
primary
references
in
their
systems
to
reflect
the
new
canonical
ID
directive).
canonicalId
is
the
same
statement
of
equivalence
as
equivalentId
except
it
is
constrained
to
a
single
value
that
is
defined
to
be
canonical
for
the
DID
subject
in
the
scope
of
the
DID
document
.
Like
equivalentId
,
the
use
of
canonicalId
means
that
the
same
DID
document
describes
both
the
canonicalId
DID
and
the
id
property
DID
.
If
a
resolving
party
DID
URL
client
does
not
use
the
canonicalId
value
as
its
primary
ID
value
for
the
DID
subject
and
treat
all
other
equivalent
values
as
secondary
aliases,
there
might
be
negative
or
unexpected
issues
that
arise
related
to
user
experience.
Implementers
are
strongly
advised
to
observe
the
directives
related
to
this
metadata
property.
Many
DID
methods
use
proofs
when
executing
method
operations
.
See
7.1
10.1
Method
Architectures
for
details.
DID
document
metadata
MAY
include
a
proof
property.
If
present,
the
value
MUST
be
a
set
where
each
item
is
a
map
that
represents
a
proof.
The
use
of
this
property
and
the
types
of
proofs
are
DID
method
-specific.
A DID resolver implements the following DID resolution algorithm.
did
rule
of
the
DID
Syntax
.
If
not,
the
DID
resolver
MUST
return
the
following
result:
https://www.w3.org/ns/did#INVALID_DID
null
«[
]»
https://www.w3.org/ns/did#METHOD_NOT_SUPPORTED
null
«[
]»
https://www.w3.org/ns/did#FEATURE_NOT_SUPPORTED
null
«[
]»
https://www.w3.org/ns/did#INVALID_OPTIONS
null
«[
]»
https://www.w3.org/ns/did#NOT_FOUND
null
«[
]»
«[
...
]»
null
«[
"deactivated"
→
true,
...
]»
expandRelativeUrls
option
with
a
value
of
true
:
id
property
is
a
relative
DID
URL
,
or
if
a
verification
relationship
is
a
relative
DID
URL
:
«[
...
]»
«[
"contentType"
→
output
DID
document
media
type
,
...
]»
If the DID resolver encounters any unexpected errors during the execution of the DID Resolution algorithm, it MUST return the following result:
https://www.w3.org/ns/did#INTERNAL_ERROR
null
«[
]»
The
A
DID
URL
dereferencing
client
function
dereferences
a
DID
URL
into
a
resource
with
contents
for
subsequent
processing
and
display.
The
process
may
vary
depending
on
on
the
DID
URL
's
components,
including
the
DID
method
,
method-specific
identifier,
path,
query,
and
fragment.
fragment,
as
well
as
the
client
context
in
which
dereferencing
occurs,
and
properties
in
(a)
the
DID
document,
(b)
document
metadata,
and
(c)
resolution
metadata.
This
process
depends
on
DID
resolution
of
the
DID
contained
in
the
DID
URL
.
DID
URL
dereferencing
and
might
involve
multiple
steps
(e.g.,
when
the
DID
URL
being
dereferenced
includes
a
fragment),
and
the
function
is
defined
to
return
the
final
resource
after
all
steps
are
completed.
fragment).
The
following
figure
depicts
the
relationship
described
above.
This next figure and its long description should be replaced, but I've already done that in a different PR that I expect will get merged first.
The top left part of the diagram contains a rectangle with black outline, labeled "DID".
The bottom left part of the diagram contains a rectangle with black outline, labeled "DID URL". This rectangle contains four smaller black-outlined rectangles, aligned in a horizontal row adjacent to each other. These smaller rectangles are labeled, in order, "DID", "path", "query", and "fragment.
The top right part of the diagram contains a rectangle with black outline, labeled "DID document". This rectangle contains three smaller black-outlined rectangles. These smaller rectangles are labeled "id", "(property X)", and "(property Y)", and are surrounded by multiple series of three dots (ellipses). A curved black arrow, labeled "DID document - relative fragment dereference", extends from the rectangle labeled "(property X)", and points to the rectangle labeled "(property Y)".
The bottom right part of the diagram contains an oval shape with black outline, labeled "Resource".
A black arrow, labeled "resolves to a DID document", extends from the rectangle in the top left part of the diagram, labeled "DID", and points to the rectangle in the top right part of diagram, labeled "DID document".
A black arrow, labeled "refers to", extends from the rectangle in the top right part of the diagram, labeled "DID document", and points to the oval shape in the bottom right part of diagram, labeled "Resource".
A black arrow, labeled "contains", extends from the small rectangle labeled "DID" inside the rectangle in the bottom left part of the diagram, labeled "DID URL", and points to the rectangle in the top left part of diagram, labeled "DID".
A black arrow, labeled "dereferences to a DID document", extends from the rectangle in the bottom left part of the diagram, labeled "DID URL", and points to the rectangle in the top right part of diagram, labeled "DID document".
A black arrow, labeled "dereferences to a resource", extends from the rectangle in the bottom left part of the diagram, labeled "DID URL", and points to the oval shape in the bottom right part of diagram, labeled "Resource".
All
conforming
DID
URL
dereferencers
implement
the
function
below,
which
has
the
following
abstract
form:
dereference(didUrl, dereferenceOptions) →
«
dereferencingMetadata,
contentStream,
contentMetadata
»
All
conforming
DID
URL
dereferencers
MUST
implement
the
DID
URL
dereferencing
function
for
at
least
one
DID
method
.
All
The
inputs
and
outputs
of
the
dereference
function
apart
from
contentStream
MUST
be
serializable
to
JSON.
The
input
variables
of
the
dereference
function
algorithm
are
as
follows:
This
function
returns
multiple
values,
and
no
limitations
are
placed
on
how
these
values
are
returned
together.
The
algorithm
may
or
may
not
return
one
or
more
values
of
dereference
are
dereferencingMetadata
,
contentStream
,
and
contentMetadata
.
These
values
are
described
below:
dereferencingMetadata
A
metadata
structure
consisting
of
values
relating
to
may
affect
program
state,
depending
on
the
results
context
of
the
DID
URL
use.
For
example,
dereferencing
process.
This
structure
is
REQUIRED
,
and
in
the
case
context
of
an
error
in
the
dereferencing
process,
this
MUST
NOT
be
empty.
This
structure
is
further
defined
in
5.2
DID
web
browsing
may
support
any
number
of
common
URL
Dereferencing
Metadata
.
If
the
dereferencing
is
unsuccessful,
this
structure
MUST
contain
an
error
property
describing
the
error.
See
Section
9.
Errors
.
contentStream
If
the
dereferencing
function
was
called
and
successful,
this
MUST
contain
a
resource
corresponding
to
usage
patterns:
This
is
a
metadata
structure
that
contains
input
options
for
the
A
DID
URL
Dereferencing
Client
process.
The
possible
properties
within
this
structure
and
their
possible
values
SHOULD
be
registered
in
implements
the
following
DID
Resolution
Extensions
[
DID-EXTENSIONS-RESOLUTION
URL
dereferencing
].
This
specification
defines
algorithm,
consisting
of
the
following
common
input
options:
accept
The
media
type
that
the
caller
prefers
for
contentStream
.
The
value
MUST
be
expressed
according
five
steps:
did-url
rule
of
the
DID
URL
DID-EXTENSIONS-RESOLUTION
https://www.w3.org/ns/did#INVALID_DID_URL
].
This
specification
defines
the
following
common
metadata
properties:
contentType
The
Media
Type
of
the
returned
contentStream
proof
did:ex:abc#key-1
did:ex:abc
.
null
linkedResource
property
uses
its
own
retrieval
strategy
as
described
at
Linked
Resource
in
the
[
linkedResourceMetadata
property
uses
its
own
retrieval
strategy
as
In
the
input
simplest
case,
retrieval
is
a
simple
HTTPS
GET
on
a
Retrieval
URL.
However,
some
DID
URL
methods
or
properties
may
provide
alternate
means
for
retrieving
a
resource,
e.g.,
from
on-chain
data
or
from
out-of-band
communications
rather
than
from
a
web
service.
When
a
DID
URL
contains
the
DID
parameter
a
service
and/or
the
DID
parameter
serviceType
,
and
optionally
parameter
use
the
following
algorithm
to
determine
which
service
should
be
used
for
dereferencing
the
DID
parameter
relativeRef
:
URL.
did:example:1234?service=files&relativeRef=%2Fmyresume%2Fdoc%3Fversion%3Dlatest
id
property
matches
the
value
of
the
service
DID
parameter.
If
the
id
property
or
the
service
DID
parameter
or
both
contain
relative
references,
the
corresponding
absolute
URIs
MUST
be
resolved
and
used
for
determining
the
match,
using
the
rules
specified
in
RFC3986
Section
5:
Reference
Resolution
and
in
section
Relative
DID
URLs
in
Decentralized
Identifiers
(DIDs)
v1.0
.
relativeRef
parameter,
evaluate
the
Relative
Ref
Dereferencing
Algorithm
as
the
retrieval
stategy.
When
a
DID
URL
contains
a
serviceType
parameter
use
the
following
algorithm
to
determine
which
service
should
beExpand
commentComment
on
line
R1370Resolved
used
for
dereferencing
the
DID
URL.
did:example:1234?serviceType=pathService&relativeRef=%2Fmyresume%2Fdoc%3Fversion%3Dlatest
serviceType
:
Select
the
service
if
its
type
property
matches
the
value
of
the
serviceType
DID
parameter.
We
need
to
say
what
we
do
when
there
are
multiple
services
with
the
serviceEndpoint
property
of
same
type:
pick
the
selected
first,
error
out,
or
evaluate
each
service
according
to
context.
If
the
value
of
the
serviceEndpoint
property
of
the
selected
service
input
DID
URL
is
a
string
,
add
this
value
to
a
list
of
selected
contains
the
DID
service
endpoint
parameter
URLs
.
If
the
value
of
the
serviceEndpoint
relativeRef
property
and
a
service
of
the
type
"PathService"
is
selected
from
either
the
service
selection
algorithm
is
a
set
or
the
service-type
selection
algorithm
,
add
all
its
items
that
are
strings
set
the
retrieval
strategy
to
a
list
of
selected
DID
service
endpoint
URLs
.
RelativeRef
and
use
the
following
retrieval
algorithm.
relativeRef
.
Resolving
a
DID
service
endpoint
—
particularly
—particularly
one
that
is
itself
a
DID
—
might
DID—might
result
in
a
resolution
cycle
,
which
is
a
set
of
steps
that
result
in
an
infinite
loop.
For
example,
a
DID
service
endpoint
might
indirectly
point
back
through
a
sequence
of
resolutions
to
a
previously
dereferenced
identifier.
A
DID
resolver
recursively
resolving
a
DID
service
endpoint
is
advised
to
detect
and
handle
such
a
cycle
to
prevent
an
infinite
loop
or
resolution
failure.
For
further
guidance,
see
Section
Resolution
Cycles
.
When
no
other
words,
the
select
DID
service
endpoint
URL
"inherits"
the
DID
fragment
of
the
input
DID
URL
.
Return
the
select
DID
service
endpoint
URL
.
Otherwise,
dereference
dereferencing
strategy
applies,
simply
return
the
DID
fragment
Document
as
defined
by
the
media
type
([
RFC2046
])
of
the
final
resource.
For
example,
if
the
resource
is
a
representation
of
a
DID
document
with
media
type
application/did
,
then
the
fragment
is
treated
according
to
the
rules
associated
with
the
JSON-LD
1.1:
application/ld+json
media
type
[JSON-LD11].
Note
This
use
of
the
DID
fragment
is
consistent
with
the
definition
of
the
fragment
identifier
in
[
RFC3986
].
It
identifies
a
secondary
resource
which
is
a
subset
of
the
primary
resource
(the
DID
document
).
Note
This
behavior
of
the
DID
fragment
is
analogous
to
the
handling
of
a
fragment
in
an
HTTP
URL
in
the
case
when
dereferencing
it
returns
an
HTTP
3xx
(Redirection)
response
with
a
Location
header
(see
section
7.1.2
of
[
RFC7231
]).
Given the following input DID URL :
did:example:123456789abcdefghi#keys-1
... and the following resolved DID document :
{
"@context":[
"https://www.w3.org/ns/did/v1.1",
"https://didcomm.org/messaging/contexts/v2",
"https://identity.foundation/linked-vp/contexts/v1"
],
"id": "did:example:123456789abcdefghi",
"verificationMethod": [{
"id": "did:example:123456789abcdefghi#keys-1",
"type": "Multikey",
"controller": "did:example:123456789abcdefghi",
"publicKeyMultibase": "z6MkmM42vxfqZQsv4ehtTjFFxQ4sQKS2w6WR7emozFAn5cxu"
}],
"service": [{
"id": "did:example:123456789abcdefghi#messages",
"type": "DIDCommMessaging",
"serviceEndpoint": "https://example.com/messages/8377464"
}, {
"id": "did:example:123456789abcdefghi#linkedvp",
"type": "LinkedVerifiablePresentation",
"serviceEndpoint": "https://example.com/verifiable-presentation.jsonld"
}]
"@context":[
"https://www.w3.org/ns/did/v1.1",
"https://didcomm.org/messaging/contexts/v2",
"https://identity.foundation/linked-vp/contexts/v1"
],
"id": "did:example:123456789abcdefghi",
"verificationMethod": [{
"id": "did:example:123456789abcdefghi#keys-1",
"type": "Multikey",
"controller": "did:example:123456789abcdefghi",
"publicKeyMultibase": "z6MkmM42vxfqZQsv4ehtTjFFxQ4sQKS2w6WR7emozFAn5cxu"
}],
"service": [{
"id": "did:example:123456789abcdefghi#messages",
"type": "DIDCommMessaging",
"serviceEndpoint": "https://example.com/messages/8377464"
}, {
"id": "did:example:123456789abcdefghi#linkedvp",
"type": "LinkedVerifiablePresentation",
"serviceEndpoint": "https://example.com/verifiable-presentation.jsonld"
}]
}
...
then
the
result
of
the
5.
8.
DID
URL
Dereferencing
algorithm
is
the
following
output
resource
:
Example
12
{
"@context": "https://www.w3.org/ns/did/v1.1",
"id": "did:example:123456789abcdefghi#keys-1",
"type": "Multikey",
"controller": "did:example:123456789abcdefghi",
"publicKeyMultibase": "z6MkmM42vxfqZQsv4ehtTjFFxQ4sQKS2w6WR7emozFAn5cxu"
}
Figure
2
Dereferencing
a
DID
URL
to
a
evaluating
the
proof
in
the
credential
with
the
verification
method.
method
#keys-1
.
Given the following input DID URL :
did:example:123456789abcdefghi?service=messages&relativeRef=%2Fsome%2Fpath%3Fquery#frag
... and the same resolved DID document as in the previous section.
...
then
the
result
of
the
5.
8.
DID
URL
Dereferencing
algorithm
is
the
following
selected
DID
service
endpoint
URL
:
and
applying
that
to
the
current
context:
https://example.com/messages/8377464/some/path?query#frag
Input
and
output
metadata
is
often
involved
during
the
DID
Resolution
,
DID
URL
dereferencing
,
and
other
DID-related
processes.
.
The
structure
used
to
communicate
this
metadata
MUST
be
a
map
of
properties.
Each
property
name
MUST
be
a
string
.
Each
property
value,
and
each
value
within
any
complex
data
structure
such
as
a
map
or
list,
MUST
be
a
string
,
number
,
map
,
list
,
set
,
boolean
,
or
null
.
The
entire
metadata
structure
MUST
be
serializable
according
to
the
JSON
serialization
rules
in
the
[
INFRA
]
specification.
Implementations
MAY
serialize
the
metadata
structure
to
other
data
formats.
All implementations of functions that use metadata structures as either input or output are able to fully represent all data types described here in a deterministic fashion. As inputs and outputs using metadata structures are defined in terms of data types and not their serialization, the method for representation is internal to the implementation of the function and is out of scope of this specification.
The following example demonstrates a JSON-encoded metadata structure that might be used as DID resolution input metadata .
{
"accept": "application/did"
}
This example corresponds to a metadata structure of the following format:
«[
"accept" → "application/did"
]»
The next example demonstrates a JSON-encoded metadata structure that might be used as DID resolution metadata if a DID was not found.
{
"error": "notFound"
}
This example corresponds to a metadata structure of the following format:
«[
"error" → "notFound"
]»
The next example demonstrates a JSON-encoded metadata structure that might be used as DID document metadata to describe timestamps associated with the DID document .
{
"created": "2019-03-23T06:35:22Z",
"updated": "2023-08-10T13:40:06Z"
}
This example corresponds to a metadata structure of the following format:
«[
"created" → "2019-03-23T06:35:22Z",
"updated" → "2023-08-10T13:40:06Z"
]»
The
DID
resolution
algorithm
involves
executing
the
Resolve
operation
on
a
DID
according
to
its
DID
method
(see
4.
7.
DID
Resolution
).
Every DID method defines this method operation, i.e., how a DID resolver can obtain a DID document from a DID. The underlying data formats, protocols, technical infrastructures, and processes can vary considerably among DID methods .
Examples of DID method considerations include the following:
Based on the above considerations combined with the nature of a DID method's "Resolve" operation, the interaction between a DID resolver and the verifiable data registry could be considered either a verifiable resolution or an unverifiable resolution :
A verifiable resolution maximizes confidence in the integrity and correctness of the result of the "Resolve" operation, to the extent possible under the applicable DID method . This can be accomplished in a number of ways, such as the following:
An unverifiable resolution does not have such guarantees and is therefore less desirable, for example:
Whether or not a verifiable resolution is possible depends not only on a DID method itself, but also on the way a DID resolver implements that DID method . DID methods MAY allow multiple ways of implementing their "Resolve" operation, and SHOULD offer guidance regarding at least one way to implement a verifiable resolution .
The guarantees associated with a verifiable resolution are always limited by the architecture(s), protocol(s), cryptographic element(s), and other aspects of the DID method's underlying verifiable data registry . The forms of verifiable resolution implementation that are considered strongest are those that require no interaction with any remote network (for example, see [ DID-KEY ]), and those that minimize dependencies on specific network infrastructure, reducing the "root of trust" to proven entropy and cryptography (for example, see [ KERI ]).
To enable verifiable resolutions , many DID methods use digital signatures, state proofs, proofs of inclusion in Merkle trees, cryptographic event logs, or other types of proof. If a DID method uses such proofs, it MUST specify in its DID method specification how they are used for verification of the correctness of the result of a "Resolve" operation.
A
DID
method
MAY
also
include
such
proofs
in
the
DID
document
itself,
or
in
a
proof
property
of
the
DID
document
metadata
.
This
can
potentially
enable
a
client
to
independently
verify
the
results
of
a
DID
Resolution
process,
even
if
it
does
not
trust
the
DID
resolver
.
Note
that
proofs
originating
from
the
DID
method
are
DID
method
-specific
and
must
be
understood
within
the
technology
of
the
applicable
DID
method
.
A
simple
signature
on
a
DID
document
or
DID
document
metadata
does
not
necessarily
prove
control
of
a
DID,
nor
guarantee
that
the
DID
document
is
the
correct
one
for
the
DID
.
These
proofs
help
to
verify
the
integrity
and
authenticity
of
the
results
of
a
DID
Resolution
process
as
far
as
the
DID
method
itself
is
concerned.
However,
they
do
not
guarantee
that
the
binding
between
a
client
and
the
DID
resolver
is
secure.
See
also
7.2
10.2
Resolver
Architectures
.
The
algorithms
for
DID
resolution
and
DID
URL
dereferencing
are
is
defined
as
a
the
abstract
functions
(see
4.
DID
Resolution
and
5.
DID
URL
Dereferencing
).
function
resolving
.
Those
algorithms
are
implemented
by
DID
resolvers
and
DID
URL
dereferencers
,
which
are
are
invoked
by
a
DID
URL
client
via
a
binding
.
Bindings
define
how
the
abstract
functions
are
accessed
using
concrete
programming
or
communication
interfaces.
Examples of bindings include the following:
Based
on
the
above
considerations
combined
with
the
nature
of
the
binding,
the
interaction
between
a
client
and
the
DID
resolver
or
DID
URL
dereferencer
could
be
considered
either
a
local
binding
or
a
remote
binding
:
Whenever
possible,
local
bindings
are
preferred,
as
they
minimize
dependencies
on
third
parties
and
intermediaries,
reduce
security
risks,
and
maximize
confidence
in
the
integrity
and
correctness
of
the
results
result
of
the
DID
resolution
and
DID
URL
dereferencing
functions.
.
In some cases, it might not be possible to use a local binding ; for example, in constrained IoT (Internet of Things) environments, or when a DID method requires complex infrastructure, or when many different DID methods should be supported.
If a client uses a remote binding , the following considerations apply:
A
DID
resolver
MAY
also
include
proofs
in
a
proof
property
of
the
DID
resolution
metadata
.
Note
that
proofs
originating
from
a
DID
resolver
are
DID
method
-independent
and
can
be
universally
applied
by
a
DID
resolver
,
across
all
DID
methods.
These
proofs
help
to
verify
the
integrity
and
authenticity
of
the
results
of
a
DID
Resolution
process
as
far
as
the
DID
resolver
itself
is
concerned.
However,
they
do
not
guarantee
that
the
result
from
the
"Resolve"
operation
of
the
applicable
DID
method
is
itself
correct.
See
also
7.1
10.1
Method
Architectures
.
A DID resolver might support the DID resolution algorithm for multiple DID methods :
In
this
case,
the
above
considerations
in
7.1
10.1
Method
Architectures
about
verifiable
resolution
and
unverifiable
resolution
implementations
apply
to
each
supported
DID
method
individually.
A
DID
resolver
MAY
invoke
another
DID
resolver
,
which
serves
as
a
proxy
that
executes
the
DID
resolution
algorithm
as
defined
in
4.
7.
DID
Resolution
.
The first DID resolver then acts as a client and chooses a suitable binding for invoking the second DID resolver . For example, a DID resolver may be invoked via a local binding (such as a command line tool), which in turn invokes another DID resolver via a remote binding (such as the HTTP(S) binding ).
When using proxied resolution, a "downstream" resolver SHOULD preserve all DID resolution metadata and DID document metadata from an "upstream" resolver in a transparent manner, including any proofs that may be present. In this process, the "downstream" resolver MAY add its own DID resolution metadata , including any metadata about the proxied resolution process itself.
This is similar to a "stub resolver" invoking a "recursive resolver" in DNS architecture, although the concepts are not entirely comparable (DNS Resolution uses a single concrete protocol, whereas DID resolution is an abstract function realized by different DID methods and different bindings ).
Given
the
DID
URL
did:xyz:1234#keys-1
,
a
DID
resolver
could
be
invoked
via
local
binding
for
Dereferencing
the
Resource
(i.e.,
the
DID
document
),
and
the
client
could
complete
the
DID
URL
dereferencing
algorithm
by
Dereferencing
the
Fragment
(i.e.,
a
part
of
the
DID
document
).
Given
the
DID
URL
did:xyz:1234?service=agent&relativeRef=%2Fsome%2Fpath%3Fquery#frag
,
a
DID
resolver
could
be
invoked
for
Dereferencing
the
Resource
(i.e.,
a
DID
service
endpoint
URL),
and
the
client
could
complete
the
DID
URL
dereferencing
algorithm
by
Dereferencing
the
Fragment
(i.e.,
a
DID
service
endpoint
URL
with
a
fragment).
Given
the
DID
URL
did:xyz:1234#keys-1
,
a
DID
resolver
could
be
invoked
via
local
binding
,
which
invokes
another
DID
resolver
via
remote
binding
for
Dereferencing
the
Resource
(i.e.,
the
DID
document
),
and
the
client
could
complete
the
DID
URL
dereferencing
algorithm
by
Dereferencing
the
Fragment
(i.e.,
a
part
of
the
DID
document
).
This
section
defines
a
JSON
data
structure
that
represents
the
result
of
the
algorithm
described
in
4.
7.
DID
Resolution
.
A
DID
resolution
result
contains
the
DID
document
as
well
as
DID
resolution
metadata
and
DID
document
metadata
.
The
media
type
of
this
data
structure
is
defined
to
be
application/did-resolution
.
{
"didDocument": {
"@context": "https://www.w3.org/ns/did/v1",
"id": "did:example:123456789abcdefghi",
"authentication": [{
"id": "did:example:123456789abcdefghi#keys-1",
"type": "Ed25519VerificationKey2018",
"controller": "did:example:123456789abcdefghi",
"publicKeyBase58": "H3C2AVvLMv6gmMNam3uVAjZpfkcJCwDwnZn6z3wXmqPV"
}],
"service": [{
"id":"did:example:123456789abcdefghi#vcs",
"type": "VerifiableCredentialService",
"serviceEndpoint": "https://example.com/vc/"
}]
},
"didResolutionMetadata": {
"contentType": "application/did",
"retrieved": "2024-06-01T19:73:24Z",
},
"didDocumentMetadata": {
"created": "2019-03-23T06:35:22Z",
"updated": "2023-08-10T13:40:06Z",
"method": {
"nymResponse": {
"result": {
"data": "{\"dest\":\"WRfXPg8dantKVubE3HX8pw\",\"identifier\":\"V4SGRU86Z58d6TV7PBUe6f\",\"role\":\"0\",\"seqNo\":11,\"txnTime\":1524055264,\"verkey\":\"H3C2AVvLMv6gmMNam3uVAjZpfkcJCwDwnZn6z3wXmqPV\"}",
"type": "105",
"txnTime": 1.524055264E9,
"seqNo": 11.0,
"reqId": 1.52725687080231475E18,
"identifier": "HixkhyA4dXGz9yxmLQC4PU",
"dest": "WRfXPg8dantKVubE3HX8pw"
},
"op": "REPLY"
},
"attrResponse": {
"result": {
"identifier": "HixkhyA4dXGz9yxmLQC4PU",
"seqNo": 12.0,
"raw": "endpoint",
"dest": "WRfXPg8dantKVubE3HX8pw",
"data": "{\"endpoint\":{\"xdi\":\"http://127.0.0.1:8080/xdi\"}}",
"txnTime": 1.524055265E9,
"type": "104",
"reqId": 1.52725687092557056E18
},
"op": "REPLY"
}
}
}
}
8.2
DID
URL
Dereferencing
Result
This
section
defines
a
JSON
data
structure
that
represents
the
result
of
the
algorithm
described
in
5.
DID
URL
Dereferencing
.
A
DID
URL
dereferencing
result
contains
the
content
as
well
as
DID
URL
dereferencing
metadata
and
DID
URL
content
metadata
.
The
media
type
of
this
data
structure
is
defined
to
be
application/did-url-dereferencing
.
8.2.1
Example
Example
22
:
Example
DID
URL
dereferencing
result
{
"content": {
"@context": "https://www.w3.org/ns/did/v1",
"id": "did:example:123456789abcdefghi",
"authentication": [{
"id": "did:example:123456789abcdefghi#keys-1",
"type": "Ed25519VerificationKey2018",
"controller": "did:example:123456789abcdefghi",
"publicKeyBase58": "H3C2AVvLMv6gmMNam3uVAjZpfkcJCwDwnZn6z3wXmqPV"
}],
"service": [{
"id":"did:example:123456789abcdefghi#vcs",
"type": "VerifiableCredentialService",
"serviceEndpoint": "https://example.com/vc/"
}]
},
"didUrlDereferencingMetadata": {
"contentType": "application/did",
"retrieved": "2024-06-01T19:73:24Z",
},
"contentMetadata": {
"created": "2019-03-23T06:35:22Z",
"updated": "2023-08-10T13:40:06Z",
"method": {
"nymResponse": {
"result": {
"data": "{\"dest\":\"WRfXPg8dantKVubE3HX8pw\",\"identifier\":\"V4SGRU86Z58d6TV7PBUe6f\",\"role\":\"0\",\"seqNo\":11,\"txnTime\":1524055264,\"verkey\":\"H3C2AVvLMv6gmMNam3uVAjZpfkcJCwDwnZn6z3wXmqPV\"}",
"type": "105",
"txnTime": 1.524055264E9,
"seqNo": 11.0,
"reqId": 1.52725687080231475E18,
"identifier": "HixkhyA4dXGz9yxmLQC4PU",
"dest": "WRfXPg8dantKVubE3HX8pw"
},
"op": "REPLY"
},
"attrResponse": {
"result": {
"identifier": "HixkhyA4dXGz9yxmLQC4PU",
"seqNo": 12.0,
"raw": "endpoint",
"dest": "WRfXPg8dantKVubE3HX8pw",
"data": "{\"endpoint\":{\"xdi\":\"http://127.0.0.1:8080/xdi\"}}",
"txnTime": 1.524055265E9,
"type": "104",
"reqId": 1.52725687092557056E18
},
"op": "REPLY"
}
}
}
"didDocument": {
"@context": "https://www.w3.org/ns/did/v1",
"id": "did:example:123456789abcdefghi",
"authentication": [{
"id": "did:example:123456789abcdefghi#keys-1",
"type": "Ed25519VerificationKey2018",
"controller": "did:example:123456789abcdefghi",
"publicKeyBase58": "H3C2AVvLMv6gmMNam3uVAjZpfkcJCwDwnZn6z3wXmqPV"
}],
"service": [{
"id":"did:example:123456789abcdefghi#vcs",
"type": "VerifiableCredentialService",
"serviceEndpoint": "https://example.com/vc/"
}]
},
"didResolutionMetadata": {
"contentType": "application/did",
"retrieved": "2024-06-01T19:73:24Z",
},
"didDocumentMetadata": {
"created": "2019-03-23T06:35:22Z",
"updated": "2023-08-10T13:40:06Z",
"method": {
"nymResponse": {
"result": {
"data": "{\"dest\":\"WRfXPg8dantKVubE3HX8pw\",\"identifier\":\"V4SGRU86Z58d6TV7PBUe6f\",\"role\":\"0\",\"seqNo\":11,\"txnTime\":1524055264,\"verkey\":\"H3C2AVvLMv6gmMNam3uVAjZpfkcJCwDwnZn6z3wXmqPV\"}",
"type": "105",
"txnTime": 1.524055264E9,
"seqNo": 11.0,
"reqId": 1.52725687080231475E18,
"identifier": "HixkhyA4dXGz9yxmLQC4PU",
"dest": "WRfXPg8dantKVubE3HX8pw"
},
"op": "REPLY"
},
"attrResponse": {
"result": {
"identifier": "HixkhyA4dXGz9yxmLQC4PU",
"seqNo": 12.0,
"raw": "endpoint",
"dest": "WRfXPg8dantKVubE3HX8pw",
"data": "{\"endpoint\":{\"xdi\":\"http://127.0.0.1:8080/xdi\"}}",
"txnTime": 1.524055265E9,
"type": "104",
"reqId": 1.52725687092557056E18
},
"op": "REPLY"
}
}
}
}
The algorithms described in this specification throw specific types of errors. Implementers might find it useful to convey these errors to other libraries or software systems. This section provides specific URLs and descriptions for the errors, such that an ecosystem implementing technologies described by this specification might interoperate more effectively when errors occur. Additionally, this specification uses some errors defined in Section 3.5 Processing Errors of the [ CID ] specification.
Implementers SHOULD use [ RFC9457 ] to encode the error data structure. If [ RFC9457 ] is used:
type
value
of
the
error
object
MUST
be
a
URL.
Where
the
values
listed
in
the
section
below
do
not
define
a
URL,
the
values
MUST
be
prepended
with
the
URL
https://www.w3.org/ns/did#
.
title
value
SHOULD
provide
a
short
but
specific
human-readable
string
for
the
error.
detail
value
SHOULD
provide
a
longer
human-readable
string
for
the
error.
https://www.w3.org/ns/did#INVALID_DID
https://www.w3.org/ns/did#INVALID_DID_DOCUMENT
https://www.w3.org/ns/did#NOT_FOUND
accept
input
metadata
property
is
not
supported
by
the
DID
method
and/or
DID
resolver
implementation.
See
Section
https://www.w3.org/ns/did#REPRESENTATION_NOT_SUPPORTED
https://www.w3.org/ns/did#INVALID_DID_URL
https://www.w3.org/ns/did#METHOD_NOT_SUPPORTED
https://www.w3.org/ns/did#INVALID_OPTIONS
https://www.w3.org/ns/did#INTERNAL_ERROR
detail
field
SHOULD
provide
a
longer
description
of
the
feature
that
is
not
supported
by
the
resolver.
https://www.w3.org/ns/did#FEATURE_NOT_SUPPORTED
This
section
defines
bindings
for
the
abstract
algorithms
in
sections
4.
7.
DID
Resolution
and
5.
DID
URL
Dereferencing
.
This
section
defines
a
DID
resolver
binding
which
exposes
the
DID
resolution
and/or
DID
URL
dereferencing
functions
function
(including
all
resolution/dereferencing
resolution
options
and
metadata)
via
an
HTTP(S)
endpoint.
See
7.2
10.2
Resolver
Architectures
.
The HTTP(S) binding requires a known HTTP(S) URL where a DID resolver can be invoked. This URL is called the DID resolver HTTP(S) endpoint .
This
binding
is
generally
considered
a
remote
binding
,
but
could
also
be
a
local
binding
if
the
HTTP(S)
endpoint
is
run
in
a
local
environment,
such
as
on
localhost
.
All conforming DID resolvers MUST implement the GET version of the HTTPS binding and MAY implement the POST version. All HTTPS bindings MUST use TLS. Use of DNS names in certificates is NOT REQUIRED ; resolvers MAY use TLS certificates issued for IP addresses.
Using
this
binding,
the
DID
resolution
function
(see
4.
7.
DID
Resolution
)
and/or
DID
URL
dereferencing
function
(see
5.
DID
URL
Dereferencing
)
can
be
executed
as
follows:
https://resolver.example/1.0/identifiers/
https://resolver.example/1.0/identifiers/did:example:1234
Accept
HTTP
request
header
to
application/did-resolution
to
request
a
complete
Accept
HTTP
request
header
to
the
value
of
the
accept
resolution
option
to
request
only
the
Accept
HTTP
request
header
to
application/did-url-dereferencing
to
request
a
complete
8.2
DID
URL
Dereferencing
Result
,
OR
set
the
Accept
didDocument
accept
are
provided:
accept
as
query
parameters
in
the
request
HTTP(S)
URL
.
GET
request
on
the
request
HTTP(S)
URL
.
This
invokes
the
DID
resolution
or
GET https://resolver.example/1.0/identifiers/did%3Aexample%3A1234?option1=value1&option2=value2 HTTP/1.1 Accept: application/did-resolution
POST
request
on
the
request
HTTP(S)
URL
.
This
invokes
the
DID
resolution
POST https://resolver.example/1.0/identifiers/did:example:1234 HTTP/1.1Accept: application/did-resolution { "option1": "value1", "option2": "value2" } Example 29 POST https://resolver.example/1.0/identifiers/did:example:1234?service=files&relativeRef=/resume.pdf HTTP/1.1 Accept: application/did-url-dereferencingAccept: application/did-resolution{ "option1": "value1", "option2": "value2"{ "option1": "value1", "option2": "value2" }
type
property
of
the
error
object
,
according
to
the
following
table:
error
type
URI
|
HTTP status code |
|---|---|
https://www.w3.org/ns/did#INVALID_DID
|
400
|
https://www.w3.org/ns/did#INVALID_DID_URL
|
400
|
https://www.w3.org/ns/did#INVALID_OPTIONS
|
400
|
https://www.w3.org/ns/did#NOT_FOUND
|
404
|
https://www.w3.org/ns/did#REPRESENTATION_NOT_SUPPORTED
|
406
|
https://www.w3.org/ns/did#INVALID_DID_DOCUMENT
|
500
|
https://www.w3.org/ns/did#METHOD_NOT_SUPPORTED
|
501
|
https://www.w3.org/ns/did#FEATURE_NOT_SUPPORTED
|
501
|
https://www.w3.org/ns/did#INTERNAL_ERROR
|
500
|
| (any other error URI) |
500
|
true
in
the
didDocumentMetadata
or
contentMetadata
:
410
.
Content-Type
HTTP
response
header
is
application/did-resolution
:
200
.
Content-Type
HTTP
response
header
.
Its
value
MUST
be
the
value
of
the
contentType
metadata
property
in
the
didResolutionMetadata
(see
Content-Type
HTTP
response
header
.
See here for an OpenAPI definition corresponding to the HTTP(S) binding.
Given the following DID resolver HTTP(S) endpoint :
https://resolver.example/1.0/identifiers/
And given the following input DID :
did:example:123
Then the request HTTP(S) URL is:
https://resolver.example/1.0/identifiers/did:example:123
The
resolve()
function
can
be
invoked
over
the
HTTP(S)
binding
as
follows:
GET https://resolver.example/1.0/identifiers/did:example:123 HTTP/1.1 Accept: application/did-resolution
The response is as follows:
HTTP 200 OK
Content-Type: application/did-resolution
{
"didDocument": {
"@context": [ "https://www.w3.org/ns/did/v1.1" ],
"id": "did:example:123",
"verificationMethod": [{
...
}],
"service": [{
...
}]
},
"didResolutionMetadata": {
"contentType": "application/did"
},
"didDocumentMetadata": {
...
}
"didDocument": {
"@context": [ "https://www.w3.org/ns/did/v1.1" ],
"id": "did:example:123",
"verificationMethod": [{
...
}],
"service": [{
...
}]
},
"didResolutionMetadata": {
"contentType": "application/did"
},
"didDocumentMetadata": {
...
}
}
The
resolve()
function
can
be
invoked
over
the
HTTP(S)
binding
as
follows:
GET https://resolver.example/1.0/identifiers/did:example:123 HTTP/1.1 Accept: application/did
The response is as follows:
HTTP 200 OK
Content-Type: application/did
{
"@context": [ "https://www.w3.org/ns/did/v1.1" ],
"id": "did:example:123",
"verificationMethod": [{
...
}],
"service": [{
...
}]
"@context": [ "https://www.w3.org/ns/did/v1.1" ],
"id": "did:example:123",
"verificationMethod": [{
...
}],
"service": [{
...
}]
}
The
dereference()
function
can
be
invoked
over
the
HTTP(S)
binding
as
follows:
GET https://resolver.example/1.0/identifiers/did:example:123?versionId=2 HTTP/1.1 Accept: application/did-url-dereferencing
The response is as follows:
HTTP 200 OK
Content-Type: application/did-url-dereferencing
{
"content": {
"@context": [ "https://www.w3.org/ns/did/v1.1" ],
"id": "did:example:123",
"verificationMethod": [{
...
}],
"service": [{
...
}]
},
"dereferencingMetadata": {
"contentType": "application/did"
},
"contentMetadata": {
...
}
"content": {
"@context": [ "https://www.w3.org/ns/did/v1.1" ],
"id": "did:example:123",
"verificationMethod": [{
...
}],
"service": [{
...
}]
},
"dereferencingMetadata": {
"contentType": "application/did"
},
"contentMetadata": {
...
}
}
The
dereference()
function
can
be
invoked
over
the
HTTP(S)
binding
as
follows:
GET https://resolver.example/1.0/identifiers/did:example:123?versionId=2 HTTP/1.1 Accept: application/did
The response is as follows:
HTTP 200 OK
Content-Type: application/did
{
"@context": [ "https://www.w3.org/ns/did/v1.1" ],
"id": "did:example:123",
"verificationMethod": [{
...
}],
"service": [{
...
}]
"@context": [ "https://www.w3.org/ns/did/v1.1" ],
"id": "did:example:123",
"verificationMethod": [{
...
}],
"service": [{
...
}]
}
This section contains a variety of security considerations that people using DID Resolution in production settings are advised to consider. Readers are urged to familiarize themselves with the general security advice provided in the Security Considerations section of the Decentralized Identifiers specification before reading this section.
DID resolution and DID URL dereferencing do not involve any authentication or authorization functionality. Similar to DNS resolution, anybody can perform the process, without requiring any credentials or non-public knowledge.
A DID resolver may maintain a generic cache of DID documents . It may also maintain caches specific to certain DID methods .
The
noCache
resolution
option
can
be
used
to
request
a
certain
kind
of
caching
behavior.
This resolution option is OPTIONAL .
Possible values of this property are:
"false"
(default
value):
Caching
of
DID
documents
is
allowed.
"true"
:
Request
that
caching
is
disabled
and
a
fresh
DID
document
is
retrieved
from
the
verifiable
data
registry
.
Caching
behavior
can
be
controlled
by
configuration
of
the
DID
resolver
,
by
the
noCache
resolution
option,
or
by
contents
of
the
DID
document
(e.g.,
a
cacheMaxTtl
field),
or
by
a
combination
of
these
properties.
Resolvers
that
implement
noCache
might
be
more
vulnerable
to
denial
of
service
attacks,
as
malicious
clients
can
bypass
caching
to
force
expensive
network
requests
and
resource
consumption.
Clients
requesting
resolution
with
noCache
expect
that
some
resolvers
will
reject
resolution
requests
that
bypass
caching.
Resolvers
that
deny
resolution
without
caching
MUST
respond
with
a
FEATURE_NOT_SUPPORTED
error
that
makes
it
clear
that
bypassing
the
cache
was
not
permitted
so
the
client
can
attempt
to
resolve
without
using
noCache
.
If JSON-LD Context files are fetched from a remote location, an attacker could alter the context file (for example, by compromising the server or intercepting the request via a man-in-the-middle attack).
Therefore, any DID resolver which performs remote retrieval of JSON-LD Context URLs is strongly advised to use a registry of context files and corresponding hashes (or a functionally equivalent mechanism) to help ensure end-to-end security. Implementations are expected to throw errors if the cryptographic hash value for a resource does not match the expected hash value.
If
a
versionId
or
versionTime
DID
parameter
is
provided,
the
DID
resolution
algorithm
returns
a
specific
version
of
the
DID
document
.
The
DID
parameters
versionId
and
versionTime
are
mutually
exclusive.
The
use
of
the
versionId
DID
parameter
is
specific
to
the
DID
method
.
Its
possible
values
may
include
sequential
numbers,
random
UUIDs,
content
hashes,
etc..
DID
document
metadata
MAY
contain
a
versionId
property
that
changes
with
each
Update
operation
that
is
performed
on
a
DID
document.
While most DID methods support the Update operation, there is no requirement for DID methods to keep all previous DID document versions, therefore not all DID methods support versioning.
DID methods that use a distributed system (such as a distributed ledger) as a VDR ( verifiable data registry ) need to manage the potential that network forks may occur. Therefore, the specification of a DID method that uses a distributed system as a VDR SHOULD specify a means by which the VDR they are using can be disambiguated from such forks.
When
a
DID
resolver
client
dereferences
identifiers
and
linked
resources
in
a
DID
document
—
especially
fields
like
verificationMethod
,
controller
,
or
alsoKnownAs
—
it
might
encounter
a
resolution
cycle
.
These
can
occur
when
a
DID
document
references
another
DID
(or
URL)
that
eventually
leads
back
to
a
previously
dereferenced
identifier,
forming
a
loop.
A
DID
resolver
can
also
encounter
such
a
situation
when
dereferencing
a
DID
URL
that
references
a
DID
service
endpoint
.
did:example:alice
└── verificationMethod.controller → did:example:bob
└──
verificationMethod.controller
→
did:example:alice
DID resolvers and their clients that perform recursive dereferencing are expected to expect, detect, and handle such cycles .
Security and performance risks: If cycles are not detected and mitigated, recursive dereferencing could lead to:
Mitigation guidance: Components that recursively follow external DID document references are encouraged to track identifiers that have already been dereferenced and to detect when a cycle has occurred and take appropriate action. In addition, developers might wish to limit recursion depth or breadth to reduce the potential attack surface.
This section details the privacy considerations specific to DID Resolution. Readers are urged to familiarize themselves with the general privacy advice provided in the Privacy Considerations section of the Decentralized Identifiers specification before reading this section.
DID resolvers and DID URL dereferencers will be able to log requests to their services for resolution and dereferencing. Over time, these logs could be used to track and profile the clients making requests for these services. To mitigate this privacy risk, clients should make such requests to services they trust, for example, because of an existing business relationship or because the service is running on infrastructure they control. Clients can also take steps to obfuscate their requests to a service in order to limit the possibilities of correlation and profiling.
One of the most common mechanisms used to resolve an identifier to an address on the Internet is the global Domain Name System (DNS) described in [ RFC1034 ]. The DNS and the processes and systems used to map a Domain Name to an Internet Protocol address is a common requirement for hosting a website.
The Decentralized Identifiers (DIDs) v1.0 specification introduced a new type of identifier that lacks any dependency on the global Domain Name System and introduced the concept of an identifier resolution process that does not require the centralization of any part of the architecture. This new architecture allows the decentralized creation and management of globally-resolvable identifiers that combat identifier rent-seeking and censorship. It enables individuals to fully own and control their identifiers instead of renting the identifiers from a third party.
Individuals that acquire DID URLs use them in their software much like they continue to use DNS-based URLs. The software uses a DID resolver interface (defined in this specification) to determine the location of the resources to be retrieved. The process of DID resolution , much like the process of DNS resolution, is opaque to the individual and happens within the software without needing any direct involvement of the individual.
The research related to DNS centralization and the corresponding invention of DIDs and DID resolution is documented by the Decentralized Identifiers (DIDs) v1.0 specification in the section related to the history of DIDs .
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in: