†IPFSを実行しながら学んでいく2 ~永続性~ †

2022.07.06

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

††学んだ内容をメモメモ††

IPFSのコマンドラインツールを使って色々と学んでいこうとしています。

前回はIPFSのコマンドラインツールをインストールし、 ファイルを追加したり、追加されたファイルを操作したりとやってみました。

今回はIPFSで非常に重要な概念であるPinnning(固定)を試していきたいと思います

固定は、IPFSに特定のオブジェクトを常にどこかに保持するように指示できるメカニズムです。

IPFSの永続性の考え方に以下のような仕様があるため、IPFSに無期限に保持したいコンテンツがある場合は固定を行う必要があります。

  • IPFSネットワーク上のノードは、ダウンロードしたリソースを自動的にキャッシュし、それらのリソースを他のノードで使用できるように保つ
  • ノードは新しいリソース用のスペースを確保するために、以前にキャッシュされたリソースの一部をクリアする必要がある(ガベージコレクション)
  • ガベージコレクションを防ぐには、CIDを固定するか、MFS(可変ファイルシステム)に追加します
  • ipfs addを実行すると、デフォルトではローカルノードに再帰的に固定される

ローカルノードへの固定を試す

ipfsコマンドを使って確認していきます。

追加

まず、何か適当なコンテンツをipfsに追加してみました。

$ ipfs add <<path_to_file>>
added QmRTV3h1jLcACW4FRfdisokkQAk4E4qDhUzGpgdrd4JAFy <<path_to_file>>

固定したファイルを確認する

ipfs pin lsコマンドを使うとローカルストレージに固定されているすべてのオブジェクトを一覧表示できます。

$ ipfs pin ls
QmQGiYLVAdSHJQKYFRTJZMG4BXBHqKperaZtyKGmCRLmsF indirect
QmVvzqbLErJv3KJ2Sc9Woq1Uv9BkRoTF2x35XNxcqJzrae indirect
QmU4aN9f24NrUUrrNLRi6qiSg9PTXFsE6QZPbHY7xGmi6k indirect
QmQd7pArHBowCQGaUikY2wkaLES2BSaWmaqhAncEXXDB5v indirect
QmYyQkqJ36Zgx7j15fnoThu6M5HSUbFQx9GyVyTVKrJ8ot indirect
QmXjC6ru34t4VFxbgRx7PkZLoEmGnxjvjQfTUKmyGA5mrJ indirect
~~~ 省略 ~~~

typeオプションを使うことにより、特定の固定タイプに制限することができます

typeは以下

<ul> <li>direct:単一のブロックだけを固定し、そのブロックに関連する他のブロックは固定しない</li> <li>recursive:与えられたブロックとそのすべての子ブロックを固定されたもの</li> <li>indirect:与えられたブロックの親が再帰的にピン留めされた結果、ピン留めされたもの</li> <li>all : 全てのタイプ(デフォルト</li> </ul>

$ ipfs pin ls --type=recursive
QmQPeNsJPyVWPFDVHb77w8G42Fvo15z4bG2X8D2GhfbSXc recursive
QmRTV3h1jLcACW4FRfdisokkQAk4E4qDhUzGpgdrd4JAFy recursive
~~~~

$ ipfs pin ls --type=indirect
QmYyQkqJ36Zgx7j15fnoThu6M5HSUbFQx9GyVyTVKrJ8ot indirect
QmNsk9Myon3WExiFoar9yWJRrc3TY55FXP8Cor56QCRyoq indirect
QmdpxVjSeQ18KF23cf8H86GgRiiyZUne1dMxapLNxN3NXw indirect
~~~~
省略

先ほど追加したコンテンツのCID確認してみます。

$ ipfs pin ls QmRTV3h1jLcACW4FRfdisokkQAk4E4qDhUzGpgdrd4JAFy
QmRTV3h1jLcACW4FRfdisokkQAk4E4qDhUzGpgdrd4JAFy recursive

上記のようにCIDが出力されるはずです。これで<code>ipfs add</code>が自動で固定してくれる ということが体験できました。

<h3>固定したファイルを解除する</h3>

<code>pin rm </code>コマンドを使用してオブジェクトの固定を解除することができます。

$ ipfs pin rm QmRTV3h1jLcACW4FRfdisokkQAk4E4qDhUzGpgdrd4JAFy
unpinned QmRTV3h1jLcACW4FRfdisokkQAk4E4qDhUzGpgdrd4JAFy

$ ipfs pin ls QmRTV3h1jLcACW4FRfdisokkQAk4E4qDhUzGpgdrd4JAFy
Error: path 'QmRTV3h1jLcACW4FRfdisokkQAk4E4qDhUzGpgdrd4JAFy' is not pinned

<h3>ガベージコレクションを実行してみる</h3>

<code>ipfs repo gc</code>コマンドを使うことにより、ローカルノードでガベージコレクションを実行できます。

$ ipfs repo gc
removed bafkreihshanjznywfxaxc664xcmsnzwqydntrgsxmbnqqjqeeqxecos2w4
removed bafkreigbyivpq6rzmva4hl6n65ztg6u5u3zo2zpmgzaceqxlqtnpi77dq4
removed bafkreibokmzydcu77xhc5mgl34jdpmvqr4ziahdm2wbhkx2gkrfrlpivia
~~~
~~~
省略

このコマンドは、固定されていないすべてのオブジェクトをIPFSから削除します。

※ 今回は手動で実行しましたが、ipfsをデーモンとして実行していた場合は自動でガベージコレクションを行うように設定できます。

その他のIPFS固定サービスに関して

ローカルIPFSノードにコンテンツを固定したり、解除したりしてみました。

ローカルで固定する以外に、外部ノードで固定する有料サービスもあり、重要なデータを確実に保持するにはこれらのサービスを利用することが勧められています(※ 参考欄を参照)。

※ IPFSは、ネットワーク上のあらゆるコンテンツが発見可能であることを保証しているが、あらゆるコンテンツが永続的に利用可能であることは保証していない

IPFS+Filecoinソリューション

さらにFilecoinというストレージプロバイダーがクライアントにストレージスペースを貸し出す分散型ストレージネットワークというものも現れてきています。Filecoinは信頼できる長期ストレージソリューションをユーザーに提供します。 これはブロックチェーントランザクションに精通していない、または単にコマンドライン内での作業に慣れていない新しいユーザーには複雑であると言われていますが、

ファイルコインを介してデータを永続化しながら、IPFSでコンテンツを利用できるようにするプロセスを簡素化するのに役立つツールとサービスプロバイダーのコミュニティが増えているとのこと。

この2つを組み合わせると、ファイルをアップロードすると、そのファイルをすぐにダウンロードできるようになります。 さらに、IPFSとFilecoinを組み合わせたソリューションは、定期的にデータをバンドルし、評判の良いFilecoinストレージプロバイダーとの取引を作成して、データが長期ストレージで利用できるようにします。 多くのソリューションには、開発者がアプリやサービスに統合するためのAPIクライアントライブラリや、ファイルをすばやく管理および検査するためのWebインターフェイスが含まれていることが多いので、これらを使うこともありそうです。

参考