プロトタイプの説明
以下buildに追加でいい?Yudai.icon
結構長くなりそうなんだよねー
かいつまんで説明して、全体はreadmeでいいかも?
-----------------------------------
Monasという分散型Personal data storeのプロトタイプの開発をした
詳細についてはこちらのリンクを参照
docs:
システム構成図
https://scrapbox.io/files/65ffe04a8a0ebd0024bf175b.png
私たちはIPFS, Filecion, Tabeleland, Push protocolから構成されている
重要な機能は3つある
1つ目はCryptreeの機能
Monasではユーザーがフォルダの作成やファイルのアップロードが行われるとMonas serverに送られる
Monasサーバーではメタデータの作成や追加、メタデータやファイルの暗号化、復号化、再暗号化の処理が行われる
そして、暗号化されたファイルはIPFS上に保存される
2つ目の機能は状態の管理
また、tablelandとFilecoinを使ってMonasで重要な機能の1つであるPDSの状態の管理を行う
File_infoとしてファイルのCIDとroot_cidを保存する
3つ目は共有機能
私たちはPush protocolを使って共有相手にfile or folderのCID、Key、file_infoを送信する
共有相手は受け取ったCIDとKeyによって共有されたアイテムの複合化を行いアクセスする事ができる
また、共有された人はfile_infoを使用することで、共有されたアイテムは改竄されていないか、また、空間全体は最新な状態なのかどうかを検証する事ができる
Cryptreeのアルゴリズム
https://scrapbox.io/files/65fbfbc305cd540024300051.png
私たちの重要な機能であるCryptree algorizmについてである
Cryptreeとは鍵と暗号リンクから構成される暗号化データ構造のことである
私たちはCryptreeを構築することでユーザーが直感的かつ柔軟なアクセス制御が可能であると考えた
Monasでは今回KeyとIPFSによって出力されるCIDによって暗号化データ構造を構築した
MonasではユーザーがSign upするとメタデータの作成を行い暗号化し、IPFSに保存されRoot folderとして作成される
この際に生成されたCIDはRoot_id, KeyのことをRoot_keyとしている
この鍵によってユーザーはPDSへのアクセスを制御している
例えばユーザーが新しくRoot folder配下にフォルダやファイルの作成をするとする
そうすると、フォルダの場合はメタデータを作成し暗号化、ファイルの場合はファイルを暗号化し、 IPFS上に保存されCIDが生成される
そして親フォルダがある場合は、親ノードのメタデータにCIDを追加し、 親ノードの鍵で暗号化し IPFS上に保存するという処理をルートノードまで行う
これは IPFSの特性上、 IPFS上に保存されているアイテムに変化を加えるとCIDが変化するためだ。しかし、これにより IPFS上ではデータの真正性は保たれていると考えられる
次にアクセスを拒否する処理である
アクセス拒否をした際は再暗号化の処理が実行される
私たちは既に共有されているデータへのアクセスを拒否するのではなく、新しい状態のデータへのアクセスを拒否すると捉えていることを言及しておく
再暗号化の処理では、アクセス拒否したい特定のノードから、最下層に向かって復号化処理を行なっていく
最下層まで完了したら、新しい鍵の生成を行い最下層のノードを暗号化を行い IPFS上に保存をしCIDの生成を行う
このCIDは親ノードのメタデータに保存される
上記の処理を特定のノードまで再起的行う。
特定のノードまで来たら、再暗号化ではなく、親のメタデータにCIDを追加する処理をRoot_nodeまで繰り返し行う
という処理が行われる
課題
鍵をどこに保存するか
現状はユーザーが保存する形となっている
つまり署名鍵と暗号鍵の2つが存在していることになる
私たちはDID methodの構築を検討しており、 UXをあげようと考えている
Root_idが毎回変わる
IPFSを利用しているからこそ、CIDが変更するという問題がある
例えばIPNSを利用する場合はこの問題に対処できる可能性がある
どのように早くするのかにも繋がる
どこで処理を行うか
私たちは現状のプロトタイプではMonasのサーバーに依存している
これを私たちはユーザーがノードを建てられるようにすることで解決を図っていこうと考えている
しかし、すべてのユーザーがノードを建てられるとは思っていない
または処理を軽くすることで、スマートフォンでも可能にする?
Write機能をどう実装するか
ユーザーがNodeを建てて実装する際にどのように処理を行うのか
どのような暗号化アリゴリズムを使用するのか