Open4

Decentralized な

kwikwi

DID は URL であり、DID Document を提供するための仕組み。

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

DID は URL であり registry である。

kwikwi

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)で、ここに収める。

https://bitcoin.stackexchange.com/questions/29554/explanation-of-what-an-op-return-transaction-looks-like

ION 以外にも SideTree ベースの実装はあって、https://github.com/transmute-industries/sidetree.js#sidetree-based-did-methods のようになっている。

kwikwi

DID document に公開鍵を記載できる。ちょうど DNS レコードを書くようなイメージ。

ところで公開鍵は用途によって使い分けたほうがよいというのもあるけれど、そもそも使えるかどうかが種類によって決まっている。
https://github.com/transmute-industries/did-key.js/blob/main/packages/did-key-common/src/getRelationships.ts#L14-L35

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"
 ]
}
kwikwi

DWN の考え方。出発点を見失った時に立ち戻る。

  • まず署名を使う。データと署名をセットにして扱う。
  • DID は PKI となり、public key を取得できるようになる。
  • DID で署名付きデータへのアクセス制御ができるようになる。
  • データベースをどこにでも構築できるようになる。