【INFURA】ファイルをまとめてIPFSへアップ【5GBまで無料】

## はじめに
NFT、とくに大量の画像を扱うジェネレーティブ系の場合、IPFSへのアップロードはちょっとしたテーマです。
少し前までは、[【Pinata】](https://www.pinata.cloud/)がとても扱いやすかったのですが、最近、料金プランが変更されたことで、特に無料枠が使いづらくなってしまいました(無料プランではピン留めできるファイル数がたったの１００個...)。

有料プランに切り替えれば今まで同様、便利に扱えるのでしょうが、個人で細々やっているようなNFTの場合、最低でも月額 **$20**というのはなかなかの出費となります。
というわけでこの記事では、[【INFURA】](https://infura.io/)の無料枠を使った IPFSへのアップロード、とくに、フォルダとしてのあげ方に関してまとめてみます。

## INFURAのIPFS
INFURAといえば、EVM系のゲートウェイサービスとして有名ですが、IPFSのサービスも提供しています。

とはいえ、Webサイト上で手軽にファイルやフォルダをアップロードできるPinataと比べ、INFURAでは APIを叩く必要があり、使い勝手は若干(というかかなり)落ちます。

ですが、Pinataの無料枠 **1GB**に対して、INFURAの無料枠は **5GB**という太っ腹。ピン留めの制限もないようなので、ここは黙って、ありがたく使わせていただきましょう。

## 準備①：INFURAのアカウント作成
[【https://infura.io/】](https://infura.io/)へアクセスして、右上の「SIGN UP」をクリックします。
![ss01](https://user-images.githubusercontent.com/13220051/185568467-d0169bcf-ce52-478b-80f0-79bcbb238ca1.png)

「EMAIL」と「PASSWORD」を入力して「SIGN UP」をクリックします。
![ss02](https://user-images.githubusercontent.com/13220051/185568482-1a53f720-055f-4d7b-8d81-241a347e34ff.png)

これで、入力したメルアドに認証メールが届くので、そこから登録を完了させましょう。

## 準備②：IPFSプロジェクトの作成


INFURAのサイトにログインし、右上の「CREATE NEW KEY」をクリックします。
![ss03](https://user-images.githubusercontent.com/13220051/185568487-e48fef12-cf36-48ce-b440-67d836ff2415.png)

「NETWORK」で「IPFS」選択し、「NAME」に任意の名前をつけ、「CREATE」をクリックします。
![ss04](https://user-images.githubusercontent.com/13220051/185568493-f93a60a8-427b-4e1f-b725-04b1c16c2d9b.png)

クレジットカードの登録画面が表示された場合、カード情報を入力し、「CREATE PROJECT」をクリックします。
![ss05](https://user-images.githubusercontent.com/13220051/185568499-9024731c-1515-4756-83ab-0a9d41f498a3.png)
（注意書きにもありますが、**5GB**を超えると課金されるようなので、登録後の使用量にはご注意ください）

IPFSのプロジェクトページが表示されたら、「PROJECT ID」と「API KEY SECRET」をメモ(コピー)しておきます。
![ss06](https://user-images.githubusercontent.com/13220051/185568505-a669777e-f7df-4d90-8d07-8f9fa4c2d0f2.png)
これで準備は完了です。
上でメモした「PROJECT ID」と「API KEY SECRET」を、IPFSへのアップロードの際に利用することになります。


## ファイルを単体でアップロード
ファイルをアップロードするには、[【INFURA IPFS の add API】](https://docs.infura.io/infura/networks/ipfs/http-api-methods/add)を利用します。

下記では **test.png**というファイルをIPFSへアップロードしています。
（*ここでは、コマンドラインから、「curl」を使って叩いています*）
（*実際に実行する際は、下記の「**PROJECT ID**」と「**API KEY SECRET**」をご自身のプロジェクトの値で置き換えてください*）

```
$ curl -X POST -u "「PROJECT ID」:「API KEY SECRET」" \
"https://ipfs.infura.io:5001/api/v0/add?pin=true" \
-F file=@"test.png"
```

成功すると下記の出力を得られます。

```
{"Name":"test.png","Hash":"QmZPk72rkQLdHAmgvzv4K1et6axJzvShNcd1K2VebNoZEk","Size":"465584"}
```

Hashの値がCID(ファイルのハッシュ値)となり、この値を指定することでIPFSにアップされたデータへアクセスできます。
[ipfs://QmZPk72rkQLdHAmgvzv4K1et6axJzvShNcd1K2VebNoZEk](https://hakumai-test.infura-ipfs.io/ipfs/QmZPk72rkQLdHAmgvzv4K1et6axJzvShNcd1K2VebNoZEk)


## ファイルをまとめてフォルダとしてアップロード
下記は、複数のファイル **1〜10.png**をまとめてアップし、その"**フォルダ**”のハッシュ値を得るコマンドです。

```
$ curl -X POST -H "Content-Type: multipart/form-data" -u "「PROJECT ID」:「API KEY SECRET」" \
"https://ipfs.infura.io:5001/api/v0/add?pin=true&recursive=true&wrap-with-directory=true" \
-F file=@"1.png" \
-F file=@"2.png" \
-F file=@"3.png" \
-F file=@"4.png" \
-F file=@"5.png" \
-F file=@"6.png" \
-F file=@"7.png" \
-F file=@"8.png" \
-F file=@"9.png" \
-F file=@"10.png"
```

成功すると下記の出力を得られます。

```
{"Name":"1.png","Hash":"QmcdLaXx2pv7Pr1yDBfCLZPTALjBLAGGUKXWKwRwym62Re","Size":"507801"}
{"Name":"2.png","Hash":"QmfHQyLyZ3miqkWYebtKds4AiiCwvVuiN7quMA1nYQTopB","Size":"491168"}
{"Name":"3.png","Hash":"QmbxZbtR5ootk99rzTJBqG7YeLtDKrfJ5LGAWBaNKyJ2WB","Size":"537620"}
{"Name":"4.png","Hash":"QmVsc2CkKC7rYGfXVLhZV4unBimJQ8HQ9u9einUuwR29KC","Size":"464954"}
{"Name":"5.png","Hash":"QmVQE8x4MdFjgmtbYtGYFQx6RSrEhsRgEDkLeMGmfk6oqm","Size":"443394"}
{"Name":"6.png","Hash":"QmSd4Lh4acdkzzc4oph42cEhheKzoGiiYJLruLzgu8RCp2","Size":"460594"}
{"Name":"7.png","Hash":"QmXEMMXrtDFAT8u5NtT7iaa8njiHD6HkKbLZwSbirYccFA","Size":"472196"}
{"Name":"8.png","Hash":"Qmc382VuPzpL9s4nWotzZNy5wwJnAQv9RG45oCjq1PSdBP","Size":"492979"}
{"Name":"9.png","Hash":"QmRS3YUyJVscXrsBF4XmtFNGUoQkyRJ5iwUz3Zxy5KYKqN","Size":"537616"}
{"Name":"10.png","Hash":"QmYrWYdv1S2eiAEA2D91Lp2aerpP5mGz8vQRySGtuPAC3N","Size":"488841"}
{"Name":"","Hash":"QmUYXwTeCcrJAxSxwkAty9BVEKakEjpwTRoc93Cp6ZkN63","Size":"4897658"}
```

一番最後のCIDがフォルダのハッシュ値となり、下記のように、個々のファイルへアクセスすることができます。

[ipfs://QmUYXwTeCcrJAxSxwkAty9BVEKakEjpwTRoc93Cp6ZkN63/1.png](https://hakumai-test.infura-ipfs.io/ipfs/QmUYXwTeCcrJAxSxwkAty9BVEKakEjpwTRoc93Cp6ZkN63/1.png)
[ipfs://QmUYXwTeCcrJAxSxwkAty9BVEKakEjpwTRoc93Cp6ZkN63/2.png](https://hakumai-test.infura-ipfs.io/ipfs/QmUYXwTeCcrJAxSxwkAty9BVEKakEjpwTRoc93Cp6ZkN63/2.png)
[ipfs://QmUYXwTeCcrJAxSxwkAty9BVEKakEjpwTRoc93Cp6ZkN63/3.png](https://hakumai-test.infura-ipfs.io/ipfs/QmUYXwTeCcrJAxSxwkAty9BVEKakEjpwTRoc93Cp6ZkN63/3.png)
[ipfs://QmUYXwTeCcrJAxSxwkAty9BVEKakEjpwTRoc93Cp6ZkN63/4.png](https://hakumai-test.infura-ipfs.io/ipfs/QmUYXwTeCcrJAxSxwkAty9BVEKakEjpwTRoc93Cp6ZkN63/4.png)
[ipfs://QmUYXwTeCcrJAxSxwkAty9BVEKakEjpwTRoc93Cp6ZkN63/5.png](https://hakumai-test.infura-ipfs.io/ipfs/QmUYXwTeCcrJAxSxwkAty9BVEKakEjpwTRoc93Cp6ZkN63/5.png)
[ipfs://QmUYXwTeCcrJAxSxwkAty9BVEKakEjpwTRoc93Cp6ZkN63/6.png](https://hakumai-test.infura-ipfs.io/ipfs/QmUYXwTeCcrJAxSxwkAty9BVEKakEjpwTRoc93Cp6ZkN63/6.png)
[ipfs://QmUYXwTeCcrJAxSxwkAty9BVEKakEjpwTRoc93Cp6ZkN63/7.png](https://hakumai-test.infura-ipfs.io/ipfs/QmUYXwTeCcrJAxSxwkAty9BVEKakEjpwTRoc93Cp6ZkN63/7.png)
[ipfs://QmUYXwTeCcrJAxSxwkAty9BVEKakEjpwTRoc93Cp6ZkN63/8.png](https://hakumai-test.infura-ipfs.io/ipfs/QmUYXwTeCcrJAxSxwkAty9BVEKakEjpwTRoc93Cp6ZkN63/8.png)
[ipfs://QmUYXwTeCcrJAxSxwkAty9BVEKakEjpwTRoc93Cp6ZkN63/9.png](https://hakumai-test.infura-ipfs.io/ipfs/QmUYXwTeCcrJAxSxwkAty9BVEKakEjpwTRoc93Cp6ZkN63/9.png)
[ipfs://QmUYXwTeCcrJAxSxwkAty9BVEKakEjpwTRoc93Cp6ZkN63/10.png](https://hakumai-test.infura-ipfs.io/ipfs/QmUYXwTeCcrJAxSxwkAty9BVEKakEjpwTRoc93Cp6ZkN63/10.png)

ジェネレーティブNFTのように、数百〜数千のファイルを扱う場合、このフォルダのハッシュ値によるアクセスがとても便利です。

## おわりに
Pinataほどの簡単さはありませんが、INFURAでもファイルをまとめてアップしてフォルダ扱いをすることができました。

また、IPFSの特性として、同じ内容のフォルダ(ファイルのかたまり)であれば、同じハッシュ値を得られます。言い換えると、Pinataの有料プランで管理している素材を、INFURAの無料プランに移行する、なんてことも可能ということです。

INFURAは多少手間ではありますが、**5GB**という無料枠の大きさもあるため、しぶしぶPinataの有料プランを使っている方は、乗り換えを検討してみるのもよいかもしれません（手間をとるか、お金をとるか、ですね）。


## 補足：INFURAのDEDIGATEDゲートウェイ
これまた最近の話ですが、INFURAがパブリックゲートウェイのサポートを取りやめたようです。

以前は下記のように、パブリックゲートウェイからIPFSのデータが確認できていたのですが、現在は警告「**Public Gateway Is Not Supported Anymore - Setup a Dedicated Gateway**」がでます。

```
https://infura-ipfs.io/ipfs/QmZPk72rkQLdHAmgvzv4K1et6axJzvShNcd1K2VebNoZEk
```

では、いったいどうやって、通常のブラウザでIPFSのファイルを確認するかというと、INFURAのIPFSプロジェクトごとに提供される「専用」ゲートウェイを利用します。

まずは、INFURAのIPFSプロジェクト画面を開き、「ENABLE DEDICATED GATEWAYS」を有効にします。
![ss07](https://user-images.githubusercontent.com/13220051/185568507-1cff075a-f32f-482b-8b05-848cc4b76152.png)
その後、「UNIQUE SUBDOMAIN NAME」にお好きなサブドメインを記載することで、専用ゲートウェイが利用できるようになります。

また、「Pinned Content Only」にチェックをいれることで、プロジェクトに紐づいた(ピン留めされた)データのみを仲介するようにもできます。
感覚的に、パブリックゲートウェイよりも快適(レスポンスが早くタイムアウトになりにくい)ですので、ぜひ利用しましょう。