概要
Web3ハッカソンに出場したレポートと、
作ったモックアップについて紹介し、供養したいと考えています。
提出に使用した loom へのリンクはこちら。
作ったアプリ
Tesolana は、
自分の位置情報を友達と「セキュア」に共有することのできるWeb3アプリです。
Tesolana はSolanaチェーン上にデプロイされたスマートコントラクトで作られたdAppです。
Tesolanaは、暗号技術を用いて、自分のフレンドユーザのみに安全に位置情報を共有できます。
ユーザの位置情報は暗号化され、不特定多数のユーザや、スマートコントラクト側はユーザの位置情報を知ることはできません。
各ユーザがアップロードした位置情報はSolanaのデータアカウントに保存され、他のユーザもその情報を取得できますが、他のユーザが取得できるのは暗号化された位置情報のみです。
ユーザ1がユーザ2をフレンド登録すると、スマートコントラクトは、ユーザ1のデータアカウントに登録されているユーザ1の位置情報(暗号)を、ユーザ2の鍵ペアで復号できる暗号に作り替え(プロキシ再暗号)、ユーザ2のデータアカウントに書き込みます。
そのようにして、サーバサイドにも、ユーザサイドにも位置情報を公開することなく、必要な人たちにのみ位置情報を公開することのできるようなdAppを今回は作成しました。
システム構成
ソースコード
フロントエンド
https://github.com/b02505048/tesolana
バックエンド(スマートコントラクト)(experiment ブランチ)
https://github.com/b02505048/solana_program
使用したtech stacks
フロントエンド
vuejs, web3js
バックエンド
solana_program, rust
使用したBlockchain
Solana
deployしたContract
バックエンドのコントラクト
application codeやその他のfile
アプリケーションはフロントエンドにコードがあります。
準同型暗号を用いて、チェーン上のパブリックな情報を暗号化して保存(したかった)
この安全な位置情報の共有を達成するために、準同型暗号を用いました。準同型暗号は、暗号化したまま計算ができる暗号のことです。さらに今回は、この暗号にプロキシ再暗号化の技術も用い、ユーザ1の位置情報を、暗号化したまま、ユーザ2が復号可能な暗号へと変換する技術を用いました。
準同型暗号を用いると暗号状態での計算が可能になるため、例えば、ユーザ1とユーザ2の距離を、暗号状態の位置情報から計算することができます。
また、プロキシ再暗号を用いると、サービスを使っているユーザの特定のユーザ(今回はフレンドのみ)に対して自分の位置情報を公開することができます。
例えば、ユーザ1がユーザ2をフレンドを登録すると、ユーザ2のみがサービス経由でユーザ1の位置情報を取得することができます。ここで大事なのは、サービス側(スマートコントラクト側)もそれらの位置情報を知ることができないので、ユーザは安心して位置情報を共有できるところです。
準同型暗号を用いたかったが、苦戦した言い訳
今回、プロジェクトをスタートした時は、 完全準同型暗号であるconcrete ライブラリを使用して暗号のロジックを 書こうというところからスタートしました。 concrete ライブラリのいいところは、
準同型暗号が実装されている(暗号状態で計算できる)ため、位置情報の分析を暗号状態で行えること)
鍵交換が実装されている(プロキシ再暗号化とも呼ばれる)が可能であり、ユーザ1の位置情報をユーザ2にのみ復号可能なように暗号文を変更できる
などでした。 しかしながら、concrete ライブラリは計算資源を大量に必要とすることから、 Solanaのスマートコントラクトとしてデプロイすることが非常に困難であることがわかりました。
また、次にトライしたrecryptライブラリは、 鍵交換の機能を実装しているライブラリであり、準同型暗号ではありませんでした。 しかしながら、位置情報の共有のみを目的とした場合、鍵交換が可能であればアプリケーションとして 成り立つことから、スマートコントラクト上への実装を試みました。
しかしながら、このライブラリも、unsafeなオペレーションが含まれていることから 簡単にはスマートコントラクトへの実装ができず、限られた時間の中でこれらのライブラリを実際にスマートコントラクト上で動かすことは困難であるという決定をする必要がありました。
従って、今回のプロジェクトでは我々が「モックアップ暗号」として、 grasscrete というあくまでも暗号ではなく、位置情報にランダム性を持たせ、暗号ライブラリとしてモックアップの意味で使用する、というアプローチを取りました。
このgrasscrete は、ランダム性をデータに付与するものですが、実際の鍵を知らなければ位置情報が秘匿される仕様になっており、上記で言及した
準同型性
鍵交換の可能性 をどちらもクリアーしています。
このgrasscreteはあくまでもモックアップのためのものであり、 今後セキュリティが向上するような改善をおこなっていくことが前提となった工夫であることに言及しておきます。
まとめ
今回はWeb3ハッカソンに出場し、初めてのSolanaブロックチェーンに苦戦しながらも、
どうにか格子暗号を操作するチェーンをデプロイできないかと苦戦し、
それらが実現した時の「セキュアな位置情報共有アプリ」について実装を頑張った経験について書きました。
ブロックチェーンはやはりバックエンドDBのような使い方が普通であり、
重い計算をするような設計にはなっていないことなどを知り、考えが甘かったなと思ったということ、
Anchorを用いずにPureRustでエンドポイントを作ろうとして低レイヤでの作業がしんどく、判断を誤ったなと思ったことなど、いろいろと反省がありました。
しかしながらブロックチェーンを用いたバックエンドの実装は楽しく、
一緒に出場した2人のメンバーとの開発経験は非常に勉強になることばかりで、これからももっと勉強してWeb3アプリケーションの開発もやっていきたいなと思っています。
Solana、イーサ、Terraあたりをぜひもっと開発してみていろんなものを作ってみたいなと思っています。
また、機会があればWeb3ベースのハッカソンにも出場してみたいと思っています。
今回はこの辺で。