Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Goによる P2Pチャットシステムの開発
Search
h2so5
March 26, 2015
Programming
7.1k
11
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Goによる P2Pチャットシステムの開発
h2so5
March 26, 2015
More Decks by h2so5
See All by h2so5
Riot.js Tokyo #2
h2so5
0
740
Dripcap03
h2so5
2
360
Other Decks in Programming
See All in Programming
変化を抱擁するドキュメントの作り方 - ビジネスルール駆動開発がもたらす、コードとの新しい関係
ioki
2
110
新卒PdEのリアル
ryu1013
1
380
PyO3 で既存 Python 評価器を Rust core 化する ー wasm-bindgen でブラウザにも配るための設計
kdash
1
370
まずはプロンプトガイドを読もう、話はそれからだ
kiakiraki
1
260
AWS Step Functions 大規模並列の壁を越える / jaws-sonic-2026-niigata-step-functions
kasacchiful
PRO
0
340
LoopHub - ローカルで動く GitHub で、AI と共同開発
jugyo
0
410
{ Android | Kotlin } Gradle Plugin in 2026
ryunen344
1
280
Gmail/Google DriveをトリガーにAIエージェントを動かそう! / Run AI agents with Gmail/Google Drive as triggers!
har1101
3
460
週末にAI-DLCを本気で回したら$1,600溶けた
hbashimizu
0
120
Building an Out-of-Order CPU
latte72
0
660
AIを上手に使っていこうとしたら越境せざるを得なくなった話 〜実践1年で見えた境界を越えなければならない理由と進め方〜 / Crossing borders with AI
tomoyakitaura
3
1k
[PyCon KR 2026] More Variants, More Diversity for AI Accelerators
achimnol
0
130
Featured
See All Featured
The B2B funnel & how to create a winning content strategy
katarinadahlin
PRO
1
500
We Analyzed 250 Million AI Search Results: Here's What I Found
joshbly
1
1.9k
GraphQLの誤解/rethinking-graphql
sonatard
75
12k
The Cost Of JavaScript in 2023
addyosmani
55
10k
Neural Spatial Audio Processing for Sound Field Analysis and Control
skoyamalab
0
460
KATA
mclloyd
PRO
35
15k
How to Think Like a Performance Engineer
csswizardry
28
2.8k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
17k
Keith and Marios Guide to Fast Websites
keithpitt
413
23k
Writing Fast Ruby
sferik
630
63k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
128
56k
Self-Hosted WebAssembly Runtime for Runtime-Neutral Checkpoint/Restore in Edge–Cloud Continuum
chikuwait
0
770
Transcript
Goによる P2Pチャッ トシステムの開発 橋本 論 https://github.com/h2so5/murcott
チャット 作ってました RelayCoding MikuMikuOnline
集中型の チャット サーバー クライアント
サーバーが ダウンすると サーバー クライアント
常に サーバーを経由
有名なチャットの プロトコル IRC XMPP <iq from='
[email protected]
/castle' id='get-data-1' to='
[email protected]
/pda' type='result'> <data
xmlns='urn:xmpp:bob' cid='
[email protected]
' max-age='86400' type='image/png'> iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAABGdBTUEAALGP C/xhBQAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9YGARc5KB0XV+IA AAAddEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIFRoZSBHSU1Q72QlbgAAAF1J REFUGNO9zL0NglAAxPEfdLTs4BZM4DIO4C7OwQg2JoQ9LE1exdlYvBBeZ7jq ch9//q1uH4TLzw4d6+ErXMMcXuHWxId3KOETnnXXV6MJpcq2MLaI97CER3N0 vr4MkhoXe0rZigAAAABJRU5ErkJggg== </data> </iq> ・テキストプロトコル ・バイナリは苦手
今回 開発したもの https://github.com/h2so5/murcott Decentralized instant messaging framework murcott
murcottの構造 μTP 暗号化 DHT DHT
・Golang 100% ・IDによるメッセージの電子署名 ・扱いやすいバイナリ (MessagePack) ・Kademlia DHT ・UDP(μ TP)で通信 ・グループチャット対応
murcottの特徴
Golangについて ・コンパイルするため高速 ・サーバー向きのライブラリが充実 ・チャンネルによる非同期通信 特に暗号関連 低レイヤーの処理をするため重要 P2Pでは非同期処理が多くなりがち
murcottのID ZXF3qv3i8q4y3UGboNW89n2bRy95ngwuDT ZXF3qv53NguoqoAhhnVkJRdCk6BNcJm9yE ZXF3qv5M1U8oaByBX3YoGHQxfWctgnZmzR ZXF3qv5oMTEha58tXa5ky7QovHS6fc9Atx ZXF3qv4Bywkot1zbRLWmGDKkivUfYyp6H5 ZXF3qv4gsmv8f5twDGYZyHiB1HcT1NFypb アドレスの代わり
murcottのID の中身 0x 90 ネットワークID ECDSA 公開鍵のハッシュ IDの種類 ユーザー: 0.0.0.0
グループ: 1.0.0.0 0x 01 00 00 00 0x 48 89 5c 24 28 48 ZXF3qv3i8q4y3UGboNW89n2bRy95ngwuDT BASE58 20byte
メッセージの署名 ・相手に接続したときに公開鍵をダウンロード ・メッセージが本当にそのIDから送信された かどうかが分かる 接続 公開鍵の交換 メッセージ送信 秘密鍵 A 秘密鍵
A 公開鍵 A 公開鍵 A 秘密鍵 A 秘密鍵 B 公開鍵 B 秘密鍵 B 秘密鍵 B 公開鍵 B メッセージ+署名 B B A A A B 署名 検証
MessagePack { dst: <byte[20]>, # Destination node ID src: <byte[20]>,
# Source node ID type: <string>, # Payload type payload: <byte[]>, # Messagepack serialized payload id: <byte[20]>, # Message ID sign: { # Payload's ecdsa signature r: <byte[]>, # r s: <byte[]> # s }, ttl: <int> # TTL for broadcasts } ・JSON風の構造 ・画像もバイナリのままコンパクトに扱える ・いろいろな言語向けのライブラリがある http://msgpack.org/
Distributed Hash Table (DHT) ・ID (ZXF3...)から接続先を検索できる ・自分のIDを周囲のマシンに知らせておく ・複数のマシンをリレーして検索 ・グループの参加者のリストも管理している 検索
検索 検索 通知 通知
利点 欠点 UDPによる メッセージ通信 ・巨大なデータを送ることができない ・パケットロスの可能性 ・DHTとメッセージを同じソケットで扱える ・UDPホールパンチングが利用可能 Micro Transport
Protocol (μTP) NATを超えるのが容易
Micro Transport Protocol (μTP) https://github.com/h2so5/utp http://www.bittorrent.org/beps/bep_0029.html ・bittorrentでよく利用されているプロトコル ・UDPを使ってTCPのようなストリームを作成する ・murcottとは独立したライブラリとして開発
グループチャット ・グループ自体もひとつIDを持つ ・グループごとに独立したDHTが作成される ・メッセージを受け取ると他の参加者に転送 全体のDHT グループごとのDHT
murcottの 問題点 ・μTPライブラリの実装が不完全なため、 非常に長いメッセージでは効率が悪い ・メッセージの偽造は難しいが、メッセー ジの妨害や紛失に対して弱い ・グループチャットで参加者にちゃんと メッセージが届いたか判断できない
None