Web3 Security & Privacy service Elusiv Study
今度 solana の summer hackathonに参加することにしました。
オンラインハッカソンにもだいぶ慣れてきたのでETHGlobalとは違う団体のハッカソンにでて違いを体験してみたいのと、 SolanaというRustベースのWeb3を一通り体験してみたいという理由です。
ハッカソンの賞金を提供しているElusiveというServiceをStudyします。
概要
Web3におけるプライバシーを確保しながら、セキュリティ、安全性、分散化を犠牲にしないで実現するにはどうすればよいのか?
分散化された設定でユーザープライバシーを確保しながらネットワークの安全性とセキュリティを犠牲にしないことは困難でした。KYCのような許可されたプロセスが長い間、ユーザーを確認し、システム内の完全性を維持するために使用されてきました。しかし、これは中央集権的であり、ユーザーには感叹的な個人情報を公開する必要があり、監視資本主義を助長します。
このため、我々はElusivを構築しています。これは、デジタル世界に新しい時代をもたらすもので、以下の特性を持っています:
全面的な暗号化:Elusivは、ユーザーとネットワークに対して先進的なゼロ知識暗号と多パーティ計算を適用します。その結果、ユーザーのデータは完全にプライベートに保たれつつ、ネットワークは整合性、セキュリティ、コンプライアンスを維持することができます。
選択によるプライバシー:普遍的な暗号化は包括的なプライバシーを生み出します。Elusivは、ユーザーが自身のデータを制御するためのツールを提供し、何を共有し、何を非公開にするかを選ぶことができます。
社会の力強さ:プライバシーは自由で開かれ、繁栄する社会にとって基本的なものです。普遍的なプライバシー保証をブロックチェーンとWeb3の分散性と組み合わせることで、私たちのデジタル世界は個人とコミュニティを力強くすることができます。
技術概要
なぜElusivが必要なのか?
ブロックチェーンにおける伝統的な支払いは、送金者と受取人の公開鍵を公開するだけでなく、特定の公開鍵のすべての取引を誰でも遡って追跡できます。Elusivは送金者と受取人の直接的なリンクを断ち切り、ユーザーがプライベートな形で取引を行う方法を提供することを目指しています。
Elusivはどのように機能するのか?
ユーザーはまず、自身の資金をElusivプログラムが管理する共有プールに送金してElusivのプライベートバランスを充填します。その後、プログラムに資金を受取人に送金するよう指示することができます。外部から見ると、Elusivへの入金とElusivからの支払いだけが観察可能で、それらを結びつけることはできません。
Elusivはどのようにプライバシーを確保するのか?
プライバシーは、ユーザーの数と取引の多様性が増えることで生じ、経過時間を通じて入金と支払いを結びつけることが難しくなります。たとえば、ユーザーが特定の量(36.5トークン)を入金し、すぐにElusivに36.5トークンを支払うよう指示した場合、外部の観察者はこれら2つの転送を直接結びつけることはできませんが、これらの取引が関連していると非常に確信を持つことができます。
しかし、異なるユーザーが一般的な量(例えば80、50、100トークン)を入金し、それらを長期間にわたって複数の支払いを通じて使うと、前述の正確なチャージアップ戦略と比べてどのユーザーがどの資金を使っているのかを結びつけることが難しくなります。要するに、匿名性は大勢が好むというわけです。
これは、この種のシステムの固有の特性であり、対応する理想的な機能に置き換えられた場合でも変わりません。
私の残高がどのようにしてプライベートに保たれるのか?
共有プールの資金には、その入金者に関する情報は含まれません。代わりに、ユーザーは自分の資金を他のものと一緒にプールに入れ、関連する秘密の値を追跡します。これらの値は後で、未使用の資金の一定量に対する権限の証明を生成するために使用することができます。クライアントは、ユーザーが所有するすべての未使用の資金を集計することで、ユーザーのプライベートバランスを導き出します。これはUTXOベースのシステムが動作する方法に似ています。
閲覧キーはどのように機能しますか?
Elusiv内の支払い詳細は、その支払いを指示するユーザーにしか見えません。ただし、必要に応じてその詳細へのアクセスを許可することは便利かもしれません。ユーザーは特定の取引の閲覧キーを生成して共有することができます。これにより、対応する取引を復号化する能力が付与されます。
ルート閲覧キーはどのように機能しますか?
Elusivアカウントには、支払いキーとルート閲覧キーという2つの重要なキーがあります。名前が示す通り、支払いキーはユーザーの資産を使用するために(しかし復号化することはできません)、閲覧キーはユーザーの資産を復号化するために(しかし使用することはできません)使用できます。一般的に言って、支払いキーはプライベートキーを共有するのと同じで、他の誰とも共有すべきではありません。しかし、ルート閲覧キーは、あなたのプライベートな資産に完全な閲覧アクセスを許可したい信頼できる個人に対して有用ですが、それらを使用する権力を与えることはありません。
技術仕様
コミットメントスキーム
コミットメントスキームは、一方の参加者がある値にコミット(つまりその値を確定)し、後でその値を明らかにする方法を提供します。このコミットメントスキームの一例として、ハッシュ関数に基づくコミットメントスキームがあります。これは、送信者がコミットメントC = H(s||o)を計算し、Cを受信者に送信します。sは秘密の値、oは開示と呼ばれるランダムな値、Hはハッシュ関数です。後で、送信者はsとoを明らかにし、受信者はH(s||o) = Cが成り立つことを確認します。
ゼロ知識証明
ゼロ知識証明は、一方の参加者がある主張が正しいことを証明できるが、その主張についての具体的な情報を他方に漏らさない方法を提供します。Elusivでは、ゼロ知識証明は、ユーザーがコミットメントC = H(x||y||n)のnullifier nを知っていることを証明するために使用されます。ここで、xは資金量、yは資産タイプ、nはnullifier(ユーザーが秘密に保持する値)です。
Elusivプロトコルでは、Zero-Knowledge Proofs(ZKP)、特にzk-SNARKs(Zero-Knowledge Succinct Non-Interactive Argument of Knowledge)をGroth16アルゴリズムで使用することで、プライバシーを保ちつつ、特定の行動や計算が正しく実行されたことを証明します。これは、これらの計算の入力に関する具体的な詳細を明らかにすることなく行われます。非対話的な性質は、証明者と検証者間の対話を必要とせずに証明を作成できることを意味します。
-
プライバシーの保護:Elusivでは、ユーザーが未使用のコミットメントを請求するとき、関連するnullifiersを知っていることを証明する必要があります。直接的なアプローチは、これらのnullifiersを公開することですが、これはユーザーのプライバシーを侵害し、そのトランザクションを追跡できるようになる可能性があります。ZKP:
ZKP{(n), C = H(x||y||n)}
を使用することで、ユーザーはnullifierに関する情報を明らかにすることなく、そのnullifierを知っていることの証明を生成できます。これにより、敵対的なパーティが公開されたnullifierを関連するコミットメントにリンクしたり、それを悪用することを防げます。 -
二重支払いの防止:nullifiersが公開されない場合、ユーザーが自分の資金を二重に支払っていないことを確認する必要が生じます。実際には、Elusivはnullifierを直接使用せず、代わりにnullifierのハッシュ化されたバージョン(n0:
n0 = H(0||n)
とn1:n1 = H(1||n
)を使用します。ハッシュ関数の隠蔽特性により、格納されたハッシュ化されたnullifiersは対応するコミットメントにリンクできないため、預金から支出までのリンクが切れます。n0とn1を生成できるのはユーザーだけです。ユーザーを信用する代わりに、これらの値が正しく形成されていることのZKPを提供するよう求められます。入金時には、n0が正しく形成されており、コミットメントCが正しいかどうかを確認し(ZKP{(n): n0 = H(0||n)} C = H(x||y||n0)
)、ユーザーが資金を支払うときは、コミットメントCが正しいかどうかと、n1が正しく形成されているかどうかをZKPで確認(ZKP{(n): C = H(x||y||n0) ^ n1 = H(1||n)}
)します。これらが確認できたら、その後でハッシュ化されたnullifier n1がチェーン上に保存されます。
つまり、ZKPを利用することで、ユーザーのプライバシーを保護しながらも、二重支払いを防ぐための安全な機構を提供することができます。Elusivプロトコルは、このようにして信頼性とプライバシーを両立しています。
OnChainに保存されるもの
以下の情報がOn-Chain(つまり、ブロックチェーン上)に保存されます。
-
コミットメント: ユーザーがエルーシブの共有プールに資金xを預けるとき、関連するコミットメントCが生成され、これがOn-Chainに保存されます。このコミットメントCは、C = H(x||y||n)という形で導き出されます。ここで、xは預けられた資金の量、yは資産の種類、nはヌルアイファ(これはユーザーが秘密に保持する値)です。
-
nullifier: ユーザーが預けた資金を引き出すとき、その資金に関連するnullifier nが明らかにされます。ただし、直接ヌルアイファnを公開するのではなく、nullifierのハッシュ値n0 = H(0||n)とn1 = H(1||n)が生成され、これらがOn-Chainに保存されます。これにより、同一のnullifierが再利用されて資金が二重に支払われることを防ぎつつ、預けられた資金とnullifierとの関連性を断つことで、ユーザーのプライバシーが保護されます。
SDK
以上です。 どのようにPrivacyをまもる(Transactionの内容をまもる)といっているのかよく理解できました。
このあたりとZeroKnowledgeProof, Privacy関連は solanaでお、ethereumでもホットなので同様のサービス、ライブラリはたくさん出てきていると思うので比較していきたいとおもいます。
Discussion