🖼️

Universal Resolver でCompliantになるMethod目指した

2023/11/29に公開

0. 背景

発端は自分が管理しているdid methodの did:content のResolverを作りMergeされたが
Universal Resolver でエラーが出てしまっていたので解決しようとした。

エラー内容 non-compliant かつ missing であることだけわかる。

1. Valid なDID Documentを目指す

そもそもDID Documentとして正しいSchemaなのかを確認する。
https://www.w3.org/TR/did-core/#did-document-properties
Universal Resolverには便利なLintのリンクがありDID Documentをチェックできる。
https://didlint.ownyourdata.eu/validate

早速チェックしてみる
did:content:3SqTXtoMpiPeNo5vEP2p7yNGQUeCGjqW1wnctv8yaCWXojD29GYcUEo

Verification Relationship is missing と出ている。
verification relationship とはDID対象者と検証方法を紐つける方法についてあるメソッドであり
authentication / assertionMethod などがある。
https://www.w3.org/TR/did-core/#dfn-verification-relationship
Note: Requiredには id だけなのでいらないと思ったが、なにかの要素があるときはRequiredになるのだろうか、しっかり読んだほうが良い

authentication / assertionMethod などを追加し、Lintに怒られなくなった。

2. しかし直らず。


そもそも、この内容はどこで決定されるだろうと想いRepositoryを捜索する。
https://github.com/decentralized-identity/universal-resolver-frontend/blob/18f7be728ecebbe75e6a5b2347194594571f02de/src/components/App.jsx
するとネット上のJSONデータを元にポップアップを出していることがわかった。
https://identity.foundation/universal-resolver/result.json

  ....
  "did:content": {
    "status": "no response",
    "identifiers": [
      {
        "did:content:3SqTXtoMpiPeNo5vEP2p7yNGQUeCGjqW1wnctv8yaCWXojD29GYcUEo": {
          "error": "no response",
          "duration": 62.026434094
        }
      }
    ]

このJSONの更新元をたどっていけばなんのValidationに違反しているのかがわかりそうと
思いRepositoryを捜索する。
更新はCIによる定期実行だった。
https://github.com/decentralized-identity/universal-resolver/blob/main/ci/did-lint-check/run.sh

GitHub Actionsを見ると確かにエラーが出ている。

 X> invalid SHACL validation response
processing Did: did:content:3SqTXtoMpiPeNo5vEP2p7yNGQUeCGjqW1wnctv8yaCWXojD29GYcUEo 

Note:SHACL とはこれのこと?と思ったが違いそう。
https://www.w3.org/TR/shacl/

3. did-status-generator を調べる。

とりあえずCIで使われている oydeu/did-status-generator:latest を落として中に入りValidation部分を読んで見る。
(ソースコードはここにあった)
https://github.com/OwnYourData/didlint/blob/main/did_status_generator/status.rb

読んでみるとここへのアクセスでTimeoutにっている🤔

$ curl https://didlint.ownyourdata.eu/api/validate/did:content:3SqTXtoMpiPeNo5vEP2p7yNGQUeCGjqW1wnctv8yaCWXojD29GYcUEo
{"valid":false,"error":"time out"}

https://didlint.ownyourdata.eu/api/validate/ の実装の中に入り、
何がTimeoutなのか見てみると、dev.uniresolver.io/1.0/identifiers/ ぽい。
https://github.com/OwnYourData/didlint/blob/05ba4758655eb7148cb57bbb80870aa10f2e5512/app/helpers/application_helper.rb#L28

$ curl https://dev.uniresolver.io/1.0/identifiers/did:content:3SqTXtoMpiPeNo5vEP2p7yNGQUeCGjqW1wnctv8yaCWXojD29GYcUEo
<html>
<head><title>504 Gateway Time-out</title></head>
<body>
<center><h1>504 Gateway Time-out</h1></center>
</body>
</html>

確かに今日は https://dev.uniresolver.io/1.0/methods504 Gateway Timeout なので https://dev.uniresolver.io/ 自体正しく動いていない

4. 【暫定】 結論

dev.uniresolver.io/1.0/* 系APIが落ちているのでLintが通らず non-compliant になっている。Web Front の方でValidationはPassedなので復活したらなおるかも。
Experimentalなので気長にまつ。
とはいえ、見様見真似な部分もあるDID DocumentなのでよりValidなものにしていかないといけない。

4. 動いた(ミス発覚)

動いたけど、contextで必要なものを削ぎ落としたてしまい、Error。

*このWarningに従うとエラーになるので、気にしないようにしよう。

Notes on JSON-LD Context:
'https://w3id.org/security/suites/secp256k1recovery-2020/v2' is not yet listed as Verification Method Type in the DID Specification Registries

5. Compliant!

6. Extends

コンテンツのIDをプラットフォームから独立して管理するためのDID-Methods did:content を設計しています(道半ば)。
https://github.com/KataruInc/did-content-spec

Discussion