ipfs について
ipfs は、IPFS を使って分散ネットワーク上でファイルを保存・共有する開発者向けのスキルです。コンテンツアドレス指定、ピア検出、ピン留め、CLI と HTTP API の操作を扱います。
主な機能
- 01コンテンツハッシュによるファイル指定
- 02DHT によるピア検出
- 03IPLD によるデータ構成
- 04ファイルのピン留め
- 05CLI と HTTP API の利用
活用シーン
- 01ブロックチェーンデータのアーカイブ
- 02P2P ネットワークでのファイル共有
- 03NFT メタデータの保存
- 04CID によるファイル取得と検証
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ alphaonedev/ openclaw-graph --skill ipfsインストール後、Claude Code で/ipfsを入力して読み込まれたか確認します。
詳細
ipfs
目的
IPFS(InterPlanetary File System)は、分散型ネットワークでファイルを保存、共有するためのピアツーピアプロトコルです。中央サーバーを介さずにデータの永続性を確保します。
使用する場面
ブロックチェーンデータのアーカイブ、ピアツーピアのファイル共有、不安定なネットワークでのコンテンツ配信など、耐障害性を確保する分散ストレージが必要なアプリケーションを構築する場合にIPFSを使用します。NFTメタデータの保存や分散型アプリなど、大容量ファイルや検閲耐性のあるデータを扱う用途にも適しています。
主な機能
- 分散ストレージ:ファイルはコンテンツハッシュ(Qm...abcのようなCID)で識別され、任意のノードからグローバルにアクセスできます。
- ピア探索:DHTを使用してピアに自動的に接続します。
ipfs config Addresses.Swarm --json '["/ip4/0.0.0.0/tcp/4001"]'で設定します。 - バージョン管理:IPLDを使用したデータ構造のリンクに対応しています。
ipfs dag putでDAGノードを追加します。 - 暗号化:外部ツールを使ってファイルを暗号化できます。ファイルを追加する前に、libsodiumを使った対称暗号化を組み込みます。
- ピン留め:
ipfs pin add <CID>を使ってファイルをローカルストレージに手動でピン留めし、ガベージコレクションによる削除を防ぎます。
使用パターン
ファイルを追加するには、CLIからipfs add path/to/file.txtを実行し、その後CIDで参照します。コードではGo IPFSライブラリを使い、"github.com/ipfs/go-ipfs-api"をインポートして、sh := shell.NewShell("localhost:5001"); cid, err := sh.Add(strings.NewReader("data"))を呼び出します。スクリプトでは、エラーに備えてコマンドをtry-catchで囲みます。たとえば、最初にipfs daemonでデーモンが実行中か確認します。API呼び出しには、マルチパートフォームデータを使うPOST /api/v0/addなどのHTTPエンドポイントを使用します。
一般的なコマンド/API
- ファイルを追加:
ipfs add -r /path/to/dir(ディレクトリ用の再帰フラグ)。API:ファイルを含む本文を指定してPOST /api/v0/add。 - ファイルを取得:
ipfs cat <CID>で標準出力に出力します。API:GET /api/v0/cat?arg=。 - ピンの一覧表示:
ipfs pin ls --type=recursive。JSON形式で出力するには--enc=jsonを指定します。 - 設定の構成:
ipfs config --json Datastore.StorageMax "10GB"でストレージの上限を設定します。設定ファイルは~/.ipfs/configにあるJSONファイルです。 - デーモンの起動:pubsub機能を使うには
ipfs daemon --enable-pubsubを実行します。APIキーが必要な場合(例:エンタープライズゲートウェイ)、export IPFS_API_KEY=$SERVICE_API_KEYのように環境変数を設定し、ヘッダーに含めます。 curlで追加するコードスニペット:
curl -X POST -F [email protected] http://localhost:5001/api/v0/addGoのコードスニペット:
cid, err := sh.AddFile("/path/to/file.txt")
統合に関する注意
デーモンをローカルで実行するか、パブリックゲートウェイ(例:https://ipfs.io/ipfs/)を使用して、IPFSを他のツールと統合します。ブロックチェーンでは、コントラクトのメタデータを保存するためにIPFSをEthereumと連携させ、web3.jsでCIDを取得します。コードでは$IPFS_GATEWAYを環境変数として、エンドポイントをshell.NewShell("http://$IPFS_GATEWAY:5001")に設定します。認証には、プライベートAPIを使用する場合、Authorization: Bearer $IPFS_API_KEYのようなヘッダーを追加します。複数のネットワークを設定するには、configでswarmアドレスを指定します。たとえば、カスタムピアにはipfs bootstrap add /ip4/1.2.3.4/tcp/4001/ipfs/Qm...を追加します。
エラー処理
まずipfs idを実行して、"daemon not running"などの一般的なエラーがないか確認します。失敗した場合は、ipfs daemonで起動します。ネットワークの問題が発生した場合は、ipfs swarm connect /ip4/host/tcp/portでピアに手動接続します。APIエラーを解析します。レスポンスには、{"Message": "file not found"}のように"Message"フィールドを含むJSONが返されます。コードでは、sh.Add()の後に次のように処理します:
if err != nil { log.Fatal(err) }。権限エラーが発生した場合は、$IPFS_API_KEYが設定され、有効であることを確認します。一時的な障害には指数バックオフで再試行します。操作の前にipfs validate <CID>でCIDを検証します。
具体的な使用例
- ブロックチェーンストレージへのファイルのアップロード:まず、IPFS デーモンが実行中であることを確認します。ファイルを追加します:
ipfs add contract.jsonを実行すると、Qmabcd のような CID が出力されます。この CID をスマートコントラクトに保存します。Node.js では次のようにします:
const ipfsApi = require('ipfs-api'); const ipfs = ipfsApi('localhost', '5001', {protocol: 'http'}); ipfs.add(Buffer.from('contract data')).then(response => console.log(response[0].hash)); - ファイルの取得と検証:CID でファイルを取得します:
ipfs get Qmabcd -o output.txt。スクリプトで整合性を検証するには、ipfs cat Qmabcd | sha256sumを実行し、元のハッシュと一致することを確認します。分散型アプリでは、ループ内で使用します。複数の CID を取得し、見つからないものは try-catch で処理します。
グラフの関係
- 関連項目:ブロックチェーン(クラスター)。IPFS はブロックチェーンデータに分散型ストレージを提供します。
- タグによる関連:p2p(ほかの P2P プロトコルへのリンク)、decentralized-storage(分散型データベースとの関連)、distributed-filesystem(ファイル共有スキルとの重複)。