Topology KO - k-p2p-lab/kpl-v3 GitHub Wiki

Transport, Kademlia, GossipSub ํ† ํด๋กœ์ง€ ํ™•์ธ

Wiki home โ€บ ํ•œ๊ตญ์–ด ๋ฌธ์„œ ยท ์˜์–ด ์›๋ฌธ

๋ฌธ์„œ ์•ˆ๋‚ด ยท ์†Œ์Šค ์ €์žฅ์†Œ

ํ™”๋ฉด ์‚ฌ์šฉ๋ฒ•

Overview๋Š” Network Overview ํƒญ์ด ์„ ํƒ๋œ ๊ฒฝ์šฐ์—๋„ ํŽ˜์ด์ง€๋ฅผ ์—ด ๋•Œ๋งˆ๋‹ค Off๋กœ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. On์œผ๋กœ ๋ฐ”๊พธ๋ฉด ํ˜„์žฌ Peer์™€ ๊ด€๊ณ„ ๋ฐ์ดํ„ฐ๋ฅผ ๋ถˆ๋Ÿฌ์™€ ๊ทธ๋ž˜ํ”„๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค. Off ๋™์•ˆ Controller๋Š” ๋Œ€์‹œ๋ณด๋“œ ๊ฐ„์„  ๊ณ„์‚ฐ๊ณผ ์ƒ์„ธ ๊ทธ๋ž˜ํ”„ ์ „์†ก์„ ์ƒ๋žตํ•˜๊ณ , ๋ธŒ๋ผ์šฐ์ €๋Š” ๊ทธ๋ž˜ํ”„ ๋ฐฐ์น˜์™€ SVG ๋ Œ๋”๋ง์„ ์ƒ๋žตํ•ฉ๋‹ˆ๋‹ค. ํ”ผ์–ด ์ˆ˜์™€ ์‹คํ—˜ ์ง€ํ‘œ๋Š” ๊ณ„์† ๊ฐฑ์‹ ํ•˜๋ฉฐ, Transport links๋Š” ๊ทธ๋ž˜ํ”„๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ ์ „๊นŒ์ง€ N/A ยท Overview off๋กœ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์ด ์Šค์œ„์น˜๋Š” ์‹œ๊ฐํ™”๋งŒ ์ œ์–ดํ•˜๋ฉฐ ์‹คํ—˜ ์‹คํ–‰์ด๋‚˜ ์ €์žฅ ๊ด€์ธก์น˜๋ฅผ ๋ฐ”๊พธ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

Overview๋ฅผ Off๋กœ ๋ฐ”๊พธ๋ฉด ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ๋ฉˆ์ถ”๊ณ  ๊ทธ๋ž˜ํ”„ ๋ฐ์ดํ„ฐยท๋ฐฐ์น˜ยท์„ ํƒ์„ ํ•ด์ œํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์‹œ On์œผ๋กœ ๋ฐ”๊พธ๋ฉด ์ตœ์‹  ์ „์ฒด ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค. ํƒญ ์ „ํ™˜์€ Overview๋ฅผ ์ผœ๊ฑฐ๋‚˜ ์ตœ์ดˆ ์š”์ฒญ์„ ๋ฐ˜๋ณตํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‹ค์‹œ ์ผœ๋„ ๋ ˆ์ด์–ด ํ•„ํ„ฐ์™€ motion ์„ค์ •์€ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.

Ready Peers ์นด๋“œ๋Š” ๋งˆ์ง€๋ง‰ ๋ณด๊ณ  ์ƒํƒœ๊ฐ€ ready์ธ ๋…ธ๋“œ๋ฅผ ์…‰๋‹ˆ๋‹ค. ํ† ํด๋กœ์ง€๋Š” starting ๋…ธ๋“œ๋„ ํ‘œ์‹œํ•˜๋ฏ€๋กœ join/churn ์ค‘์—๋Š” ์ „์ฒด ์ˆ˜๊ฐ€ ๋” ํด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ—ค๋”์—์„œ ์ „์ฒดยทreadyยทstarting ์ˆ˜๋ฅผ ๊ตฌ๋ถ„ํ•˜๋ฉฐ, ์ค‘์•™์˜ TOTAL๊ณผ Agent ๊ตฌ์—ญ๋ณ„ ์ˆ˜๋Š” ํ™”๋ฉด์— ํ‘œ์‹œ๋˜๋Š” ์ „์ฒด Peer ์ˆ˜์ž…๋‹ˆ๋‹ค. ๋ฉ”ํŠธ๋ฆญ ์นด๋“œ๋„ Ready ์ˆ˜ ์•„๋ž˜์— Topology(์ „์ฒด)์™€ Starting์„ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. stoppingยทstoppedยทfailed๋Š” ์ œ์™ธํ•˜๊ณ , ์•Œ ์ˆ˜ ์—†๋Š” ํ‘œ์‹œ ์ƒํƒœ๊ฐ€ ์žˆ์œผ๋ฉด Other๋กœ ๋”ฐ๋กœ ์ง‘๊ณ„ํ•ฉ๋‹ˆ๋‹ค. ๋‘ ํ™”๋ฉด์€ ๋‹ค๋ฅธ run์—์„œ ๋‚จ์•„ ์žˆ๋Š” Peer๊นŒ์ง€ ํฌํ•จํ•œ ๋™์ผํ•œ ํด๋Ÿฌ์Šคํ„ฐ snapshot์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์„ ํƒํ•œ run, ๊ด€๊ณ„ ๋ ˆ์ด์–ด, topic ํ•„ํ„ฐ๋Š” ์ด ํ”ผ์–ด ์ˆ˜๋ฅผ ๋ฐ”๊พธ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด ๊ฐ’์€ ๋ณด๊ณ ๋œ ์ˆ˜๋ช… ์ƒํƒœ์ด๋ฉฐ ์‹ค์‹œ๊ฐ„ ํ†ต์‹  ๊ฐ€๋Šฅ์„ฑ์„ ๋ณ„๋„๋กœ ๊ฒ€์‚ฌํ•œ ๊ฒฐ๊ณผ๋Š” ์•„๋‹™๋‹ˆ๋‹ค.

๋Œ€์‹œ๋ณด๋“œ๋Š” ์ „์ฒด ํญ์˜ ๋Œ€ํ™”ํ˜• ํ† ํด๋กœ์ง€๋ฅผ ๊ฐ™์€ ํฌ๊ธฐ์˜ Agent๋ณ„ ๋ถ€์ฑ„๊ผด ์˜์—ญ์œผ๋กœ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. Agent ๋ฒˆํ˜ธ๋Š” **Agent status โ†’ No.**์™€ ์—ฐ๊ฒฐ๋ฉ๋‹ˆ๋‹ค. ๊ฐ Peer์—๋Š” Agent ๋‚ด๋ถ€ ํ‘œ์‹œ ๋ฒˆํ˜ธ๊ฐ€ ๋ถ™์œผ๋ฉฐ ์„ ํƒํ•˜๋ฉด ์ „์ฒด Node ID์™€ Peer ID๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฒˆํ˜ธ๋Š” ํ™”๋ฉด์—์„œ Peer๋ฅผ ๊ตฌ๋ถ„ํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์œผ๋กœ ์œ„์น˜๋ฅผ ๊ณ ์ •ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Peer ์ดํƒˆ ํ›„ ํ‘œ์‹œ ๋ฒˆํ˜ธ๋Š” ์žฌ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์˜๊ตฌ ์‹๋ณ„์—๋Š” ์ „์ฒด ID๋ฅผ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค.

Peer๋Š” ์†Œ์† Agent์˜ ๋ถ€์ฑ„๊ผด ์•ˆ์—์„œ ์„œ์„œํžˆ ์ž๋ฆฌ๋ฅผ ์žก์Šต๋‹ˆ๋‹ค. ํ‘œ์‹œ๋œ ์—ฐ๊ฒฐ์—๋Š” ์Šคํ”„๋ง๊ณผ ๊ฐ™์€ ์ธ๋ ฅ์ด ์ž‘์šฉํ•˜๊ณ , ๋ฐ˜๋ฐœ๋ ฅ๊ณผ ์ถฉ๋Œ ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ€๊นŒ์šด Peer๋“ค์„ ๋ถ„์‚ฐ์‹œํ‚ต๋‹ˆ๋‹ค. ์ด๋™ ์ค‘์—๋„ ์†Œ์† ์˜์—ญ ๋ฐ–์œผ๋กœ ๋‚˜๊ฐ€์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Peer๋‚˜ ํ‘œ์‹œ ๊ด€๊ณ„๊ฐ€ ๋ฐ”๋€Œ๋ฉด ๋ฐฐ์น˜ ์กฐ์ •์„ ๋‹ค์‹œ ์‹œ์ž‘ํ•˜๊ณ , ์•ˆ์ •๋˜๋ฉด ๋ฉˆ์ถ”๋ฏ€๋กœ ๋ฌด์ž‘์œ„๋กœ ๊ณ„์† ์›€์ง์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด ๋ฐฐ์น˜๋Š” ํ™”๋ฉด ํ‘œ์‹œ๋ฅผ ์œ„ํ•œ ๊ฒƒ์œผ๋กœ ํ”„๋กœํ† ์ฝœ ๋™์ž‘์ด๋‚˜ ์‹คํ—˜ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ”๊พธ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์„ธ ๋ ˆ์ด์–ด๋Š” ๋ชจ๋‘ ๋ˆ ์ƒํƒœ๋กœ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜ํ”„ ์œ„ ์ฒดํฌ๋ฐ•์Šค๋Š” ๋‹ค์Œ ์ˆœ์„œ์ด๋ฉฐ ๊ฐ๊ฐ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ ˆ์ด์–ด ๊ธฐ๋ณธ๊ฐ’ ์„  ์˜๋ฏธ
Transport ๋” ๊ฐ€๋Š” ํšŒ์ƒ‰ ์„  Peer๊ฐ€ ๋ณด๊ณ ํ•œ ํ™œ์„ฑ libp2p transport ์—ฐ๊ฒฐ
Kademlia ๋” ๊ฐ€๋Š” ์ฒญ๋ก ์ ์„  ํ˜„์žฌ DHT ๋ผ์šฐํŒ… ํ…Œ์ด๋ธ”์— ์ƒ๋Œ€ Peer๊ฐ€ ํฌํ•จ๋œ ๊ด€๊ณ„
GossipSub mesh ๋” ๊ตต์€ ์ฃผํ™ฉ ์‹ค์„  ์„ ํƒํ•œ topic์—์„œ ์ˆ˜๋ฝ๋œ GRAFT mesh ๊ด€๊ณ„

์ฒดํฌ๋ฅผ ํ•ด์ œํ•˜๋ฉด ํ•ด๋‹น ์„ ์„ ์ˆจ๊ธฐ๊ณ  ๋‚จ์€ ํ‘œ์‹œ ๊ด€๊ณ„๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋ฐฐ์น˜์˜ ํž˜์„ ๋‹ค์‹œ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค. ํ”„๋กœํ† ์ฝœ์ด๋‚˜ ์‹คํ—˜ ์‹คํ–‰์„ ๋„์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. GossipSub topic ํ•„ํ„ฐ๋Š” mesh์—๋งŒ ์ ์šฉํ•˜๋ฉฐ ๋‹ค๋ฅธ ๋ ˆ์ด์–ด๋Š” ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ํ•„ํ„ฐ๋ฅผ ๋ฐ”๊พธ๋ฉด Peer๊ฐ€ ๊ฐ์ž์˜ ๋ถ€์ฑ„๊ผด ์•ˆ์—์„œ ์žฌ๋ฐฐ์น˜๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. All topics์—์„œ๋Š” ๊ฐ™์€ ์Œ์˜ ์—ฌ๋Ÿฌ topic ๊ด€๊ณ„๋ฅผ ํ•œ ์„ ์œผ๋กœ ํ•ฉ์น˜๋˜ ์„ธ๋ถ€ ์ •๋ณด์— topic๋ณ„ ๊ทผ๊ฑฐ๋ฅผ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ์ƒ๋‹จ Transport links๋Š” ์„ธ ๋ ˆ์ด์–ด์˜ ํ•ฉ์ด ์•„๋‹Œ ๊ณ ์œ  transport ์—ฐ๊ฒฐ ์Œ ์ˆ˜์ž…๋‹ˆ๋‹ค.

Peer์— ๋งˆ์šฐ์Šค๋ฅผ ์˜ฌ๋ฆฌ๋ฉด ํ˜„์žฌ ํ‘œ์‹œ ์ค‘์ธ ์ด์›ƒ ์—ฐ๊ฒฐ์„ ๊ฐ•์กฐํ•˜๊ณ  ๊ด€๋ จ ์—†๋Š” ์„ ์„ ํ๋ฆฌ๊ฒŒ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์„ ํƒํ•˜๋ฉด AgentยทPeer ํ‘œ์‹œ ๋ฒˆํ˜ธ, ์ „์ฒด ID, profile, ๋„คํŠธ์›Œํฌ ์„ค์ •, ๋ณด๊ณ ํ•œ endpoint ์ •๋ณด๋ฅผ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. Clear selection ๋˜๋Š” Escape๋กœ ์„ ํƒ์„ ํ•ด์ œํ•ฉ๋‹ˆ๋‹ค. + / โˆ’, Ctrl/Command + ์Šคํฌ๋กค๋กœ ํ™•๋Œ€ยท์ถ•์†Œํ•˜๊ณ , ๋ฐฐ๊ฒฝ์„ ๋“œ๋ž˜๊ทธํ•ด ์ด๋™ํ•˜๋ฉฐ, Fit์œผ๋กœ ์ „์ฒด ๋ฐฐ์น˜๋ฅผ ๋งž์ถฅ๋‹ˆ๋‹ค. ํ‚ค๋ณด๋“œ ์ดˆ์  ์ด๋™๊ณผ Enter/Space ์„ ํƒ๋„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

Pause motion์„ ๋ˆ„๋ฅด๋ฉด ๊ธฐ์กด Peer์˜ ์œ„์น˜๋ฅผ ์œ ์ง€ํ•˜๋ฉด์„œ ํ•„ํ„ฐ, ์„ ํƒ, ํ™•๋Œ€ยท์ถ•์†Œ์™€ ํ™”๋ฉด ์ด๋™์„ ๊ณ„์† ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ƒˆ Peer์™€ Agent ์˜์—ญ ๋ณ€๊ฒฝ์€ ์ฆ‰์‹œ ๋ฐ˜์˜ํ•ฉ๋‹ˆ๋‹ค. Resume motion์œผ๋กœ ๋ฐฐ์น˜ ์กฐ์ •์„ ์žฌ๊ฐœํ•ฉ๋‹ˆ๋‹ค.

Network Overview ํƒญ์— ํ† ํด๋กœ์ง€์™€ ์กฐ์ž‘ ๋„๊ตฌ๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. Overview๊ฐ€ On์ผ ๋•Œ ๋‹ค๋ฅธ ํƒญ์—์„œ๋Š” ๋ฐฐ์น˜ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ๋ฉˆ์ถ”๊ณ  ์‹ค์‹œ๊ฐ„ ๊ทธ๋ž˜ํ”„ ๋ฐ์ดํ„ฐ ๊ฐฑ์‹ ์€ ๊ณ„์†ํ•ฉ๋‹ˆ๋‹ค. ๋Œ์•„์˜ค๋ฉด ์ตœ์‹  ํ† ํด๋กœ์ง€๋ฅผ ํ‘œ์‹œํ•˜๋ฉฐ ๊ธฐ์กด ๋™์ž‘ ์„ค์ •์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. Overview๊ฐ€ Off์ด๋ฉด ํƒญ ์ „ํ™˜ ํ›„์—๋„ Off๋ฅผ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ํƒ์ƒ‰๊ณผ ํ‚ค๋ณด๋“œ ์กฐ์ž‘์€ ์ž‘์—… ํ™”๋ฉด ํƒญ์„ ์ฐธ๊ณ ํ•˜์‹ญ์‹œ์˜ค.

์šด์˜์ฒด์ œ๋‚˜ ๋ธŒ๋ผ์šฐ์ €์˜ ๋™์ž‘ ์ค„์ด๊ธฐ ์„ค์ •์„ ์‚ฌ์šฉํ•˜๋ฉด ๊ธฐ๋ณธ์ ์œผ๋กœ ์•ˆ์ •ํ™” ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ๋•๋‹ˆ๋‹ค. ์ตœ์ดˆ ๋ฐฐ์น˜์™€ ๊ด€๊ณ„ ๋ณ€๊ฒฝ์—๋Š” ์ œํ•œ๋œ ์ •์ฐฉ ๊ณ„์‚ฐ์„ ์ ์šฉํ•˜๊ณ  ์ค‘๊ฐ„ ์ด๋™ ๊ณผ์ • ์—†์ด ๊ฒฐ๊ณผ๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. Resume motion์„ ์ง์ ‘ ์„ ํƒํ•˜๋ฉด ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์ผค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Agent ์˜์—ญ์˜ ๊ฐ๋„๋Š” ๊ฐ™์œผ๋ฉฐ ์„ค์ •ํ•œ capacity๋งŒํผ ๋นˆ Peer ์œ„์น˜๋ฅผ ์˜ˆ์•ฝํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Peer๊ฐ€ ๋งŽ์€ ์‹คํ—˜์€ ์—ฌ์ „ํžˆ ์กฐ๋ฐ€ํ•˜๊ฒŒ ๋ณด์ผ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ topic ํ•„ํ„ฐ์™€ ๋ ˆ์ด์–ด ์ฒดํฌ๋ฐ•์Šค๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ๊ด€์‹ฌ AgentยทPeer๋ฅผ ํ™•๋Œ€ํ•ด ํ™•์ธํ•˜์‹ญ์‹œ์˜ค.

์„ ์˜ ์ •ํ™•ํ•œ ์˜๋ฏธ

transport ์—ฐ๊ฒฐ, DHT๊ฐ€ ์•„๋Š” Peer, ๋กœ์ปฌ์—์„œ ์•Œ๋ ค์ง„ PubSub topic Peer(TopicPeers / PubSub ListPeers), GRAFT mesh๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ๊ด€๊ณ„์ž…๋‹ˆ๋‹ค. Topic Peer ํ•ญ๋ชฉ๋งŒ์œผ๋กœ ์›๊ฒฉ application subscription์„ ์ž…์ฆํ•  ์ˆ˜๋Š” ์—†์œผ๋ฉฐ publish-only๋‚˜ relay ์ฐธ๊ฐ€์ž๋„ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ ๊ทธ๋ž˜ํ”„๋Š” ADD_PEER ์ด๋ฒคํŠธ๋กœ ๊ด€๊ณ„๋ฅผ ์žฌ๊ตฌ์„ฑํ•˜์ง€ ์•Š๊ณ  ๊ฐ ๋ ˆ์ด์–ด์— ํ•ด๋‹นํ•˜๋Š” Peer ์ƒํƒœ ํ•„๋“œ์—์„œ ๊ด€๊ณ„๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

  • Kademlia๋Š” dht.RoutingTable().ListPeers()์—์„œ ์–ป์Šต๋‹ˆ๋‹ค. ๋ผ์šฐํŒ… ํ…Œ์ด๋ธ” ํฌํ•จ๋งŒ์œผ๋กœ ํ˜„์žฌ transport ์—ฐ๊ฒฐ์ด๋‚˜ ํŒจํ‚ท ์ „์†ก์„ ์ž…์ฆํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.
  • GossipSub๋Š” ํ‰์ƒ์‹œ Peer ๋‚ด๋ถ€์˜ ๋™๊ธฐ router callback์œผ๋กœ ์ถ”์ ํ•ฉ๋‹ˆ๋‹ค. ์ˆ˜๋ฝ๋œ Graft๋Š” ์ถ”๊ฐ€ํ•˜๊ณ  Prune, topic Leave, RemovePeer๋Š” ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค. Mesh freeze ์ดํ›„์—๋Š” PubSub ์ด๋ฒคํŠธ ๋ฃจํ”„์—์„œ ๊ณ ์ • ๊ตฌ์„ฑ์› ์ค‘ ํ™œ์„ฑ ๋ถ€๋ถ„๋งŒ ์ƒํƒœ์— ๋ณด๊ณ ํ•ฉ๋‹ˆ๋‹ค. ๋กœ์ปฌ topic์— ์ฐธ์—ฌํ•˜๊ณ  ์ƒ๋Œ€ PubSub stream์ด ๋ฉ”์‹œ ๋ผ์šฐํŒ…์„ ์ง€์›ํ•˜๋ฉฐ ์ƒ๋Œ€๊ฐ€ ๊ทธ topic์„ ๊ด‘๊ณ ํ•˜๋Š” ๊ตฌ์„ฑ์›์ž…๋‹ˆ๋‹ค. ์—ฐ๊ฒฐ์ด ๋Š๊ธด ๊ตฌ์„ฑ์› ID๋Š” ๋‚ด๋ถ€์— ๊ณ ์ •๋˜์–ด ๋‚จ์ง€๋งŒ ํ‘œ์‹œ ์„ ์€ ์‚ฌ๋ผ์ง‘๋‹ˆ๋‹ค. ๊ฐ™์€ ๊ตฌ์„ฑ์›์ด ๋‹ค์‹œ ์—ฐ๊ฒฐ๋˜๋ฉด ์ƒˆ GRAFT ์—†์ด ์„ ์ด ๋‹ค์‹œ ๋‚˜ํƒ€๋‚  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๊ฐ€์ƒ์˜ GRAFT/PRUNE ์ด๋ฒคํŠธ๋Š” ๋งŒ๋“ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‘ ๊ด€์ธก ๋ฐฉ์‹ ๋ชจ๋‘ telemetry ์ „๋‹ฌ ์ˆœ์„œ์™€ ์ตœ๊ทผ 300๊ฐœ ํ‘œ์‹œ ํ•œ๋„์—์„œ ๋…๋ฆฝ์ ์ž…๋‹ˆ๋‹ค. floodsub, randomsub, PubSub ๋น„ํ™œ์„ฑ์—๋Š” GossipSub mesh๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. GRAFT mesh ๋ฐ–์˜ direct/fanout ์ „๋‹ฌ ๊ฒฝ๋กœ๋Š” ํฌํ•จํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • Transport๋Š” ํ˜„์žฌ host ์—ฐ๊ฒฐ ๋ชฉ๋ก์ž…๋‹ˆ๋‹ค. ADD_PEER ์ด๋ฒคํŠธ๋‚˜ ๊ธฐ์กด ์—ฐ๊ฒฐ๋งŒ์œผ๋กœ KademliaยทGossipSub ์„ ์„ ๋งŒ๋“ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์„ ์€ ํ•œ์ชฝ ๋˜๋Š” ์–‘์ชฝ endpoint์˜ ๋ณด๊ณ ๋ฅผ ๋ฌด๋ฐฉํ–ฅ์œผ๋กœ ํ‘œ์‹œํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. reportedBy๊ฐ€ ์‹ค์ œ ๋ณด๊ณ ์ž๋ฅผ ๋‚˜ํƒ€๋‚ด๋ฉฐ, Kademlia ํ…Œ์ด๋ธ”๊ณผ ๊ฐฑ์‹  ์ค‘ mesh๋Š” ๋น„๋Œ€์นญ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•œ์ชฝ์—์„œ PRUNE๊ฐ€ ๊ด€์ธก๋ผ๋„ ์ƒ๋Œ€์˜ ๋‹ค์Œ ๋ณด๊ณ ๊ฐ€ ์˜ค๊ธฐ๊นŒ์ง€ ๋ฐ˜๋Œ€์ชฝ ๊ด€๊ณ„๊ฐ€ ์ž ์‹œ ๋‚จ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. DHTยทtransportยทmesh๋ฅผ ํด๋Ÿฌ์Šคํ„ฐ ์ „์ฒด์˜ ๋‹จ์ผ ์›์ž์  ์‹œ์ ์— ์ฝ๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.

์‹œ๋‚˜๋ฆฌ์˜ค v3๋Š” ์„ ํƒํ•œ Peer ๋„๋ฉ”์ธ์— ๋ชจ๋ธ ๊ธฐ๋ฐ˜ ๋ฉ”์‹œ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๋™๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ƒ์„ฑํ•œ ์ด์›ƒ ๋ชฉ๋ก์€ ์‹คํ—˜ ๋กœ๊ทธ์— ์ €์žฅํ•˜๋Š” ์˜ˆ์ • ๊ทธ๋ž˜ํ”„์ž…๋‹ˆ๋‹ค. ์ด ํ™”๋ฉด์€ ๊ณ„์† ๋Ÿฐํƒ€์ž„์˜ ํ™œ์„ฑ ๋ฉ”์‹œ ๋ฉค๋ฒ„์‹ญ์„ ํ‘œ์‹œํ•˜๋ฏ€๋กœ ์—ฐ๊ฒฐ ์‹คํŒจ๋‚˜ Peer ์ดํƒˆ ์‹œ ๊ณ„ํš๊ณผ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. RGGยทWaxmanยทGridยท์‚ผ๊ฐ ๊ฒฉ์ž์˜ ์ขŒํ‘œ๋Š” Agent ๊ตฌ์—ญ ๊ธฐ๋ฐ˜ ํ™”๋ฉด ๋ฐฐ์น˜๋‚˜ ๋งํฌ ์ง€์—ฐ์„ ์„ค์ •ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

Bootstrap๊ณผ topic discovery

Bootstrap transport ์—ฐ๊ฒฐ๊ณผ GossipSub topic discovery๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ์ ˆ์ฐจ์ž…๋‹ˆ๋‹ค. ๊ฐ Peer๋Š” ๋จผ์ € /api/v1/bootstrap์œผ๋กœ ๋™์ผ run์˜ ready boot Peer๋ฅผ ์กฐํšŒํ•ฉ๋‹ˆ๋‹ค. Worker๋Š” DHT๋ฅผ ๋น„ํ™œ์„ฑํ™”ํ–ˆ๋”๋ผ๋„ seed ๊ธฐ๋ฐ˜์œผ๋กœ ์„ž์€ ์ˆœ์„œ์—์„œ ์ฒซ ์—ฐ๊ฒฐ ์„ฑ๊ณต๊นŒ์ง€ ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค. Boot ๋…ธ๋“œ๋Š” ์ œ๊ณต๋œ Peer์— ์—ฐ๊ฒฐ์„ ์‹œ๋„ํ•˜๋ฉฐ ๋น„์–ด ์žˆ๋Š” ๋„คํŠธ์›Œํฌ๋กœ ์‹œ์ž‘ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. Kademlia bootstrap์€ DHT๊ฐ€ ํ™œ์„ฑํ™”๋œ ๊ฒฝ์šฐ์—๋งŒ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋‚ด์žฅ boot type์€ PubSub๋ฅผ ์‹คํ–‰ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์ด ์—ฐ๊ฒฐ๋งŒ์œผ๋กœ GossipSub mesh๊ฐ€ ์ƒ๊ธฐ์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.

PubSub๊ฐ€ ์‹œ์ž‘๋˜๋ฉด Peer๋Š” ์„ค์ •ํ•œ ์ •ํ™•ํ•œ topic๋งˆ๋‹ค Controller์˜ /api/v1/discovery registry๋ฅผ ์ฆ‰์‹œ ์กฐํšŒํ•˜๊ณ  ์ดํ›„ 3์ดˆ polling loop๋กœ ๋‹ค์‹œ ์กฐํšŒํ•ฉ๋‹ˆ๋‹ค. Registry๋Š” ๋™์ผ runยทtopic์—์„œ ready ์ƒํƒœ์ด๊ณ  PubSub๊ฐ€ ํ™œ์„ฑํ™”๋˜์–ด ์žˆ์œผ๋ฉฐ Agent๊ฐ€ online์ธ ๋ชจ๋“  Peer๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. Peer๊ฐ€ rendezvous hash๋กœ ์ˆœ์„œ๋ฅผ ์ •ํ•˜๊ณ  publish-onlyยทrelay ํ›„๋ณด๋ณด๋‹ค ์‹ค์ œ subscriber๋ฅผ ์šฐ์„ ํ•ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ PubSub ListPeers(topic) ์ˆ˜๋ฅผ DHigh์—์„œ ๋นผ๊ณ , ์ „์ฒด hard connection cap์˜ ์—ฌ์œ  ๋ฒ”์œ„ ์•ˆ์—์„œ ๋ถ€์กฑํ•œ ์—ฐ๊ฒฐ์„ ์ฑ„์›๋‹ˆ๋‹ค. Dial์ด ์‹คํŒจํ•˜๋ฉด ๋‹ค์Œ ์ˆœ์œ„ ํ›„๋ณด๋ฅผ ์‹œ๋„ํ•˜๊ณ  ์‹คํŒจํ•œ Peer ID์—๋Š” 15์ดˆ retry backoff๋ฅผ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค. Registry ์š”์ฒญ๊ณผ ๊ฐ dial round์˜ ์ œํ•œ ์‹œ๊ฐ„์€ 5์ดˆ์ด๋ฏ€๋กœ ๋А๋ฆฐ round๋Š” ๋‹ค์Œ polling์„ ๋Šฆ์ถœ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฐฉ์‹์€ churn ์ค‘ ํ›„๋ณด ์—ฐ๊ฒฐ์„ ๋ณด๊ฐ•ํ•˜๋ฉฐ ์˜๋„์ ์œผ๋กœ all-to-all graph๋ฅผ ๋งŒ๋“ค์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. ์ˆ˜์‹  ์—ฐ๊ฒฐ์ด๋‚˜ ๋‹ค๋ฅธ ํ”„๋กœํ† ์ฝœ ์—ฐ๊ฒฐ๋กœ topic๋ณ„ discovery ๋ชฉํ‘œ๋ณด๋‹ค ๋งŽ์€ ์—ฐ๊ฒฐ์ด ์ƒ๊ธธ ์ˆ˜๋Š” ์žˆ์Šต๋‹ˆ๋‹ค.

Registry๋Š” ์ฃผ์†Œ์™€ ์„ค์ •๋œ topic ์ฐธ์—ฌ ์ •๋ณด๋งŒ ์ œ๊ณตํ•˜๋ฉฐ ์ „๋‹ฌ ๊ฒฐ๊ณผ๋ฅผ ์กฐํšŒํ•˜๊ฑฐ๋‚˜ ์„ ํƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฐœ๊ฒฌํ•œ ์—ฐ๊ฒฐ์€ libp2p ์—ฐ๊ฒฐ์ด ์™„๋ฃŒ๋œ ๋’ค ํšŒ์ƒ‰ transport ๋ ˆ์ด์–ด์— ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค. GossipSub๋Š” ํ•ด๋‹น Peer์˜ ๋ฉ”์‹œ๋ฅผ ๋™๊ฒฐํ•˜๊ธฐ ์ „๊นŒ์ง€ ์ˆ˜๋ฝ๋œ GRAFT๋กœ mesh์— ๋“ค์–ด๊ฐˆ topic Peer๋ฅผ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค. ๋™๊ฒฐ๋œ ๊ตฌ์„ฑ์›์€ ์œ„์˜ ์„ค๋ช…์ฒ˜๋Ÿผ ์žฌ์—ฐ๊ฒฐ ์‹œ ํ™œ์„ฑ ์„ ์„ ๋ณต์›ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ƒˆ transport ํ›„๋ณด๋Š” ๋™๊ฒฐ๋œ mesh์— ๋“ค์–ด๊ฐ€์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. DHT routing-table entry๋Š” ๋ณ„๋„์˜ ์ฒญ๋ก ์„ ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ DHigh๋Š” discovery ๋ชฉํ‘œ์ด๋ฉฐ ํ™”๋ฉด์— ์ •ํ™•ํžˆ ๊ทธ ์ˆ˜์˜ transport ๋˜๋Š” mesh ์ด์›ƒ์ด ํ‘œ์‹œ๋œ๋‹ค๋Š” ๋ณด์žฅ์€ ์•„๋‹™๋‹ˆ๋‹ค.

๊ฐฑ์‹ ๊ณผ ๋…ธ๋“œ ์ˆ˜๋ช…

Peer๋Š” ์•ฝ 2์ดˆ๋งˆ๋‹ค ์ƒํƒœ๋ฅผ ๋ณด๊ณ ํ•˜๊ณ  Agent๊ฐ€ ํ˜„์žฌ snapshot์„ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ๋„คํŠธ์›Œํฌยท์Šค์ผ€์ค„๋งยท๋ณด๊ณ  ์‹คํŒจ๋กœ ์ง€์—ฐ์ด ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค. stoppingยทstoppedยทstartingยทfailed endpoint์—๋Š” ๊ด€๊ณ„ ์„ ์„ ํ‘œ์‹œํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. stoppingยทstoppedยทfailed ์›๊ณผ ์—ฐ๊ฒฐ์„ ์€ ์ˆจ๊น๋‹ˆ๋‹ค. starting Peer๋Š” ํ™ฉ์ƒ‰ Starting์œผ๋กœ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์‹คํŒจ ํ”ผ์–ด์˜ ์ง„๋‹จ ์ •๋ณด๋Š” ๋…ธ๋“œ ์กฐํšŒ์™€ ์ €์žฅ ์‹คํ—˜ ๊ธฐ๋ก์— ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.

์ปจํ…Œ์ด๋„ˆ ์ •๋ฆฌ๊ฐ€ ์ •์ƒ ์™„๋ฃŒ๋˜๋ฉด Agent๋Š” Peer ์‹๋ณ„์ž, ์ข…๋ฃŒ ์ƒํƒœ, ์ˆ˜๋ช… ์‹œ๊ฐ, ํ† ํ”ฝ ๋ ˆ์ด๋ธ”์„ ์ถ•์•ฝ ๊ธฐ๋ก์œผ๋กœ ๋ณด์กดํ•˜๊ณ  ๊ณผ๊ฑฐ ์—ฐ๊ฒฐยทrouting/meshยท์Šค์ฝ”์–ด์™€ ํฐ ์„ค์ • ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋Š” ๋ฉ”๋ชจ๋ฆฌ์—์„œ ํ•ด์ œํ•ฉ๋‹ˆ๋‹ค. Agent ์ „์ฒด ์ƒํƒœ์™€ ๋…ธ๋“œ ์กฐํšŒ์—๋Š” ์ด ์ถ•์•ฝ ์ข…๋ฃŒ ๊ธฐ๋ก์ด ๊ณ„์† ํฌํ•จ๋˜๋ฉฐ, ์‹คํ–‰ ์ค‘์ธ Peer์™€ ์‹คํŒจํ•œ ํ”„๋กœ์„ธ์Šค๋Š” ์ƒ์„ธ ์ •๋ณด๋ฅผ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.

์ •๊ธฐ heartbeat๋Š” ์‹คํ–‰ ์ค‘์ด๊ฑฐ๋‚˜ ์‹คํŒจํ•œ Peer์™€ Controller๊ฐ€ ์•„์ง ์ˆ˜์‹  ํ™•์ธํ•˜์ง€ ์•Š์€ ์ •์ƒ ์ข…๋ฃŒ ๊ธฐ๋ก์„ ์ „์†กํ•˜๋ฉฐ, ํฐ ๋ณด๊ณ ๋Š” ์ œํ•œ๋œ ํฌ๊ธฐ์˜ JSON batch๋กœ ๋‚˜๋ˆ•๋‹ˆ๋‹ค. ์ •์ƒ ์ข…๋ฃŒ ๊ธฐ๋ก์€ ์ˆ˜์‹  ํ™•์ธ ๋’ค ์ •๊ธฐ ๋ณด๊ณ ์—์„œ ์ƒ๋žตํ•˜์ง€๋งŒ ์ „์ฒด ์ธ๋ฒคํ† ๋ฆฌ์—๋Š” ๋‚จ์Šต๋‹ˆ๋‹ค. ์žฌ๋“ฑ๋ก์€ ์ด ์ˆ˜์‹  ํ™•์ธ์„ ์ดˆ๊ธฐํ™”ํ•˜๋ฏ€๋กœ Controller ์žฌ์‹œ์ž‘ ํ›„ ๋ณด์กด ์ด๋ ฅ์„ ๋‹ค์‹œ ์ „์†กํ•ฉ๋‹ˆ๋‹ค. Controller๋Š” ๋ถ€๋ถ„ heartbeat์—์„œ ๋น ์ง„ ๋…ธ๋“œ๋ฅผ ์ข…๋ฃŒ๋กœ ํ•ด์„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Heartbeat ๊ณ„์•ฝ์„ ์ฐธ๊ณ ํ•˜์‹ญ์‹œ์˜ค.

Dashboard๊ฐ€ ์—ฐ๊ฒฐ๋˜์ง€ ์•Š์•„๋„ Controller snapshot์— ์ข…๋ฃŒ ์ƒํƒœ๊ฐ€ ๋ฐ˜์˜๋ฉ๋‹ˆ๋‹ค. ๋Šฆ์€ heartbeat๋‚˜ ์ƒ์„ฑ ์‘๋‹ต์€ stopped ๋˜๋Š” failed Peer๋ฅผ ๋‹ค์‹œ ํ™œ์„ฑ ์ƒํƒœ๋กœ ๋˜๋Œ๋ฆฌ์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. failed Peer์˜ ์ •๋ฆฌ ์ง„ํ–‰๊ณผ stopped ์ „ํ™˜์€ ๊ณ„์† ๋ฐ˜์˜ํ•˜๋ฉฐ, Dashboard๋ฅผ ๋‹ค์‹œ ์—ด๋ฉด ํ˜„์žฌ snapshot์œผ๋กœ ๊ทธ๋ž˜ํ”„๋ฅผ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.

์˜คํ”„๋ผ์ธ Agent์™€ 10์ดˆ ์ด์ƒ ์˜ค๋ž˜๋œ Peer ๋ณด๊ณ ๋Š” ์„ ์—์„œ ์ œ์™ธํ•ฉ๋‹ˆ๋‹ค. ์„œ๋กœ ๋‹ค๋ฅธ ์„œ๋ฒ„ ์‹œ๊ณ„๋ฅผ ์ง์ ‘ ๋นผ์ง€ ์•Š๋„๋ก, Controller๋Š” ๋™์ผ Agent๊ฐ€ ๊ธฐ๋กํ•œ ๋‘ ์‹œ๊ฐ์œผ๋กœ Peer ๋ณด๊ณ  ๋‚˜์ด๋ฅผ ๊ณ„์‚ฐํ•œ ๋’ค ์ˆ˜์‹  ํ›„ ๊ฒฝ๊ณผ ์‹œ๊ฐ„์„ ์ž๊ธฐ ์‹œ๊ณ„๋กœ ๋”ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” Agent๊ฐ€ ๋ณด๊ณ ํ•œ ๋‚˜์ด์™€ ์ˆ˜์‹  ํ›„ ์‹œ๊ฐ„์ด๋ฉฐ ๋„คํŠธ์›Œํฌ ์ „์†ก ์ค‘ ์‹œ๊ฐ„์˜ ์ƒํ•œ์„ ๋œปํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ณผ๊ฑฐ ํ˜•์‹์— ์‹œ๊ฐ ์ •๋ณด๊ฐ€ ์—†์œผ๋ฉด ์ด ๋‚˜์ด๋ฅผ ํ™•์ •ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. OverlayObservedAt์€ overlay ๋ณด๊ณ  ์ง€์› ์—ฌ๋ถ€๋ฅผ ์‹๋ณ„ํ•˜๋Š” Peer ์‹œ๊ฐ์œผ๋กœ, ๋ธŒ๋ผ์šฐ์ €ยทController ํ˜„์žฌ ์‹œ๊ฐ๊ณผ ์ง์ ‘ ๋น„๊ตํ•ด stale์„ ํŒ์ •ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ƒˆ ๋นˆ snapshot์€ ์ด์ „ routingยทmesh ๊ด€๊ณ„๋ฅผ ์ง€์›๋‹ˆ๋‹ค. Agent๋Š” ์ˆœ์„œ๊ฐ€ ๋’ค์ง‘ํžŒ ์˜ค๋ž˜๋œ ๋ณด๊ณ ๋ฅผ ๊ฑฐ๋ถ€ํ•˜๊ณ  slice/map์„ ๋ณต์‚ฌํ•ด ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด๋ฒคํŠธ ์ผ๋ถ€๊ฐ€ ์œ ์‹ค๋ผ๋„ ์ƒˆ ์ƒํƒœ ๋ณด๊ณ ๋กœ ๊ทธ๋ž˜ํ”„๋ฅผ ๋ณต๊ตฌํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ทœ์น™์ด ๋ชจ๋“  ํ‘œ์‹œ ๊ด€๊ณ„์˜ ํ˜„์žฌ ํ†ต์‹  ๊ฐ€๋Šฅ์„ฑ์ด๋‚˜ ์ „์†ก ์ค‘ ์—ฌ๋ถ€๋ฅผ ๋ณด์ฆํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.

overlay ๋ณด๊ณ ๊ฐ€ ์—†๋Š” ์ด์ „ Peer๋Š” Transport ์„ ๋งŒ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ํ™”๋ฉด์—์„œ overlay ์ •๋ณด๋ฅผ ๋ณด๊ณ ํ•œ Peer ์ˆ˜๋ฅผ ์•ˆ๋‚ดํ•˜๋ฉฐ, ๊ณผ๊ฑฐ transport ์„ ์„ Kademlia๋กœ ๋ฐ”๊พธ์–ด ํ‘œ์‹œํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ฐฑ์‹ ํ•œ ์ด๋ฏธ์ง€๋ฅผ ControllerยทAgent์— ๋ฐฐํฌํ•˜๊ณ  ์ƒˆ Peer๋ฅผ ์‹คํ–‰ํ•ด์•ผ ๋ชจ๋“  ๋ ˆ์ด์–ด๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

API์™€ ๋ณด์กด ๋ฐ์ดํ„ฐ

GET /api/v1/snapshot, GET /api/v1/network, ๊ทธ๋ž˜ํ”„๋ฅผ ํฌํ•จํ•˜๋Š” SSE snapshot์€ ๋™์ผํ•œ typed edge๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋Œ€์‹œ๋ณด๋“œ์˜ Off ์ŠคํŠธ๋ฆผ์€ ์ƒ์„ธ ๋…ธ๋“œยท๊ฐ„์„  ๋Œ€์‹  ํ”ผ์–ด ์ˆ˜๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์„ ํƒ ๊ฐ’๊ณผ ๋ณ€๊ฒฝ๋ถ„ ๊ณ„์•ฝ์€ Dashboard SSE๋ฅผ ์ฐธ๊ณ ํ•˜์‹ญ์‹œ์˜ค. Node์˜ ๊ด€๋ จ ํ•„๋“œ๋Š” routingPeers(Peer ID ๋ชฉ๋ก), meshPeers(topic โ†’ Peer ID ๋ชฉ๋ก), overlayObservedAt์ž…๋‹ˆ๋‹ค. /api/v1/discovery๋Š” ํ˜„์žฌ transport ํ›„๋ณด registry์ด๋ฉฐ ํ† ํด๋กœ์ง€ ์ด๋ ฅ endpoint๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์˜ˆ์‹œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

{"source":"node-a","target":"node-b","protocol":"gossipsub","topic":"kpl/demo","reportedBy":["node-a"]}

protocol์€ transport, kademlia, gossipsub ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. API๋Š” GossipSub edge๋ฅผ topic๋ณ„๋กœ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ์ค‘๋ณต ๋ณด๊ณ ๋Š” ์ผ๊ด€๋œ ์ˆœ์„œ๋กœ ํ•ฉ์น˜๊ณ  ์•Œ ์ˆ˜ ์—†๋Š” endpoint, ๊ฐ™์€ run ์•ˆ์˜ ๋ชจํ˜ธํ•œ ์ค‘๋ณต Peer ID, ๋‹ค๋ฅธ run ๊ด€๊ณ„๋Š” ์ œ์™ธํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜ํ”„/API edge endpoint๋Š” Node ID์ด๊ณ  Node ๋‚ด๋ถ€ ์ด์›ƒ ๋ชฉ๋ก์€ libp2p Peer ID์ž…๋‹ˆ๋‹ค.

Controller๋Š” ์‹คํ–‰ ์ค‘ ์•ฝ 5์ดˆ๋งˆ๋‹ค observations.jsonl์— ๊ทธ๋ฃน ์ƒํƒœยท์ฐจ์ˆ˜ยทclusteringยท์ ์ˆ˜ ์š”์•ฝ๊ณผ ํ”„๋กœํ† ์ฝœ๋ณ„ ๊ทธ๋ž˜ํ”„ ํ‘œ๋ณธ์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. graphs์˜ ๊ฐ ํ•ญ๋ชฉ์€ protocol, ์ •๋ ฌ๋œ Node ID ๋ฐฐ์—ด nodes, ๊ฐ™์€ ์ธ๋ฑ์Šค์˜ groups, ๋…ธ๋“œ ์ธ๋ฑ์Šค ์Œ edges์ž…๋‹ˆ๋‹ค. ๊ณ ์œ  ๋ฌด๋ฐฉํ–ฅ ๊ฐ„์„ ์„ ์ €์žฅํ•˜๋ฉฐ GossipSub๋Š” ์—ฌ๋Ÿฌ ํ† ํ”ฝ์˜ ๊ฐ™์€ Peer ์Œ์„ ํ•ฉ์นฉ๋‹ˆ๋‹ค. ์‹ค์‹œ๊ฐ„ ๊ฐ„์„ ์˜ topic๊ณผ reportedBy๋Š” ์ด ์ €์žฅ ํ˜•์‹์— ํฌํ•จ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ‘œ๋ณธ ์‚ฌ์ด ๋ณ€ํ™” ์ „๋ถ€๋‚˜ ํ‰๊ฐ€์ž๋ณ„ ๊ฐœ๋ณ„ ์ ์ˆ˜๋Š” ๋ณด์กดํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

events.jsonl์—๋Š” ์ˆ˜์ง‘ํ•œ GRAFT/PRUNE ๋“ฑ์˜ ์ „์ด์™€ ์ƒ์„ธ RPC ๋ฉ”ํƒ€์ •๋ณด๊ฐ€ ๋‚จ์ง€๋งŒ telemetry ์œ ์‹ค์˜ ์˜ํ–ฅ์„ ๋ฐ›์Šต๋‹ˆ๋‹ค. ๊ฐ„์„ ์ด ์—†๋Š” ๊ณผ๊ฑฐ ์š”์•ฝ์€ ์ƒˆ ๊ทธ๋ž˜ํ”„ ์ง€ํ‘œ๋ฅผ ๋ณต์›ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์›๋ณธ์€ ๊ฒฐ๊ณผ ZIP, ํ‘œ๋ณธ ์ถ•์†Œยท๊ทธ๋ž˜ํ”„ ๊ณ„์‚ฐ์€ ์—ฐ๊ตฌ ์ง€ํ‘œ๋ฅผ ์ฐธ๊ณ ํ•˜์‹ญ์‹œ์˜ค. ๋ ˆ์ด์–ด ํ‘œ์‹œ์™€ ๋ฐฐ์น˜๋Š” ๋ฉ”์ธ ๋„๋‹ฌ ์ง€ํ‘œ์˜ ์ •์˜๋ฅผ ๋ฐ”๊พธ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ฐœ๋ฐœ ๊ฒ€์ฆ

์ด๋ฏธ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ Linux Docker engine์—์„œ make test-linux ๋˜๋Š” docker build --target test -t kpl-v3:test .๋กœ Peer meshยทDHT snapshot, Agent ์ˆœ์„œยท๋ณต์‚ฌ, Controller edgeยท์‹ ์„ ๋„, ๋‚ด์žฅ HTML์„ ๊ฒ€์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋„ค์ดํ‹ฐ๋ธŒ go test ./...๋Š” Linux์—์„œ๋งŒ ์‹คํ–‰ํ•˜๋ฉฐ Windows์—์„œ๋Š” Go ํ…Œ์ŠคํŠธ๋‚˜ ํ…Œ์ŠคํŠธ binary๋ฅผ ์‹คํ–‰ํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค. ์ตœ์‹  Node.js ํ™˜๊ฒฝ์—์„œ node --test internal/webui/topology_test.cjs internal/webui/topology-layout_test.cjs๋กœ ๋ ˆ์ด์–ดยทtopic ํ•„ํ„ฐ, ๋ถ€์ฑ„๊ผด ๋ฐฐ์น˜์™€ ์•ˆ์ •ํ™”, churn, ์นด๋ฉ”๋ผ์™€ DOM ์กฐ์ž‘ ํšŒ๊ท€๋ฅผ ๊ฒ€์‚ฌํ•ฉ๋‹ˆ๋‹ค. JavaScript ํ…Œ์ŠคํŠธ๋Š” Node.js ๋‚ด์žฅ ๋ชจ๋“ˆ๋งŒ ์‚ฌ์šฉํ•˜๋ฉฐ npm ํŒจํ‚ค์ง€ ์„ค์น˜๊ฐ€ ํ•„์š” ์—†์Šต๋‹ˆ๋‹ค. ์ด ๊ฒ€์‚ฌ๋Š” ๋ธŒ๋ผ์šฐ์ € ํ™”๋ฉด ๊ฒ€ํ† ๋‚˜ ์‹ค์ œ ๋‹ค์ค‘ ์„œ๋ฒ„ ์‹คํ—˜์„ ๋Œ€์‹ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ „์ฒด ๊ฒ€์ฆ ๋ฒ”์œ„๋Š” ๊ฐœ๋ฐœ ๊ฐ€์ด๋“œ๋ฅผ ์ฐธ๊ณ ํ•˜์‹ญ์‹œ์˜ค.