DNSLinkメモ
よくわかる解説
なんとなくわかる解説
ドメインのTXTレコードにIPFSのパスを書いて、プログラムはそれを見てあげましょうというプロトコル
何がうれしい?
DNSLinkに対応しているプログラムに対して、CIDを渡す代わりにhuman-readableなドメイン名を渡してCIDを見てもらうことができる。
応用して、好きなドメインmy.domainを使って、IPFS上でサーブしているファイルの閲覧が可能になる。
ファイルがHTML/CSS/JSならWebサイトになる。
DNSLinkに対応しているプログラムって?
go-ipfs (つまりipfsコマンド、かつ IPFS ゲートウェイ)
(例)libp2p.com ドメイン
digコマンドでTXTレコードを見る
プロトコル上FQDNと_dnslink.FQDNのTXTレコードに対して指定できる。
_dnslink.libp2p.com に IPFSパスが書かれていることがわかる。
code:shell
$ dig +noall +answer TXT libp2p.io
libp2p.io. 60 IN TXT "ALIAS for website-int.ipfs.io"
libp2p.io. 60 IN TXT "v=spf1 a include:_spf.google.com ~all"
$ dig +noall +answer TXT _dnslink.libp2p.io
_dnslink.libp2p.io. 60 IN TXT "dnslink=/ipfs/bafybeiejgrxo4p4uofgfzvlg5twrg5w7tfwpf7aciiswfacfbdpevg2xfy"
ipfsコマンドでドメイン名を使う
/ipns/libp2p.io というパスは /ipfs/bafybeiejgrxo4p4uofgfzvlg5twrg5w7tfwpf7aciiswfacfbdpevg2xfy と同じことがわかる。
code:shell
$ ipfs ls /ipns/libp2p.io
bafybeifrarvwyfk6ne4y3ek7fcujnpjpaz6ojbgyjs7vxgxlpkxl5324gi - bundles/
bafybeifsyzh2ane5hrpk7hm2dexbuixnt5ah3xtg4bq5eyg657cfgouxwm - categories/
...略
$ ipfs ls /ipfs/bafybeiejgrxo4p4uofgfzvlg5twrg5w7tfwpf7aciiswfacfbdpevg2xfy
bafybeifrarvwyfk6ne4y3ek7fcujnpjpaz6ojbgyjs7vxgxlpkxl5324gi - bundles/
bafybeifsyzh2ane5hrpk7hm2dexbuixnt5ah3xtg4bq5eyg657cfgouxwm - categories/
...略
パブリックゲートウェイに対してもドメイン名を使う
code:shell
<!DOCTYPE html>
<html lang="en">
...略
DNSLinkの応用
好きなドメインmy.domainでIPFS上のファイルにアクセスさせる。
普通にアクセスできる。
209.94.78.1はIPFSゲートウェイ(もしくはゲートウェイへのプロキシ)の働きをしている(多分)。
IPFSゲートウェイはHTTPヘッダのHost: FQDNを見て、DNSLinkプロトコルに従ってそのFQDNのCIDを取得する。
IPFS ゲートウェイがそのCIDに対応するファイルを返すため、まるで普通のWebサーバにアクセスしたかのようにIPFS上のコンテンツを見ることができる。
code:shell
$ dig +noall +answer A libp2p.io
libp2p.io. 38 IN A 209.94.78.1
DNSLinkの応用の問題点
指定するIPFSゲートウェイへの依存
ゲートウェイサーバがオフラインになったらおしまい。
多くのドメインに指定された場合負荷も増大する。
ゲートウェイサーバが発行して保持するTLS証明書への信頼
HTTPS接続する場合、ゲートウェイサーバがTLS証明書を保持する必要がある。
Cloudflareにmy.domainのTLS証明書を発行して保持してくれと頼む。
(参考)go-ipfsの実装
code:go
rootChan := make(chan lookupRes, 1)
go workDomain(r, fqdn, rootChan)
subChan := make(chan lookupRes, 1)
go workDomain(r, "_dnslink."+fqdn, subChan)
(fqdn)と_dnslink.(fqdn)のTXTレコードを見ていることがわかる。