Unity IAPを使ったNFT販売
Jelly Forestで、iOS App StoreやGoogle Play StoreのIAP(アプリ内課金)でNFTを購入できるようにした方法と、同様の仕組みを自分のゲームに導入する方法もご紹介します。
ほとんどのプレイヤーはウォレットに暗号資産を持っていません。従来の方法で暗号資産を入金するのは手間がかかり、技術的な経験が少ないユーザーには負担になることもあります。いずれにせよ、決済の手間を最小限にすることは、効果的な収益化戦略において非常に重要です。多くのモバイルユーザーにとって最も手軽なマイクロトランザクションの方法は、既に慣れ親しんでいるアプリ内課金(IAP)です。特にEmbedded Walletsを利用し、ブロックチェーンが見えないゲームを作る場合はなおさらです。
このガイドでは、Unityで作成したEmbedded Walletのショーケースゲーム「Jelly Forest」に、IAPでジェリー用のユニークなホットドッグ帽子NFTをミントできる機能を追加した方法を解説します。
スマートコントラクトをデプロイする
まだの場合は、まずスマートコントラクトをデプロイし、販売したいNFTを定義し、ゲーム内で表示できるようにしましょう。
スマートコントラクトをデプロイしたら、「Gas Sponsoring」ページでコントラクトアドレスを Sponsored Address として追加するのを忘れずに!これにより、ゲームのスマートコントラクトとやりとりする際、ユーザーのガス代が自動的にあなたのコンピュートクレジットで肩代わりされます。
リモートミンターをデプロイする
デフォルトでは、Builder Console を使ってデプロイされた ERC1155/721 コントラクトは、トークンをミントするためにコールする側に適切な権限が必要です。一見面倒に思えるかもしれませんが、これはとても重要な仕組みです。これがなければ、誰でもあなたのコントラクトの mint メソッドを呼び出して、自分に無限にゲーム内アイテムを付与できてしまいます。
Sequence ウォレット(または他のウォレット)を持つサーバーをデプロイし、Builder でミント権限を付与しましょう。
Jelly Forest での実装例
Jelly Forest では、ゲームプレイ中に集めたコインがすべて ERC1155 トークンとしてミントされます。実装方法は以下の通りです:
- Cloudflare に登録します(ミントサービスのコードをホストするためですが、他の方法でも構いません)
- ターミナルやコマンドラインを開きます
git clone https://github.com/0xsequence-demos/cloudflare-worker-sequence-relayer.git
を実行し、続いてcd cloudflare-worker-sequence-relayer
git checkout permissionedMinter
pnpm install
で依存関係をインストールします- wrangler をインストールします
そしてログインします
wrangler.toml
を開きますname
の文字列を変更してサーバー名を設定します- 新しいEOAウォレットを作成し、秘密鍵をエクスポートします。どのEOAウォレットでも構いません。Metamaskを使えば簡単にウォレットのセットアップや秘密鍵のエクスポートができます。秘密鍵の取り扱いには十分ご注意ください。パソコンに平文で保存したり、バージョン管理にコミットしたりしないでください!この秘密鍵を
PKEY
に設定します。 CONTRACT_ADDRESS
を設定します。PROJECT_ACCESS_KEY
を設定します。これは、先ほどBuilder ConsoleでSequenceConfig
スクリプタブルオブジェクトをセットアップした際に取得した本番用APIキーです。CHAIN_HANDLE
を設定します。これが何かわからない場合は、Builder ConsoleのNode Gatewayページで各ネットワークのCHAIN_HANDLE
を確認できます。
pnpm dev
- これでサーバーがローカルにデプロイされます。どのlocalhostでデプロイされたかはコマンドラインに表示されます。- 別のコマンドラインウィンドウを開きます。
curl http://localhost:8787
- 表示されたlocalhostに置き換えてください。これでサーバーにリクエストを送ります。- ローカルサーバーが動作しているコマンドライン上で、ミンターのウォレットアドレスがログに表示されるはずです。
- このアドレスにBuilder Consoleでミント権限を付与します。
Contracts
から該当するコントラクトを探し、クリックして開きます。Write Contract
をクリックします。grantRole
を展開します。role
には0x9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6
を入力します。これはMINTER_ROLE
のKeccak-256ハッシュ値です。account
にはミンターのウォレットアドレスを貼り付けます。
wrangler deploy
- これでCloudflare Workerにコードがデプロイされ、ミント用のURLが発行されます。
これで準備完了です!サーバーにPOSTリクエストを送るときは、C#で定義されたボディを使います。proof
はミントリクエストを送るクライアント側で生成されます。Unity SDKでは、MintingRequestProverによって実装されています。
リモートミンターで IAP 購入トークンを処理する
上記では、ゲーム内アクションで獲得できるトークンをミントするためのリモートミンターをデプロイしました。ここでは、このサーバーを活用して、IAP(アプリ内課金)で購入できるトークンもミントできるようにする方法を見ていきます。
リモートミンターに送信するペイロードには、レシートも含めることができます。ここに Google や Apple から受け取った IAP レシートを含めます。Unity では、Nobuyori Takahashi 氏の IAP プロジェクトを使って、Unity IAP で受け取ったレシートをサーバー側で検証することが推奨されています。
サーバー側でレシートの検証が完了したら、上記のサンプルコードを参考にしてミント処理を進めることができます。
Unity 実装
Unity 側では、まず Unity IAP をプロジェクトに統合します。
統合プロセスで作成した IStoreListener
の ProcessPurchase
メソッド内で、ミント処理を開始します。Jelly Forest では、UnityIAP と PremiumItem のスクリプトで実装されています。
ペイロードについては、PremiumItem
の実装で PermissionedMintTransaction
を TransactionQueuer
に追加しているのが分かります。
ここで、_permissionedMinterTransactionQueuer
は PermissionedMinterTransactionQueuer
です。
この処理により、次の形式のペイロードが送信されます。
トランザクションキューアについての詳細は、こちらのドキュメントをご覧ください。
Apple や Google では、ユーザーが誤って行った IAP のチャージバック(返金)を申請することができます。この場合でも、ユーザーにはトークンがミントされたまま残ります。頻繁にチャージバックを行うプレイヤーを従来通り(例:アカウント停止など)で対処することは可能ですが、不正なチャージバックのリスクがあるため、高額な NFT の販売にはこの方法を使用しないよう注意してください。