IPFSにファイルを保存してそれをブラウザに表示+Blockcerts検証

Yosuke
9 min readSep 22, 2020

--

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を立てることもできる。

HTMLファイルを保存すれば、Webサーバーの代わりに利用することができる。

Blockcerts検証

  1. まずはrevocationのissuerをipfsに変えて検証。

2. issuer.jsonの ”issuer”項目のURLをIPFSに変更してハッシュ値を確認

上が変更後、下が変更前(QmQTNzPhajWq4VemWqgg6m81LWocmP7KJ3esz6fbDG2GXe)なのでipfsゲートウェイを通すとブラウザのハッシュ値も変わってしまう。

考察

ipfsはコンテンツ指向ではあるものの、URL(今回の場合は同コンテンツ異なるゲートウェイ)が異なった場合ハッシュ値が異なる。つまり違うコンテンツとして異なる場所に管理されてしまう。

ipfsのwhitepaperによると上図のようにMerkle DAGの構造を取っており、リーフから識別子を計算していくため、今回の検証のように一部異なる文字列(同コンテンツ)の場合でもCID(Content Identifer) が変わってしまった。

jsonファイルでMerkle DAGを理解するデモ

--

--

Yosuke
Yosuke

Written by Yosuke

アメリカ大学院留学生。CS専攻。SDGs目標達成へ国連主導組織「Learning economy 」ブロックチェーンを活用した21世紀型教育プラットフォーム「C-Lab」の学生研究員。海外でのCSやブロックチェーン、留学の学びについて発信します。9月〜マルタ大学院で学生研究員🇲🇹

No responses yet