リレートランザクションサーバーの構築
Sequenceを使い、サーバーがユーザーに代わってトランザクションを送信できるリレートランザクションサーバーの構築方法を説明します。
Sequenceを利用すれば、サーバー用のスマートコントラクトウォレットを作成し、トランザクション速度やスループット、再編成を気にせずユーザーのためにトランザクションを送信できます。
通常のSequenceウォレットでブロックチェーンにトランザクションを送信する場合との違いは、スマートコントラクトレベルでmsg.sender
がSequence Relayersウォレットアドレスのいずれかになる点です。Sequence Builder標準コントラクトでは、リレートランザクションAPIリクエストと組み合わせれば問題ありません。
デフォルトでは、Sequenceのトランザクションは順番に実行されます。
以下の手順では、サーバーの作成方法とコレクティブルをウォレットアドレスへミントする方法を説明します。
- Expressライブラリを使って、HTTPリクエストを受け付けるNodeJsベースのサーバーを作成します。
- プロジェクトとアクセスキーの管理:Sequenceスタックと連携するためのパブリックアクセスキーを発行します。
- コレクティブルコントラクトのデプロイ:ウォレットアドレスへトークンをミントするために、コレクティブルコントラクトをブロックチェーン上にデプロイします。
- Transactions APIを使ったスポンサー付きリレイヤーの構築:Expressのルートで利用する関数を作成し、スポンサー付きコントラクトからSequence Transactions APIを呼び出します。
追加機能:
- (オプション)ウォレット保有通貨によるリレー:Expressのルートで利用する関数を作成し、ウォレットが保有する通貨でSequence Transactions APIの支払いを行います。
- (オプション)並列トランザクションのリレイヤー:通貨を送信するためにトランザクションのバッチ処理を行います。
Expressサーバーによる環境構築
以下のコマンドで pnpm
(または他のNodeパッケージマネージャ)がインストールされていることを確認してください。
こちらのExpressテンプレートコード をクローンします。
Expressは、Webおよびモバイルアプリケーション向けの堅牢な機能を提供する、最小限かつ柔軟なNode.jsウェブアプリケーションフレームワークです。本ガイドで使用します。
コードをローカル環境に配置したら、以下のコマンドでサーバーとクライアントを起動します。
コード内には /mint
というルートが含まれており、CLIからテスト用に呼び出すことができます。
以下の例のcurlリクエストで試してみてください。
次のような出力が表示されるはずです。
プロジェクトとアクセスキーの管理
まずはこちらの手順に従い、Sequence Builderへのサインアップ方法やプロジェクト作成方法をご確認ください。
次に、Transactions APIを利用するためには、こちらの手順に従ってBillingを Developer
にアップグレードする必要があります。
最後に、Transactions APIには Public Access Key
が必要です。こちらの手順に従って取得してください。
最後に、.env.example
を .env
にリネームしてから、以下の内容で更新してください。
コレクティブルコントラクトのデプロイ
こちらの手順に従ってコレクティブルコントラクトをデプロイしてください。
テストネット以外を利用し、コントラクトのスポンサーが必要な場合は、こちらの手順に従って実行できます。
最後に、デプロイしたコレクティブルコントラクトの情報で .env
を更新してください。
Transactions APIによるスポンサー付きリレイヤーの構築
このセクションの全コードはこちらで確認できます。
まず、ステップ1で用意したテンプレートコードにいくつかのパッケージを追加します。
次に、サーバーにはメッセージに署名できるEOAウォレットが必要です。このウォレットがサーバー側Sequenceウォレットの所有者となり、トランザクションの送信に利用されます。
セッションを開始すると、Sequenceウォレットが新しいバージョンにマイグレーションされる場合があります。例えば、v1
から v2
への移行、または将来のバージョンへの移行が含まれます。
マイグレーションは一方向のみであり、一度ウォレットが移行されると以前のバージョンには戻せません。
予期しないマイグレーションを検知するには、onMigration
コールバックを利用できます。
callContract
関数を実装するには、以下のように単一の署名者でトランザクションをリレーするコードを追加してください。
最後に、こちらのアプリで生成できるウォレットのプライベートキーを .env
に設定してください(これはデモ用です)。本番環境では、ご自身のPC上で安全にプライベートキーを生成することを推奨します。
次に、取得したキーをPKEY
変数に設定してください。
リレイヤーウォレットアドレスへのMinterロール付与
コントラクトのロールアクセスをBuilderで更新し、ミンターウォレットアドレスからのみリクエストを受け付けるようにします。
Sequence Builderで minter permission
を Sequence Wallet Transactions API Address
に付与してください。
プロジェクトを開き、Contracts
ページに移動し、Linked contracts
を選択、Write Contract
タブで grantRole
メソッドを展開します。
以下の情報で入力してください。
bytes32 role
: 0x9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6
address account
: <Generated Sequence Transactions API Wallet Address>
ここで入力する role
文字列は、solidityでは keccak256("MINTER_ROLE")
、javascriptでは ethers.solidityPackedKeccak256(ethers.toUtf8Bytes("MINTER_ROLE"))
の結果です。
これにより、特定のアドレスのみがコントラクトからミントできるようになり、それ以外はエラーとなります。
write
をクリックし、スポンサー付きトランザクションに署名してロールの更新を完了してください。
これで、クライアントフロントエンドでウォレットにサインインし、「ミント」をクリックしてテストトランザクションを送信できます。
お試しください。
クライアントの initWallet
関数でアクセスキーを更新することも忘れないでください。
(オプション)ウォレット保有通貨によるリレー
ガス代の支払い方法を特定の方法に制限することも可能です。
(オプション)並列トランザクションのリレー
複数の独立したトランザクションをバッチ処理せずに送信したい場合は、それぞれ異なるnonceスペースで送信できます。
トランザクションごとに異なるnonceスペースを使うことで、トランザクション間に依存関係がないことをAPIに示し、オンチェーンで任意の順序で実行できるようになります。
これにより、バッファを介さずに即時トランザクションを送信できます。
その方法の例を以下に示します。