NFTを発行するスマートコントラクトを実装してみた!

こんにちは。

SIOS PS/SLアプリチームに所属している佐々木寛太です。 半年前ぐらいからweb3.0領域の業務が続きいくつかデモを作成してきたので今回はNFTを発行するデモを作成してみます。

スマートコントラクトの実装

今回はOpenzeppelin Wizardというサイトを利用してスマートコントラクト側で必要な機能を実装していきます。
スマートコントラクトは再デプロイが困難(プロキシパターンを使用するとできなくはない)なので、初学者は根幹にかかわる機能は特に監査済みのコードをそのまま使用するといいと思います。

Openzeppelin WizardとはERC20、ERC721、ERC1155などのスマートコントラクトの機能をUI上で組み合わせて実装することができるサービスになっていて、使用したい機能を選択することでテンプレートを作成することができます。 https://docs.openzeppelin.com/contracts/4.x/wizard

今回はNFTの発行と所有者の移動をすることができるスマートコントラクトを作成します。

Openzeppelin Wizardを開きERC721のタブを選択します。

Remixでローカルにデプロイ

上記で生成したコードをRemixに貼り付けます。 RemixとはブラウザでEVMのスマートコントラクトの開発言語であるSolidityを使って、スマートコントラクトが開発できるIDEです。

https://remix.ethereum.org/

remixを開いたらcontractsファイルを選択し適当なファイルを作成します。 今回はmint-nft.solというファイルを作成しました。

先ほどのWizardで作成したコードを張り付け保存しDeployボタンを押下します。

デプロイボタンを押下した後、コンソール画面に緑のチェックボックスが表示されていればデプロイ成功です。

動作確認

Deployed Contractsに先ほどデプロイしたコントラクトがあるのでプルダウンを選択します。
プルダウンを選択すると複数の項目が表示され、実装した関数が表示されていることが確認できると思います。

NFTの発行から動作確認をしていきます。 NFTを発行するためには以下の手順を踏む必要があります。

  1. 画像をアップロードする(AWSのS3、AzureのBlobStorageなど)
  2. アップロードした画像のURLを保存したJsonファイル(メタデータ)をIPFSに保存する IPFSはPinataなどのサービスを使用するといいと思います。
  3. IPFSにアップロードしたMetadataのURLを取得する
  4. デプロイしたコントラクトにあるSafeMintを実行する to: 上部にあるアカウントのアドレスをコピペする uri: 先ほど取得したMetadataのURLをコピペする
    to: NFTの発行者のアドレス
    uri: metadataの保存先のURIを設定

metadataの中身は以下のようなものを設定することが多いです。
{

    name: "NFTの画像の名前"

    description: "NFTの説明"

    image: "画像のURL" 

}

これでNFTの発行は完了です。

現在の実装ではNFTを発行したらIDは1ずつ増えていきます。なので一つ目に発行したNFTのtokenIdは1となっています。
では発行したNFTの所有者とmetadataが保存してあるURLを確認してみます。 実行する関するはownerOfとtokenURIです。

ownerOfはNFTの所有者を表しており、tokenURIはmetadataの場所を表していることが確認できます。

ここまででわかる通りNFTを発行する際のスマートコントラクトの責務はtokenIdとWalletAddressとmetadataのURLの紐づけのみを行っており、画像の保存やNFTの説明などが記載してあるmetadataの保存はスマートコントラクト外に保存しているということがわかると思います。

では所有権の移動を行いたいと思います。 所有権の移動にはsafeTransferFrom関数を使用します。

from: 現在NFTを所有している人のWalletAddress to: NFTの送付先Address
tokenId: 所有権を変えたいNFTのtokenId

これを実行することで所有権を変えることができます。 この時関数を実行するユーザーを所有者のアドレスにしておくようにしてください。
確認する場所は以下の画像のAccountという項目でこちらを現在のNFTの所有者のAddressにして実行してください。

では再度ownerOf関数を使用して所有者のAddressが変更されていることを確認してみます。

先ほどtoに設定したアドレスに代わっていることを確認することができます。

まとめ

上記のように関数を実行していくことでNFTを発行したり所有権を移動したりすることができます。
実装を見てわかる通り画像と画像の説明に関する情報は一切ブロックチェーン上には保存されていないことが分かったと思います。
NFTの発行を行う際にはweb2のアプリケーション側で画像アップロード、メタデータアップロードの処理を別途実装する必要があります。

また今回使用しなかった関数が複数ありますが、各関数の説明はこちらにまとめています。(すべて網羅できているわけではないです。すみません。。。)

こちらにOpenzeppelinにあるERC721のInterfaceの解説がなされているドキュメントを張っておくので興味のある方は見てみてください!

ご覧いただきありがとうございます! この投稿はお役に立ちましたか?

役に立った 役に立たなかった

0人がこの投稿は役に立ったと言っています。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です