広告

IPFS APIでデータアップロードする方法

2024年4月14日

概要

IPFSノードを立ち上げデータをアップロードする方法の紹介です。

IPFSは分散型ストレージでNFTの画像や音楽データを主に保存しています。

将来は主流のデータ保存ストレージになる大変注目度の高い技術です。

IPFSノードにデータ(ファイルや画像など)を保存

/api/v0/add

IPFSにファイルやディレクトリを追加する。

引数

パラメータ説明必須
quiet [bool]:最小限の出力を書き込む。×
quieter [bool]最終ハッシュのみを出力する。×
silent [bool]何も出力しない。×
progress [bool]進捗データを流す×
trickle [bool]ダグ生成にトリクルダグ形式を使用する×
only-hash [bool]チャンクとハッシュのみ - ディスクに書き込まない×
wrap-with-directory [bool]ファイルをディレクトリオブジェクトでラップする×
chunker [string]チャンキングアルゴリズム、size-[bytes]、ravin-[min]-[avg]-[max]、またはbuzhash。デフォルト:size-262144×
raw-leaves [bool]リーフノードにrawブロックを使う。×
nocopy [bool]ファイルストアを使ってファイルを追加する。raw-leavesを暗示する。(実験的)×
fscache [bool]ファイルストアに既存のブロックがないかチェックする。(実験的)×
cid-version [int]CIDバージョン。CIDv1に依存するオプションが渡されない限り、デフォルトは0である。バージョン1を渡すと、raw-leavesオプションのデフォルトがtrueになる×
hash [string]使用するハッシュ関数。sha2-256でない場合はCIDv1を意味する。(実験的)。デフォルト: sha2-256×
inline [bool]小さなブロックを CID にインライン化する。(実験的)×
inline-limit [int]インライン化する最大ブロックサイズ。(実験的)。デフォルト: 32。×
pin [bool]追加されたファイルをガベージコレクションから保護するためにローカルにピンを立てる。デフォルト: true×
to-files [string]指定したパスに Files API (MFS) への参照を追加します×

Request Body

引数のパスはファイル・タイプです。このエンドポイントは、'multipart/form-data'としてリクエストのボディに1つまたは複数のファイル(コマンドに依存)を期待します。

addコマンドはファイルを追加するだけでなく、ディレクトリや複雑な階層をアップロードすることもできます。

これは次のように行われる: マルチパートリクエストの各部分は、IPFSに追加するディレクトリまたはファイルです。

ディレクトリパートは特別なコンテントタイプapplication/x-directoryを持つ。これらのパートはデータを持たない。パートヘッダーは以下のようになる:

Content-Disposition: form-data; name="file"; filename="folderName"
Content-Type: application/x-directory

ファイル・パートは、以下のヘッダーの後にファイル・ペイロードを運ぶ:

Abspath: /absolute/path/to/file.txt
Content-Disposition: form-data; name="file"; filename="folderName%2Ffile.txt"
Content-Type: application/octet-stream

...contents...

上記のファイルは "folderName/file.txt "階層にパスを含むので、IPFSはそれを "folderName "の中に追加することができる。ディレクトリを宣言する部分は、中にファイルがある場合は任意であり、ファイル名から推測される。どのような場合でも、ディレクトリツリーの深さ優先探索は、 リクエストを生成する異なるパーツを順番に並べるために推奨される。

Abspathヘッダーはnocopyオプションで有効になっているfilestore/urlstore機能のために含まれ、ファイルシステム内のファイルの場所(IPFSルート内)、または完全なWeb URLに設定することができます。

Response

成功すると、このエンドポイントへの呼び出しは、200と次のボディで返されます:

{
  "Bytes": "<int64>",
  "Hash": "<string>",
  "Name": "<string>",
  "Size": "<string>"
}

cURL Example

curl -X POST -F file=@myfile "http://127.0.0.1:5001/api/v0/add?quiet=<value>&quieter=<value>&silent=<value>&progress=<value>&trickle=<value>&only-hash=<value>&wrap-with-directory=<value>&chunker=size-262144&raw-leaves=<value>&nocopy=<value>&fscache=<value>&cid-version=<value>&hash=sha2-256&inline=<value>&inline-limit=32&pin=true&to-files=<value>"

データを公開

/api/v0/name/publish

IPNS名を公開する。

引数

パラメータ説明必須
arg [string]公開するオブジェクトのipfsパス
key [string]ipfs key list -l'でリストされる、使用するキーの名前または有効なPeerID。デフォルト: self×
resolve [bool]パブリッシュする前に、与えられたパスが解決できるかどうかをチェックする。デフォルト: true×
lifetime [string]署名付きレコードの有効期間。300s"、"1.5h"、または "7d2h45m "のような期間を受け入れる。デフォルト:48h0m0s×
ttl [string]更新をチェックする前にこのレコードをキャッシュする時間を示す。デフォルト:1h0m0s×
quieter [bool]CIDv1としてエンコードされた最終IPNS名のみを書き込む(/ipnsコンテンツパスで使用するため)。×
v1compat [bool]V1 と V2 署名の両方のフィールドを含む下位互換 IPNS レコードを生成する。デフォルト:true×
allow-offline [bool]offlineの場合、IPNSレコードをネットワークにブロードキャストせずに(失敗する代わりに)ローカルのデータストアに保存する×
ipns-base [string]キーに使用するエンコード: マルチベースでエンコードされたCIDか、base58btcでエンコードされたマルチハッシュのどちらかである。b58mh|base36|k|base32|b…}を取る。デフォルト: base36。必須ではない。×

Response

成功すると、このエンドポイントへの呼び出しは、200と次のボディで返されます

{
  "Name": "<string>",
  "Value": "<string>"
}

cURL Example

curl -X POST "http://127.0.0.1:5001/api/v0/name/publish?arg=<ipfs-path>&key=self&resolve=true&lifetime=48h0m0s&ttl=1h0m0s&quieter=<value>&v1compat=true&allow-offline=<value>&ipns-base=base36"

データの反映確認

/api/v0/name/resolve

IPNS名を解決する。

引数

パラメータ説明必須
arg [文字列]解決するIPNS名。デフォルトはノードのpeerID×
recursive [bool]結果がIPNS名でなくなるまで解決する。デフォルト:true×
nocache [bool]キャッシュされたエントリーを使用しない×
dht-record-count [uint]DHT 解決のために要求するレコード数。デフォルト: 16×
dht-timeout [string]DHT 解決中に値を収集する最大時間。タイムアウトなしの場合は0を渡します。デフォルト:1m0s×
stream [bool]見つかったエントリーをストリームする×

Response

成功すると、このエンドポイントへの呼び出しは、200と次のボディで返されます:

{
  "Path": "<string>"
}

cURL Example

curl -X POST "http://127.0.0.1:5001/api/v0/name/resolve?arg=<name>&recursive=true&nocache=<value>&dht-record-count=16&dht-timeout=1m0s&stream=<value>"

-EVM