概要
宮崎よりお送りします。最近、ひょんなことから ブロックチェーンに興味を持ちましたyoshinoです。ブロックチェーン関連技術の1つであるIPFS*1の特徴である「コンテンツ指向」、「分散型WEB」の理解を深めるために、EC2上にIPFSサーバーを作成して動作を確認しました。
今回EC2上に作成するIPFS サーバーには大きく2つの役割があり、1つはIPFSネットワークに参加して、他のIPFS NODE(ピア)とIPFSプロトコルで通信すること、もう1つはHTTPリクエストによってIPFSのコンテンツへアクセスできるように橋渡しをしてくれるIPFS Gatewayとしての機能です。
IPFS Gatewayに、あるコンテンツを問い合わせて、そのNodeがそのコンテンツを所有していなければ、IPFSネットワークの中でそのコンテンツを持っている他のNODEがないかを確認し、持っているNODEがいれば、それをコピーして、そのコンテンツをレスポンスとして返します。
結果として、コンテンツを保有しているのは、2つのNODEになり、現在のHTTPプロトコルによる「ロケーション指向」では、少数のドメインがコンテンツを独占的に所有していることと比較して、「分散的」であり、「コンテンツ指向」であることが確認できます。
それでは、実際に確認してみることにします。
AWS EC2インスタンスを作成する
EC2インスタンスを作成します。IPFS Gatewayは8080ポート、IPFS Nodeは4001ポートを利用できるようにします。内容としてはこれだけです。今回利用したEC2の具体的な内容などは、こちらのリポジトリで参照いただけます。
IPFSサーバーを動かす
sshでEC2インスタンスに接続します。
ssh -i <SSH KEY> <Public IPv4 DNS>
IPFSコマンドのインストールから試していきたいという方は、こちらの記事が参考になるかと思います。今回はDockerを利用してIPFSサーバーを動かします。
sudo apt update sudo apt install docker.io
IPFSのコンテンツを置いておくディレクトリ(/data/ipfs-staging
)と設定ファイルを置いておくディレクトリ(/data/ipfs
)を作成して、volume マウントします。
sudo mkdir -p /data/ipfs-staging sudo mkdir -p /data/ipfs export ipfs_staging=/data/ipfs-staging export ipfs_data=/data/ipfs
IPFSをDocker image ipfs/go-ipfs を利用して動かします。
sudo docker run -d --name ipfs_host -v $ipfs_staging:/export -v $ipfs_data:/data/ipfs -p 4001:4001 -p 0.0.0.0:8080:8080 ipfs/go-ipfs:latest
お疲れさまでした。IPFS NPDEの完成です🎉
試してみる
コンテンツをアップロードする
コンテンツを適当に作成します。
mkdir blog touch blog/20220709.txt touch blog/20220710.txt echo 'hello! 2022/07/09' > blog/20220709.txt echo 'hello! 2022/07/10' > blog/20220710.txt
ipfs add でIPFS nodeにアップロードします(ディレクトリの場合は-r
オプションをつける)
>> cp -r blog $ipfs_staging >> sudo docker exec ipfs_host ipfs add -r /export/blog added QmQ5ZdQnE8gszp4GdKzkz4ecQYR8ZnSigAMT4p1mRJsF2r blog/20220709.txt added QmV8bR6LrPCk246df8p79UVY7B6XBQ2bTX4jfUHu6ZX4kB blog/20220710.txt added QmeZ26UugrZNRHYBKxUoUD7Q78kFgUFayvmhpiSJQPFc8S blog
QmeZ26UugrZNRHYBKxUoUD7Q78kFgUFayvmhpiSJQPFc8S
がblogディレクトリ以下を含むコンテンツのIDとなり、コンテンツ内容に対して一意となります。
今回作成した、EC2のGateway経由でのコンテンツは以下のようにアクセスすることができます。
http://<Public IPv4 DNS>:8080/ipfs/QmeZ26UugrZNRHYBKxUoUD7Q78kFgUFayvmhpiSJQPFc8S
コンテンツを持っているIPFS NODEを確認する
先ほど作成したコンテンツを持っているNODEのIDを表示します。
>> sudo docker exec ipfs_host ipfs dht findprovs QmeZ26UugrZNRHYBKxUoUD7Q78kFgUFayvmhpiSJQPFc8S 12D3xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
12D3xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
というNODE のIDが1つだけこのコンテンツを持っていることを表します。
もちろん、このNODE IDは先ほどEC2上に作成したIPFSのNODEにほかなりません。
以下のようにNODE ID を確認することができます。
>> sudo docker exec ipfs_host ipfs id "ID": "12D3xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
コンテンツを他のGatewayから取得する
ローカルでIPFSサーバーを起動します*2。
ipfs daemon
http://localhost:8080/ipfs/QmeZ26UugrZNRHYBKxUoUD7Q78kFgUFayvmhpiSJQPFc8S にアクセスして、先ほどEC2のIPFS NODEにアップロードしたコンテンツと同じものが見れることを確認します。
このコンテンツを持っているNODEのIDをもう一度確認してみます。
>> ipfs dht findprovs QmeZ26UugrZNRHYBKxUoUD7Q78kFgUFayvmhpiSJQPFc8S ✘ 1 Qmdxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 12D3xxxxxxxxxxxxxxxxxxxxxxxxxxxx
今度は先ほどのEC2のIPFS NODEのID12D3xxxxxxxxxxxxxxxxxxxxxxxxxxxx
に加えて、ローカルのIPFS NODEQmdxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
が確認することができました。
EC2に作成したIPFS NODEから、ローカルで起動したIFPS NODEにコンテンツが複製されていることが確認できます。
最後に
IPFS Gatewayを無料で公開する企業もでてきており、IPFSも気軽に利用できるようになっています。例えば、Infura、Pinta、fleekなどがあります。
infuraのIPFS Gatewayを利用してみます。
https://ipfs.infura.io/ipfs/QmeZ26UugrZNRHYBKxUoUD7Q78kFgUFayvmhpiSJQPFc8S
また、infuraはIPFSにアップロードできるAPIも公開しているので、無料で、IPFSネットワークにアップロードすることを試すこともできます(infuraのNODEにアップロードしても、そのコンテンツが永続的に残ることはなく、定期的に削除されてしまいます。そのため、永続的にIPFSネットワークに残しておくために、例えば、今回紹介したような形で自前のIPFS NODEが必要になるかもしれません)。
今後もIPFSをはじめとしたブロックチェーンまわりの動向に注目していきたいです。
リファレンス
*1:IPFSに関してはIPFSとは何か?がわかりやすいです
*2:ipfsコマンドのインストールはIPFSのインストールを参照ください