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 を​学んだ方が​良さそうですね。​はい。

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

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

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

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