Protocol Options KO - k-p2p-lab/kpl-v3 GitHub Wiki

ํ”„๋กœํ† ์ฝœ ์„ค์ • ๋ ˆํผ๋Ÿฐ์Šค

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

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

์ด ๋ฌธ์„œ๋Š” ๊ณ ์ • ์˜์กด์„ฑ go-libp2p-pubsub v0.13.1, go-libp2p-kad-dht v0.31.0์— ๋Œ€ํ•œ ์„ ์–ธํ˜• ๋…ธ๋“œ ์„ค์ •์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ ๋ธ”๋ก์€ ์‹œ๋‚˜๋ฆฌ์˜ค profile ๋˜๋Š” join phase์˜ node์— ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค. ์‹œ๋‚˜๋ฆฌ์˜ค ์„ค์ •๊ณผ ํ”„๋กœํ† ์ฝœ ์˜ˆ์ œ๋ฅผ ์ฐธ๊ณ ํ•˜์‹ญ์‹œ์˜ค. ์‹คํ—˜์€ Swarm์—์„œ ์‹คํ–‰ํ•˜๋ฉฐ ๋ฐฐํฌ ์ „์— kpl validate --scenario FILE๋กœ YAML์„ ๊ฒ€์ฆํ•ฉ๋‹ˆ๋‹ค.

Duration์—๋Š” 250ms, 1s, 5m ๊ฐ™์€ Go ๋ฌธ์ž์—ด์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ํฌ์ธํ„ฐ๋กœ ํ‘œํ˜„ํ•˜๋Š” ์ˆซ์žยทboolean ์„ค์ •์€ ์œ ํšจํ•œ ๋ฒ”์œ„์—์„œ ๋ช…์‹œ์ ์ธ 0ยทfalse๋ฅผ ๋ณด์กดํ•ฉ๋‹ˆ๋‹ค. List์™€ map์€ ์ƒ์†๋œ listยทmap ์ „์ฒด๋ฅผ ๊ต์ฒดํ•ฉ๋‹ˆ๋‹ค. score, peerGater, discovery ๊ฐ™์€ ์„ ํƒ์  ๊ฐ์ฒด ๋ธ”๋ก๋„ ์ƒ์†๋œ ๊ฐ์ฒด ์ „์ฒด๋ฅผ ๊ต์ฒดํ•˜๋ฏ€๋กœ ์œ ์ง€ํ•˜๋ ค๋Š” ์„ค์ •์„ ๋‹ค์‹œ ์ž‘์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. enabled: true๊ฐ€ ์—†๋Š” score ๋ธ”๋ก์€ ํ™œ์„ฑ profile score๋ฅผ ๊ต์ฒดํ•œ ๊ฒฝ์šฐ์—๋„ ๋น„ํ™œ์„ฑ์ž…๋‹ˆ๋‹ค.

Version 3์˜ profile schedules๋Š” ์„ ํƒํ•œ ๊ธฐ์กดยท์ดํ›„ ์ž…์žฅ Peer์˜ ์ •ํ•ด์ง„ routing parameter์™€ ๋„คํŠธ์›Œํฌ ์กฐ๊ฑด์„ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ƒ์„ฑ ์‹œ์—๋งŒ ์„ค์ •ํ•˜๋Š” ๊ฐ’์€ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ์ง€์› ํ•„๋“œยท์‹œ๊ฐ„ ๊ธฐ์ค€ยท๋Œ€์ƒ ์„ ํƒยท์‹คํŒจ ๋™์ž‘์€ schedule ๋ ˆํผ๋Ÿฐ์Šค๋ฅผ ๊ธฐ์ค€์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค.

PubSub ํ™œ์„ฑํ™”์™€ ๊ณตํ†ต ์„ค์ •

์ด ์ ˆ์˜ ํ•„๋“œ๋Š” ๋ชจ๋‘ gossipsub ์•„๋ž˜์— ๋‘ก๋‹ˆ๋‹ค. ์ƒ๋žตํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์„ ํƒ ์„ค์ •์€ ๊ณ ์ • ๋ฒ„์ „์˜ ๊ธฐ๋ณธ๊ฐ’์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ๋…ธ๋“œ preset์€ ์•„๋ž˜์—์„œ ์„ค๋ช…ํ•˜๋Š” ๋ณ„๋„ mesh ์„ค์ •์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•„๋“œ ๋™์ž‘
enabled PubSub ํ™œ์„ฑํ™”. ๊ธฐ๋ณธ true์ด๋ฉฐ boot preset์€ ๋ช…์‹œ์ ์œผ๋กœ ์žฌ์„ค์ •ํ•˜์ง€ ์•Š์œผ๋ฉด ๋น„ํ™œ์„ฑ์ž…๋‹ˆ๋‹ค.
router gossipsub(๊ธฐ๋ณธ), floodsub, randomsub.
hopwave ์„ ํƒ์  HopWave ์ „๋‹ฌ. ๊ธฐ๋ณธ ๋น„ํ™œ์„ฑ์ด๋ฉฐ true๋กœ๋งŒ ์ผญ๋‹ˆ๋‹ค. GossipSub router์—์„œ๋งŒ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.
meshFreeze ์‹คํ–‰ ์ค‘ ๋ฉ”์‹œ ํ”„๋ฆฌ์ฆˆ ๋ช…๋ น์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ false์ด๋ฉฐ GossipSub๊ฐ€ ํ™œ์„ฑํ™”๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. true๋Š” ์ดํ›„ ๋™๊ฒฐ์„ ํ—ˆ์šฉํ•˜๋Š” ์„ค์ •์œผ๋กœ, ๋ช…๋ น ์ „๊นŒ์ง€ ์ •์ƒ ๋ฉ”์‹œ ํ˜•์„ฑ์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.
topics ์ฐธ์—ฌ topic ์ด๋ฆ„. ๊ธฐ๋ณธ [kpl/default]์ด๋ฉฐ topic๋ณ„ ์„ค์ •์€ ์ •ํ™•ํžˆ ๊ฐ™์€ ๋ฌธ์ž์—ด์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
topicMode subscribe(๊ธฐ๋ณธ), relay, publish. Relay๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ตฌ๋… ์—†์ด ์ „๋‹ฌํ•˜๋ฉฐ publish๋Š” ์ฐธ์—ฌํ•˜๋˜ ๊ตฌ๋…ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
subscribe ํ˜ธํ™˜ ์„ค์ •. topicMode๊ฐ€ ์—†์„ ๋•Œ false๋Š” publish ๋ชจ๋“œ๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
allowPublish ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฐœํ–‰ ์š”์ฒญ ํ—ˆ์šฉ. ๊ธฐ๋ณธ true.
randomDegree, randomNetworkSize ์–‘์ˆ˜์ธ RandomSub degree ๋ชฉํ‘œ์™€ ์ถ”์ • ์ „์ฒด ๋„คํŠธ์›Œํฌ ํฌ๊ธฐ. ๊ฐ Peer ์ปจํ…Œ์ด๋„ˆ์—๋Š” ๋…๋ฆฝ๋œ process-global degree๊ฐ€ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.
floodPublish, peerExchange GossipSub flood ๋ฐœํ–‰๊ณผ PRUNE peer exchange. ๋ช…์‹œ์ ์ธ false๋ฅผ ๋ณด์กดํ•ฉ๋‹ˆ๋‹ค.
maxMessageSize ์ง๋ ฌํ™”๋œ PubSub RPC ์ตœ๋Œ€ ๋ฐ”์ดํŠธ ์ˆ˜. ๊ธฐ๋ณธ 1 MiB์ด๋ฉฐ 0๋„ ์‹ค์ œ ์ œํ•œ๊ฐ’์œผ๋กœ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.
peerOutboundQueueSize ์–‘์ˆ˜์ธ Peer๋ณ„ ์†ก์‹  RPC ํ ํฌ๊ธฐ. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ธฐ๋ณธ 32.
validateQueueSize ์–‘์ˆ˜์ธ ์ˆ˜์‹  ๊ฒ€์ฆ ํ ํฌ๊ธฐ. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ธฐ๋ณธ 32.
validateThrottle ๋™์‹œ ๋น„๋™๊ธฐ ๊ฒ€์ฆ ํ•œ๋„. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ธฐ๋ณธ 8192์ด๋ฉฐ 0 ์ด์ƒ์ž…๋‹ˆ๋‹ค. 0์€ ๋น„๋™๊ธฐ ๊ฒ€์ฆ์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
validateWorkers ์–‘์ˆ˜์ธ ๊ฒ€์ฆ worker ์ˆ˜. ๊ธฐ๋ณธ๊ฐ’์€ ํ”„๋กœ์„ธ์Šค์—์„œ ๋ณด์ด๋Š” CPU ์ˆ˜์ž…๋‹ˆ๋‹ค.
subscriptionBufferSize 0 ์ด์ƒ์ธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ตฌ๋… ๋ฒ„ํผ ํฌ๊ธฐ. Topic๋ณ„ ์„ค์ •์ด ์šฐ์„ ํ•ฉ๋‹ˆ๋‹ค.
signaturePolicy strict-sign(๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ธฐ๋ณธ), strict-no-sign, lax-sign, lax-no-sign. Strict ์ •์ฑ…์€ ์„ ํƒํ•œ ์„œ๋ช… ๊ทœ์น™์„ ์ˆ˜์‹  ๋ฉ”์‹œ์ง€์—๋„ ์ ์šฉํ•˜๋ฉฐ lax ์ •์ฑ…์€ ์ˆ˜์‹  ์„œ๋ช… ์š”๊ฑด์„ ์™„ํ™”ํ•ฉ๋‹ˆ๋‹ค.
seenMessagesTTL PubSub seen-message cache ๋ณด์กด ์‹œ๊ฐ„. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ธฐ๋ณธ 2m์ด๋ฉฐ score ์ „๋‹ฌ ๊ธฐ๋ก TTL๊ณผ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค.
seenMessagesStrategy first-seen(๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ธฐ๋ณธ) ๋˜๋Š” last-seen cache ๋งŒ๋ฃŒ ์ „๋žต.
messageId default๋Š” authorยทsequence, sha256์€ ๋ฉ”์‹œ์ง€ ๋ฐ์ดํ„ฐ hash, topic-sha256์€ ๊ธธ์ด๋ฅผ ์•ž์— ๋ถ™์ธ topic๊ณผ ๋ฐ์ดํ„ฐ์˜ hash๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋‚ด์šฉ์ด ๊ฐ™์€ raw ๋ฐœํ–‰์€ ๊ฐ™์€ PubSub ๋ฉ”์‹œ์ง€๋กœ ํ•ฉ์ณ์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
scoreInspectInterval ์ ์ˆ˜ snapshot ์ฃผ๊ธฐ. ์Šค์ฝ”์–ด๋ง์„ ๋ช…์‹œ์ ์œผ๋กœ ์ผฐ์„ ๋•Œ๋งŒ ๊ธฐ๋ณธ 1s; 0s๋Š” ๊ด€์ธก์„ ๋•๋‹ˆ๋‹ค. ์ด ํ•„๋“œ๋งŒ์œผ๋กœ ์Šค์ฝ”์–ด๋ง์„ ์ผœ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

GossipSub mesh parameter, HopWave, mesh freeze, ํ™œ์„ฑ scoring, flood ๋ฐœํ–‰, peer exchange, direct peer์™€ PeerGater๋Š” GossipSub router์— ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. FloodSub๋Š” mesh feature ์—†๋Š” ์‚ฌ์šฉ์ž ์ง€์ • protocol ID๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ RandomSub๋Š” ์‚ฌ์šฉ์ž ์ง€์ • protocol ๋ชฉ๋ก์„ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ณตํ†ต filter, validator, message ID, publication๊ณผ discovery ์ •์ฑ…์€ ๊ณตํ†ต PubSub API๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

Mesh freeze

Profile ๋˜๋Š” join phase์˜ node ๋ธ”๋ก์— gossipsub.meshFreeze: true๋ฅผ ์„ค์ •ํ•˜๋ฉด ํ•ด๋‹น Peer์˜ GossipSub ๋ฉ”์‹œ๋ฅผ ๋‚˜์ค‘์— ๋™๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ ๋น„ํ™œ์„ฑ์ž…๋‹ˆ๋‹ค. ๋ฉ”์‹œ๋ฅผ ํ˜•์„ฑํ•œ ๋’ค ์‹œ๋‚˜๋ฆฌ์˜ค v3์˜ mesh-freeze action์„ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค. ์˜ต์…˜๋งŒ์œผ๋กœ ์‹œ์ž‘ ์‹œ์ ์˜ ๋นˆ ๋ฉ”์‹œ๋ฅผ ๋™๊ฒฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ช…๋ น์€ ์„ ํƒํ•œ ๊ฐ Peer์˜ ํ˜„์žฌ ๋ชจ๋“  topic ๋ฉ”์‹œ๋ฅผ ๋™๊ฒฐํ•˜๋ฉฐ topic ์„ ํƒ์ด๋‚˜ ํ•ด์ œ ๋ช…๋ น์€ ์—†์Šต๋‹ˆ๋‹ค. ๋ฐ˜๋ณต ํ˜ธ์ถœ์€ ๊ณ ์ •๋œ ๊ตฌ์„ฑ์›์„ ๋ฐ”๊พธ์ง€ ์•Š๊ณ  ์„ฑ๊ณตํ•ฉ๋‹ˆ๋‹ค.

Peer adapter๋Š” vendored WithMeshFreeze() ์˜ต์…˜๊ณผ PubSub.FreezeMesh(ctx)๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์„ฑ๊ณต ์‘๋‹ต์€ PubSub ์ด๋ฒคํŠธ ๋ฃจํ”„์—์„œ ์ ์šฉ์„ ๋งˆ์ณค๋‹ค๋Š” ๋œป์ž…๋‹ˆ๋‹ค. ๊ทธ ์ดํ›„ heartbeat์˜ degree ๋ณต๊ตฌ, score ๊ธฐ๋ฐ˜ prune, opportunistic graft๋Š” ๋ฉ”์‹œ ๊ตฌ์„ฑ์›์„ ๋ฐ”๊ฟ€ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ˆ˜์‹  GRAFT/PRUNE, ์ƒ๋Œ€ ๊ตฌ๋… ํ•ด์ œ์™€ Peer ์ œ๊ฑฐ๋„ ๊ณ ์ • ๊ตฌ์„ฑ์›์„ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์ œ๊ฑฐํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ๋Œ€๊ธฐ ์ค‘์ด๊ฑฐ๋‚˜ ์žฌ์‹œ๋„ํ•  GRAFT/PRUNE ์ œ์–ด ๋ฉ”์‹œ์ง€๋Š” ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฏธ ์†ก์‹ ์„ ์œ„ํ•ด ํ์—์„œ ๊บผ๋ƒˆ๊ฑฐ๋‚˜ ์ „์†ก ์ค‘์ธ ๊ธฐ์กด ์ œ์–ด ๋ฉ”์‹œ์ง€๋Š” ์‘๋‹ต ๋’ค์— ๋„์ฐฉํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๋„คํŠธ์›Œํฌ ์ „์ฒด์— ๊ฐ™์€ ์ˆœ๊ฐ„์˜ ์ฐจ๋‹จ ๊ฒฝ๊ณ„๋ฅผ ๋ณด์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ณ ์ • ๋ฉ”์‹œ์—๋Š” ํ•ด๋‹น PubSub ์ธ์Šคํ„ด์Šค๊ฐ€ ๋๋‚  ๋•Œ๊นŒ์ง€ ํ•œ์ •๋œ topic/Peer ID ์ง‘ํ•ฉ์ด ๋‚จ์Šต๋‹ˆ๋‹ค. ์—ฐ๊ฒฐ์ด ๋Š๊ธด ๊ตฌ์„ฑ์›์„ ๋Œ€์ฒดํ•˜์ง€ ์•Š์œผ๋ฉฐ transport ์ •๋ฆฌ์™€ ์›๋ž˜์˜ ์–‘์ˆ˜ยท์Œ์ˆ˜ ์ ์ˆ˜ ๋ณด์กด ๊ทœ์น™์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ์žฌ์ ‘์† ์‹œ ํ˜‘์ƒ๋œ ํ”„๋กœํ† ์ฝœ์ด ๋ฉ”์‹œ ๋ผ์šฐํŒ…์„ ์ง€์›ํ•  ๋•Œ๋งŒ ํ™œ์„ฑ ๋ฉ”์‹œ ์—ฐ๊ฒฐ์„ ๋ณต์›ํ•ฉ๋‹ˆ๋‹ค. ๋กœ์ปฌ ๊ตฌ๋…์ด๋‚˜ relay๋ฅผ ์žƒ์œผ๋ฉด ๊ทธ topic์˜ ์ฐธ์—ฌ๋ฅผ ์ค‘๋‹จํ•ฉ๋‹ˆ๋‹ค. ์›๋ž˜ topic์— ๋‹ค์‹œ ์ฐธ์—ฌํ•˜๋ฉด ๊ณ ์ • ๊ตฌ์„ฑ์›์„ ์‚ฌ์šฉํ•˜๋ฉฐ ๊ธฐ์กด ๊ทœ์น™๋Œ€๋กœ ๋ฐœํ–‰ ์ „์šฉ fanout์„ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์ƒˆ๋กœ ์ฐธ์—ฌํ•œ topic์—๋Š” ๋ฉ”์‹œ ๊ตฌ์„ฑ์›์„ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š์ง€๋งŒ IHAVE/IWANT์™€ heartbeat gossip์€ ๊ตํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Peer ํ”„๋กœ์„ธ์Šค๋ฅผ ์ƒˆ๋กœ ์‹œ์ž‘ํ•˜๋ฉด ๋™๊ฒฐ๋˜์ง€ ์•Š์€ ์ƒˆ ๋ฉ”์‹œ๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

์‹ค์ œ ์—ฐ๊ฒฐ๊ณผ ์ƒ๋Œ€ ๊ตฌ๋…์€ ๊ณ„์† ์‚ฌ๋ผ์งˆ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๊ณ ์ • ๊ตฌ์„ฑ์›๋งŒ์œผ๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋งํฌ๋‚˜ ๋ฉ”์‹œ์ง€ ์ „๋‹ฌ์„ ๋ณด์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Cache, validation, scoring, lazy gossip, fanout, direct peer, flood ๋ฐœํ–‰๊ณผ ์„ ํƒ์  HopWave ์ „๋‹ฌ์€ ๊ฐ์ž์˜ ๊ทœ์น™๋Œ€๋กœ ๊ณ„์†๋ฉ๋‹ˆ๋‹ค. ์ด๋ฏธ ๊ฒ€์ฆ ์ค‘์ธ ๋ฉ”์‹œ์ง€๋Š” ๋กœ์ปฌ ๊ตฌ๋… ํ•ด์ œ ๋’ค์—๋„ ์›๋ž˜ PubSub ๋™์ž‘๋Œ€๋กœ ์บ์‹œ ์ €์žฅ๊ณผ ์ „๋‹ฌ์„ ๋งˆ์น  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฉ”์‹œ๋ฅผ ๊ณ ์ •ํ•  ๋ชจ๋“  ์ฐธ๊ฐ€์ž์—์„œ ์˜ต์…˜์„ ์ผœ๊ณ  ๋ช…๋ น์„ ๋ณด๋‚ด์‹ญ์‹œ์˜ค. ์—ฌ๋Ÿฌ Peer์— ๋Œ€ํ•œ ๋ช…๋ น์€ ๊ฐ Peer์— ๊ฐœ๋ณ„ ์ ์šฉ๋˜๋ฏ€๋กœ ๋„คํŠธ์›Œํฌ ์ „์ฒด์˜ ํ•œ ์‹œ์  snapshot์„ ๋งŒ๋“ค์ง€ ์•Š์œผ๋ฉฐ, ์‹œ๊ฐ„ ์ดˆ๊ณผ๋‚˜ ์‹คํŒจ ์‹œ ์ผ๋ถ€๋งŒ ๋™๊ฒฐ๋œ ์ƒํƒœ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ControllerยทAgentยทPeer ์ด๋ฏธ์ง€๋ฅผ ํ•จ๊ป˜ ๊ฐฑ์‹ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์‹œ๋‚˜๋ฆฌ์˜ค topology action๋„ meshFreeze: true๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ช…์‹œ์  ๊ทธ๋ž˜ํ”„๋ฅผ ์„ค์น˜ํ•œ ๋’ค ๋™๊ฒฐํ•ฉ๋‹ˆ๋‹ค. Vendored ValidateMeshPlan๊ณผ SetMeshAndFreeze API๋Š” ์š”์ฒญํ•œ ๋ชจ๋“  ์ด์›ƒ์„ ๊ฒ€์‚ฌํ•˜๋ฉฐ, ํ›„์ž๋Š” ์ฐธ์—ฌ ์ค‘์ธ ํ† ํ”ฝ ํ•˜๋‚˜๋ฅผ ๊ต์ฒดํ•˜๊ณ  Router ์ด๋ฒคํŠธ ๋ฃจํ”„์—์„œ ๋ชจ๋“  ๋กœ์ปฌ ํ† ํ”ฝ ๋ฉ”์‹œ๋ฅผ ์›์ž์ ์œผ๋กœ ๋™๊ฒฐํ•ฉ๋‹ˆ๋‹ค. ๊ฐ™์€ ๋™๊ฒฐ ๋ฉค๋ฒ„์‹ญ์€ ๋ฉฑ๋“ฑ์ด๋ฉฐ ๋‹ค๋ฅธ ๋ฉค๋ฒ„์‹ญ์€ ์ถฉ๋Œํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ์กด ์ ์ˆ˜ ์‚ฐ์‹๊ณผ ์—ฐ๊ฒฐ accounting์€ ์œ ์ง€ํ•˜๊ณ  GRAFT/PRUNE ๊ตํ™˜์„ ํ•ฉ์„ฑํ•ด ๊ธฐ๋กํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

HopWave

HopWave๋Š” ๋ฉ”์‹œ์ง€์˜ hop ์ง„ํ–‰์— ๋”ฐ๋ผ ์ œํ•œ์ ์ธ ์ „๋‹ฌ๊ณผ ์ฃผ๊ธฐ์ ์ธ ์ „ํŒŒ ๊ฐ•ํ™”๋ฅผ ๊ฒฐํ•ฉํ•˜๋Š” ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธ ํ”„๋กœํ† ์ฝœ์ž…๋‹ˆ๋‹ค. ํ•™์ˆ  ์ฐธ๊ณ ๋ฌธํ—Œ์€ Sungwook Lee์™€ Hongtaek Ju์˜ HopWave ๋…ผ๋ฌธ, APNOMS 2026์ด๋ฉฐ ์•„์ง ์ถœํŒ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์•„๋ž˜ ๋™์ž‘์€ KPL์˜ ํ˜„์žฌ ๊ตฌํ˜„์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

KPL์€ ๊ธฐ์กด ์ ์ˆ˜ ๊ด€์ธก ํŒจ์น˜๋ฅผ ์œ ์ง€ํ•˜๋ฉด์„œ ๊ณ ์ •ํ•œ GossipSub ์†Œ์Šค ๋‚ด์— HopWave๋ฅผ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค. ๋ฐœํ–‰ ๋Œ€์ƒ ์„ ํƒ์„ ๋ฐ”๊พธ๋ฉฐ mesh ์œ ์ง€์™€ scoring์€ ๊ธฐ์กด ๋™์ž‘์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ์ด์‹์— ์‚ฌ์šฉํ•œ ์†Œ์Šค ๋ฆฌ๋น„์ „์€ ์•„๋ž˜ ํŒจ์น˜ ์ถœ์ฒ˜ ์•ˆ๋‚ด์— ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค. PubSub๋ฅผ ์ผ  boot ๋…ธ๋“œ๋ฅผ ํฌํ•จํ•˜์—ฌ ์ฐธ์—ฌํ•˜๋Š” ๋ชจ๋“  profile์— ์„ค์ •ํ•˜์‹ญ์‹œ์˜ค.

gossipsub:
  hopwave: true
  params:
    hopwaveFactor: 0.5
    hopwaveInterval: 3

Peer adapter๋Š” ์„œ๋“œํŒŒํ‹ฐ Go API์˜ WithHopwavePublish(true)๋กœ ๊ธฐ๋Šฅ์„ ์ผœ๊ณ  ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ GossipSubParams.HopwaveFactor์™€ HopwaveInterval์— ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค. WithHopwave()๋Š” ๋ฉ”ํƒ€์ •๋ณด๋งŒ ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค. Go ์‹๋ณ„์ž๋Š” hopwave๋ฅผ ํ•œ ๋‹จ์–ด๋กœ ์“ฐ๋ฉฐ ๊ณต๊ฐœ ์ด๋ฆ„์— ํ•„์š”ํ•œ ์ฒซ ๊ธ€์ž๋งŒ ๋Œ€๋ฌธ์ž๋กœ ํ‘œ๊ธฐํ•ฉ๋‹ˆ๋‹ค.

์ „์ฒด HopWave ์‹œ๋‚˜๋ฆฌ์˜ค๋Š” Swarm์—์„œ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. kpl validate --scenario examples/hopwave.yaml๋กœ ๊ฒ€์ฆํ•˜์‹ญ์‹œ์˜ค.

gossipsub.params ์•„๋ž˜ ํ•„๋“œ ๊ธฐ๋ณธ๊ฐ’ ๊ณ„์•ฝ
hopwaveFactor 1 [0, 1]์˜ ์œ ํ•œํ•œ ๋น„์œจ. ์ „์ฒด ์ „์†ก ์‚ฌ์ด์—๋Š” ๋ฌด์ž‘์œ„๋กœ ์„ž์€ ํ›„๋ณด์—์„œ floor(์œ ํšจ ๋Œ€์ƒ ์ˆ˜ ร— ๋น„์œจ)๊ฐœ๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ์–‘์ˆ˜ ๋น„์œจ์€ ํ›„๋ณด๊ฐ€ ์žˆ์œผ๋ฉด ์ตœ์†Œ ํ•˜๋‚˜๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. 0์€ ์ „์ฒด ์ „์†ก ์‚ฌ์ด์˜ eager ์ „๋‹ฌ์„ ๋•๋‹ˆ๋‹ค.
hopwaveInterval 1 [1, 2147483647]์˜ ์ •์ˆ˜. ์ „์ฒด ์ „์†ก ์‚ฌ์ด์˜ hop ๋‹จ๊ณ„ ์ˆ˜์ด๋ฉฐ ์‹ค์ œ ์‹œ๊ฐ„์ด๋‚˜ heartbeat ์ฃผ๊ธฐ์™€ ๋…๋ฆฝ์ ์ž…๋‹ˆ๋‹ค.

์ƒˆ ๋ฐœํ–‰์€ ์นด์šดํ„ฐ 0์œผ๋กœ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ ์†ก์‹ ์€ ์บ์‹œ์— ๋ณด์กดํ•œ ์ˆ˜์‹  ์นด์šดํ„ฐ์—์„œ ํ•œ ๋‹จ๊ณ„ ์ง„ํ–‰ํ•˜๊ณ  ์„ค์ •ํ•œ ์ฃผ๊ธฐ์— ๋„๋‹ฌํ•˜๋ฉด 0์œผ๋กœ ๋˜๋Œ๋ฆฝ๋‹ˆ๋‹ค. ์†ก์‹  ์นด์šดํ„ฐ๊ฐ€ 0์ด๋ฉด ์œ ํšจํ•œ ๋ฐœํ–‰ ๋Œ€์ƒ ์ „์ฒด์— ๋ณด๋‚ด๋ฉฐ ๋‚˜๋จธ์ง€ ๊ฐ’์—์„œ๋Š” ๋น„์œจ์„ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ์กด ๋ฐœ์‹ ์žยท์›์ €์ž ์ œ์™ธ์™€ protocolยทscoreยทIDONTWANT ๊ทœ์น™์„ ์ ์šฉํ•œ ๋’ค direct peer์™€ flood-publish ๋Œ€์ƒ์—๋„ ์„ ํƒ์„ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค. IWANT ์‘๋‹ต์€ ๋น„์œจ ์„ ํƒ์„ ๊ฑฐ์น˜์ง€ ์•Š์œผ๋ฉฐ ๊ธฐ์กด ์š”์ฒญ ์ž๊ฒฉ๊ณผ ์žฌ์ „์†ก ํ•œ๋„๋ฅผ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ํ™œ์„ฑํ™”๋งŒ ํ•˜๊ณ  ์กฐ์ •ํ•˜์ง€ ์•Š์œผ๋ฉด ๊ธฐ๋ณธ 1/1์ด ์ „์ฒด ์ „์†ก์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.

์ผ๋ฐ˜ ๋ฐœํ–‰ ์ „๋‹ฌ์€ eager-push, IWANT ์‘๋‹ต์€ lazy-pull์„ ๋ณด๊ณ ํ•ฉ๋‹ˆ๋‹ค. ์†ก์‹ ์šฉ ๋ณต์‚ฌ๋ณธ์„ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ๊ตฌ๋…์žยท์บ์‹œ์˜ ์ˆ˜์‹  ๊ฐ’ยท๋Œ€๊ธฐ ์ค‘์ธ push๋Š” ์œ ์ง€๋˜๋ฉฐ ๋ฐ˜๋ณต pull ์‘๋‹ต๋„ ์นด์šดํ„ฐ๋ฅผ ๋ˆ„์ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ˆ„๋ฝยท์Œ์ˆ˜ยทoverflow ์นด์šดํ„ฐ๋Š” unknown์„ ์œ ์ง€ํ•˜๊ณ  ์ „์ฒด ๋ฐœํ–‰ ์ „๋‹ฌ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

HopWave๊ฐ€ ํ™œ์„ฑํ™”๋˜๋ฉด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ๊ธฐ๋ณธยทtopic๋ณ„ ๋ฉ”์‹œ์ง€ ID callback ์ž…๋ ฅ์—์„œ ์ด ๊ฐ€๋ณ€ ํ•„๋“œ๋ฅผ ์ œ์™ธํ•ฉ๋‹ˆ๋‹ค. ์ „๋‹ฌยท์ค‘๋ณต ์ œ๊ฑฐยทIWANT ์กฐํšŒ์—์„œ ๊ฐ™์€ ID๋ฅผ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ์ฒ˜๋ฆฌ์ž…๋‹ˆ๋‹ค. ์„ ์–ธํ˜• default, sha256, topic-sha256 ์ •์ฑ…์€ ์ด๋ฏธ ๋ณ€ํ•˜์ง€ ์•Š๋Š” ํ•„๋“œ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. HopWave ๋น„ํ™œ์„ฑ ์‹œ callback ์ž…๋ ฅ์€ ๊ธฐ์กด๊ณผ ๊ฐ™์œผ๋ฏ€๋กœ ์„ค์ •์„ ํ˜ผํ•ฉํ•  ๋•Œ๋Š” ์‚ฌ์šฉ์ž ์ง€์ • callback๋„ ๋ณ€ํ•˜์ง€ ์•Š๋Š” ํ•„๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Wire์˜ hopCount๋Š” ์ˆœํ™˜ํ•˜๋Š” wave ์นด์šดํ„ฐ์ด๋ฏ€๋กœ ์—ฐ๊ตฌ ์ง€ํ‘œ์˜ ์ ˆ๋Œ€ ๊ฒฝ๋กœ ๊ธธ์ด๋ฅผ ๋Œ€์‹ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ „ํŒŒ ํƒ€์ž…์€ ๋ณด๊ณ ๋œ ๋งˆ์ง€๋ง‰ ์†ก์‹  ๋ฐฉ์‹์ด๋ฉฐ ๋ฐœํ–‰์ž๋ถ€ํ„ฐ ์ˆ˜์‹ ์ž๊นŒ์ง€์˜ ์ „์ฒด ๊ฒฝ๋กœ ๋ถ„๋ฅ˜๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ๋‘ ํ•„๋“œ๋Š” ์„œ๋ช…ํ•˜์ง€ ์•Š๋Š” ๊ฐ€๋ณ€ ๋ณด๊ณ ๊ฐ’์ด๋ฉฐ payloadยทtopicยทauthorยทsequence๋Š” ๊ณ„์† ์„œ๋ช…ํ•ฉ๋‹ˆ๋‹ค. KPL์€ ์ƒ์„ธ Peer ๋กœ๊ทธ์— ๋ณ„๋„๋กœ ๋ณด์กดํ•˜๋ฉฐ ๊ธฐ์กด ๋ณต์› ๊ฒฝ๋กœ์™€ eager/lazy ์ถ”์ •์˜ ์ •์˜๋ฅผ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ํ•ด๋‹น ํ•„๋“œ๊ฐ€ ์—†๋Š” ๊ณผ๊ฑฐ ๋กœ๊ทธ์—๋Š” ๊ด€์ธก๊ฐ’์„ ๋งŒ๋“ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ฐธ์กฐ fork์ฒ˜๋Ÿผ GossipSub protocol ID๋ฅผ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ํŒจ์น˜๊ฐ€ ์—†๋Š” ์„œ๋ช… ๊ฒ€์ฆ๊ธฐ๋Š” ์ด wire ํ•„๋“œ๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ฒฝ๋กœ ์ „์ฒด์— ํ˜ธํ™˜๋˜๋Š” ๋นŒ๋“œ์™€ ๊ฐ™์€ HopWave ์„ค์ •์„ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค. ๊ธฐ์กด protocol ์„ค์ •์˜ ์‚ฌ์šฉ์ž ์ง€์ • ID๋กœ ๊ด€์ธก ์‹คํ—˜์„ ๊ฒฉ๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ControllerยทAgentยทPeer ์ด๋ฏธ์ง€๋ฅผ ๋ชจ๋‘ ๊ฐฑ์‹ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํŒจ์น˜ ์ถœ์ฒ˜์™€ ์—…๊ทธ๋ ˆ์ด๋“œ ์•ˆ๋‚ด์—์„œ ์ •ํ™•ํ•œ ์ฐธ์กฐ ์†Œ์Šค์™€ ์ด์‹ ๋ฒ”์œ„๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

GossipSub mesh parameter ์ „์ฒด 32๊ฐœ

gossipsub.params ์•„๋ž˜์— ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์•„๋ž˜ ๊ธฐ๋ณธ๊ฐ’์€ ๋…ธ๋“œ preset ๋˜๋Š” profile์„ ์ ์šฉํ•˜๊ธฐ ์ „์˜ KPL ๊ธฐ๋ณธ๊ฐ’์ž…๋‹ˆ๋‹ค.

์ดˆ๊ธฐ heartbeat์™€ direct peer ์—ฐ๊ฒฐ ํƒ€์ด๋จธ๋Š” Peer context๊ฐ€ ์ทจ์†Œ๋˜๋ฉด ์ข…๋ฃŒ๋ฉ๋‹ˆ๋‹ค. ์ฃผ๊ธฐ์ ์ธ direct peer ์žฌ์—ฐ๊ฒฐ์€ ํฌ๊ธฐ๊ฐ€ ์ œํ•œ๋œ connector ํ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ, ํ๊ฐ€ ๊ฐ€๋“ ์ฐจ๋ฉด ๋‚จ์€ Peer๋Š” ์ดํ›„ ์žฌ์—ฐ๊ฒฐ ์ฃผ๊ธฐ์— ๋‹ค์‹œ ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค.

Router๋Š” ์ฃผ์†Œ๋ก ์ด๋ฒคํŠธ ๊ตฌ๋…์ด ์‹คํŒจํ•˜๊ฑฐ๋‚˜ ๋‹ซํ˜€๋„ ์ทจ์†Œ ์‹œ์ ๊นŒ์ง€ ์ฃผ์†Œ๋ก์„ ์œ ์ง€ํ•˜๊ณ  ์ข…๋ฃŒ ์‹œ ํ•ด์ œํ•ฉ๋‹ˆ๋‹ค. ๋‹ซํžŒ ์ด๋ฒคํŠธ ์ŠคํŠธ๋ฆผ์„ ๋ฐ˜๋ณต ์กฐํšŒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํ•„๋“œ ๊ธฐ๋ณธ๊ฐ’ ์˜๋ฏธ
d 6 ๋ชฉํ‘œ mesh degree.
dLow 5 Mesh ๋ณด์ถฉ ๊ธฐ์ค€.
dHigh 12 Mesh pruning ๊ธฐ์ค€.
dScore 4 Pruningํ•  ๋•Œ ์œ ์ง€ํ•  ๊ณ ๋“์  Peer ์ˆ˜.
dOut 2 ์ตœ์†Œ outbound mesh ์—ฐ๊ฒฐ ์ˆ˜.
dLazy 6 ์ตœ์†Œ gossip ๋Œ€์ƒ ์ˆ˜.
historyLength 5 ๋ฉ”์‹œ์ง€ cache history slot ์ˆ˜.
historyGossip 3 Gossip์œผ๋กœ ์•Œ๋ฆด ์ตœ๊ทผ history slot ์ˆ˜.
gossipFactor 0.25 ์ ๊ฒฉ Peer ์ค‘ gossip ๋Œ€์ƒ์œผ๋กœ ์„ ํƒํ•  ๋น„์œจ.
gossipRetransmission 3 IWANT ์‘๋‹ต์—์„œ ๋ฉ”์‹œ์ง€๋ณ„ ์žฌ์ „์†ก ํ•œ๋„.
heartbeatInitialDelay 100ms ์ฒซ heartbeat ์ „ ์ง€์—ฐ.
heartbeatInterval 1s Mesh ์œ ์ง€๋ณด์ˆ˜ ์ฃผ๊ธฐ.
slowHeartbeatWarning 0.1 ๋А๋ฆฐ heartbeat ๊ฒฝ๊ณ ์— ์‚ฌ์šฉํ•˜๋Š” heartbeat ์ฃผ๊ธฐ์˜ ๋น„์œจ.
fanoutTTL 1m ๋น„ํ™œ์„ฑ fanout ์ƒํƒœ ๋ณด์กด ์‹œ๊ฐ„.
prunePeers 16 PRUNE์— ํฌํ•จํ•˜๋Š” peer exchange ํ•ญ๋ชฉ ์ˆ˜.
pruneBackoff 1m Mesh Peer pruning ํ›„ backoff.
unsubscribeBackoff 10s ๊ตฌ๋… ํ•ด์ œ ๋’ค PRUNE backoff.
connectors 8 PX๋กœ ์–ป์€ Peer์˜ ๋™์‹œ ์—ฐ๊ฒฐ worker ์ˆ˜.
maxPendingConnections 128 PX ์—ฐ๊ฒฐ ๋Œ€๊ธฐ ํ ํ•œ๋„.
connectionTimeout 30s ํ•ด๋‹น ์—ฐ๊ฒฐ์˜ timeout.
directConnectTicks 300 Direct peer ์žฌ์—ฐ๊ฒฐ ๊ฒ€์‚ฌ ์‚ฌ์ด heartbeat ์ˆ˜.
directConnectInitialDelay 1s ์ตœ์ดˆ direct peer ์—ฐ๊ฒฐ ์ง€์—ฐ.
opportunisticGraftTicks 60 Opportunistic graft ๊ฒ€์‚ฌ ์‚ฌ์ด heartbeat ์ˆ˜.
opportunisticGraftPeers 2 Opportunistic graft์—์„œ ์„ ํƒํ•  Peer ์ˆ˜.
graftFloodThreshold 10s ์ด๋ฅธ ๋ฐ˜๋ณต GRAFT์— penalty๋ฅผ ์ ์šฉํ•˜๋Š” ๊ธฐ์ค€ ์‹œ๊ฐ„.
maxIHaveLength 5000 IHAVE์— ๋„ฃ๊ฑฐ๋‚˜ heartbeat๋‹น Peer์—์„œ ์ˆ˜๋ฝยท์š”์ฒญํ•˜๋Š” ์ตœ๋Œ€ ID ์ˆ˜.
maxIHaveMessages 10 Peer๋ณ„ heartbeat๋‹น IHAVE ์ฒ˜๋ฆฌ ํ•œ๋„.
maxIDontWantLength 10 IDONTWANT์— ํฌํ•จํ•˜๊ฑฐ๋‚˜ ์ˆ˜๋ฝํ•˜๋Š” ์ตœ๋Œ€ ๋ฉ”์‹œ์ง€ ID ์ˆ˜.
maxIDontWantMessages 1000 Peer๋ณ„ heartbeat๋‹น IDONTWANT ์ฒ˜๋ฆฌ ํ•œ๋„.
iWantFollowupTime 3s IWANT ์•ฝ์†์„ ์ดํ–‰ํ•˜์ง€ ์•Š์•„ ํ–‰๋™ penalty๋ฅผ ๋ถ€์—ฌํ•˜๊ธฐ ์ „ ๋Œ€๊ธฐ ์‹œ๊ฐ„.
iDontWantMessageThreshold 1024 IDONTWANT ์ƒ์„ฑ ๊ธฐ์ค€ ๋ฉ”์‹œ์ง€ ๋ฐ”์ดํŠธ ์ˆ˜.
iDontWantMessageTTL 3 IDONTWANT ์ƒํƒœ๋ฅผ ๋ณด์กดํ•˜๋Š” heartbeat ์ˆ˜.

Degree์—๋Š” dLow <= d <= dHigh, 0 <= dScore <= d, dOut < dLow, dOut <= d/2 ์ œ์•ฝ์ด ์žˆ์Šต๋‹ˆ๋‹ค. History๋Š” 0 <= historyGossip <= historyLength์ด๋ฉฐ d, dHigh, historyLength๋Š” ์–‘์ˆ˜์ž…๋‹ˆ๋‹ค. Heartbeat interval๊ณผ ๋‘ tick counter๋„ ์–‘์ˆ˜์ด๊ณ  ๋‚˜๋จธ์ง€ count์™€ duration์€ 0 ์ด์ƒ์ž…๋‹ˆ๋‹ค. Gossip factor๋Š” ์œ ํ•œํ•œ [0,1], slow-heartbeat warning์€ ์œ ํ•œํ•œ 0 ์ด์ƒ ๊ฐ’์ž…๋‹ˆ๋‹ค. 0์€ ๋™์ž‘์„ ์–ต์ œํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ž๋™์œผ๋กœ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ๋ฐ”๊พธ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

boot์—์„œ PubSub๋ฅผ ์ผœ๋ฉด preset์˜ dScore: 3์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. Worker preset์€ v2์˜ dLow: 5, dScore: 3, maxIHaveLength: 5500, heartbeatInitialDelay: 1s๋ฅผ ์ƒ์†ํ•ฉ๋‹ˆ๋‹ค. ์‹ค์ œ ๊ฐ’์€ ํƒ€์ž… schema์™€ ๊ธฐ๋ณธ๊ฐ’ ์ฒ˜๋ฆฌ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Peer scoring: ๊ธฐ๋ณธ ๋น„ํ™œ์„ฑ

**gossipsub.score.enabled: true**๋ฅผ ์„ค์ •ํ•ด์•ผ PeerScore๋ฅผ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค. score ๋˜๋Š” score.enabled๋ฅผ ์ƒ๋žตํ•˜๊ฑฐ๋‚˜ false๋กœ ์„ค์ •ํ•˜๋ฉด ์Šค์ฝ”์–ด๋ง๊ณผ ์ ์ˆ˜ ๊ด€์ธก์„ ์‹คํ–‰ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋น„ํ™œ์„ฑ ๋ธ”๋ก์—๋Š” ๋ฏธ์™„์„ฑ tuning์„ ๋ณด์กดํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ž˜๋ชป๋œ duration, ๋น„์œ ํ•œ ์ˆ˜์น˜, ์ž˜๋ชป๋œ CIDRยทPeer ID์™€ ๋นˆ topic key๋Š” ๊ฑฐ๋ถ€ํ•ฉ๋‹ˆ๋‹ค. ํ™œ์„ฑ ๊ตฌ์„ฑ์—์„œ๋Š” router๊ฐ€ ์š”๊ตฌํ•˜๋Š” ํ•„๋“œ ๊ฐ„ ๊ด€๊ณ„๊นŒ์ง€ ๊ฒ€์ฆํ•ฉ๋‹ˆ๋‹ค.

gossipsub.score ํ•„๋“œ ์˜๋ฏธ์™€ ํ™œ์„ฑ ์ƒํƒœ ๊ฒ€์ฆ
enabled ๋ช…์‹œ์  ํ™œ์„ฑํ™”. ๊ธฐ๋ณธ false.
skipAtomicValidation ์„ค์ •ํ•˜์ง€ ์•Š์€ score group์„ ๋น„ํ™œ์„ฑ์œผ๋กœ ๋‘˜ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ false๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์ „์ฒด group ๊ฒ€์ฆ์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.
topicScoreCap ์–‘์˜ topic ๊ธฐ์—ฌ ํ•ฉ๊ณ„์— ์ ์šฉํ•  0 ์ด์ƒ ์ƒํ•œ. 0์€ ์ƒํ•œ ์—†์Œ.
appSpecificWeight ์œ ํ•œํ•œ P5 ๊ฐ€์ค‘์น˜. ์–‘์ˆ˜ยท์Œ์ˆ˜ ๋ชจ๋‘ ๊ฐ€๋Šฅํ•˜๋ฉฐ 0์ด ์•„๋‹ˆ๋ฉด appSpecificScore๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
appSpecificScore.default ๊ธฐ๋ณธ P5 ์›์ ์ˆ˜. ์ƒ๋žตํ•˜๋ฉด 0.
appSpecificScore.peers libp2p Peer ID์—์„œ P5 ์›์ ์ˆ˜๋กœ์˜ map. ๋ช…์‹œ์  0๋„ ๊ธฐ๋ณธ๊ฐ’๋ณด๋‹ค ์šฐ์„ ํ•˜๋ฉฐ ๊ฐ™์€ Peer ID์˜ ์ค‘๋ณต ํ‘œ๊ธฐ๋Š” ๊ฑฐ๋ถ€ํ•ฉ๋‹ˆ๋‹ค.
ipColocationFactorWeight 0 ์ดํ•˜์ธ P6 ๊ฐ€์ค‘์น˜. 0์€ penalty ๋น„ํ™œ์„ฑ.
ipColocationFactorThreshold P6 ๊ฐ€์ค‘์น˜๊ฐ€ 0์ด ์•„๋‹ˆ๋ฉด ์ตœ์†Œ 1.
ipColocationFactorWhitelist Colocation penalty์—์„œ ์ œ์™ธํ•  CIDR ๋ฌธ์ž์—ด.
behaviourPenaltyWeight 0 ์ดํ•˜์ธ P7 ๊ฐ€์ค‘์น˜. 0์€ ๋น„ํ™œ์„ฑ.
behaviourPenaltyThreshold 0 ์ด์ƒ์ธ penalty counter ๊ธฐ์ค€.
behaviourPenaltyDecay P7 ํ™œ์„ฑ ์‹œ (0,1)์ธ counter decay factor.
decayInterval Counter ์œ ์ง€๋ณด์ˆ˜ ์ฃผ๊ธฐ. ์ตœ์†Œ 1s.
decayToZero (0,1)์ธ counter cutoff.
retainScore 0 ์ด์ƒ์ธ ์—ฐ๊ฒฐ ํ•ด์ œ Peer์˜ ์ ์ˆ˜ ๋ณด์กด ์‹œ๊ฐ„. 0์€ ๋ณด์กดํ•˜์ง€ ์•Š์Œ.
seenMessageTTL 0 ์ด์ƒ์ธ score ์ „๋‹ฌ ๊ธฐ๋ก ๋ณด์กด ์‹œ๊ฐ„. 0์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ธฐ๋ณธ 2m์„ ์‚ฌ์šฉํ•˜๋ฉฐ gossipsub.seenMessagesTTL๊ณผ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค.
thresholds ์•„๋ž˜ threshold ๋ธ”๋ก.
topics ์ •ํ™•ํ•œ ์ฐธ์—ฌ topic ์ด๋ฆ„์—์„œ ์•„๋ž˜ TopicScore ๋ธ”๋ก์œผ๋กœ์˜ map. ํ™œ์„ฑ score key๋Š” ์ฐธ์—ฌ topic์„ ๊ฐ€๋ฆฌ์ผœ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

P5๋Š” ์„ ํƒํ•œ ์›์ ์ˆ˜์— appSpecificWeight๋ฅผ ๊ณฑํ•ฉ๋‹ˆ๋‹ค. Peer๋ณ„ map์ด default๋ณด๋‹ค ์šฐ์„ ํ•˜๋ฉฐ ๊ฐ Peer ์ธ์Šคํ„ด์Šค์—์„œ ๊ฐ’์€ ๊ณ ์ •๋ฉ๋‹ˆ๋‹ค. Key๋Š” ์‹œ๋‚˜๋ฆฌ์˜ค node IDยทgroupยทprofile ์ด๋ฆ„์ด ์•„๋‹Œ libp2p Peer ID์ž…๋‹ˆ๋‹ค. ๋ชจ๋“  ์›์ ์ˆ˜์™€ ๊ฐ€์ค‘์น˜ ์ ์šฉ ๊ฒฐ๊ณผ๋Š” ์œ ํ•œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. Callback์€ ๋ถˆ๋ณ€ ๋ฉ”๋ชจ๋ฆฌ map์„ ์ฝ์œผ๋ฉฐ ๋„คํŠธ์›Œํฌ ์š”์ฒญ์„ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํ™œ์„ฑ selective validation์—์„œ decayInterval/decayToZero group ์ „์ฒด๋ฅผ ์ƒ๋žตํ•˜๋ฉด 1s/0.01์„ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋น„ํ™œ์„ฑ time-in-mesh group ์ „์ฒด๋ฅผ ์ƒ๋žตํ•˜๋ฉด ์•ˆ์ „ํ•œ timeInMeshQuantum: 1s๋ฅผ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด tickerยท๋‚˜๋ˆ—์…ˆ ์„ค์ •์˜ ๋ช…์‹œ์  0s๋Š” ๊ฑฐ๋ถ€ํ•ฉ๋‹ˆ๋‹ค. ๊ณ ์ • ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ selective validator๊ฐ€ ํ—ˆ์šฉํ•˜๋Š” panic ์กฐ๊ฑด์„ ๋ง‰๊ธฐ ์œ„ํ•œ ๊ธฐ๋ณธ๊ฐ’์ด๋ฉฐ scoring ๊ฐ€์ค‘์น˜๋ฅผ ์ผœ์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.

gossipsub:
  topics: [kpl/default]
  score:
    enabled: true
    skipAtomicValidation: true
    appSpecificWeight: 1
    appSpecificScore:
      default: 2
    topics:
      kpl/default:
        skipAtomicValidation: true
        topicWeight: 1
        timeInMeshWeight: 0.01
        timeInMeshQuantum: 1s
        timeInMeshCap: 100

PeerScore threshold ์ „์ฒด

gossipsub.score.thresholds ์•„๋ž˜์— ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

ํ•„๋“œ ์ œ์•ฝ๊ณผ ๋™์ž‘
skipAtomicValidation ์„ค์ •ํ•˜์ง€ ์•Š์€ threshold group ํ—ˆ์šฉ. ๊ธฐ๋ณธ false.
gossipThreshold Gossip ์ „๋‹ฌ์˜ 0 ์ดํ•˜ score ๊ธฐ์ค€.
publishThreshold gossipThreshold ์ดํ•˜. ์ด๋ณด๋‹ค ๋‚ฎ์œผ๋ฉด flood/fanout ๋ฐœํ–‰์„ ์–ต์ œํ•ฉ๋‹ˆ๋‹ค.
graylistThreshold publishThreshold ์ดํ•˜. ์ด๋ณด๋‹ค ๋‚ฎ์œผ๋ฉด ๋ฉ”์‹œ์ง€ ์ฒ˜๋ฆฌ๋ฅผ ์–ต์ œํ•ฉ๋‹ˆ๋‹ค.
acceptPXThreshold Peer exchange๋ฅผ ์ˆ˜๋ฝํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ 0 ์ด์ƒ score.
opportunisticGraftThreshold Opportunistic graft๋ฅผ ์œ„ํ•œ 0 ์ด์ƒ mesh score ์ค‘์•™๊ฐ’ ๊ธฐ์ค€.

TopicScore parameter ์ „์ฒด

gossipsub.score.topics.<์ฐธ์—ฌ-topic> ์•„๋ž˜์— ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

ํ•„๋“œ ์˜๋ฏธ
skipAtomicValidation ์„ค์ •ํ•˜์ง€ ์•Š์€ score group ํ—ˆ์šฉ. ๊ธฐ๋ณธ false.
topicWeight Topic ์ „์ฒด ๊ธฐ์—ฌ์˜ 0 ์ด์ƒ ๋ฐฐ์ˆ˜.
timeInMeshWeight 0 ์ด์ƒ P1 ๊ฐ€์ค‘์น˜. 0์€ ๋น„ํ™œ์„ฑ.
timeInMeshQuantum ์–‘์ˆ˜์ธ mesh ์‹œ๊ฐ„ ์ œ์ˆ˜.
timeInMeshCap P1 ํ™œ์„ฑ ์‹œ ์–‘์ˆ˜์ธ ์ƒํ•œ.
firstMessageDeliveriesWeight 0 ์ด์ƒ P2 ๊ฐ€์ค‘์น˜.
firstMessageDeliveriesDecay P2 ํ™œ์„ฑ ์‹œ (0,1)์ธ factor.
firstMessageDeliveriesCap P2 ํ™œ์„ฑ ์‹œ ์–‘์ˆ˜์ธ counter ์ƒํ•œ.
meshMessageDeliveriesWeight 0 ์ดํ•˜ P3 ์ „๋‹ฌ ๋ถ€์กฑ ๊ฐ€์ค‘์น˜.
meshMessageDeliveriesDecay P3 ํ™œ์„ฑ ์‹œ (0,1)์ธ factor.
meshMessageDeliveriesThreshold P3 ํ™œ์„ฑ ์‹œ ์–‘์ˆ˜์ธ ์ „๋‹ฌ ๋ชฉํ‘œ.
meshMessageDeliveriesCap P3 ํ™œ์„ฑ ์‹œ ์–‘์ˆ˜์ธ counter ์ƒํ•œ.
meshMessageDeliveriesActivation P3 ํ™œ์„ฑ ์‹œ ์ตœ์†Œ 1s.
meshMessageDeliveriesWindow 0 ์ด์ƒ์ธ near-first ์ „๋‹ฌ ๊ณ„์ธก ๊ธฐ๊ฐ„.
meshFailurePenaltyWeight 0 ์ดํ•˜ P3b sticky mesh-failure ๊ฐ€์ค‘์น˜.
meshFailurePenaltyDecay P3b ํ™œ์„ฑ ์‹œ (0,1)์ธ factor.
invalidMessageDeliveriesWeight 0 ์ดํ•˜ P4 invalid-delivery ๊ฐ€์ค‘์น˜.
invalidMessageDeliveriesDecay ์„ค์ •๋œ P4 group์—์„œ (0,1)์ธ factor. Atomic validation์—์„œ๋Š” ๊ฐ€์ค‘์น˜๊ฐ€ 0์ด์–ด๋„ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๋น„ํ™œ์„ฑ ๊ฐ€์ค‘์น˜ ํ•ญ๋ชฉ์„ ํฌํ•จํ•ด ๋ชจ๋“  score ๋ถ€๋™์†Œ์ˆ˜์  ๊ฐ’์€ ์œ ํ•œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. Topic score ๋ธ”๋ก์„ ์ƒ๋žตํ•˜๋ฉด ํ•ด๋‹น topic์€ ์ ์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ „์ฒด group ๊ฒ€์ฆ์—์„œ๋Š” ๊ฐ€์ค‘์น˜๊ฐ€ 0์ด์–ด๋„ ์œ ํšจํ•œ time-in-mesh quantum๊ณผ invalid-delivery decay๋ฅผ ์ œ๊ณตํ•˜์‹ญ์‹œ์˜ค. ๋น„ํ™œ์„ฑ์ด๋ฉด ํ† ํด๋กœ์ง€ UI์— Peer scores: Disabled๋กœ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ํ™œ์„ฑ ์ ์ˆ˜ snapshot์€ node/network/snapshot API์™€ SSE์˜ peerScores์— ์žˆ์Šต๋‹ˆ๋‹ค. Router ๊ด€์ธก๊ฐ’์ด๋ฉฐ ์‹คํ—˜ ๊ฒฐ๊ณผ์˜ ๊ณ ์ • ๊ธฐ๋Œ€๊ฐ’์€ ์•„๋‹™๋‹ˆ๋‹ค.

์Šค์ฝ”์–ด ๊ตฌ์„ฑ ํ•ญ๋ชฉ ์ธก์ •

Scoring์€ ๊ณ„์† ๋ช…์‹œ์ ์œผ๋กœ ํ™œ์„ฑํ™”ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(gossipsub.score.enabled: true). ์–‘์ˆ˜ scoreInspectInterval(ํ™œ์„ฑ ์‹œ ๊ธฐ๋ณธ 1s)๋งˆ๋‹ค ๊ฐ€์ค‘์น˜๋ฅผ ์ ์šฉํ•œ P1~P7 ๊ธฐ์—ฌ๋„๋ฅผ ๊ธฐ๋กํ•˜๋ฉฐ 0s๋Š” inspection์„ ๋•๋‹ˆ๋‹ค. ๊ธฐ์กด ์ด์ ๋„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. P3b์™€ topic ์ƒํ•œ ์กฐ์ •๊ฐ’์„ ๋ณ„๋„๋กœ ์ œ๊ณตํ•˜์—ฌ ์ด์ ๊ณผ ๋น„๊ตํ•  ๋•Œ ํ•ด๋‹น ํšจ๊ณผ๊ฐ€ ์ˆจ๊ฒจ์ง€์ง€ ์•Š๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

ํ•ญ๋ชฉ ๊ธฐ๋กํ•˜๋Š” ๊ธฐ์—ฌ๋„
P1 ์ƒํ•œ์„ ์ ์šฉํ•œ ์ •์ˆ˜ time-in-mesh quantum ์ˆ˜ ร— ์‹œ๊ฐ„ ๊ฐ€์ค‘์น˜ ร— topic ๊ฐ€์ค‘์น˜. mesh ๋ฐ–์—์„œ๋Š” 0.
P2 ์ตœ์ดˆ ๋ฉ”์‹œ์ง€ ์ „๋‹ฌ counter ร— ์ „๋‹ฌ ๊ฐ€์ค‘์น˜ ร— topic ๊ฐ€์ค‘์น˜.
P3 ์ „๋‹ฌ ๋ถ€์กฑ๋ถ„์˜ ์ œ๊ณฑ ร— ์ „๋‹ฌ ๊ฐ€์ค‘์น˜ ร— topic ๊ฐ€์ค‘์น˜. router์˜ ์ „๋‹ฌ ํŽ˜๋„ํ‹ฐ ํ™œ์„ฑ flag๊ฐ€ ์ฐธ์ผ ๋•Œ๋งŒ ์ ์šฉ.
P3b ๋ณด์กด๋œ mesh ์‹คํŒจ counter ร— ์‹คํŒจ ๊ฐ€์ค‘์น˜ ร— topic ๊ฐ€์ค‘์น˜.
P4 ์ž˜๋ชป๋œ ๋ฉ”์‹œ์ง€ counter์˜ ์ œ๊ณฑ ร— ํ•ด๋‹น ๊ฐ€์ค‘์น˜ ร— topic ๊ฐ€์ค‘์น˜.
P5 ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ ์ˆ˜ ร— ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐ€์ค‘์น˜.
P6 router๊ฐ€ ์ด๋ฏธ ์ž„๊ณ„๊ฐ’ยท์ œ๊ณฑ์„ ์ ์šฉํ•œ IP colocation factor ร— ๊ฐ€์ค‘์น˜.
P7 ํ–‰๋™ ์ž„๊ณ„๊ฐ’ ์ดˆ๊ณผ๋ถ„์˜ ์ œ๊ณฑ ร— ํ–‰๋™ ๊ฐ€์ค‘์น˜.
Topic cap ๋ชจ๋“  topic ๊ธฐ์—ฌ๋„๋ฅผ ํ•ฉ์‚ฐํ•œ ๋’ค์˜ ์ƒํ•œ ์กฐ์ •๊ฐ’. ์ƒํ•œ์— ๊ฑธ๋ฆฌ์ง€ ์•Š์œผ๋ฉด 0.
Total ๊ฐ™์€ ์ธก์ • ์Œ์— ๋Œ€ํ•œ ์‹ค์ œ router ์ด์ .

Topic ํ•ญ๋ชฉ์€ ์ ์ˆ˜๋ฅผ ๋งค๊ธฐ๋Š” topic ์ „์ฒด๋ฅผ ํ•ฉ์‚ฐํ•ฉ๋‹ˆ๋‹ค. ๊ฐ€์ค‘์น˜๊ฐ€ 0์ด๋ฉด ์ธก์ •๋œ 0์ด๋ฉฐ, ์ธก์ • ๋ˆ„๋ฝยทinspection ๋น„ํ™œ์„ฑ์€ ๋นˆ ๊ตฌ๊ฐ„์ž…๋‹ˆ๋‹ค. Router inspector์™€ ๋™์ผํ•˜๊ฒŒ ์—ฐ๊ฒฐ ํ•ด์ œ ํ›„ ๋ณด์กด ์ค‘์ธ ์ƒ๋Œ€ Peer ์ ์ˆ˜๋„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. P3๋Š” prune ํ›„์—๋„ ํ™œ์„ฑ ์ƒํƒœ์ผ ์ˆ˜ ์žˆ์œผ๋ฉฐ, P3b๋Š” ์ƒํ•œ์ด ์ ์šฉ๋œ ์ด์ ์—์„œ ์ •ํ™•ํžˆ ์—ญ์‚ฐํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ณ ์ •ํ•œ libp2p-pubsub ์†Œ์Šค์— ์ ์ˆ˜ ๊ด€์ธก ํ™•์žฅ์„ ์ ์šฉํ•˜์—ฌ ์‹ค์ œ ํ™œ์„ฑ flagยท๋ˆ„์  counterยทsnapshot ์‹œ๊ฐ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. Router์˜ ์ ์ˆ˜ยท๊ฐ์‡ ยท๋ผ์šฐํŒ… ์‚ฐ์‹์€ ์œ ์ง€ํ•˜๋ฉฐ, ๋Šฆ๊ฒŒ ์‹คํ–‰๋œ callback์ด ์ตœ์‹  ์ธก์ •์„ ๋˜๋Œ๋ฆฌ์ง€ ๋ชปํ•˜๋„๋ก ํ–ˆ์Šต๋‹ˆ๋‹ค.

Inspection๋งˆ๋‹ค ๊ด€์ธก Peer๋‹น peer_score ์ด๋ฒคํŠธ ํ•˜๋‚˜์— ์œ ํšจํ•œ ์ƒ๋Œ€ Peer๋“ค์˜ ํ•ญ๋ชฉ๋ณ„ count/mean/min/max๋ฅผ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค. ๊ฐœ๋ณ„ ์ƒ๋Œ€ Peerยทtopic ํ–‰๋ ฌ์€ ์ง๋ ฌํ™”ํ•˜์ง€ ์•Š์•„ ๊ด€์ธก์žยท์ƒ๋Œ€ยทtopic ์กฐํ•ฉ ์ˆ˜๋งŒํผ ์ด๋ฒคํŠธ ํฌ๊ธฐ๊ฐ€ ๋Š˜์–ด๋‚˜์ง€ ์•Š๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ์กด telemetry ๋ฒ„ํผยท์œ ์‹ค ๋ณด๊ณ ์™€ ๋กœ์ปฌ ์šฐ์„  ๊ฒฐ๊ณผ ์ €์žฅ์„ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค. Node ์ƒํƒœ์—๋Š” ์ตœ์‹  scoreSample๋„ ๋ณด๊ณ ํ•˜๋ฉฐ, Controller๋Š” ๊ธฐ์กด 5์ดˆ ๊ด€์ธก ์ฃผ๊ธฐ์— ์ธก์ • ์Œ ์ˆ˜๋กœ ๊ฐ€์ค‘ํ•œ ๊ทธ๋ฃน ํ†ต๊ณ„๋ฅผ observations.jsonl์— ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค. max(30์ดˆ, inspection ๊ฐ„๊ฒฉ ร— 2 + 5์ดˆ)๋ณด๋‹ค ์˜ค๋ž˜๋œ ํ‘œ๋ณธ์€ ์ œ์™ธํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฃน์€ ํ‰๊ฐ€๋ฐ›๋Š” ์ƒ๋Œ€๊ฐ€ ์•„๋‹Œ ๊ด€์ธก์ž ๊ธฐ์ค€์ž…๋‹ˆ๋‹ค.

์ ์ˆ˜ ํ‘œ๋ณธ์€ ๊ฐ Peer ํ”„๋กœ์„ธ์Šค ๋‚ด inspection ์ˆœ๋ฒˆ์„ ํฌํ•จํ•˜๋ฏ€๋กœ ์‹œ๊ณ„ offset์ด ๋’ค๋กœ ๋ณด์ •๋˜์–ด๋„ Agent๊ฐ€ ๋” ์ตœ์‹ ์ธ ํ‘œ๋ณธ์ด๋‚˜ ๋นˆ snapshot์„ ๊ฑฐ๋ถ€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. observedAt์€ ์‹ ์„ ๋„ ํŒ๋‹จ๊ณผ ๋ถ„์„์— ์‚ฌ์šฉํ•  ์‹ค์ œ ๋ณด์ • ์‹œ๊ฐ์„ ์œ ์ง€ํ•˜๋ฉฐ, ์ˆœ์„œ๋ฅผ ๋งž์ถ”๋ ค๊ณ  ์•ž์œผ๋กœ ๋‹น๊ธฐ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ ์ˆ˜ API ํ•„๋“œ๋ฅผ ์ฐธ๊ณ ํ•˜์‹ญ์‹œ์˜ค.

Saved Results โ†’ Metrics โ†’ GossipSub โ†’ Peer Scores์— ๊ตฌ์„ฑ ํ•ญ๋ชฉ๋ณ„ ๊ทธ๋ž˜ํ”„์™€ P3bยท์ƒํ•œ ์กฐ์ •ยท๊ฐ™์€ ํ‘œ๋ณธ์˜ ์ด์  ๊ทธ๋ž˜ํ”„๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ์กด ์ „์ฒด ์ด์  ๊ทธ๋ž˜ํ”„๋„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฃน ์„ ์€ ๊ด€์ธก์ž๋งˆ๋‹ค ๋™์ผ ๋น„์ค‘์ด ์•„๋‹ˆ๋ผ ์‹ค์ œ ์ธก์ • ์Œ ์ˆ˜๋กœ ๊ฐ€์ค‘ํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋ณต ์‹คํ—˜ ๊ทธ๋ž˜ํ”„๋Š” Run๋ณ„ ๋™์ผ ๋น„์ค‘๊ณผ ๊ธฐ์กด ํ‘œ๋ณธ ํ‘œ์ค€ํŽธ์ฐจ ์Œ์˜์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ์กด ์ด๋ฏธ์ง€ ์ €์žฅ ๊ธฐ๋Šฅ์œผ๋กœ ๊ทธ๋ž˜ํ”„๋ฅผ ๋‚ด๋ณด๋‚ผ ์ˆ˜ ์žˆ์œผ๋ฉฐ Run ZIP์—๋Š” ์ด๋ฒคํŠธ์™€ ๊ด€์ธก๊ฐ’์ด ๋ณด์กด๋ฉ๋‹ˆ๋‹ค. ์ด์ ๋งŒ ์ €์žฅํ•œ ๊ณผ๊ฑฐ ๊ธฐ๋ก์—์„œ ์ด ํ•ญ๋ชฉ๋“ค์„ ๋ณต์›ํ•  ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค. ControllerยทAgentยทPeer๋ฅผ ํ•จ๊ป˜ ์—…๋ฐ์ดํŠธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

PeerGater parameter ์ „์ฒด 11๊ฐœ

gossipsub.peerGater ๋ธ”๋ก์„ ์ง€์ •ํ•˜๋ฉด ๊ฒ€์ฆ ๋ถ€ํ•˜ gate๋ฅผ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค. ๋ธ”๋ก์„ ์ƒ๋žตํ•˜๋ฉด ๋น„ํ™œ์„ฑ์ด๋ฉฐ PeerScore์™€ ๋…๋ฆฝ์ ์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ ๊ณ ์ • ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ DefaultPeerGaterParams๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

ํ•„๋“œ ๊ธฐ๋ณธ๊ฐ’ยท์ œ์•ฝ
threshold 0.33. ์œ ํ•œํ•œ ์–‘์ˆ˜์ธ throttled/validated ๋ฉ”์‹œ์ง€ ๋น„์œจ ๊ธฐ์ค€.
globalDecay ScoreParameterDecay(2m). (0,1)์ธ ์œ ํ•œํ•œ factor.
sourceDecay ScoreParameterDecay(1h). IP๋ณ„ ํ†ต๊ณ„์˜ (0,1)์ธ ์œ ํ•œํ•œ factor.
decayInterval 1s. ์ตœ์†Œ 1s.
decayToZero 0.01. (0,1)์ธ ์œ ํ•œํ•œ factor.
retainStats 6h. 0 ์ด์ƒ์ด๋ฉฐ 0์€ ๋ณด์กดํ•˜์ง€ ์•Š์Œ.
quiet 1m. Throttle ์—†์ด ์ง€๋‚ธ ๋’ค gate๋ฅผ ๋„๊ธฐ๊นŒ์ง€ ์ตœ์†Œ 1s.
duplicateWeight 0.125. ์œ ํ•œํ•œ ์–‘์ˆ˜.
ignoreWeight 1. ์œ ํ•œํ•œ 1 ์ด์ƒ ๊ฐ’.
rejectWeight 16. ์œ ํ•œํ•œ 1 ์ด์ƒ ๊ฐ’.
topicDeliveryWeights Topic์—์„œ weight๋กœ์˜ map. ์œ ํ•œํ•œ ์–‘์ˆ˜ ๊ฐ’.

Filter, topic๊ณผ protocol ์„ ํƒ

gossipsub ์•„๋ž˜ ๊ฒฝ๋กœ ์„ค์ •๊ณผ ๋™์ž‘
topicOptions.<topic> messageId, subscriptionBufferSize, validator. Key๋Š” ์ฐธ์—ฌ topic์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. Topic๋ณ„ IDยทbuffer ์„ค์ •์ด ์ „์—ญ ์„ค์ •๋ณด๋‹ค ์šฐ์„ ํ•˜๋ฉฐ buffer์—๋Š” subscribe ๋ชจ๋“œ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
peerFilter Peer-ID ๋ชฉ๋ก allow, deny, topics.<topic>.allow/deny. ์ „์—ญยทtopic allow ์ œํ•œ์„ ๋ชจ๋‘ ์ ์šฉํ•˜๋ฉฐ ์–ด๋А ์ชฝ deny๋„ ์šฐ์„ ํ•ฉ๋‹ˆ๋‹ค. ๋นˆ allow ๋ชฉ๋ก์€ allow ์ œํ•œ์„ ๋‘์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
directPeers GossipSub direct peer์˜ /p2p/<Peer ID>๋กœ ๋๋‚˜๋Š” transport multiaddress. Peer ์ปจํ…Œ์ด๋„ˆ์—์„œ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•˜๋ฉฐ direct-peer ๊ด€๊ณ„์˜ ์–‘์ชฝ์— ๋Œ€์นญ์ ์œผ๋กœ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
subscriptionFilter Topic allowlist ๋˜๋Š” ์ •๊ทœ์‹ pattern, ์„ ํƒ์ ์ธ ์ˆ˜์‹  ๊ตฌ๋… RPC๋‹น ์–‘์ˆ˜ maxSubscriptions. ์„ค์ •๋œ ์ž์‹ ์˜ topic๋„ filter๋ฅผ ํ†ต๊ณผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
blacklist ์ตœ์ดˆ Peer-ID ๋ชฉ๋ก peers. ttl ์ƒ๋žต์€ Peer ์ธ์Šคํ„ด์Šค ๋‚ด ์˜๊ตฌ ๋ณด์กด์ž…๋‹ˆ๋‹ค. ์–‘์ˆ˜ TTL์ด๋ฉด Add/Contains๊ฐ€ ๋‹ค๋ฅธ ID์˜ ๋งŒ๋ฃŒ ํ•ญ๋ชฉ๋„ min(ttl, 1m) ๊ฐ„๊ฒฉ๋‹น ์ตœ๋Œ€ ํ•œ ๋ฒˆ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ๋ณ„๋„ background ์ •๋ฆฌ worker๋Š” ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
protocols ์ˆœ์„œ๊ฐ€ ์žˆ๋Š” {id, features} ๋ชฉ๋ก. ID๋Š” ์ค‘๋ณต ์—†๋Š” / ์‹œ์ž‘ ๋ฌธ์ž์—ด์ž…๋‹ˆ๋‹ค. Feature๋Š” mesh, px, idontwant ๋˜๋Š” ๋‹จ๋… none์ด๋ฉฐ PX/IDONTWANT์—๋Š” mesh๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
protocolMatch exact(๊ธฐ๋ณธ) ๋˜๋Š” prefix. Prefix์—๋Š” ๋ช…์‹œ์  protocol ๋ชฉ๋ก์ด ํ•„์š”ํ•˜๋ฉฐ ๊ฐ€์žฅ ๊ธด ์ผ์น˜ prefix์˜ capability๋ฅผ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค.

์•Œ๋ ค์ง„ protocol ID์—์„œ feature ๋ชฉ๋ก์„ ์ƒ๋žตํ•˜๋ฉด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ feature ๋Œ€์‘์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. Feature๋ฅผ ์„ ์–ธํ•˜์ง€ ์•Š์€ ์‚ฌ์šฉ์ž ์ง€์ • ID์—๋Š” mesh feature๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๊ฐ™์€ ์‹คํ—˜์˜ Peer๋Š” ํ˜ธํ™˜๋˜๋Š” wire protocol๊ณผ message ID ์ •์ฑ…์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋ฉ”์‹œ์ง€ validator์™€ RPC inspector

defaultValidators๋Š” ๊ณตํ†ต validator ๋ชฉ๋ก์ด๋ฉฐ topicOptions.<topic>.validator๋Š” ํ•ด๋‹น topic์˜ validator๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ์ œ๊ณตํ•œ validator๋Š” ๋ชจ๋‘ ๊ฒ€์ฆ์— ์ฐธ์—ฌํ•ฉ๋‹ˆ๋‹ค. ๊ฐ validator๋Š” ๋‹ค์Œ ํ•„๋“œ๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

ํ•„๋“œ ์˜๋ฏธ
result ๊ฒ€์‚ฌ ์„ฑ๊ณต ์‹œ accept(๊ธฐ๋ณธ), reject, ignore.
failureResult ๊ฒ€์‚ฌ ์‹คํŒจ ์‹œ reject(๊ธฐ๋ณธ) ๋˜๋Š” ignore. Reject๋Š” invalid-message ์ ์ˆ˜์— ๋ฐ˜์˜๋˜๋ฉฐ ignore๋Š” ์ „๋‹ฌ ์„ฑ๊ณต์„ ์˜๋ฏธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
minBytes, maxBytes PubSub ๋ฉ”์‹œ์ง€ ๋ฐ์ดํ„ฐ์˜ 0 ์ด์ƒ ๋ฐ”์ดํŠธ ๋ฒ”์œ„. ์ตœ์†Œ๋Š” ์ตœ๋Œ€ ์ดํ•˜์ด๋ฉฐ envelope ๋ฐ์ดํ„ฐ์—๋Š” ์ธ์ฝ”๋”ฉ overhead๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.
pattern ๋ฉ”์‹œ์ง€ ๋ฐ์ดํ„ฐ์— ์ ์šฉํ•˜๋Š” Go ์ •๊ทœ์‹.
format any(๊ธฐ๋ณธ), json, KPL envelope. Envelope๋Š” ํ•„์ˆ˜ IDยทrunยทpublisher์™€ ์–‘์ˆ˜ timestamp๋ฅผ ๊ฒ€์‚ฌํ•ฉ๋‹ˆ๋‹ค.
delay 0 ์ด์ƒ์ธ ์ธ์œ„์  ๊ฒ€์ฆ ์ง€์—ฐ. ์ทจ์†Œ๋œ ์ž‘์—…์€ ignore๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
timeout 0 ์ด์ƒ์ธ validator timeout. 0s๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ timeout ์—†์Œ ๋™์ž‘์ž…๋‹ˆ๋‹ค.
concurrency ์–‘์ˆ˜์ธ validator๋ณ„ ๋™์‹œ ์‹คํ–‰ ํ•œ๋„. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ธฐ๋ณธ 1024.
inline ๊ฒ€์ฆ ๊ฒฝ๋กœ์—์„œ ๋™๊ธฐ ์‹คํ–‰. ๊ธฐ๋ณธ false.
basicSeqno ๊ธฐ๋ณธ false. True์ด๋ฉด ๋ฉ”๋ชจ๋ฆฌ nonce ์ €์žฅ์†Œ๋กœ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๊ธฐ๋ณธ sequence validator๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธยทstrict-sign ์ •์ฑ…์ด ํ•„์š”ํ•˜๋ฉฐ ์ด์ „ยท๋ฐ˜๋ณต sequence๋Š” ignore, ์ž˜๋ชป๋œ sequence๋Š” failureResult๋กœ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
useValidatorData ๋‚ด์šฉ ๊ฒ€์‚ฌ ํ›„ ํ”„๋กœ์„ธ์Šค ๋‚ด๋ถ€ ValidatorData.result๋กœ accept/reject/ignore๋ฅผ ์„ ํƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

rpcInspector๋Š” ์ˆ˜์‹  RPC envelope๋ฅผ ๊ฒ€์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์„ ํƒ์ ์ธ 0 ์ด์ƒ maxMessages, maxSubscriptions, maxControlEntries, maxMessageIds, maxBytes๋ฅผ ๋„˜์œผ๋ฉด ๊ฑฐ๋ถ€ํ•˜๋ฉฐ 0๋„ ์‹ค์ œ 0 ์ œํ•œ์ž…๋‹ˆ๋‹ค. rejectPeers๋Š” ์ง€์ •ํ•œ Peer ID ๋ฐœ์‹ ์ž๋ฅผ ๊ฑฐ๋ถ€ํ•ฉ๋‹ˆ๋‹ค. Control entry๋Š” IHAVEยทIWANTยทGRAFTยทPRUNEยทIDONTWANT protobuf entry ์ˆ˜์ด๋ฉฐ message ID ์ˆ˜๋Š” IHAVEยทIWANTยทIDONTWANT์˜ ์ฐธ์กฐ ํ•ฉ๊ณ„์ž…๋‹ˆ๋‹ค. ๋ฐ”์ดํŠธ ์ œํ•œ์—๋Š” protobuf ์ง๋ ฌํ™” RPC ํฌ๊ธฐ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

Discovery, author์™€ publication

discovery ๋ธ”๋ก์„ ์ƒ๋žตํ•˜๋ฉด ๊ธฐ์กด KPL์˜ ์šฉ๋Ÿ‰์„ ๊ณ ๋ คํ•˜๋Š” Controller discovery loop๋ฅผ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ๋ช…์‹œ์  discovery.mode: controller({}๋„ ๋™์ผ)๋Š” Controller ํ›„๋ณด๋ฅผ libp2p discovery pipeline์œผ๋กœ ์—ฐ๊ฒฐํ•˜๊ณ , routing์€ Kademlia๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ namespace ์•ž์— run ID๋ฅผ ๋ถ™์ž…๋‹ˆ๋‹ค. none์€ topic discovery๋ฅผ ๋•๋‹ˆ๋‹ค. Routing discovery์—๋Š” Kademlia์™€ provider ๊ธฐ๋Šฅยท์ €์žฅ์†Œ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด ์„ค์ •์€ ๋ณ„๋„ ์ตœ์ดˆ bootstrap ์—ฐ๊ฒฐ ์ ˆ์ฐจ๋ฅผ ์ œ๊ฑฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

discovery.ttl์€ ์–‘์ˆ˜ advertisement TTL์ด๋ฉฐ limit์€ ์š”์ฒญํ•  ์–‘์ˆ˜ ๊ฒฐ๊ณผ ํ•œ๋„์ž…๋‹ˆ๋‹ค. Controller discovery์˜ TTL์€ ์‹ค์ œ ๊ด‘๊ณ ๋ฅผ ์ƒˆ๋กœ ๋งŒ๋“ค์ง€ ์•Š๋Š” callback์˜ ๊ฐฑ์‹  ์ฃผ๊ธฐ์ด๋ฉฐ Controller ์ƒ์กด ํŒ๋‹จ์€ ๊ณ„์† Agent ๋ณด๊ณ ๋ฅผ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค. ์„ ํƒ์ ์ธ connector๋Š” ์ง€์ˆ˜ connection backoff๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

Connector ํ•„๋“œ Connector ๋ธ”๋ก์ด ์žˆ์„ ๋•Œ ๊ธฐ๋ณธ๊ฐ’
cacheSize 100. ์–‘์ˆ˜.
dialTimeout 2m. ์–‘์ˆ˜.
minBackoff, maxBackoff 10s, 1h. ์–‘์ˆ˜์ด๋ฉฐ ์ตœ์†Œ๋Š” ์ตœ๋Œ€ ์ดํ•˜.
timeUnit 1s. ์–‘์ˆ˜.
base 5. ์œ ํ•œํ•œ 1 ์ดˆ๊ณผ ๊ฐ’.
offset 0s. 0 ์ด์ƒ.
jitter full ๋˜๋Š” none. ๊ธฐ๋ณธ full.
seed 1. Backoff jitter์˜ ์ •์ˆ˜ seed.

Connector ๋ธ”๋ก์ด ์—†์œผ๋ฉด libp2p ๊ธฐ๋ณธ connector๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. Routing discovery๋Š” DHT admissionยทstorageยทproviderยทrefresh ์„ค์ •์˜ ์˜ํ–ฅ์„ ๋ฐ›์Šต๋‹ˆ๋‹ค.

author๋Š” Peer transport identity์™€ ๋ณ„๋„๋กœ PubSub author๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ํ•„๋“œ๋Š” peerId, base64 libp2p-marshaled privateKey, ๋˜๋Š” noAuthor์ž…๋‹ˆ๋‹ค. Peer ID๋ฅผ ํ•จ๊ป˜ ์ œ๊ณตํ•˜๋ฉด private key์™€ ์ผ์น˜ํ•ด์•ผ ํ•˜๋ฉฐ ID๋งŒ์œผ๋กœ ์„œ๋ช… author๋ฅผ ์ง€์ •ํ•˜๋ฉด host peerstore์— ํ•ด๋‹น key๊ฐ€ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. noAuthor: true๋Š” ๋‹ค๋ฅธ ๋‘ ํ•„๋“œ์™€ ์ถฉ๋Œํ•˜๋ฉฐ unsigned ์„œ๋ช… ์ •์ฑ…๊ณผ ๋ชจ๋“  topic์˜ content ๊ธฐ๋ฐ˜ message ID๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๋ช…์‹œ์  private key๋Š” ์ €์žฅ๋œ ์‹œ๋‚˜๋ฆฌ์˜ค์™€ ๋‹ค์šด๋กœ๋“œ archive์— ํฌํ•จ๋˜๋ฏ€๋กœ ์‹คํ—˜์šฉ key๋ฅผ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค.

publish๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ฐ ๋ฐœํ–‰์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

ํ•„๋“œ ๋™์ž‘
readinessMinPeers Payloadยทtimestamp ์ƒ์„ฑ ์ „์— ๊ฒ€์‚ฌํ•˜๋Š” 0 ์ด์ƒ ์ตœ์†Œ pubsub.ListPeers(topic) ์ˆ˜. ์•Œ๋ ค์ง„ ์›๊ฒฉ topic Peer ์ˆ˜์ด๋ฉฐ upstream MinTopicSize์˜ mesh ์กฐ๊ฑด์ด๋‚˜ ์ˆ˜๋ ด ๋ณด์žฅ์ด ์•„๋‹™๋‹ˆ๋‹ค.
readinessTimeout ์ตœ๋Œ€ 10s์ธ ์„ ํƒ์  ์–‘์ˆ˜ timeout. readinessMinPeers๊ฐ€ ํ•„์š”ํ•˜๋ฉฐ ์ „์ฒด ๋ฐœํ–‰ ์š”์ฒญ ์˜ˆ์‚ฐ ์•ˆ์—์„œ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค.
local ๊ธฐ๋ณธ false. True๋Š” local publication์„ ์š”์ฒญํ•˜๊ณ  ์›๊ฒฉ readiness ๊ฒ€์‚ฌ๋ฅผ ๊ฑด๋„ˆ๋›ฐ๋ฉฐ ํ•ด๋‹น ๋ฐœํ–‰์„ ์›๊ฒฉ ์„ธ์…˜ ์ „๋‹ฌ ์ง€ํ‘œ์—์„œ ์ œ์™ธํ•ฉ๋‹ˆ๋‹ค.
validatorData ํ”„๋กœ์„ธ์Šค ๋‚ด๋ถ€ map. ์ง€์›ํ•˜๋Š” result๋Š” accept/reject/ignore์ด๋ฉฐ useValidatorData์ธ validator๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. P2P wire์— ์ง๋ ฌํ™”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
author ๊ฐ™์€ identity ํ•„๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐœํ–‰๋ณ„ author override. Private key์™€ signing ์ •์ฑ…์ด ํ•„์ˆ˜์ด๋ฉฐ noAuthor ๋˜๋Š” local: true์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

Kademlia ์„ค์ •

์•„๋ž˜ ํ•„๋“œ๋Š” ๋ชจ๋‘ kademlia ์•„๋ž˜์— ์žˆ์œผ๋ฉฐ Kademlia ํ™œ์„ฑ ์‹œ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ datastoreยทprovider interface๋Š” ์•„๋ž˜ ์ด๋ฆ„ ์žˆ๋Š” ์ •์ฑ…์œผ๋กœ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

ํ•„๋“œยทgroup ์˜๋ฏธ
enabled, mode ๊ธฐ๋ณธ ํ™œ์„ฑ. Mode๋Š” ๊ธฐ๋ณธ server ๋˜๋Š” client, auto, auto-server.
protocolPrefix ๊ธฐ๋ณธ /k-p2p-lab/v3. DHT protocol prefix.
protocolId ์ •ํ™•ํ•œ V1 protocol override. Prefixยทextension๊ณผ ์ƒํ˜ธ ๋ฐฐํƒ€์ ์ž…๋‹ˆ๋‹ค.
protocolExtension Prefix ๋’ค์— ๋ถ™์ด๋Š” extension.
bucketSize ์–‘์ˆ˜ bucket ์šฉ๋Ÿ‰. KPL ๊ธฐ๋ณธ 20.
concurrency ์–‘์ˆ˜ lookup ๋ณ‘๋ ฌ ์ˆ˜.
resiliency 0 ์ด์ƒ lookup resiliency.
lookupCheckConcurrency ์–‘์ˆ˜์ธ ๋™์‹œ routing-table admission ๊ฒ€์‚ฌ ์ˆ˜.
routingTableLatencyTolerance 0 ์ด์ƒ Peer ์ง€์—ฐ admission ๊ธฐ์ค€. ๊ณ ์ •๋œ upstream v0.31.0์€ ์ด ์˜ต์…˜์„ ๋ฐ›์ง€๋งŒ routing table์„ ๊ณ ์ • 1m ๊ธฐ์ค€์œผ๋กœ ์ƒ์„ฑํ•˜๋ฏ€๋กœ ์„ค์ •ํ•œ override๋Š” ์ ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์„ค์ • ํ˜ธํ™˜์„ฑ์„ ์œ„ํ•ด ํ•„๋“œ๋Š” ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.
routingTableRefreshPeriod ์–‘์ˆ˜ ์ž๋™ routing-table refresh ์ฃผ๊ธฐ.
routingTableRefreshTimeout ์–‘์ˆ˜ refresh query timeout.
maxRecordAge 0 ์ด์ƒ value-record ์ตœ๋Œ€ age.
disableAutoRefresh, disableProviders, disableValues ๊ฐ DHT ๊ธฐ๋Šฅ์˜ ๋ช…์‹œ์  ๋น„ํ™œ์„ฑํ™” switch.
optimisticProvide, optimisticProvideJobsPoolSize Optimistic provide ํ™œ์„ฑํ™”์™€ ์–‘์ˆ˜ ๋ฐฑ๊ทธ๋ผ์šด๋“œ job pool ํฌ๊ธฐ.
bootstrapTimeout, bootstrapRetryInterval KPL ์ตœ์ดˆ transport bootstrap ์˜ˆ์‚ฐยท์žฌ์‹œ๋„ ์ฃผ๊ธฐ. ๊ธฐ๋ณธ 60sยท1s, ๋ชจ๋‘ ์–‘์ˆ˜.
bootstrapSource, bootstrapPeers DHT bootstrap ์›์ฒœ์ธ none, static, controller. Static์—๋Š” transport /p2p/<Peer ID> multiaddress๊ฐ€ ํ•„์š”ํ•˜๋ฉฐ controller๋Š” run ๋ฒ”์œ„ bootstrap Peer๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค. KPL ์ตœ์ดˆ transport bootstrap๊ณผ ๋ณ„๋„๋กœ DHT ๋ณต๊ตฌ bootstrap์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
queryFilter, routingTableFilter, addressFilter ๊ฐ๊ฐ policy, allowCIDRs, denyCIDRs๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. ์•„๋ž˜ ์„ค๋ช… ์ฐธ๊ณ .
routingTableDiversity enabled, ์–‘์ˆ˜ maxPerCpl, ์–‘์ˆ˜ maxForTable. ๋ธ”๋ก์ด ์žˆ์œผ๋ฉด ๊ธฐ๋ณธ ํ™œ์„ฑ์ด๊ณ  ์ƒ๋žตํ•œ ํ•œ๋„๋Š” ๊ณ ์ • ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ธฐ๋ณธ๊ฐ’์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
datastore memory(๊ธฐ๋ณธ ๋™์ž‘) ๋˜๋Š” null. Memory๋Š” Peer๋ณ„ ์ €์žฅ์†Œ๋กœ ์ปจํ…Œ์ด๋„ˆ ์ข…๋ฃŒ ์‹œ ์†Œ๋ฉธํ•˜๋ฉฐ null์€ ๊ธฐ๋ก์„ ๋ฒ„๋ฆฝ๋‹ˆ๋‹ค.
validator mode: default๋Š” ๊ธฐ๋ณธ pkยทipns๋ฅผ ์œ ์ง€ํ•˜๊ณ  namespace๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. mode: namespaced๋Š” ์ „์ฒด namespace map์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. namespaces.<์ด๋ฆ„>์€ public-key, ipns, bytes, reject ์ค‘ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
providerStore mode: manager(๊ธฐ๋ณธ ๋™์ž‘) ๋˜๋Š” null. Manager๋Š” ์–‘์ˆ˜ cleanupInterval, cacheSize๋ฅผ ๋ฐ›์œผ๋ฉฐ null์€ provider ๊ธฐ๋ก์„ ๋ฒ„๋ฆฌ๊ณ  ํ•ด๋‹น tuning์„ ๋ฐ›์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
requestHook none(๊ธฐ๋ณธ) ๋˜๋Š” ์ˆ˜์‹  DHT ์š”์ฒญ INFO log๋ฅผ ๋‚จ๊ธฐ๋Š” log.

Filter policy๋Š” all(๋นˆ ๊ฐ’ยท๊ธฐ๋ณธ), public, private, non-loopback์ž…๋‹ˆ๋‹ค. Query/routing-table์˜ public/private๋Š” ํ•ด๋‹น ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ filter๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ, ํŠนํžˆ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ private query๋Š” ๋น„์–ด ์žˆ์ง€ ์•Š์€ ์ฃผ์†Œ ๋ชฉ๋ก์„ ๋ชจ๋‘ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ •ํ™•ํ•œ ์‹คํ—˜ ์ฃผ์†Œ ๋ฒ”์œ„์—๋Š” CIDR ์ œํ•œ์„ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค. Address filter๋Š” ์ฃผ์†Œ๋ณ„๋กœ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค. ์–ด๋А ์ฃผ์†Œ๋“  deny CIDR์— ํฌํ•จ๋˜๋ฉด query/routing-table ํ›„๋ณด ์ „์ฒด๋ฅผ ๊ฑฐ๋ถ€ํ•˜๋ฉฐ allow ๋ชฉ๋ก์€ ์ผ์น˜ํ•˜๋Š” IP๊ฐ€ ์ตœ์†Œ ํ•˜๋‚˜ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. non-loopback์€ private unicast๋ฅผ ํฌํ•จํ•ด loopback์ด ์•„๋‹Œ global-unicast IP๋ฅผ ์š”๊ตฌํ•ฉ๋‹ˆ๋‹ค.

DHT bootstrap source๋ฅผ ์ƒ๋žตํ•˜๋ฉด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ option ๊ธฐ๋ณธ๊ฐ’์„ ์œ ์ง€ํ•˜๋ฉฐ KPL ์ตœ์ดˆ Controller bootstrap์„ ๋Œ€์ฒดํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ช…์‹œ์ ์œผ๋กœ ๋นˆ static ๋ชฉ๋ก ๋˜๋Š” none์„ ์„ค์ •ํ•˜๋ฉด DHT ๋ณต๊ตฌ bootstrap Peer๋ฅผ ์ œ๊ณตํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. public-key ์ •์ฑ…์€ pk namespace์—์„œ๋งŒ, ipns๋Š” ipns namespace์—์„œ๋งŒ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. bytes record validator๋Š” ๋ถˆํˆฌ๋ช… ๊ฐ’์„ ์ˆ˜๋ฝํ•˜๊ณ  ๋ฐ”์ดํŠธ ์‚ฌ์ „์‹ ์ˆœ์„œ์—์„œ ๊ฐ€์žฅ ํฐ ํ›„๋ณด๋ฅผ ์„ ํƒํ•˜๋ฉฐ reject๋Š” ๋ชจ๋“  record๋ฅผ ๊ฑฐ๋ถ€ํ•ฉ๋‹ˆ๋‹ค. ์ด ์ •์ฑ…์€ ํ”„๋กœํ† ์ฝœ ๋™์ž‘์„ ์„ค์ •ํ•˜๋ฉฐ DHT Put/Get/Provide ์‹œ๋‚˜๋ฆฌ์˜ค action์„ ์ถ”๊ฐ€ํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.

์ •ํ™•ํ•œ protocolId: /ipfs/kad/1.0.0์„ ํฌํ•จํ•œ ํ‘œ์ค€ /ipfs namespace์—๋Š” upstream ์ œ์•ฝ์ธ bucket size 20, value/provider ํ™œ์„ฑ, ํ‘œ์ค€ pkยทipns validator๋งŒ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž ์ง€์ • ์‹คํ—˜ prefix ๋˜๋Š” ์ •ํ™•ํ•œ protocol ID์—์„œ๋Š” ๋‹ค๋ฅธ ์ •์ฑ…์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž ์ง€์ • exact ID์—์„œ๋Š” upstream ๊ธฐ๋ณธ namespace ๊ฒ€์‚ฌ๊ฐ€ tuning์„ ๊ฑฐ๋ถ€ํ•˜์ง€ ์•Š๋„๋ก ๋‚ด๋ถ€ ๊ฒ€์ฆ prefix๋„ ์„ค์ •ํ•˜๋ฉฐ, ์ง€์ •ํ•œ ์ •ํ™•ํ•œ wire ID๋Š” ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. Public address filter๋Š” Swarm์˜ private overlay ์ฃผ์†Œ๋ฅผ ์ œ์™ธํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์‹คํ—˜ ๋„คํŠธ์›Œํฌ์— ๋งž๋Š” filter๋ฅผ ์„ ํƒํ•˜์‹ญ์‹œ์˜ค.

๊ตฌํ˜„ ๊ฒฝ๊ณ„

Schema๋Š” ๊ณตํ†ต ๋…ธ๋“œ ์„ค์ •, GossipSub parameter, PubSub ์ •์ฑ…, scoring, Kademlia ์ •์ฑ…์œผ๋กœ ๋‚˜๋‰ฉ๋‹ˆ๋‹ค. Runtime adapter๋Š” ๋Œ€์‘ํ•˜๋Š” internal/peer ํŒŒ์ผ์— ์žˆ์Šต๋‹ˆ๋‹ค.

Scalar struct ํ•„๋“œ๋Š” typed schema๋กœ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. Go ํ•จ์ˆ˜๋‚˜ interface๋ฅผ ๋ฐ›๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์˜ต์…˜์—๋Š” ์ด ๋ฌธ์„œ์˜ ์ด๋ฆ„ ์žˆ๋Š” ์ •์ฑ…์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ž„์˜ score ํ•จ์ˆ˜ยทvalidatorยทstoreยทdiscovery providerยทfeature testยทtracerยทrequest hook ๋ฐ Kademlia WithCustomMessageSender ๊ตฌํ˜„์—๋Š” ์ฝ”๋“œ ํ™•์žฅ์ด ํ•„์š”ํ•˜๋ฉฐ YAML์€ Go ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๊ฑฐ๋‚˜ ์ž„์˜ ๊ตฌํ˜„์„ ๋กœ๋“œํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. KPL telemetry tracer์™€ Peer ๋„คํŠธ์›Œํฌ ๊ฒฉ๋ฆฌ๋Š” ์œ ์ง€ํ•˜์—ฌ ์‹คํ—˜ ์‹œ์Šคํ…œ ์•ˆ์—์„œ protocol ๋™์ž‘์„ ๊ด€์ธกํ•ฉ๋‹ˆ๋‹ค.

โš ๏ธ **GitHub.com Fallback** โš ๏ธ