Decentralized な

DID は URL であり、DID Document を提供するための仕組み。
一般的な URL は Domain name を含んでいて、Domain name は DNS に登録されている。DNS は A, AAAA, NS, TXT といったレコードを記録できる。これと同様に DID Document には、公開鍵や対応するサービスエンドポイントを登録できる。
DID は URL であり registry である。

SideTree プロトコル : DID document の状態を追跡するのに、「何らかの Content-Addressable Storage のアドレス」を、decentralized な「何らかの anchoring」に書くことで実現する「プロトコル(仕様)」。例では did:sidetree
とされているけれども、実際には sidetree
の部分は適宜置き換えて使う。https://identity.foundation/sidetree/spec/
ION ネットワーク : SideTree プロトコルを IPFS と Bitcoin で実装したネットワーク。did:ion
を使う。https://github.com/decentralized-identity/ion
Bitcoin の OP_RETURN を使う。Bitcoin の OP_RETURN は 80 bytes までだが、後に 40 bytes に縮められた。ion:<operation_count>.<ipfs_cid>
形式(<ipfs cid>
は 46 bytes)で、ここに収める。
ION 以外にも SideTree ベースの実装はあって、https://github.com/transmute-industries/sidetree.js#sidetree-based-did-methods のようになっている。

DID document に公開鍵を記載できる。ちょうど DNS レコードを書くようなイメージ。
ところで公開鍵は用途によって使い分けたほうがよいというのもあるけれど、そもそも使えるかどうかが種類によって決まっている。
ed25519
系でも、keyAgreement に使えるのは X25519
に変化する。両方出す場合には、次のように派生形として出力できる。
import { generate } from '@transmute/did-key-ed25519';
const { didDocument } = await generate({secureRandom:()=>crypto.randomBytes(32)},
{accept:"application/did+json", enableEncryptionKeyDerivation:true});
console.log(JSON.stringify(didDocument));
{
"@context": [
"https://www.w3.org/ns/did/v1",
"https://w3id.org/security/suites/jws-2020/v1"
],
"id": "did:key:z6Mkt8nSi38YKBnRp97gUpLTc2ZUhr5EUWhTv3BtEU4Qw2jZ",
"verificationMethod": [
{
"id": "did:key:z6Mkt8nSi38YKBnRp97gUpLTc2ZUhr5EUWhTv3BtEU4Qw2jZ#z6Mkt8nSi38YKBnRp97gUpLTc2ZUhr5EUWhTv3BtEU4Qw2jZ",
"type": "JsonWebKey2020",
"controller": "did:key:z6Mkt8nSi38YKBnRp97gUpLTc2ZUhr5EUWhTv3BtEU4Qw2jZ",
"publicKeyJwk": {
"kty": "OKP",
"crv": "Ed25519",
"x": "y0f0EAmf08a1ClycwbW1w8BboBfrxRxAz-obfZNIgMg"
}
},
{
"id": "did:key:z6Mkt8nSi38YKBnRp97gUpLTc2ZUhr5EUWhTv3BtEU4Qw2jZ#z6LSeuHY2gGb8JnrUAvpxJM1WwtJB9Efta12eijaNQLcELYj",
"type": "JsonWebKey2020",
"controller": "did:key:z6Mkt8nSi38YKBnRp97gUpLTc2ZUhr5EUWhTv3BtEU4Qw2jZ",
"publicKeyJwk": {
"kty": "OKP",
"crv": "X25519",
"x": "L-7QlaEMsZj-gRKkpkNYurqzvcDhmaoHndfh3UCFZjQ"
}
}
],
"assertionMethod": [
"did:key:z6Mkt8nSi38YKBnRp97gUpLTc2ZUhr5EUWhTv3BtEU4Qw2jZ#z6Mkt8nSi38YKBnRp97gUpLTc2ZUhr5EUWhTv3BtEU4Qw2jZ"
],
"authentication": [
"did:key:z6Mkt8nSi38YKBnRp97gUpLTc2ZUhr5EUWhTv3BtEU4Qw2jZ#z6Mkt8nSi38YKBnRp97gUpLTc2ZUhr5EUWhTv3BtEU4Qw2jZ"
],
"capabilityInvocation": [
"did:key:z6Mkt8nSi38YKBnRp97gUpLTc2ZUhr5EUWhTv3BtEU4Qw2jZ#z6Mkt8nSi38YKBnRp97gUpLTc2ZUhr5EUWhTv3BtEU4Qw2jZ"
],
"capabilityDelegation": [
"did:key:z6Mkt8nSi38YKBnRp97gUpLTc2ZUhr5EUWhTv3BtEU4Qw2jZ#z6Mkt8nSi38YKBnRp97gUpLTc2ZUhr5EUWhTv3BtEU4Qw2jZ"
],
"keyAgreement": [
"did:key:z6Mkt8nSi38YKBnRp97gUpLTc2ZUhr5EUWhTv3BtEU4Qw2jZ#z6LSeuHY2gGb8JnrUAvpxJM1WwtJB9Efta12eijaNQLcELYj"
]
}

DWN の考え方。出発点を見失った時に立ち戻る。
- まず署名を使う。データと署名をセットにして扱う。
- DID は PKI となり、public key を取得できるようになる。
- DID で署名付きデータへのアクセス制御ができるようになる。
- データベースをどこにでも構築できるようになる。