ガスレス・サーバーレス トランザクション API でコレクティブルをミントする
Sequence のガスレス・サーバーレス トランザクション API を使ってコレクティブルをミントする方法を解説します。Cloudflare Worker 上で API を実装することで、ユーザーはガス代なしでシームレスに操作できます。
所要時間:20〜30分
Sequence Transactions API はサーバーレスの Cloudflare Worker 上で実装でき、ゲームやアプリのユーザーは確認サインやガス代の支払いなしでシームレスに利用できます。また、リレイヤーによるトランザクション速度やスループット、再編成を心配する必要がなくなり、Cloudflare による自動スケーリングも利用できます。
以下のステップで、ホスト型ミンター API を 4 ステップで構築する方法をご案内します。
- Wrangler Cli で Cloudflare 環境をセットアップしテストをデプロイする
- Sequence Builder で ERC1155 コントラクトをデプロイ、スポンサー登録、およびメタデータの更新
- EthAuthProof を使って EOA DDoS を防ぐ
- コレクティブルをウォレットにミントする
結果として、以下の仕様を持つセキュアな API が完成します。
- HTTPS GET:blockNumber を返す
- HTTPS POST(proof, address):コレクティブルをミントし、トランザクションハッシュを返す
この実装を完了するには、wrangler cli、npm、Sequence Builder の基本知識が必要です。
1. Wrangler Cli で Cloudflare 環境をセットアップしテストをデプロイする
まず、mkdir
でディレクトリを作成し、cd
でそのディレクトリに移動し、pnpm init
でpackage.json
を作成します。
次に、プロジェクトに wrangler cli がインストールされていることを確認し、wrangler
キーワードをローカル bash セッションのエイリアスとして設定します。
Cloudflareサイトでアカウントを作成し、ログインしてCloudflareダッシュボードにアクセスし、Cloudflareプラットフォームをローカル開発環境と接続します。
ログイン後、ディレクトリ内でプロジェクトを初期化し、気に入ったランダム生成のプロジェクトフォルダ名を選択して、git で管理されている TypeScript の "Hello World" Worker
アプリケーションを初期化するプロンプトに従ってください。
このステップを完了するには、wrangler init
後にエンターを4回押し、最後の2つの質問にはNo
と答えてgitバージョン管理とデプロイをスキップしてください。
これにより、クラウドにコードをデプロイできるスターターリポジトリがクローンされます。
ローカル API テスト
ガイドの任意のタイミングで、プロジェクトフォルダ内で wrangler dev
コマンドを使ってローカルテストを実行できます。
デプロイテスト
最後に、ランダムに生成されたプロジェクトフォルダにcd
で移動し、wrangler deploy
コマンドを実行します。
これによりURLが表示されるので、ブラウザでhttps://<app>.<account>.workers.dev
にアクセスし、「Hello World!」の結果を確認できます。
2. Sequence Builder で ERC1155 コントラクトをデプロイ、スポンサー登録、およびメタデータの更新
Transactions API を利用するには、Sequence Builder でプロジェクトの課金プランを Developer
にアップグレードする必要があります。こちらの手順 をご参照ください。
まず このガイド に従ってコントラクトをデプロイします。
次に、Sequence Builder でコントラクトのロールアクセスを2つの手順でミンターウォレットアドレスからのみリクエストを受け付けるように設定します。
Sequence Builderで minter permission
を Sequence Wallet Transactions API Address
に付与してください。
利用する transactions API アドレスを知るには、まず以下のいずれかの方法で取得します。
- このアプリ を使い、ネットワークを選択して
generate local wallet
ボタンでウォレットキーを生成することで取得できます(デモ目的でのみご利用ください)。 推奨
: 以下のコードスニペットを使い、EOA ウォレットの秘密鍵から生成されたアカウントアドレスをローカルで出力することもできます。
プロジェクトを開き、Contracts
ページに移動し、Linked contracts
を選択、Write Contract
タブで grantRole
メソッドを展開します。
以下の情報で入力してください。
bytes32 role
: 0x9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6
address account
: <Generated Sequence Transactions API Wallet Address>
ここで入力する role
文字列は、solidity では keccak256("MINTER_ROLE")
、javascript では ethers.keccak256(ethers.toUtf8Bytes("MINTER_ROLE"))
の結果です。
これにより、特定のアドレスのみがコントラクトからミントできるようになり、それ以外はエラーとなります。
write
をクリックし、スポンサー付きトランザクションに署名してロールの更新を完了してください。
メタデータの更新
次に、このガイド に従って、コントラクトのメディアやアセットを用いてメタデータを更新します。
コントラクトのスポンサー登録
最後に、コントラクトをスポンサーするには このガイド をご参照ください。
3. EthAuthProof を使って EOA DDoS を防ぐ
コントラクトのデプロイが完了したら、Cloudflare Worker のディレクトリとプロジェクトに戻り、ethers
と 0xsequence
をインストールして Sequence API にアクセスし、リクエストが信頼できる Sequence ウォレットから来ているかどうかの証明を検証します。
次に、POST か GET かを判定後、ミドルウェアを追加してください。POST リクエストの場合は、渡された proofString
と address
、および環境変数が有効かどうかを検証します。
src/index.ts
に配置するコードの雛形はこのようになります。callContract
と getBlockNumber
はモック化されており、コントラクト呼び出し前に verify
を呼ぶ検証ステップが含まれています。
Cloudflare 環境変数の追加
次に、wrangler.toml
の [vars]
セクションを更新してビルド用の環境変数を渡します。
Wrangler テンプレートで Window オブジェクトを実装する
なお、デプロイしようとすると、web3モジュールで必要な window
オブジェクトが見つからないというエラーが発生します。
これを防ぐには、wrangler.toml
ファイルに以下の行を追加し、環境を対応させてください。
デプロイのテスト
wrangler deploy
を使用して再デプロイできます。
次に、以下のように curl リクエストでエンドポイントをテストします。
このdappを利用し、以下の手順でウォレットアドレスの証明を取得します。
ETHAuthProof Viewer dapp の利用
ページにアクセスしたら、最初にネットワークを選択してください。
次に、「接続してProof(証明)を生成」または「ローカルウォレットを生成」のいずれかを選択できます。
connect
ボタンを押し、その後 copy to clipboard
をクリックしてください。
なお、この ETHAuthProof
を他人と共有しないことをおすすめします。これを共有すると、他人があなたのウォレットの所有者であることを証明し、特定のAPIとやり取りできてしまいます。
最後に、この手順で取得したアプリの url
、ビューワーdappからコピーした値を <some_proof>
、あなたのウォレットアドレスを <some_address>
にそれぞれ置き換えてください。これで、モックされた 0x
文字列が返されます。
4. コレクティブルをウォレットにミントする
スポンサー付きコントラクトアドレスからコレクティブルをデプロイ・ミントするには、以下のパッケージをインストールします。
そして、以前モックしていた callContract
と getBlockNumber
メソッドを次のように実装します:
これらの手順が完了したら、前の手順に従って再デプロイおよびテストできます。今回は、POSTリクエストでミント完了のトランザクションハッシュが返り、GETリクエストではブロック番号が返されるはずです。
全コードを確認したい場合は、こちらの実装例をご覧ください