†IPFSを実行しながら学んでいく3 のおまけ~DNSLink~ †

2022.07.11

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

††学んだ内容をメモメモ††

IPFSはコンテンツベースのアドレス指定を使用し、 ファイルに含まれるデータに基づいてファイルのアドレスを作成する(immutability) と学びました。

コンテンツに更新があると、アドレスが変更になるので、 Webサイトなどの更新が必要なものだと毎回ユーザーに新しいアドレスを伝えなくてはいけないのは不便なので、 IPNS(InterPlantery Naming Service)という更新可能なアドレスを作成し、コンテンツのCIDが変わってもアクセスするアドレスは同じにできるという仕組みがあることも知れました。

†IPFSをコマンドラインで実行しながら学んでいく3 ~不変性~ †

今回はIPNS以外にDNSLinkというものも使用できる とあったので、これについて試していきたいと思います。

これは、現在IPNSよりもはるかに高速で、人間が読める名前=可読性に優れている も使用できるので結構使われているとのこと

試してみる

IPFS上のコンテンツのアドレスの変更によりアクセスが難しくなる問題に対して、DNSレコードを介して解決するのがDNSLinkです、。

DNSLinkは、DNSのTXTレコードを使用して、ipfs.ioのようなDNS名をIPFSアドレスにマッピングしています。

  • DNSLinkアドレス例
/ipns/blog.classmethod.jp

IPNSでは /ipns/k51qzi5uqu5dic7r0ly7l3d65nsfp7gbbmwv6cj0216kx9fgsfykzdnsdmrdn6 のようにハッシュ化された公開鍵が使われていましたが、DNSLinkでは代わりにDNS名を使用します。

/ipns/blog.classmethod.jp/assets/
/ipns/blog.classmethod.jp/images/aaaaaaaa.png

といった他のファイルへのリンク、またはディレクトリやシンボリックリンクなど、IPFSがサポートする他の種類のリソースへのリンクを含めることができます

ユースケース

手持ちのドメインを使用し、IPFSにアップロードしたWebページにアクセスするケースを考えてみます。

アクセスは公開ゲートウェイを使います。

サンプルWebページの用意

blogというフォルダにindexと画像フォルダを用意しました。

blog
images
index.html

index.html

<html>
<meta charset="UTF-8">
<body>
<p>こんにちは、世界</p>
<img src="images/pic_01_l.jpg">
</body>
</html>

このフォルダごとIPFSにアップロードします。

必要であればPINも行います

$ ipfs add -r blog
added QmZSHMbE41iWmn3hBbTw9fs38Yto69DBMz7Xob3vDzY4nm blog/images/pic_01_l.jpg
added QmYvEDxciU7r6mPn9ehh9tq5Ru1Nx9ZzrVnzoB9CPKhPmz blog/index.html
added QmRmAGVYEJW5XZn3eBdNjsLStHgS8NR1VGMzvpCRZbfnJK blog/images
added QmZH9d4oeMhzE8sjJQbxTAXxQHV93Nv1NQ3cdTYDVsJkQh blog

## 必要なら
$ ipfs pin add -r QmZH9d4oeMhzE8sjJQbxTAXxQHV93Nv1NQ3cdTYDVsJkQh
pinned QmZH9d4oeMhzE8sjJQbxTAXxQHV93Nv1NQ3cdTYDVsJkQh recursively

ipfs daemonを実行していると、ローカルホストでのアクセスが可能です。

  • https://localhost:8080/ipfs/QmZH9d4oeMhzE8sjJQbxTAXxQHV93Nv1NQ3cdTYDVsJkQh

blogフォルダにあったindex.html

DNS設定

所有しているドメインに_dnslinkを付けて、DNS TXTレコードとしてマッピングを公開します。

ドメイン blog.auth.classmethod.net であれば、

_dnslink.blog.auth.classmethod.netをDNSに登録します。

TXTレコードの値は、

dnslink=/ipfs/<<CID>>

または

dnslink=/ipns/<<IPNSの公開鍵>>

の形式でコンテンツの場所を設定します。

今回は更新を伴うコンテンツを扱うためIPNSを使います

$ ipfs name publish /ipfs/QmZH9d4oeMhzE8sjJQbxTAXxQHV93Nv1NQ3cdTYDVsJkQh
Published to k51qzi5uqu5di9kl58x19u26pvm1gbhou4a7fhn8d4gr827rqx6221dq5ntcfv: /ipfs/QmZH9d4oeMhzE8sjJQbxTAXxQHV93Nv1NQ3cdTYDVsJkQh

TXTレコードには、以下のようにIPNSを設定します

※ IPNSキーがk51qzi5uqu5di9kl58x19u26pvm1gbhou4a7fhn8d4gr827rqx6221dq5ntcfv の場合

dnslink=/ipns/k51qzi5uqu5di9kl58x19u26pvm1gbhou4a7fhn8d4gr827rqx6221dq5ntcfv

digで名前解決した時の例)

$ dig +noall +answer TXT _dnslink.<<あなたの所有ドメイン>>
_dnslink.<<あなたの所有ドメイン>>. 300 IN TXT "dnslink=/ipns/k51qzi5uqu5di9kl58x19u26pvm1gbhou4a7fhn8d4gr827rqx6221dq5ntcfv"

IPFSクライアントやノードがアドレス解決を試みるとき、dnslink=を先頭に持つTXTレコードを探します.

アクセスしてみる

DNSを登録すると 公開ゲートウェイを通じて

https://ipfs.io/ipns/<<あなたの所有ドメイン>>

でアクセスできるようになります。

もし公開ゲートウェイ側からアクセスできない場合は、ローカルホストからアクセスしてみましょう。

https://localhost:8080/ipns/<<あなたの所有ドメイン>>

となります。

できてるー!

コンテンツの更新

次はblogフォルダにあったindex.htmlを更新してみます。

<html>
<meta charset="UTF-8">
<body>
<p>こんにちは、世界!</p>
<p>外には美しい景色が広がっていますね</p>
<img src="images/pic_01_l.jpg">
</body>
</html>

これを更新すると、CIDが変更されます

$ ipfs add -r blog
added QmZSHMbE41iWmn3hBbTw9fs38Yto69DBMz7Xob3vDzY4nm blog/images/pic_01_l.jpg
added QmfYfFQCaRtJPs28vULTwNCJVkphEpCEafvN2EvbRWB6vS blog/index.html
added QmRmAGVYEJW5XZn3eBdNjsLStHgS8NR1VGMzvpCRZbfnJK blog/images
added QmPMYeLBc3wX4LnJ2ZpMBL7izoqhZq9MbXhpU164Wg1gwz blog

更新されたCIDをIPNSにパブリッシュします。

$ ipfs name publish /ipfs/QmPMYeLBc3wX4LnJ2ZpMBL7izoqhZq9MbXhpU164Wg1gwz
Published to k51qzi5uqu5di9kl58x19u26pvm1gbhou4a7fhn8d4gr827rqx6221dq5ntcfv: /ipfs/QmPMYeLBc3wX4LnJ2ZpMBL7izoqhZq9MbXhpU164Wg1gwz

パブリッシュ後、https://<<ゲートウェイのドメイン>>/ipns/blog.auth.classmethod.net にアクセスすると

追加した文章が表示されております。

更新時のフローまとめ

dnslinkとのマッピングにIPNSの値を設定していると、

何か更新のたびに

  • ipfs addでのコンテンツ追加
  • ipfs name publishでのIPNSに公開

を行うことになります。

dnslinkとのマッピングにIPFSの値を設定している場合だと、

コンテンツに更新があった場合は

  • ipfs addでのコンテンツ追加
  • DNSレコードの設定を新しいCIDに変更

といった手順となりそうですね。

ユーザーからのアクセスは、https://<<ゲートウェイのドメイン>>/ipns/<<アクセスさせたいドメイン>> となります。

参考