P2P を実装する上でめんどくさいこと

読了まで:約4分


つい先程から [[P2P]] の開発欲みたいなのが、久しぶりに湧いてきたので、とりあえず、P2P を実装する上で面倒、というかめんどくさいコトの一覧をまとめてみる


1. ピア (ノード) 情報の管理 + ルーティング

これは主に [[Distributed Hash Table]] (= [[DHT]] ) を使って云々とかその辺りの話。

正確には P2P におけるピア (ノード) 管理のアルゴリズムについては [[DHT]] と ネットワークが絡むルーティングを組み合わせて実装する場合がほどんとだと思うんだけど、別に [[DHT]] 自体はネットワークとか絡んでなくでも実装は出来る。めんどいけど。

それで、 [[P2P]] を実装する際に、サーバサイド P2P なら、ナイーブな DHT + Routing でもなんとかはなると思うんだけど、コンシューマーサイド、特に利用者が任意で P2P アプリケーションを起動したり終了したりする場合、ネットワーク的には参加離脱が頻繁に発生するので、その辺りを加味したアルゴリズムを使わないとネットワーク的には破綻する。

そしてさらにめんどくさい事に、 [[Pure P2P]] だとノード情報の bootstrap どうするか問題とかも有って、その辺りもさらにめんどくさい。なので、この辺りの実装はよっぽどこの手のアルゴリズムとか実装に慣れているとかでは無い限り、既存の実装使った方が良い、と個人的には思う。

で、次。

2. 情報の同期 + 情報同期のためのノードの優位付け

これは今の自分がほぼ何をどうしたら出来るのかが把握できてないことなんだけど、 [[情報の同期]] と、それに伴う同期のためのノード間の優先順位の付け方、っていうのが、恐らく P2P を実装する上で一番めんどくさい部分だと思う。

いうのも、情報の同期を実装するのは、即ちノード間の情報交換の [[アルゴリズム]] を考える事だし、また、ノード間の優位付け、という問題も、51% 問題とか [[ビザンチン故障]] とか色々考えなきゃならんことが有って、これはまた僕の技量ではどうにもこうにも手が付けられていない。

これについては、情報の同期とか考えずに [[ブロードキャスト]] だけならまだ [[ゴシッププロトコル]] とか使えばなんとかなるかもだけど、下手なブロードキャストを実装するとネットワークがゴシッププロトコルの送信で溢れて情報量が爆発する、という事もあるので、その辺りもめんどうっちゃあめんどうではある。いうか、その辺りに真面目に実装しないと、DDoS もどきになりかねない。

なので、これもまた他の人が実装出来るのであれば、そっちを利用したい所なんだけど、現実的には、この手の分散アプリとか実装出来るヤツというと [[Ethereum]] ぐらいしかないっぽいので、まあ、 Ethereum 相当の実装を自前で作る根気がなければ、 [[Ethereum]] の [[DApps]] を学んだ方が速そう。

で、最後。

3. ネットワークへの攻撃 + 法的な問題

これはその昔、興味半分で Lair (今は Outopos だったっけ) のネットワークに参加してた時に有ったことなんだけど、Lair ネットワークに対して、2ch で言うところのスクリプト爆撃みたいな事が為されていた時が有って、それの対策が大変そうだったなーという記憶がなんとなしには有る。

で、あと他には、 AWS が Abuse されて Share (P2P ファイル共有の方) の参加ノードに対して、 [[DDoS]] をぶちかまされていた時期も有ったはずなので、そういった、ネットワークを崩壊させる為の攻撃やらに対処するのは、まあ面倒だよねっていう感じ。

また先の話に戻って、 [[Lair]] そのものにはそんなには法的な問題なかったけれども、 [[Amoeba]] と呼ばれるファイル共有 P2P みたいな実装の方面では、色々と法的な問題、まあ要するに違法なファイル共有とかその辺りの問題も有ったはずなので、コンシューマーサイド の P2P を実装する、というのは、そういった著作権とか違法な情報のアレがアレして、という側面が常についてまわるので、そういった事も考えるのは面倒だなぁと思う次第です。はい。

まと

なんかちょっと書くつもりが長くなってしまったけれども、話をまとめると、 P2P を実装する上で解決しなければならない課題は、

  1. ノードのルーティングと管理をどのように行うか
  2. 情報の交換と、それに伴う優位ノードの優先付けをどのように行うか
  3. また、ネットワークへの攻撃と、法的な問題の解決をどのように行うか

三つ辺り。

と、ここまで書いてみて気がついたけど、やっぱりこの手の問題を自分だけで解決する、なんてのは、ぶっちゃけ面倒すぎるので、まー Ethereum の DApps を学んだ方が良さそうですね。はい。

いう事でふとメモっておきたかったというか、書きたくなったことは以上です。はい。

アバターアイコン兼ロゴ

にゃるら(カラクリスタ)

『輝かしい青春』なんて失かった人。次に備えて待機中。

今は趣味でプログラミングをして生活しています。