見出し画像

【完全保存版】thirdwebでsignature mintingをやってみよう!

0 はじめに

本日は、thirdwebを用いて、signature mintingを学んでみましょう。

1 signature mintingとは

1 概要

まずは、「signature minting」とは何かについて学んでみましょう。

詳しくはこちらをご参照ください。

「signature minting」とは、ミントの権限を持たない人署名を使ってミントを行うことです。

2 admin(権限がある人)によるトランザクション

例えば、あるコントラクトに対して、「admin(管理者の意味です)」ミントのトランザクションを行うとします。

彼は権限があるので、ミントができます。

3 権限がない人によるトランザクション

一方、それ以外の人は権限がないので、ミントを行うことができません。

4 権限があるとは?

では、そもそも権限があるということはどういうことなのでしょうか?

それは、実行する中身(ペイロード)にサインを行い署名を作ることができるということだと私は考えています。

つまり、Aさんがトランザクションを行えないのは、「Payload(中身)」に対して、サインができず、署名が作れないからです。

そして、トランザクションには、必ず署名が必要です。

5 Signature Mintingによる解決策

そのため、「Signature Minting」では、Aさんが「admin」に対して、署名をお願いします。

そして、「admin」が署名して問題なければ、署名をAさんに渡します。

これで、Aさんはトランザクションに必要な署名をつけることができます。

これにより、Aさんはトランザクションを実行できます。

これが「Signature Minting」の流れです。

2 やってみよう

1 APIキーの取得

まずは、thirdwebでAPIキーを取得しましょう。

2 Loyalty Cardコントラクトの作成

今回は、こちらからコントラクトを作成します。

事前のメール登録やウォレット接続の部分は今回省略します。

「Deploy now」を選択します。

「Name」「Recipient Address」を入力し、「Mumbai」チェーンであることを確認して、「Deploy now」

なお、一次セールスの売上が入るアドレスロイヤリティのアドレスと同じにするのなら、下のようにすれば良いと思います。

下のようにできました。

3 git clone 

では、準備ができましたので、進めていきましょう。

まずは、git clone を行います。

git clone https://github.com/thirdweb-example/loyalty-card.git

4 依存関係のインストール

では、依存関係をインストールします。

cd loyalty-card/
yarn install

5 .envファイルを作成する

「.env.example」をコピーして、「.env」ファイルを作成します。

中身はAPIキーの内容として、クライアントIDシークレットキーを入れます。

そして、コントラクトを作成したアカウントの秘密鍵を入れます。

6 コントラクトアドレスの入力

こちらの、「consts.ts」コントラクトアドレスを入れます。

7 画像を変更する(任意)

ミントを行った時、私は画像がうまく表示されなかったので、変更しました。

こちらは変更しなくてもミント自体は行えます。

ちなみに、私はこちらのサイトを使用しました。

8 立ち上げよう

準備ができましたので、「yarn dev」で立ち上げましょう。

yarn dev

すると、このように立ち上がりました。

9 NFTの作成

では、「Generate NFT」でNFTを生成します。

このようにポップアップが表示されました。

このように、NFTが作成できました。

10 cancelの実行

ちなみに、「cancel」はここではバーンにあたります。

実行すると、このように、バーンされました。

もう一度、「Generate NFT」でNFTを作成します。

ちなみに、thirdwebを確認すると、下のように、NFTの生成やバーンを確認することができます。

11 NFTのアップデート

では、次に、「Admin Dashboard」に行ってみましょう。

このように、全てのNFTが表示されました。

では、「Edit」を押してみましょう。

任意の数字にして、「update」

これで、NFTの持っているデータを変更することができました。

3 コードを見てみよう(バックエンド)

1 署名作成ファイルについて

まず署名を作成する、「generate-sig.ts」から見てみましょう。

引数として、「NextApiRequest」「NextApiResponse」のそれぞれの型のリクエストとリスポンスをとっています。

Nextの公式のこの辺りが参考になると思います。

https://nextjs.org/docs/pages/building-your-application/routing/api-routes#adding-typescript-types

2 HTTPメソッドの分岐について

リクエストのメソッドが「POST」でない場合は、「405」エラーになるようにしています。

なお、405エラー「Method Not Allowed」です。

https://developer.mozilla.org/ja/docs/Web/HTTP/Status/405

3 SDKの初期化について

そして、「fromPrivateKey」を使って、SDKを初期化しています。

公式はこの部分です。

なお、サーバーサイドのため、「ClientID」ではなく、秘密鍵を使用しています。

4 コントラクトの取得について

そして、コントラクトを取得するために、「getContract」を使用しています。

公式としては、この辺りです。

基本的に毎回使われます。

https://portal.thirdweb.com/typescript/sdk.thirdwebsdk.smartcontract

5 リクエストからのアドレスの取得について

そして、リクエストからアドレスを取得しています。

ちなみに、下のように、「NextApiRequest」「body」はなんでも含められるように、「any」の型になっています。

https://nextjs.org/docs/pages/building-your-application/routing/api-routes#adding-typescript-types

6 ペイロードについて

次に、「PayloadToSign721withQuantity」の型で、渡す値を指定しています。

必須の部分は多くはありませんが、型としてはこのようになっています。

7 署名の作成について

そして、下の部分で、NFTをミントするための署名を作成しています。

公式としては、下の部分です。

https://portal.thirdweb.com/python/python.erc721signaturemint#payload_to_sign

なお、なぜ署名に、ミント内容が必要なのかなどについてご不明の場合は、こちらもご参照ください。

成功した場合は、署名されたペイロード(中身)を返しています。

4 コードを見てみよう(フロントエンド)

1 fetchについて

次に、「index.tsx」を確認します。

先ほどの、generate-sigに対して、fetchを行なってい、レスポンスを取得しています。

fetchがご不明の場合は、この辺りをご参照ください。

https://developer.mozilla.org/ja/docs/Web/API/fetch

また、JSON形式で、アドレスを送っていることも確認できます。

ご不明の場合は、こちらもご参照ください。

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify

返ってきたデータを下のように取得しています。

ご不明の場合は、こちらもご参照ください。

https://developer.mozilla.org/ja/docs/Web/API/Request/json

2 ミントの実施について

次に、取得した、署名済みのペイロードを使用して、ミントを行っています。

3 update関数について

次に、「NFT.tsx」の「update」関数を見てみましょう。

まずはこちらで、メタデータを更新しています。

まずは、スプレッド構文(…)を使って、要素の展開を行なっています。

次に、「filter」関数を使って、一旦「points」以外で構成した後、新しい「points」を加えています。

簡潔に言えば、「points」のデータだけを差し替えています。

次に、「update」の部分を見てみましょう。

変更したい、トークンIDとメタデータを渡しています。

中身を見ると、このようになっていました。

この「update」が何をやっているのか、少し自信がないですが、現在こうでないかと思っているところを書きます。

処理としては、「NFTMetadata」コントラクトの「setTokenURI」関数を使っていると考えています。

「update」の処理で、メタデータの情報をthirdwebがIPFSに格納し、そのURLとトークンIDを引数として、「setTokenURI」に渡しているのではと考えています。

上の部分は誤りがあれば修正しようと思います。

4 revokeとcancelについて

次に、「revoke」を見てみます。

内容が似ているので、「cancel」も一緒に見てみます。

この2つは、どちらも、バーンを行なっています。

ただ、渡している引数が違うので、名前は同じ「_burn」でも中身は違うようです。

なお、引数が1つの方(revoke)結局は2つ目の引数に自動で「false」を設定しています。

そして、引数が2つの「_burn」関数は次のようになります。

2つ目の引数の「approvalCheck」NFTの保有者か承認を得ているかのチェックをしています。

つまり、引数が一つの方は「false」になっているため、このチェックを通らずにバーンができるということです。

つまり、このようになります。

管理者はapprovalがない状態で、バーンをしたいため、管理者は「revoke」を使って、バーンが行えるようになっています。

今回は以上です。

いいなと思ったら応援しよう!

ユウキ
サポートをしていただけたらすごく嬉しいです😄 いただけたサポートを励みに、これからもコツコツ頑張っていきます😊