Upgrade to Pro — share decks privately, control downloads, hide ads and more …

libp2p

wshino
May 23, 2019

 libp2p

wshino

May 23, 2019
Tweet

More Decks by wshino

Other Decks in Technology

Transcript

  1. 自己紹介 - About me
 @ DMM.com Shinohara Wataru ・DMM.com Blockchain

    Engineer ・I really love Roller Coasters. @shinanonozenji_ 2
  2. 多言語での実装
 @ DMM.com • Rust • Go • JavaScript •

    Java • Haskell • Python 5 substrate-network-libp2p
  3. p2pとは
 @ DMM.com • 対等の者同士が対等な立場で相互にやり取りをおこなう ◦ 対等の者(Peer = Node) •

    ネットワークの参加者はクライアント、サーバー両方の役割を担える • システムの中心となる存在がいない ◦ ≠ クライアント/サーバーネットワークモデル • ノードが停止しても一台さえあればサービスが止まることはない 7
  4. p2pのメリット
 @ DMM.com • 参照性能の向上 ◦ 状態を持つ処理はまた別の困難が存在 • 耐障害性 ◦

    一部のノードが障害を起こしてもシステムは停止しない • Overlay Network ◦ 異なるネットワーク間でも同一ネットワークとして通信可能 →中央管理者がいらない 9
  5. NAT Traversalの用語説明
 @ DMM.com • NAT ◦ private IP ←→

    public IPの変換 • STUN ◦ 外から見た自分のアドレス(Refrective Addrress)を返す • UDP ホールパンチング ◦ STUNで得られたアドレスを使ってコネクションを張る 13
  6. NAT Traversalの用語説明(2)
 @ DMM.com • ICE(Interactive Connectivity Establishment) (WebRTCで使う) ◦

    ホールパンチしてくれる ▪ vanilla(ホールパンチの結果をまとめて送信) ▪ trickle(ホールパンチの結果を逐次送信) • 早くコネクションを張る可能性がある 14
  7. NAT Traversalの困難
 @ DMM.com NATは統一規格がない • full cone NAT •

    address restricted cone NAT • port restricted cone NAT • sequential port symmetric NAT • random port symmetric NAT ホールパンチができないものもある 15
  8. libp2pの主な特徴
 @ DMM.com • 効率性 ◦ 基礎となるトランスポートの効率的使用 ◦ 接続の再利用性(ソケットの効率的な利用) ◦

    ピア間の通信を1つのコネクションで多重化する ▪ ハンドシェイクのオーバーヘッド回避 ▪ ポートの枯渇回避 21
  9. Relay Protocol
 @ DMM.com • 暗号化されたTURN ◦ NAT越えできないノードを中継ノードででつなぐ ◦ 通信は暗号化されて身元確認(identity)がある

    • 通信間のノードが中間者攻撃できない ◦ secioでend-to-endで暗号化している • 許可すれば他のアプリケーションのlibp2p通信のrelayになれる 25
  10. あらゆるプロトコルに対応
 @ DMM.com 暗号化されてないプロトコル • TCP • UDP • SCTP(ストリーム処理)

    • UDT(UDPベースのデータ転送) • uTP(torrentでデータ転送に使ってる) 28 uTP https://www.bittorrent.org/beps/bep_0029.html
  11. あらゆるプロトコルに対応
 @ DMM.com 暗号化されたプロトコル • TLS • QUIC(TCP and TLS

    + HTTP/2 over UDP) • CurveCP(楕円曲線を使った通信) • SSH • Noise ◦ lightning networkのBOLT仕様で利用 29 CurveCP https://curvecp.org/ Noise http://noiseprotocol.org/
  12. 自己記述アドレス(マルチアドレス)
 @ DMM.com • /ip4/90.46.231.22/udp/25000 ◦ IPv4の90.46.231.22でUDP 25000 • /ip6/fe80::0202:b3ff:fe1e:8329/udp/1567/quic

    ◦ IPv6のfe80::0202:b3ff:fe1e:8329でUDP 1567でQUICを使う 30 QUIC UDP : 1567 IPv6 : fe80::0202:b3ff:fe1e:8329 multiaddr transport
  13. Stream Multiplex(多重化、逆多重化)
 @ DMM.com 複数のstreamを一つのコネクションにまとめる • SPDY • mplex(バックプレッシャーなし) •

    yamux(バックプレッシャー付き) 33 stream stream stream Application Stream Multiplex Encryption Transport
  14. Discovery
 @ DMM.com • 起動時のノード探索 ◦ bootstrapを使用 • ローカルのノード探索 ◦

    mDNS(multicast DNS)を使用 • その他 ◦ Kademliaの分散ハッシュテーブルを使用 36 Application Stream Multiplex Encryption Transport
  15. PubSub
 @ DMM.com • FloodSub ◦ 簡易実装 ◦ 全てのsubscriberにpublishするので帯域を圧迫する可能性 •

    GossipSub ◦ メッシュ内に伝播してメッシュ外はgossipプロトコル ◦ gossipはrandomなので到達の不確実性がある(気がする 37
  16. 話さなかったこと - I did not speak
 @ DMM.com • Network

    Layer • Swarmの詳細 ◦ Dial Synchronization System • 諸々のシーケンス 39
  17. 総括 - Conclusion
 @ DMM.com • Network Layer理解不足 • これあればアプリが作れる、アプリ間も繋げやすいぞ

    • モジュールを各レイヤーでプラガブルに利用できるのは面白い • コネクション一つを使い回すのは良い ◦ streamの詰まりは起きないのだろうか? • 抽象化が過ぎる 40
  18. 参考
 @ DMM.com 41 https://github.com/libp2p/specs https://github.com/libp2p/js-libp2p https://qiita.com/kikuchi_kentaro/items/1cfcb8 65b97cd2b309aa https://github.com/multiformats/multiaddr https://www.slideshare.net/iwashi86/webrtcic

    e https://www.parity.io/why-libp2p/ https://github.com/libp2p/js-libp2p-floodsub https://github.com/libp2p/go-libp2p-secio/issu es/7 http://www.wata-lab.meijo-u.ac.jp/file/seminar /2006/2006-Semi2-Shoichi_Kuzuya.pdf http://tutorials.jenkov.com/p2p/peer-routing-ta ble.html