ESM アジャイル事業部 開発者ブログ

永和システムマネジメント アジャイル事業部の開発者ブログです。

EC2上にIPFS NODEを作成する

概要

宮崎よりお送りします。最近、ひょんなことから ブロックチェーンに興味を持ちました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も気軽に利用できるようになっています。例えば、InfuraPintafleekなどがあります。

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のインストールを参照ください