MetaMaskでEIP-712の署名する方法

Ethereumのウォーレットの鍵ペアを使って、ブラウザ内で任意のデータに署名することができる。 アドレスの持ち主だという証明になるので、たとえばアドレスに紐づくラベルの編集とか、ログイン時にセッションキーに署名するとかに使えそう。 これは手元の秘密鍵を使ってデータに署名するだけなので、トランザクションは発生せず、残高に影響はない。

署名には、EIP-712: Ethereum typed structured data hashing and signingで規定されているeth_signTypedData を使うことになる。 ブラウザの機能拡張MetaMask では、マニュアルによると、このEIP-712 が策定される当初から実装を行っていたらしく、現在の仕様の呼び出しを行うにはメソッド名にバージョンをつけて eth_signTypedData_v4と指定する必要があった。

このページでは、実際に署名を行う動作デモを展示する。 このデモは外部のJavaScriptライブラリを使わず、MetaMask と直接やり取りするようになっている。 Connect ボタンを押してMetaMaskと接続したあと、Sign で署名できる。 なお、結果の署名はeth-sig-utilを使えばサーバサイドで検証できそう。

操作盤

Connect

Connect結果:

Account
Not connected
Chain ID
None

Sign

Sign結果:

Message body
Signature

ソース

app.js の中だけで完結している。 一連の処理をGitLab にも置いた。