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
Augmenting AI with the Power of Jakarta EE
ivargrimstad
0
290
FDEが実現するAI駆動経営の現在地
gonta
2
240
Terraform標準の組織で AWS CDKをどう使うか
mu7889yoon
1
420
今さら聞けない .NET CLI
htkym
0
150
광주소프트웨어마이스터고등학교 DevFest 특강 - 바이브 코딩 시대에서 주니어 개발자로 살아남는 방법
utilforever
1
160
数百円から始めるRuby電子工作
tarosay
0
110
Build-to-own AI: Agentic Development for Humans
inesmontani
PRO
0
110
生成AI導入の「期待外れ」を乗り越える ー 開発フロー改革が目指す、真の組織変革
starfish719
0
2.7k
php-fpmのプロセスが枯渇した日-調査・対処・そして本当にやるべきだったこと-
shibuchaaaan
0
170
信頼性について考えてみる(SRE NEXT 2026 miniLT)
hayama17
0
230
霧の中の代数的エフェクト
funnyycat
1
440
AIが無かった頃の素敵な出会いの話
codmoninc
1
280
Featured
See All Featured
Information Architects: The Missing Link in Design Systems
soysaucechin
0
1k
Product Roadmaps are Hard
iamctodd
55
12k
Un-Boring Meetings
codingconduct
0
350
Balancing Empowerment & Direction
lara
6
1.2k
How GitHub (no longer) Works
holman
316
150k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
31
2.8k
A brief & incomplete history of UX Design for the World Wide Web: 1989–2019
jct
2
430
The Mindset for Success: Future Career Progression
greggifford
PRO
0
430
Prompt Engineering for Job Search
mfonobong
0
380
sira's awesome portfolio website redesign presentation
elsirapls
0
310
Dominate Local Search Results - an insider guide to GBP, reviews, and Local SEO
greggifford
PRO
0
220
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
4.5k
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