From 4d4bd1942e797bd19346f9c505af6720952b360b Mon Sep 17 00:00:00 2001 From: dozyio Date: Sat, 14 Dec 2024 22:48:13 +0000 Subject: [PATCH 1/5] add bootstrap mode to go peer - enables peer exchange --- go-peer/main.go | 17 ++++++++++++++++- js-peer/src/lib/libp2p.ts | 24 ++++++++++++------------ 2 files changed, 28 insertions(+), 13 deletions(-) diff --git a/go-peer/main.go b/go-peer/main.go index 7646eb5..75087f7 100644 --- a/go-peer/main.go +++ b/go-peer/main.go @@ -123,6 +123,7 @@ func main() { keyPath := flag.String("tls-key-path", "", "path to the tls key file (for websockets") useLogger := flag.Bool("logger", false, "write logs to file") headless := flag.Bool("headless", false, "run without chat UI") + bootstrapper := flag.Bool("bootstrapper", false, "run as a bootstrap peer") var addrsToConnectTo stringSlice flag.Var(&addrsToConnectTo, "connect", "address to connect to (can be used multiple times)") @@ -194,8 +195,22 @@ func main() { panic(err) } + gossipSubOpts := []pubsub.Option{} + + if *bootstrapper == true { + gossipSubOpts = append(gossipSubOpts, pubsub.WithPeerExchange(true)) + + pubsub.WithFloodPublish(true) + + // See https://github.com/libp2p/specs/blob/master/pubsub/gossipsub/gossipsub-v1.1.md#recommendations-for-network-operators + pubsub.GossipSubD = 0 + pubsub.GossipSubDlo = 0 + pubsub.GossipSubDhi = 0 + pubsub.GossipSubDout = 0 + } + // create a new PubSub service using the GossipSub router - ps, err := pubsub.NewGossipSub(ctx, h) + ps, err := pubsub.NewGossipSub(ctx, h, gossipSubOpts...) if err != nil { panic(err) } diff --git a/js-peer/src/lib/libp2p.ts b/js-peer/src/lib/libp2p.ts index c1b80fc..054c5ed 100644 --- a/js-peer/src/lib/libp2p.ts +++ b/js-peer/src/lib/libp2p.ts @@ -100,17 +100,17 @@ export async function startLibp2p(): Promise { log(`changed multiaddrs: peer ${peer.id.toString()} multiaddrs: ${multiaddrs}`) }) - // 👇 explicitly dial peers discovered via pubsub - libp2p.addEventListener('peer:discovery', (event) => { - const { multiaddrs, id } = event.detail - - if (libp2p.getConnections(id)?.length > 0) { - log(`Already connected to peer %s. Will not try dialling`, id) - return - } - - dialWebRTCMaddrs(libp2p, multiaddrs) - }) + // // 👇 explicitly dial peers discovered via pubsub + // libp2p.addEventListener('peer:discovery', (event) => { + // const { multiaddrs, id } = event.detail + // + // if (libp2p.getConnections(id)?.length > 0) { + // log(`Already connected to peer %s. Will not try dialling`, id) + // return + // } + // + // dialWebRTCMaddrs(libp2p, multiaddrs) + // }) return libp2p } @@ -200,4 +200,4 @@ export const getFormattedConnections = (connections: Connection[]) => connections.map((conn) => ({ peerId: conn.remotePeer, protocols: [...new Set(conn.remoteAddr.protoNames())], - })) \ No newline at end of file + })) From 54612346c63a26e80a34fbe10f8d7f9fe8da5784 Mon Sep 17 00:00:00 2001 From: dozyio Date: Sat, 14 Dec 2024 22:56:15 +0000 Subject: [PATCH 2/5] fix: bool comparison --- go-peer/main.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/go-peer/main.go b/go-peer/main.go index 75087f7..6a7a277 100644 --- a/go-peer/main.go +++ b/go-peer/main.go @@ -197,7 +197,7 @@ func main() { gossipSubOpts := []pubsub.Option{} - if *bootstrapper == true { + if *bootstrapper { gossipSubOpts = append(gossipSubOpts, pubsub.WithPeerExchange(true)) pubsub.WithFloodPublish(true) From dbf316e5c1d5576bc5db22e8fcdf553fef3581ba Mon Sep 17 00:00:00 2001 From: dozyio Date: Mon, 16 Dec 2024 22:10:09 +0000 Subject: [PATCH 3/5] feat(go-peer): directConnection --- go-peer/main.go | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/go-peer/main.go b/go-peer/main.go index 6a7a277..5394f16 100644 --- a/go-peer/main.go +++ b/go-peer/main.go @@ -125,6 +125,9 @@ func main() { headless := flag.Bool("headless", false, "run without chat UI") bootstrapper := flag.Bool("bootstrapper", false, "run as a bootstrap peer") + var directPeers stringSlice + flag.Var(&directPeers, "directpeer", "reciprocal gossipsub bootstrap peers (can be used multiple times)") + var addrsToConnectTo stringSlice flag.Var(&addrsToConnectTo, "connect", "address to connect to (can be used multiple times)") @@ -200,6 +203,11 @@ func main() { if *bootstrapper { gossipSubOpts = append(gossipSubOpts, pubsub.WithPeerExchange(true)) + if len(directPeers) > 0 { + dp := peerStrSliceToAddrInfoSlice(directPeers) + gossipSubOpts = append(gossipSubOpts, pubsub.WithDirectPeers(dp)) + } + pubsub.WithFloodPublish(true) // See https://github.com/libp2p/specs/blob/master/pubsub/gossipsub/gossipsub-v1.1.md#recommendations-for-network-operators @@ -281,6 +289,24 @@ func main() { } } +func peerStrSliceToAddrInfoSlice(peerStrs []string) []peer.AddrInfo { + var addrInfos []peer.AddrInfo + + if len(peerStrs) > 0 { + for _, addr := range peerStrs { + peerInfo, err := peer.AddrInfoFromString(addr) + if err != nil { + LogMsgf("Failed to parse multiaddr: %s", err.Error()) + continue + } + + addrInfos = append(addrInfos, *peerInfo) + } + } + + return addrInfos +} + // printErr is like fmt.Printf, but writes to stderr. func printErr(m string, args ...interface{}) { fmt.Fprintf(os.Stderr, m, args...) From 03e1772d4b136260908db4e2fc53173e272649ff Mon Sep 17 00:00:00 2001 From: dozyio Date: Thu, 19 Dec 2024 19:46:37 +0000 Subject: [PATCH 4/5] add directConnectTicks to go-peer --- go-peer/main.go | 1 + 1 file changed, 1 insertion(+) diff --git a/go-peer/main.go b/go-peer/main.go index 5394f16..16df7af 100644 --- a/go-peer/main.go +++ b/go-peer/main.go @@ -206,6 +206,7 @@ func main() { if len(directPeers) > 0 { dp := peerStrSliceToAddrInfoSlice(directPeers) gossipSubOpts = append(gossipSubOpts, pubsub.WithDirectPeers(dp)) + pubsub.WithDirectConnectTicks(60) // attempt to reconnect to direct peers every 60 ticks (seconds) } pubsub.WithFloodPublish(true) From a57f1e29fbae54e05ac7106193975dc73a2ceca3 Mon Sep 17 00:00:00 2001 From: dozyio Date: Thu, 19 Dec 2024 19:48:31 +0000 Subject: [PATCH 5/5] chore: restore js-peer/src/lib/libp2p.ts --- js-peer/src/lib/libp2p.ts | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/js-peer/src/lib/libp2p.ts b/js-peer/src/lib/libp2p.ts index 054c5ed..c1b80fc 100644 --- a/js-peer/src/lib/libp2p.ts +++ b/js-peer/src/lib/libp2p.ts @@ -100,17 +100,17 @@ export async function startLibp2p(): Promise { log(`changed multiaddrs: peer ${peer.id.toString()} multiaddrs: ${multiaddrs}`) }) - // // 👇 explicitly dial peers discovered via pubsub - // libp2p.addEventListener('peer:discovery', (event) => { - // const { multiaddrs, id } = event.detail - // - // if (libp2p.getConnections(id)?.length > 0) { - // log(`Already connected to peer %s. Will not try dialling`, id) - // return - // } - // - // dialWebRTCMaddrs(libp2p, multiaddrs) - // }) + // 👇 explicitly dial peers discovered via pubsub + libp2p.addEventListener('peer:discovery', (event) => { + const { multiaddrs, id } = event.detail + + if (libp2p.getConnections(id)?.length > 0) { + log(`Already connected to peer %s. Will not try dialling`, id) + return + } + + dialWebRTCMaddrs(libp2p, multiaddrs) + }) return libp2p } @@ -200,4 +200,4 @@ export const getFormattedConnections = (connections: Connection[]) => connections.map((conn) => ({ peerId: conn.remotePeer, protocols: [...new Set(conn.remoteAddr.protoNames())], - })) + })) \ No newline at end of file