メインコンテンツへスキップ
所要時間:約50分~60分 このガイドでは、Reactで構築したweb3アプリを作成します。Sequence Stackのツールを使い、Embedded Walletによる認証とCloudflare Workerによる簡単・確認不要のトランザクションで、AI生成の戦利品をトレジャーチェストからミントします。 これらの機能をご体験いただけるよう、ダンジョンクローラーゲームとしてまとめました。実際にプレイして報酬を獲得できます。 これらのツールで以下のことが可能になります:
  1. Sequence Builderコンソール登録&プロジェクト作成:Builderでプロジェクトを作成
  2. アクセスキー管理:Sequence Stackとやり取りするためのパブリックキー、シークレットキー、waas configキーを取得
  3. Embedded Wallet統合:アプリケーションにEmbedded Walletを組み込む
  4. コントラクトのデプロイ&ガススポンサー:アイテムコントラクトをデプロイし、ガスをスポンサーする
  5. Cloudflare Worker をデプロイする:ガスレスかつ確認不要なトランザクションのために Cloudflare Worker をデプロイします
  6. AIプロンプトと画像の生成:API経由でAIプロンプトを作成し、画像を生成してアップロードします
  7. メディアを Sequence Metadata サービスに保存:コレクションやトークンのメタデータを Sequence にアップロードします
  8. Cloudflare Worker のセキュリティ強化:外部からのリクエストを防ぐためにリファラーURLを制限します
  9. (オプション) 各ウォレットごとのネイティブミント制限:ウォレットごとの1日あたりのミント数を制限します

1. Sequence Builder コンソールへのサインアップとプロジェクト作成

まずはこちらの手順に従い、Sequence Builder Consoleへのサインアップ方法とプロジェクトの作成方法を確認してください。 Gas SponsoringTransactions API など一部機能を利用するには、こちらの手順に従ってプロジェクトプランを Developer にアップグレードする必要があります。

2. アクセスキーの管理

プロジェクトが作成できたら、Sequence Stack でアプリケーションを認証するために3種類のアクセスキーを取得する必要があります。 ・Waas Config Key:Embedded Wallet 用。詳細はこちらをご覧ください。 ・Public Access Key:Embedded Wallet および Transactions API 用。取得方法はこちらをご参照ください。 ・Secret Access Key:Metadata Service 用。以下の手順で取得します。
  1. Waas Config Key:Embedded Wallet 用。詳細はこちらをご覧ください。
  2. Public Access Key:Embedded Wallet および Transactions API 用。取得方法はこちらをご参照ください。
  3. Secret Access Key:Metadata Service 用。以下の手順で取得します。

シークレットアクセスキーの作成

1

設定画面を開く

まず設定画面にアクセスし、API Keys を選択します。
builder settings access keys
2

サービスアカウントの追加

下にスクロールして+ Add Service Accountを選択します。
builder settings add service account
3

書き込み権限の選択

アクセス権限を WriteConfirm に変更します。
builder settings add service account
最後に copy をクリックし、キーを安全な場所に保管してください。なお、Builder Console からは今後再確認できません。

3. Embedded Wallet の統合

テンプレートリポジトリはこちらから閲覧やクローンができます。
ここでは、必要な要素をゼロから構築して、ユーザーがWeb2認証プロバイダーを使ってアプリケーションにオンボードできる Sequence Embedded Wallet の利用を可能にします。 まず mkdir <project> でプロジェクトフォルダを作成し、cd <project> で移動後、React を使って vite プロジェクトを作成します:
次に、Embedded Wallet を利用するための Wallet-as-a-Service (Waas) パッケージをインストールします:
以降の手順で新規作成するファイルはすべて /src ディレクトリ内に作成してください。 まず SequenceEmbeddedWallet.ts などの名前でファイルを作成し、以下の初期化コードを記述します:
続いて、ユーザーごとに一意なセッションハッシュをSDKから生成する useSessionHash.ts ファイルを作成します:
Google認証を実装するには、アプリケーション全体を GoogleOAuthProvider でラップする必要があります。以下のコマンドで、後ほど利用する Apple Auth サインインも含めてインストールします:
その後、main.tsx ファイル内で先ほどインポートしたファイルを使い、スターターコードを実装します:
main.tsx の準備ができたら、次はログインボタンを作成します。見た目は以下のようになります:
embedded wallet social login
App.tsx では、ユーザーが接続されているかを確認し、サインインしたユーザーに基づいてウォレットアドレスを表示するコードと、各種ソーシャル認証ボタンやハンドラーを実装します:
続いて、プロジェクトのルートに .env ファイルを作成し、.gitignore に追加したうえで、Sequence Builder から取得した以下の値でファイルを更新します:
Vite アプリケーションの環境変数として認識されるには、すべて VITE_ で始める必要があります。
ルートフォルダで以下のコマンドを実行し、動作を確認してください:

4. コントラクトのデプロイとガススポンサー設定

AI生成画像を任意のトークンのメタデータに紐付けるため、トークンコントラクトをデプロイします。コントラクトのデプロイには ERC1155 の利用を推奨します。ERC721 よりも ERC1155 を使う利点については以下で説明します。
  • セミファンジブル:同じアイテムの複数コピーを持つゲーム資産などに最適です。
  • ガスコスト削減:複数のトークンが必要なプロジェクトでは、1つのERC1155で多様なトークンタイプを管理できます。
ガスコスト削減の観点では、トークンタイプごとに新規コントラクトをデプロイする代わりに、1つのERC1155コントラクトでシステム全体の状態を保持できるため、デプロイコストや複雑さを抑えられます。 コントラクトをデプロイするには、このガイドに従ってERC1155をデプロイし、wrangler.tomlCONTRACT_ADDRESSを設定してください。 ミント機能をプログラムで実行し、リレイヤーのトランザクションをガスレスにするには、アップグレードした請求プランのアカウントクレジットから Transactions API が利用できるよう、デプロイしたスマートコントラクトアドレスをスポンサー登録する必要があります。 Transactions APIで手数料なしにトランザクションを中継できるようにするには、このガイドに従って、デプロイ済みコントラクトのガススポンサー設定を行ってください。
すべての Sequence テストネットは無料です。

5. Cloudflare Worker で Transactions API をデプロイ

前のステップに続き、Sequence Transactions API をサーバーレスな Cloudflare Worker 上で実装することで、ゲームやアプリのユーザー操作時に確認署名やガス支払いなしでシームレスに処理できます。この場合、Worker は Sequence Transactions API を利用してユーザーアドレスへトークンをミントします。トランザクション速度やスループット、リオーグなどを気にせず、Cloudflare による自動スケーリングの恩恵も受けられます。

トークンのミント

Cloudflare Worker をゼロからデプロイする方法が必要な場合は、こちらのガイドでデプロイ済み ERC1155 コントラクトを使ったサーバーレスNFTミントサービスの構築方法を確認するか、本ガイド専用のテンプレートをクローンしてください。
Sequence Standard ERC1155 Items Contract を利用する場合は、リレイヤーアカウントアドレスに MINTER_ROLE を付与してください。
セットアップが完了したら、後のステップでNFTをミントするために、Cloudflareインスタンスのエンドポイントを呼び出します。

6. AIプロンプトと画像の生成

AI画像生成を始めるには、メディアを作成するためのAIモデルプロンプトが必要です。本ガイドおよびデモでは、Diabloゲーム内のアイテムからプロンプトを取得しています。 テンプレートには、すでにデプロイ済みAPIを呼び出すコードとレスポンスを解析するコードが含まれています。 このAPIを使い、Cloudflare Worker 内の generate 関数でデプロイ済み Diablo API のプロンプトを利用して画像を生成する方法を紹介します:
次に、Scenario API からインスタンス化された推論リファレンスを取得し、生成した戦利品の nametype を含む prompt、および追加のモデルパラメータ(Scenario API ドキュメントでカスタマイズ可能)を渡す getInferenceWithItem 関数を完成させます:
本ガイドでは、品質と時間のバランスから Scenario API の EulerDiscreteScheduler スケジューラータイプを採用していますが、他のスケジューラーも試したい場合はこちらのカスタムローカルCLIを利用し、Scenario.gg ダッシュボードで結果を確認できます。
その後、上記の関数をReactコード内で実装します:
inferenceId を取得したら、推論ステータスをポーリングし、succeeded ステータスになった時点で完了として返します。
再度、上記の関数をReactコードに追加し、inferenceId を渡します。レスポンスを受け取ったら、resObject.inference.images[0].url で画像のURLを取得できます:
なお、1つのプロンプトで複数の画像を返すアプリケーションを設計し、ユーザーがその中から適切な生成画像を選択できるようにすることも可能です。

7. Sequence Metadata Service へのメディア保存

Scenario APIから取得したメディアのurlを使い、次はそのアセットをSequence Metadata Serviceに保存します。これにより、AI生成画像を特定のトークンメタデータに紐付けることができます。これらはすべてREST-API経由で実現できます。 Dungeon Minterの宝箱報酬はすべて同じプロセスに従い、まずSequence Metadata APIを使ってメタデータを保存し、urlとランダムに生成されたtokenID(これにより並列リクエストが可能)がクライアントに返されます。その後、ユーザーがコレクティブルを確認し、ミントに同意した後、tokenIDとユーザーのaddressステップ5で作成したワーカーに返され、ミント処理が行われます。

実装方法

こちらのガイドを完了し、統合して、Cloudflare Workersを活用したSequence Metadata APIベースのサーバーレスメディアサービスを構築してください。または、このガイド用のCloudflareテンプレートをクローンして利用できます。 完了したら、保存したメディアのtokenIDurlをフロントエンドに渡し、ユーザーがミントする前に内容を確認できるようにします:

8. Cloudflare Worker を使ったミント処理

最後のステップは、先ほどメタデータを紐付けたtokenIdをユーザーのアドレスにミントすることです。ここでは、ステップ5で作成したCloudflare Workerにリクエストを送り、ユーザーにトークンをミントします。
重要な注意点として、Cloudflare Workerが特定のフロントエンドからのリクエストのみを処理するようにしたい場合は、request.headersReferrer値をwrangler.tomlCLIENT_URLと比較することで簡単に制御できます。

まとめ

このチュートリアルで行った内容を振り返りましょう: Sequenceプロジェクトの作成方法と、APIスイートへのアクセス方法を解説しました。サンプルのダンジョンクローラーゲーム向けに、スムーズなプレイ体験を提供するための埋め込み型ウォレットの導入・設定も行いました。また、Sequenceプラットフォームを活用してコントラクトをデプロイし、ユーザー体験を簡素化するためにガス代をスポンサーしました。さらに、Sequence Transaction APIを使ったサーバーレスNFTミンターをデプロイし、数百万規模のプレイヤーに対応しつつ、リオーグのような複雑なブロックチェーン処理も可能にしました。加えて、scenario.gg APIを利用して、プレイヤーへの報酬となるゲームアセットを動的に生成しました。これらの画像をSequence Metadata APIでNFTのメタデータに紐付けました。これで、Scenario.ggとSequenceを活用したゲームでAIアートをミントする方法が理解できたはずです。 スケーラブルで安全、そして楽しいブロックチェーン対応ゲームを作るには多くの要素が必要ですが、SequenceプラットフォームとScenarioがあれば安心です。 最後に、上記すべてのステップを組み込んだ完全な体験を、ダンジョンクローラーゲームで実際に体験できます。迷路に挑戦して、自分だけの戦利品を手に入れましょう。 開発を楽しんでください!

9.(オプション)ウォレットごとのネイティブミント制限

特定ウォレットによる宝箱ミントの過剰利用を防ぐため、wrangler.tomlDAILY_MINT_RESTRICTIONというパラメータを設定し、1日あたりの最大ミント数を制限できます。また、必要に応じてプロトコルにADMINを追加し、無制限にミントできる権限を持たせることも可能です。 これらの機能は、以下の手順でコードに実装できます:
hasDailyMintAllowanceは2つの関数に分かれています:
  • ユーザーのaddressのトランザクションを1日分ページネーションで取得するfullPaginationDay
  • from0xアドレスであることに対応するmintCount

インデクサーによる1日分の全ページネーション取得

補足ですが、Sequence Indexerスタックはこの期間中のトランザクションを30日分のみ保持しているため、1日から最大30日まで期間を拡張できます。
Sequence Indexerを利用するには、pnpm install @0xsequence/indexerが必要です。 実装時は、インデクサーから最初のトランザクションバッチとpage.after値を取得し、whileループでタイムスタンプが24時間未満かどうかを継続的にチェックしながら、一時配列に追加していきます。これにより、利用可能なすべてのトランザクションを取得できます:

1日分のミント数取得

ERC721およびERC1155標準のSequenceコントラクトからミントされたすべてのコレクティブルは、from0xアドレスとなります:

1日あたりのミント許可の有無