スマートコントラクトをデプロイする
まだ行っていない場合は、まずスマートコントラクトをデプロイして、プレイヤーに販売しゲーム内で表示するNFTを定義・表現できるようにしましょう。 スマートコントラクトをデプロイしたら、忘れずにBuilder Consoleの「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が発行されます。
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 の販売にはこの方法を使用しないよう注意してください。