IPFSのインストール
まずはここからOSに合ったものをダウンロードする次に、解凍しgo-ipfs
のフォルダに入り、install.sh
を実行する。
$ tar xvfz go-ipfs.tar.gz
$ cd go-ipfs
$ ./install.sh
OR
$ sudo mv ipfs /usr/local/bin/ipfs
以上のコマンドを順に実行した後に、
$ ipfs help
を実行し、helpが表示されると、無事にipfsが利用できるようになっている。ここでIPFSを初期化するために
$ ipfs init
を実行する。
Firebaseのほうがかっこいいですね。
IPFSに保存する
今回検証したファイルはこちら
https://github.com/blockchain-certificates/wallet-test-resources
$ ipfs add sample_cert-v1-issuer-2.0a.json
$ ipfs add revocation_list-2.0.json
出力結果
added QmQTNzPhajWq4VemWqgg6m81LWocmP7KJ3esz6fbDG2GXe sample_cert-v1-issuer-2.0a.json
23.67 KiB / 23.67 KiB [======================================================] 100.00%added QmQA7V5ZKdznSeZRgYps8A98dvDKi3Kz91b8pn7kWN9CqQ revocation_list-2.0.json
559 B / 559 B [==============================================================] 100.00%
ここで表示されたハッシュ値のようなものが、ファイルの識別子となる。
出力されるハッシュ値はファイルにより異なるため、以下の作業は自身のファイルのハッシュ値を利用してください。
IPFSのネットワークに参加し、自身のファイルを周りのノードに保存してもらう。
% ipfs daemon
Daemon is ready
Initializing daemon...
go-ipfs version: 0.6.0
Repo version: 10
System version: amd64/darwin
Golang version: go1.14.4
Swarm listening on /ip4/127.0.0.1/tcp/4001
Swarm listening on /ip4/127.0.0.1/udp/4001/quic
Swarm listening on /ip4/192.168.1.9/tcp/4001
Swarm listening on /ip4/192.168.1.9/udp/4001/quic
Swarm listening on /ip6/2400:4052:6a00:1300:1003:42f6:95ae:135/tcp/4001
Swarm listening on /ip6/2400:4052:6a00:1300:1003:42f6:95ae:135/udp/4001/quic
Swarm listening on /ip6/2400:4052:6a00:1300:a94d:4f81:6a76:1e51/tcp/4001
Swarm listening on /ip6/2400:4052:6a00:1300:a94d:4f81:6a76:1e51/udp/4001/quic
Swarm listening on /ip6/::1/tcp/4001
Swarm listening on /ip6/::1/udp/4001/quic
Swarm listening on /p2p-circuit
次に以下を実行
% ipfs name publish QmQTNzPhajWq4VemWqgg6m81LWocmP7KJ3esz6fbDG2GXe
% ipfs name publish QmQA7V5ZKdznSeZRgYps8A98dvDKi3Kz91b8pn7kWN9CqQ
出力結果
Published to Qma1jGzcuk93Cm9Ko2VKYW9onVCNV4EtDfmm6TyR6MsYGe: /ipfs/QmQTNzPhajWq4VemWqgg6m81LWocmP7KJ3esz6fbDG2GXePublished to Qma1jGzcuk93Cm9Ko2VKYW9onVCNV4EtDfmm6TyR6MsYGe: /ipfs/QmQA7V5ZKdznSeZRgYps8A98dvDKi3Kz91b8pn7kWN9CqQ
IPFSのネットワークに接続できているか確認するためには、以下のコマンドを実行する
$ ipfs swarm peers | head
出力結果
/ip4/104.131.131.82/tcp/4001/p2p/QmaCpDMGvV2BGHeYERUEnRQAwe3N8SzbUtfsmvsqQLuvuJ
/ip4/106.54.135.46/tcp/4001/p2p/QmQ9p1W5szCs91DC2kW7E82QhXGW5r3n8GyHHf7etAXEeU
/ip4/106.54.226.157/tcp/4001/p2p/QmVnWD8696ei51y3PwZENUFnZf5CtE47LHcgMcTTpS7Ed1
/ip4/109.206.206.92/tcp/4001/p2p/QmNr36d6pMCSEqdhj9q8fYkajTW6VYiN4XMdaBkh2qwuEa
/ip4/111.229.116.11/tcp/4001/p2p/QmRjHg4dvGqh2gCmj9nUhP9LUsH1SPErkjCtucFFRmYifa
/ip4/111.229.121.166/tcp/4001/p2p/QmZWkuYtWm7cuZN5KbFAGLXDBaVNSzc6kFyrRhXnESao2Q
/ip4/118.89.49.94/tcp/4001/p2p/QmTsyYZvZ66Yc2ViWC3gbv4do8hbzHHC3XXHp3v5stSHNn
/ip4/122.51.147.34/tcp/4001/p2p/QmP7UxEuTBVoR56u2Fo6fz4ZgTFZaz3o9CTTTQvfaezUvJ
/ip4/122.51.165.254/tcp/4001/p2p/QmfGL9MucUduDcMb4GbhsqfLpS92HfLSwXyVv8hLiS8A8A
/ip4/123.207.126.179/tcp/4001/p2p/QmP7PWCvhWT1kYh1ZN9CfYoywUPPZohVk7SMDnH48VG5G8
次に以下のコマンドで先ほどIPFSのネットワークに伝達したファイルを保持してくれてるノードの一覧を取得することができる。
% ipfs dht findprovs QmQTNzPhajWq4VemWqgg6m81LWocmP7KJ3esz6fbDG2GXe
% ipfs dht findprovs QmQA7V5ZKdznSeZRgYps8A98dvDKi3Kz91b8pn7kWN9CqQ
出力結果
Qma1jGzcuk93Cm9Ko2VKYW9onVCNV4EtDfmm6TyR6MsYGe
Qma1jGzcuk93Cm9Ko2VKYW9onVCNV4EtDfmm6TyR6MsYGe
偶々同じノード内に保存されている。
IPFSのファイルをブラウザから確認する
IPFS上のファイルをブラウザから確認するためには、IPFSのゲートウェイサーバーを利用する。
以下のURLでアクセスする。
・sample_cert-v1-issuer-2.0a.json
<https://ipfs.io/ipfs/QmQTNzPhajWq4VemWqgg6m81LWocmP7KJ3esz6fbDG2GXe>
・revocation_list-2.0.json
<https://ipfs.io/ipfs/QmQA7V5ZKdznSeZRgYps8A98dvDKi3Kz91b8pn7kWN9CqQ>
今回利用したGateWay以外にも、https://ipfs.io/ipfs/ハッシュ値
で利用できるものもある。また、個人でGatewayを立てることもできる。
- Protocol Labs, which deploys the public gateway
https://ipfs.io
; - Third-party public gateways; e.g.,
https://cf-ipfs.com
.
HTMLファイルを保存すれば、Webサーバーの代わりに利用することができる。
Blockcerts検証
- まずはrevocationのissuerをipfsに変えて検証。
2. issuer.jsonの ”issuer”項目のURLをIPFSに変更してハッシュ値を確認
上が変更後、下が変更前(QmQTNzPhajWq4VemWqgg6m81LWocmP7KJ3esz6fbDG2GXe
)なのでipfsゲートウェイを通すとブラウザのハッシュ値も変わってしまう。
考察
ipfsはコンテンツ指向ではあるものの、URL(今回の場合は同コンテンツ異なるゲートウェイ)が異なった場合ハッシュ値が異なる。つまり違うコンテンツとして異なる場所に管理されてしまう。
ipfsのwhitepaperによると上図のようにMerkle DAGの構造を取っており、リーフから識別子を計算していくため、今回の検証のように一部異なる文字列(同コンテンツ)の場合でもCID(Content Identifer) が変わってしまった。
jsonファイルでMerkle DAGを理解するデモ