[Tech] EIP 191 Signed Dataを使ったサイドチェーンへのログイン機能
MCHバトルベータでは、大部分の実装をLoom Networkを採用したサイドチェーンで実現しています。
現状のEthereumにおいて、Gasやトランザクションの確定速度の面からゲームのようなアプリケーションには、サイドチェーンもしくはオフチェーン技術が必須といえます。
Ethereumの秘密鍵情報はWalletブラウザが握っており、アプリケーション側から触るべきではないこと。Loom NetworkとEthereumの暗号方式が違うことからEIP 191 Signed Dataを使ったログイン機能を実装しました。
Go言語で作成したスマートコントラクトプラグインで実現しています。以降、KeyManagerと呼びます。
バトルベータにログインする際、プレイヤーは次のようなメッセージに署名する必要があります。
署名リクエストにより、「メッセージ」部分を署名し、シグニチャを作成します。
Tokenはワンタイムトークンです。MCH ベータバトルでは、広く使われているTOTPを使った2段階認証Tokenをメッセージに含ませることで、リプレイアタックの可能性を抑えています。
「署名前メッセージ」、「シグニチャ」をKeyManagerに送信し、署名とメッセージの検証を行います。
「メッセージに含まれたメインチェーンアドレス」と「ワンタイムトークン」によってKeyManagerはメッセージの正当性を検証することができます。
KeyManagerは署名メッセージの正当性を確認後、メインチェーンのアドレスに対応する秘密鍵を返答します。この秘密鍵自体もコントラクトで管理しており、運営陣からも確認することができません。
サイドチェーンの秘密鍵を受け取ったDAppsブラウザは、Local Storageに秘密鍵を保存し以後の通信で利用します。
このようにして、ログイン機能を実現しています。
このSigned Dataは、メインチェーンとサイドチェーンをつなぐのみならず、鍵認証が身近なものになるブロックチェーン技術全般で広く利用できるものであると考えています。
しかしながら、単一のテキストしか利用できないことや、DAppsブラウザごとに表示が異なることからまだまだ発展途上にあると考えています。
最後に今後の展望としまして、構造化されたデータの署名」(EIP712 Ethereum typed structured data hashing and signing) が検討されています。
これにより、署名メッセージに構造をもたせることができ、UXが改善できるのではないかと考えております。