オンチェーンでの型付きデータと署名メッセージの検証
署名者からのデータの完全性を保証するため、オンチェーンおよび未デプロイのウォレットコントラクトでメッセージの署名検証を行う方法
所要時間:10~20分
このガイドでは、EVMベースのコントラクト用に提供されたソースコードの使い方を順を追って解説し、Universal Signature Validator(ERC-6492)を組み込んだカスタムオンチェーンメッセージバリデータコントラクトの仕組みや、型付きデータによるアプリ内署名検証の方法を説明します。
これは6つのステップで実現できます:
- Builderプロジェクトの作成とアクセスキーの取得
- React Viteアプリケーションの初期化
- Sequence Walletを使ったユーザーサインイン
- EIP712型付きデータでEIP6492署名を生成
- EIP712検証とEIP1271バリデーション用コントラクトのデプロイ
- 検証・バリデーションコントラクトからのレスポンスを表示
このアプリケーションの全体的な流れは、以下のシーケンス図で確認できます:
デモの全コードはこちらで確認できます。また、デモはこちらからご利用いただけます。
1. Builderプロジェクトの作成とアクセスキーの取得
まず、こちらのガイドに従ってSequence Builderでプロジェクトを作成し、プロジェクトのアクセスキーを取得してください。
2. React Viteアプリケーションの初期化
次に、署名生成やブロックチェーンからの検証レスポンス取得に必要なコードを格納する新しいプロジェクトを初期化します:
これで空のプロジェクトが作成され、要素やロジックを追加できるようになります。
3. Sequence Walletを使ったユーザーサインイン
プロジェクトの動作に必要なパッケージをインストールします:
その後、ステップ1で取得したプロジェクトアクセスキーと選択したネットワークで、ユーザーがサインインできるようにします。
4. EIP712型付きデータでEIP6492署名を生成
次に、typescriptでカスタム型付きデータを定義します。Sequenceのユーティリティライブラリを使ってTypedData
型を構築し、name
、wallet
、message
パラメータを持つメッセージ構造を検証します:
この例のVERIFYING_CONTRACT_ADDRESS
はsepolia
にデプロイしたスマートコントラクトですが、次のステップでこのコントラクトの内容を紹介し、どのネットワークでもデプロイできるように説明します:
その後、参照した各プロパティを使って型付きメッセージオブジェクトに署名します:
関数をボタンに紐付け、ユーザーがクリックした後に署名が生成されることを確認してください:
5. EIP712検証とEIP1271バリデーション用コントラクトのデプロイ
ここでは、Remix や Foundry などのツール、または Sequence Builder を使ってコントラクトをデプロイするためのソースコードを提供します。
Universal Signature Validator(ユニバーサル署名バリデータ)
Universal Signature Validator は、特定のネットワークに一度デプロイすれば、多くのアプリケーションで共有できるため、再利用性と拡張性に優れています。これは、EIP6492 対応ウォレット向けのオフチェーン・オンチェーン両方のスマートコントラクトウォレットで利用できます。
こちらにソースコードがあります。このコードを利用してデプロイしてください。
カスタムコントラクトバリファイア
次に紹介するコントラクトは、用途に合わせてカスタマイズできるよう、さまざまな関数について詳しく説明します。まずは、Universal Signature Validator をコンストラクタに渡すという最初のステップで、以下の基本事項から始めましょう。
署名の検証
次に、署名検証用の関数を用意します。この関数はメッセージハッシュのダイジェストを生成し、署名者を検証します。
カスタム Person ダイジェスト
以下の関数では、渡されたパラメータを使って struct ハッシュを再生成します。必要に応じて、パラメータの種類や数を増減できます。
ダイジェストの構築方法については、EIP712仕様 をご参照ください。
署名者の検証
次に、signer
アドレス、digest
、signature
を検証します。EIP6492 署名が渡された場合は universal signature validator を利用し、それ以外は EIP1271 の署名検証を直接行います。
これで両方のコントラクトをデプロイする準備ができました。ネットワークを選択してください。
6. 検証コントラクトからのレスポンスを表示
署名を渡し、ethers
を使ってデプロイ済みコントラクトを呼び出します。この際、PROJECT_ACCESS_KEY
を利用します。
プロバイダの作成
プロジェクトアクセスキーを使ってプロバイダを作成します。
Ethers コントラクトの初期化
ステップ5 で生成された ABI(または Git のソースコード からコピー)をインポートし、プロバイダと検証コントラクトアドレスを指定します。
署名検証関数をスタティックコール
関数をスタティックコールすることで、トランザクションをチェーンに送信せずにシミュレーションできます。これにより、検証が成功したかどうかの結果が返されます。
まとめ
これで、ユーザーが正しい情報に署名していることを保証するさまざまなユースケース(例:ERC20 の使用許可、オフチェーンでの入札、署名済み QR コードによるミントなど)へとアプリケーションを拡張できます。