-
Notifications
You must be signed in to change notification settings - Fork 7
/
Copy pathgossipsub-v1_0.ss
45 lines (41 loc) · 1.55 KB
/
gossipsub-v1_0.ss
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
;;; -*- Gerbil -*-
;;; © vyzo
;;; baseline gossipsub v1.0 protocol
(import :std/iter
(only-in :std/srfi/1 take)
:vyzo/simsub/proto
:vyzo/simsub/env
:vyzo/simsub/gossipsub-base)
(export #t)
;; gossipsub/v1.0 overlay parameters
;; D-gossip: the gossip degree (fixed)
(defstruct (overlay/v1.0 overlay) (D-gossip)
constructor: :init!)
(defmethod {:init! overlay/v1.0}
(lambda (#!key kws self D-gossip: (D-gossip 6))
(set! (overlay/v1.0-D-gossip self) D-gossip)
(apply overlay:::init! self (keyword-rest kws D-gossip:))))
;; gossipsub v1.0 implementation
(defgossipsub gossipsub/v1.0
(params peers mesh mcache rng)
(publish! forward! void gossip! void prune-candidates prune! void)
(def (publish! id msg)
(forward-message! #f id msg mesh rng))
(def (forward! source id msg)
(forward-message! source id msg mesh rng))
(def (prune-candidates mesh)
(shuffle/normalize mesh rng))
(def (prune! peer)
(send! (!!gossipsub.prune peer [])))
(def (gossip!)
(let (mids (mcache-gossip mcache (overlay-gossip-window params)))
(unless (null? mids)
(let* ((all-peers (shuffle/normalize peers rng))
(gossip-peers (filter (lambda (p) (not (memq p mesh))) all-peers))
(gossip-peers
(let (D-gossip (overlay/v1.0-D-gossip params))
(if (> (length gossip-peers) D-gossip)
(take gossip-peers D-gossip)
gossip-peers))))
(for (peer gossip-peers)
(send! (!!gossipsub.ihave peer mids))))))))