ウォレットメール

https://github.com/hackz-hackathon-ichthyo/comet

TypeScript

Next.js

Firebase

GitHub

ウォレットアドレスをメールアドレスとして扱うブラウザメールアプリ

Nishino

推しアイデア

Metamask(ウォレット)を暗号化インターフェースとして捉え、メールに必要な電子署名、平文の暗号化などを実現できるようにした。またスマートコントラクト上で公開鍵認証局を作ることで従来よりも分散されたPKIの実現ができるようになった。

作った背景

Metamask(ウォレット)は秘密鍵と公開鍵を所持しているため、普段の使い方は違う使い方をすることで新しい可能性を見せたかったから

推し技術

公開鍵と秘密鍵をふんだんに使った暗号技術とスマートコントラクト。暗号は楕円離散対数問題における安全性が保証されている。

プロジェクト詳細

概要

このプロジェクトはブロックチェーンで取引する際に使っているウォレットアドレスをメールアドレスとしてテキストのやり取りができるブラウザメールアプリです。

私たちはブロックチェーンで取引をする際にウォレットを使用して取引しますが、ウォレットには取引をするための秘密鍵と公開鍵が入っています。 私たちはこのウォレットが秘密鍵と公開鍵を持っていることに注目し、ウォレットを暗号化インターフェースとして捉えることであらゆる暗号、認証を実現しました。

ウォレットアドレスを公開していればメールが届くのでいつの間にか有名人からのメールが来るかもしれません。←目が離せない

推しポイントについて

1. 分散型の公開鍵認証局をスマートコントラクトで実現

既存の公開鍵認証局はその公開鍵が本人のものであることを証明するために認証局を通しています。ユーザーは認証局を信用しなければならず、中央集権的です。しかし、私たちはアドレスと公開鍵を紐づけるスマートコントラクトを作成し、分散型の公開鍵認証局を作成しました。 公開鍵を登録するのはウォレットを持っている本人しかできません。 また、スマートコントラクトなので、他の開発者がアドレスと公開鍵の紐付けデータが欲しいとなった時、このスマートコントラクトを使えば良い(色んなアプリで使われることでたくさんのアドレスと公開鍵の紐付けが登録される)ので、コンポーザビリティを意識した開発を行いました。

2. アドレスをメールアドレスとして設計

通常のメールサービスは登録していないメールアドレスには送信できませんが、このサービスではアドレスをメールアドレス部分としているので、メールアドレスを登録する必要がありません。ただのuidに向けたチャットのように見えますが、それだとメッセージの暗号や、電子署名を実現しきれない(しようと思ってもサーバー側を信頼する必要がある)ので、公開鍵を秘密鍵を持つアドレスで実現可能です。

3. ユーザーに選択肢をたくさん用意した

既存のメールクライアントは、向こうが用意したサーバーに保存されたりと、ユーザーが選択できるものが少なかったのに対してこのアプリでは多くの選択ができるようになっています。ユーザーは何を重要視するかによって利用する形態を自由に選択できます。

firebaseでの認証も、一度きりのトークンの発行をMetamaskで署名し、ウォレットが本人のものであることが証明されているので不正な認証はできません。また、一度きりのトークンなのでリプレイアタックによる攻撃の心配もありません。

image また、それだけでなくLayer1,Layer2のEVM互換であるチェーンにデプロイしてあるので、ユーザーは好きなチェーン(手数料が安いなど)やサーバー(信用しなければならないが利用は完全に無料)などを自由に選ぶことができます。

技術スタック

image

フロントではNext.jsを、バックエンドにはBackend as a ServiceのFirebaseを使用しています。Firebaseからワンタイムトークンを発行し、そのワンタイムトークンをMetamaskを使用して署名を行い、Cloud Functions上で検証し、アドレスが復元されることが確認されるので、アドレスが本人のものである検証ができます。その後Firebaseログインを行うことで、オフチェーンのガス(手数料)が無料のままサービスを利用することも可能です。

メールを送る手順

前提として送信先のアドレスが公開鍵を登録しているとします。

  1. 相手の公開鍵を使って平文を暗号化(暗号化方式はx25519-xsalsa20-poly1305)
  2. 自分の秘密鍵を使って平文に対して電子署名を作成(Metamask側でメソッドが定義されているため開発者は秘密鍵は入手できない仕様 )

これによって相手のみにしか復号できない暗号文と、メールを送ったのが送信元アドレス本人であることがわかります。

暗号文の復号手順

  1. 自分の秘密鍵を使用して暗号文を復号(復号もMetamask側でメソッドが定義されているため開発者は秘密鍵は入手できない)
  2. 相手の公開鍵を使って電子署名をリカバリーし、アドレスと一致することで検証

Nishino

@bv583bgy7gs3zbx5