This specification defines a DID method (did:doge) that supports DIDs based on the public Dogecoin blockchain. Dogecoin is an open-source is a cryptocurrency, blockchain, and payment system that is instant, fun, and free from traditional banking fees.
We draw heavily from prior work by Christopher Allen and Kim Hamilton Duffy within the W3C Credentials Community Group on the BTCR DID Method due to strong architectural similarities between the Bitcoin and Dogecoin blockchains.
However, there are some key differences that enable new privacy-preserving benefits. Namely, the did:doge method-specific identifier is the Base58Check-encoded Dogecoin address itself, allowing for DID usage even in the absence of any public transaction histories and only relying upon them for rotation events for verification methods and service endpoints. This specification defines the resolution of the did:doge method-specific identifier to an optional "genesis" transaction for DID document updates, which then follows the linear transaction history "tip" in the same style of did:btcr using "update" transactions.
In summary, while did:btcr requires a cleared transaction prior to first use, did:doge does not, allowing users use of decentralized identifiers even if they do not own cryptocurrencies.
The namestring that shall identify this DID method is: doge
.
A DID that uses this method MUST begin with the prefix
did:doge
. As per the DID specification, this string MUST be
in lowercase.
The full Doge DID scheme is defined by the following ABNF:
doge-did = "did:doge:" address
address = "D" 33*33base58-char
base58-char = "1" / "2" / "3" / "4" / "5" / "6" / "7" / "8" / "9" /
"A" / "B" / "C" / "D" / "E" / "F" / "G" / "H" / "J" / "K" /
"L" / "M" / "N" / "P" / "Q" / "R" / "S" / "T" / "U" / "V" /
"W" / "X" / "Y" / "Z" /
"a" / "b" / "c" / "d" / "e" / "f" / "g" / "h" / "i" / "j" /
"k" / "m" / "n" / "o" / "p" / "q" / "r" / "s" / "t" / "u" /
"v" / "w" / "x" / "y" / "z"
All Doge DID method-specific identifiers are Dogecoin addresses,
which are Base58Check encoded P2PKH and P2SH prefixed by a
"D"
.
Example Doge DID: did:doge:DH5yaieqoZN36fDVciNyRueRGvGLR3mr7L
.
Every Dogecoin address, whether it has a transaction on the public
Dogecoin blockchain or not, is a valid did:doge by default. If a
Dogecoin address does not have any did:doge genesis transactions,
then a DID resolver MUST generate a default DID Document using the
Dogecoin address as its only input into the following template,
substituting the input for the placeholder [DOGECOIN_ADDRESS]
:
{ "@context": ["https://w3id.org/did", "https://w3id.org/doge/v1"], "id": "did:doge:[DOGECOIN_ADDRESS]", "publicKey": [ { "id": "did:doge:[DOGECOIN_ADDRESS]#wow", "controller": "did:doge:[DOGECOIN_ADDRESS]", "type": "EcdsaSecp256k1RecoverySignature2020", "dogecoinAddress": "[DOGECOIN_ADDRESS]" }, { "id": "did:doge:[DOGECOIN_ADDRESS]#vckey-0", "controller": "did:doge:[DOGECOIN_ADDRESS]", "type": "EcdsaSecp256k1RecoverySignature2020", "dogecoinAddress": "[DOGECOIN_ADDRESS]" } ], "authentication": ["#wow"], "assertionMethod": ["#vckey-0"] }
A resolver MUST search the Dogecoin public blockchain exhaustively for did:doge genesis transactions as part of implicit resolution.
To initiate key and service input rotations, a did:doge DID controller MUST sign and clear a transaction to the public Dogecoin blockchain conforming to the following requirements.
scriptSig
within the
txin
at index 0 a valid P2PKH unlocking Script with a
public key corresponding to the did:doge method-specific identifier
when interpreted as a Dogecoin address.txin
entries as
necessary for paying transaction fees.scriptPubKey
within
the txout
at index 0 a valid P2PKH locking Script with the
corresponding Dogecoin address's pubKeyHash
as the
recipient, specifically by substituting the
publicKeyHash
for the placeholder
[DOGECOIN_ADDRESS_PKH]
in the Script template:
OP_DUP OP_HASH160 [DOGECOIN_ADDRESS_PKH] OP_EQUALVERIFY OP_CHECKSIG
scriptPubKey
within
the txout
at index 1 the following Script exactly:
OP_RETURN OP_PUSHBYTES_49 5468652054696d65732032372f4a616e2f32303231202744756d62204d6f6e657927204973206f6e2047616d6553746f70This unique value is meant to signify an intentful did:doge genesis transaction, and has been selected because it has not been used previously to this specification's existence.
txout
entries.The did:doge genesis transaction is defined as the transaction matching the criteria above found on the public Dogecoin blockchain with the lowest block height, and in the case of multiple matching transactions in the same block, the most preceding transaction in the transaction list.
To conduct key and service input rotations using did:doge update transactions for a DID, there must exist a corresponding did:doge genesis transaction as specified in the previous section. A did:doge update transaction MUST be produced in the manner described below and cleared on the public Dogecoin blockchain.
scriptSig
within the
txin
at index 0 a valid P2PKH unlocking Script with a
public key corresponding to the did:doge method-specific identifier
when interpreted as a Dogecoin address. Furthermore, the
txin
at index 0 MUST refer to the OutPoint
of
of a valid did:doge genesis transaction or valid did:doge update
transaction.txin
entries as
necessary for paying transaction fees.scriptPubKey
within
the txout
at index 0 a P2PKH locking Script with the
next did:doge active keypair's corresponding pubKeyHash
as
the recipient, specifically by substituting the
publicKeyHash
for the placeholder
[NEXT_ACTIVE_KEY_PKH]
in the Script template:
OP_DUP OP_HASH160 [NEXT_ACTIVE_KEY_PKH] OP_EQUALVERIFY OP_CHECKSIGThe next did:doge active keypair MAY be the current did:doge active keypair.
scriptPubKey
within
the txout
at index 1 the following Script template,
substituing a desired service endpoint URI encoded as hex (no longer
than 79 bytes) for [SERVICE_ENDPOINT_URI]
and the decimal
length of the URI in bytes for [NUM_BYTES]
:
OP_RETURN OP_PUSHBYTES_[NUM_BYTES] [SERVICE_ENDPOINT_URI]If no service endpoint is desired, an empty value MAY be chosen for
[SERVICE_ENDPOINT_URI]
. The OP_RETURN
instruction MUST be included, otherwise this transaction will be
considered a did:doge deactivation transaction instead, permanently and
irreversibly deactivating the DID.
txout
entries.To deactivate a DID permanently and irreversibly, there must first exist a corresponding did:doge genesis transaction as specified in the previous section. There MAY also exist did:doge update transactions. To deactivate the DID, a deactivation transaction MUST be produced in the manner described below and cleared on the public Dogecoin blockchain.
scriptSig
within the
txin
at index 0 a valid P2PKH unlocking Script with a
public key corresponding to the did:doge method-specific identifier
when interpreted as a Dogecoin address. Furthermore, the
txin
at index 0 MUST refer to the OutPoint
of
of a valid did:doge genesis transaction or valid did:doge update
transaction.txin
entries as
necessary for paying transaction fees.txout
entries. However,
the transaction MUST NOT contain the Script instruction
OP_RETURN
within the scriptPubKey
of any of
its txout
entries.
The following did:doge update transaction with respect to a
did:doge genesis transaction or did:doge update transaction is defined as
the conforming did:doge update transaction on the public Dogecoin
blockchain that uses the current transaction's txout
at
index 0 as its txin
at index 0.
The did:doge active update transaction is the last transaction obtained by starting at a did:doge genesis transaction or did:doge update transaction and recursively identifying the following did:doge update transaction until none exists.
The did:doge active keypair is the corresponding keypair to the signature produced via private key signing of the did:doge active update transaction, or the corresponding keypair to the DID method-specific identifier if no update transactions exist.
The did:doge active service endpoint is the parameter of
OP_RETURN
in the scriptPubKey
of the
txout
at index 1 of the did:doge active update
transaction, or it is empty if no update transactions exist or the
OP_RETURN
has no following data.
Doge DIDs exist per each Dogecoin address by default.
However, to enable key rotation and specification of a service endpoint, the following steps MUST be followed:
To resolve a did:doge DID, the following steps MUST be followed:
id
with did:doge:[DOGECOIN_ADDRESS]#service
(where [DOGECOIN_ADDRESS]
is the Dogecoin address
corresponding to the method-specific identifier), type
with DidDogeService
, and serviceEndpoint
of
the did:doge active service endpoint.To update a did:doge DID document, the following steps MUST be followed.
txin
at index
0.To deactivate a did:doge DID, the following steps MUST be followed.
txin
at index
0.DID method specifications MUST include their own Security Considerations sections. This section MUST consider all the requirements mentioned in section 5 of [RFC3552] (page 27) for the DID operations defined in the specification, including eavesdropping, replay, message insertion, deletion, modification, and man-in-the-middle. Potential denial of service attacks MUST be identified as well.
A full list of requirements for this section may be found at W3C Decentralized Identifiers 7.3
DID method specifications MUST include their own Privacy Considerations sections to discuss any subsection of section 5 of [RFC6973] that could apply in a method-specific manner. The subsections to consider are: surveillance, stored data compromise, unsolicited traffic, misattribution, correlation, identification, secondary use, disclosure, exclusion.
A full list of requirements for this section may be found at W3C Decentralized Identifiers 7.4
Spruce Systems, Inc. is developing a referencing implementation in Rust at github.com/spruceid/did-doge.