Hyperledger FireFlyとNFTトークンの発行

前回からの続きで、
今回は、NFTの発行手順を紹介したいと思います。

## 環境構築からNFT生成までのステップ（前回からの続き）

* [初回紹介](https://qiita.com/LJC-mobileapps/items/bbcd43332fa180bac20a)
Hyperledger FireFly環境を新規でWeb3 ゲートウェイ機能を有効にしBinaceテストネットと通信できるようにします。

* [前々回紹介](https://qiita.com/LJC-mobileapps/items/4ebea4439c142fc314ef)
BinaceテストネットトークンをFausetサイトから入手します。
Binaceテストネット上にNFT用のコントラクト（ERC-721ベース）をデプロイします。

* [前回紹介](https://qiita.com/LJC-mobileapps/items/bedd553b95db75f0d07a)
IPFS環境の調整

* **今回紹介**
NFT用のコントラクトの関数などのメタ情報をFireFly側に登録します。
NFTとして扱う画像をFireFly側に登録します。
FireFly側に登録した画像をPublicに公開します。
NFTテキストデータをFireFly側に登録します。
FireFly側に登録したNFTテキストデータをPublicに公開します。
発行したNFTを他のユーザに転送して、ウォレットから確認します。

## 準備
### 各サービスの起動
[bscスタック※ UI環境](http://127.0.0.1:5000/ui)
[FireFlyのSwagger UI](http://127.0.0.1:5000/api)
※ bscスタック環境をまだ構築していない場合は、[こちらを参照ください](https://qiita.com/LJC-mobileapps/items/bbcd43332fa180bac20a)。
### NFTデータの準備
任意の画像データを手元に用意します。
ここで用意した画像データをNFTとして登録します。
今回は、このような画像を用意しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3514304/c0888366-c53c-caa4-c030-f7bb44643907.png)

## FireFlyにアップロード
画像をFireFlyに登録します。
[FireFlyのSwagger UIから「/data」](http://127.0.0.1:5000/api#/Default%20Namespace/postData)を探します。
Request bodyに「multipart/form-data」を指定します。
filename.extのchooseFileボタンからNFTとしてアップロードするファイルを選択します。
metadataおよびvalidatorのチェックボックスをOFFにします。
「Execute」ボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3514304/fd06c564-3f07-dcca-1ad1-c15310fd17ec.png)
以下のレスポンスが返却されます。これでローカル環境のFireFlyに登録されました。
レスポンスの「id」をメモします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3514304/9909cf95-4909-629b-e737-f19bb62c2384.png)
つづいて、FireFlyに登録した画像データを公開します。
[FireFlyのSwagger UIから「/data/{dataid}/blob/publish」](http://127.0.0.1:5000/api#/Default%20Namespace/postDataBlobPublish)を探します。
「dataid」を指定し、Body分は空（{}）を指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3514304/d8e7cdf8-a29c-fdc7-caa4-a3be3a222121.png)
入力し「Execute」ボタンをクリックします。
実行後、blob.publicにCIDが返却されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3514304/d00d93a1-4c83-fd94-6ab3-93faf4cfaf13.png)
返却されたpublicのアドレスをmetadata.jsonに記載します。
このjsonファイルが画像を指し示す情報になります。このjsonファイルもIPFSに登録します。
以下のjsonファイルを作成します。このjsonファイルのファイル名をmetadata.jsonとします。
imageに上記publicのアドレスを記載ます。
##### metadata.json
```
{
	"description": "FireFly private NFT",
	"external_url": "https://qiita.com/LJC-mobileapps",
	"image": "https://ipfs.io/ipfs/QmfQQ7tTU4WyzQAJh5D3iy1LQ57kC55uepsmPJ8DxaGWLZ",
	"name": "FireFly Art"
}
```

記載したら画像をアップロードした手順と同じ操作をします。
[FireFlyのSwagger UIから「/data」](http://127.0.0.1:5000/api#/Default%20Namespace/postData)を開きます。
ファイルにmetadata.jsonを指定し、チェックボックスを２か所OFFにします。
Executeボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3514304/d43735e6-3a7d-87c0-b6ef-a1587cefc2e6.png)
ここでのidをコピーします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3514304/3d488289-c2d6-9eed-0c0d-a5e23012b226.png)
つづいて、[FireFlyのSwagger UIから「/data/{dataid}/blob/publish」](http://127.0.0.1:5000/api#/Default%20Namespace/postDataBlobPublish)を開きます。
URIのdataidに「0c1490d6-6aaf-49c6-b0e3-7eef8a29d05f」を指定し、Body分は空（{}）を指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3514304/5b476d5f-915b-c6cd-ba94-9c9bc67519d8.png)
Executeボタンをクリックします。
ここでのpublicをコピーします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3514304/9b447202-5b6d-1df5-f1fc-ce13d5a6c18b.png)
このpublicの値（jsonファイルのCID）がNFTトークンを紐づけるキー情報になります。
以上で、画像ファイルおよび画像を管理するメタデータの登録が完了です。
## NFTトークンの発行
IPFSに登録した情報をNFTトークンに紐づけます。
[FireFlyのSwagger UIから「/tokens/mint」](http://127.0.0.1:5000/api#/Default%20Namespace/postTokenMint)を探します。
このAPIを実行することにより画像がNFTとしてトークンへの紐づけが完了します。
リクエスト欄に以下の内容を記載します。
poolには、作成済みのpoolIDを記載します。
toにNFTトークンを受け取るユーザのアドレス（Walletアドレス）を指定します。
uriに上記metadata.jsonを登録したときに返却されたIDを指定します。
```
{
  "amount": "1",
  "pool": "9aa198f9-b350-4aa4-8e14-c2cf82675ae2",
  "to": "0x250d2382c1D1076A722b3C0c1a7287D325a3e68a",
  "uri": "ipfs://QmXyAWrLHU3p6b8MrEd93kTZ2pT8Qui9pjwGcTaGMKAETh"
}
```
:::note info
pool IDはこちらの画面から確認することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3514304/54003d99-af20-c1af-b600-293cc9e11618.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3514304/34bc8b8b-afd0-63e7-6f85-d1215e520f67.png)

:::
正常に処理がされると、以下の内容のレスポンスが得られます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3514304/f7b1fd73-2c67-94d5-22f0-9b658d9cc1e5.png)

トークンの紐づけは以上です。
## localのIPFSで確認する
画像をFireFlyにアップロードしたときのCIDを指定してブラウザのURLにアドレスを入力します。
[ロカール環境のURL](http://127.0.0.1:8080/ipfs/QmfQQ7tTU4WyzQAJh5D3iy1LQ57kC55uepsmPJ8DxaGWLZ)
URLがリダイレクトされ画像が表示されることが確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3514304/665e8a5b-ebe7-60ec-4cc7-706beaf35b62.png)
metadata.jsonのURLを開くと、jsonファイルが表示されます。
[ロカール環境のURL](http://127.0.0.1:8080/ipfs/QmXyAWrLHU3p6b8MrEd93kTZ2pT8Qui9pjwGcTaGMKAETh)
URLがリダイレクトされ画像が表示されることが確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3514304/f993c036-1761-dcf3-edd5-1ccf2c503f44.png)

NFT登録手順と確認方法は以上です。

## 次回は
第4回にわたりNFTの登録までを紹介しました。
おおむね手動での操作であり、数種類のAPIを使用しながら進めてきました。
フロントエンドを構築しバックグランドでこれらの処理ができると、アプリケーションとしてもさらに応用ができるのではないかと考えています。
今後は、core機能やIPFS以外の各機能について紹介したいと思います。
次回は、イベントの操作について紹介します。