DIDComm v2 vs v1

Most of the DIDComm material you will find describes v1, and v2 is not compatible with it. That is the practical headline, and the rest of this page is why it matters when you go looking for documentation.

The problem this page exists to solve

Search for "DIDComm" and you will find a decade of material, much of it describing v1 under the same name. Code samples that look authoritative will not work against a v2 endpoint, and the failure is not always loud, sometimes you get a plausible-looking envelope that decrypts for nobody.

Check the accept field before trusting any tutorial. Ours says so explicitly:

curl -s https://relay.solidus.network/invite | jq -r '.body.accept[]'
# didcomm/v2

What actually changed

  • Envelope format. v2 standardises on JOSE, JWE for encryption, JWM for message structure. v1 used its own packing formats from the Aries lineage. This is the incompatibility that matters: the envelopes are not mutually parseable.
  • Message addressing. v2 messages carry explicit from and to in a defined header set, rather than relying on connection state established earlier. A v2 message is more self-describing.
  • The connection model. v1 leaned on a stateful connection protocol establishing a pairwise relationship first. v2 leans on out-of-band invitations plus DID documents, you resolve where to send, and send. See out-of-band invitations.
  • Protocol identifiers. v2 protocols are named by URI (https://didcomm.org/out-of-band/2.0/invitation, which is exactly what our invitation's type field contains). v1 used did:sov:…;spec/… identifiers. The message type tells you which generation you are looking at, a fast way to triage a sample you found online.
  • Routing. v2's forward and routingKeys are the mediation mechanism described in the forward message and routing keys. v1 had routing too, but the v2 shape is what mediators standardise on now.

What did not change

The premise. Both versions exist to let two agents exchange end-to-end encrypted, authenticated messages without a platform in the middle, DID-identified, transport-agnostic, and asynchronous. v2 is a cleaner implementation of the same idea, not a different idea.

Which one to build on

v2. The mediator ecosystem, the current libraries and the active specification work are all v2. The reason to touch v1 is an existing deployment you must interoperate with, and in that case a translating bridge is a project, not a configuration flag.

What this means for Solidus Relay specifically

  • It advertises didcomm/v2 and nothing else.
  • It implements Coordinate Mediation 2.0 and Pickup Protocol 3.0 on top of that.
  • It has not been run against an independent DIDComm conformance suite, so "implements" is the claim and "conformant" is not. If interop with a specific vendor's v2 agent is load-bearing for you, test it before you depend on it.

Version compatibility is not a privacy property. Being on v2 says nothing about what the mediator observes while routing your traffic: that is what a mediator can and cannot see, and it is worth reading before you route anything real.

Keep reading

DIDComm v2 vs v1 · Solidus