DApps開発において、データやファイルをどこに格納するのかは常に課題になると思いますが、
現段階でその課題を解決してくれそうな一番の有力候補はIPFSでしょう。
そこで今回はIPFSを使うために、テスト環境用にクローズドなIPFSノードを立ち上げる方法を試してみようと思います。
1. go-ipfsのダウンロード
下記サイトよりgo-ipfsをダウンロードし、任意の場所に格納します。
https://dist.ipfs.io/#go-ipfs
2. インストール
下記のinstall手順に沿って、コマンドを実行し、ipfsをインストールします。
tar xvfz go-ipfs.tar.gz
cd go-ipfs
./install.sh
# Moved ./ipfs to /usr/local/bin
ipfs help
とコマンドを打って、helpが表示されていれば無事ダウンロード完了です。
3. 起動(パブリック)
下記コマンドを実行すると、IPFSノードがパブリックな状態で起動します。
ipfs daemon
# Initializing daemon...
# Successfully raised file descriptor limit to 2048.
# Swarm not listening, running in offline mode.
# API server listening on /ip4/127.0.0.1/tcp/5001
# Gateway (readonly) server listening on /ip4/0.0.0.0/tcp/9001
# Daemon is ready
問題なく起動できていれば、下記コマンドで自分が立ち上げたノードと接続されたpeerを確認できます。
ipfs swarm peers
問題なくパブリックなネットワークに接続できているか確認するため、下記のコマンドで猫の画像を取得してみます。
ipfs cat /ipfs/QmW2WQi7j6c7UgJTarActp7tDNikE4B2qXtFCfLPdsgaTQ/cat.jpg >cat.jpg
open cat.jpg
猫の画像が見えれば、ノードの起動は成功です。
4.起動(クローズド)
ctrl + c
で起動させたノードを停止し、下記コマンドでIPFSノードをクローズドな状態で起動します。
ipfs daemon --offline
# Initializing daemon...
# Successfully raised file descriptor limit to 2048.
# Swarm not listening, running in offline mode.
# API server listening on /ip4/127.0.0.1/tcp/5001
# Gateway (readonly) server listening on /ip4/0.0.0.0/tcp/9001
# Daemon is ready
問題なく起動できていれば、下記コマンドでエラーになります。
ipfs swarm peers
# Error: This command must be run in online mode. Try running 'ipfs daemon' first.
5.ファイルのアップロード
クローズドなIPFSノードにファイルをアップロードします。
ipfs add sample.png
# added Qmxxxxxxxxxxxxxxxxxxxxxxxxxxx sample.png
ハッシュ値が返ってくるので、その値をもとにIPFS自身が運営するGatewayと自分で立ち上げたノードとにアクセスしてみます。
-
IPFS Gateway
-
自分で立ち上げたノード
自分で立ち上げたノードでのみ画像が表示されていると思います。
ファイルをアップロードした後に、IPFSノードをパブリックな状態で起動し直してしまうと、他のパブリックなノードからアクセスできてしまうので要注意です。
6.設定変更
ポートを変更したい場合は、下記コマンドで変更できます。
ipfs config Addresses.Gateway /ip4/0.0.0.0/tcp/9001
ipfs config Addresses.API /ip4/0.0.0.0/tcp/3001
異なるドメインからIPFSのAPIを呼ぶ場合は、下記コマンドでHTTPHeadersの設定を変更しておく必要があります。
ipfs config --json API.HTTPHeaders.Access-Control-Allow-Origin '["*"]'
ipfs config --json API.HTTPHeaders.Access-Control-Allow-Methods '["GET", "POST"]'
<参考>
https://ipfs.io/docs/
https://groups.google.com/forum/#!topic/ipfs-users/5oEfULoGpt4