From 993d92300894ec82b69afb1d8acd3909a6903c66 Mon Sep 17 00:00:00 2001 From: Dennis Trautwein Date: Wed, 16 Apr 2025 13:28:55 +0200 Subject: [PATCH 1/5] add: gossipsub px flag --- cmd/nebula/cmd_crawl.go | 38 ++++++++++++++++++++++++-------------- config/config.go | 3 +++ libp2p/crawler.go | 2 ++ libp2p/driver_crawler.go | 2 ++ 4 files changed, 31 insertions(+), 14 deletions(-) diff --git a/cmd/nebula/cmd_crawl.go b/cmd/nebula/cmd_crawl.go index 58d46062..7e6c8822 100644 --- a/cmd/nebula/cmd_crawl.go +++ b/cmd/nebula/cmd_crawl.go @@ -27,20 +27,21 @@ import ( ) var crawlConfig = &config.Crawl{ - Root: rootConfig, - CrawlWorkerCount: 1000, - WriteWorkerCount: 10, - CrawlLimit: 0, - PersistNeighbors: false, - FilePathUdgerDB: "", - Network: string(config.NetworkIPFS), - BootstrapPeers: cli.NewStringSlice(), - Protocols: cli.NewStringSlice(string(kaddht.ProtocolDHT)), - AddrTrackTypeStr: "public", - AddrDialTypeStr: "public", - KeepENR: false, - CheckExposed: false, - UDPRespTimeout: 3 * time.Second, + Root: rootConfig, + CrawlWorkerCount: 1000, + WriteWorkerCount: 10, + CrawlLimit: 0, + PersistNeighbors: false, + FilePathUdgerDB: "", + Network: string(config.NetworkIPFS), + BootstrapPeers: cli.NewStringSlice(), + Protocols: cli.NewStringSlice(string(kaddht.ProtocolDHT)), + AddrTrackTypeStr: "public", + AddrDialTypeStr: "public", + KeepENR: false, + CheckExposed: false, + UDPRespTimeout: 3 * time.Second, + EnableGossipSubPX: false, } // CrawlCommand contains the crawl sub-command configuration. @@ -172,6 +173,13 @@ var CrawlCommand = &cli.Command{ Value: crawlConfig.Network, Destination: &crawlConfig.Network, }, + &cli.BoolFlag{ + Name: "gossipsub-px", + Usage: "Whether to enable gossipsub peer exchange crawling", + EnvVars: []string{"NEBULA_CRAWL_GOSSIPSUB_PX"}, + Value: crawlConfig.EnableGossipSubPX, + Destination: &crawlConfig.EnableGossipSubPX, + }, &cli.BoolFlag{ Name: "check-exposed", Usage: "IPFS/AMINO: Whether to check if the Kubo API is exposed. Checking also includes crawling the API.", @@ -458,6 +466,7 @@ func CrawlAction(c *cli.Context) error { // configure the crawl driver driverCfg := &libp2p.CrawlDriverConfig{ Version: cfg.Root.Version(), + WorkerCount: cfg.CrawlWorkerCount, Network: config.Network(cfg.Network), Protocols: cfg.Protocols.Value(), DialTimeout: cfg.Root.DialTimeout, @@ -467,6 +476,7 @@ func CrawlAction(c *cli.Context) error { AddrTrackType: cfg.AddrTrackType(), TracerProvider: cfg.Root.TracerProvider, MeterProvider: cfg.Root.MeterProvider, + GossipSubPX: cfg.EnableGossipSubPX, LogErrors: cfg.Root.LogErrors, } diff --git a/config/config.go b/config/config.go index 2837a140..8358257d 100644 --- a/config/config.go +++ b/config/config.go @@ -422,6 +422,9 @@ type Crawl struct { // WakuClusterShards defines shard indices for Waku cluster operations. WakuClusterShards *cli.IntSlice + + // EnabledGossipSub defines whether to activate gossipsub PX crawling + EnableGossipSubPX bool } func (c *Crawl) AddrTrackType() AddrType { diff --git a/libp2p/crawler.go b/libp2p/crawler.go index fbf20e67..7d905e8a 100644 --- a/libp2p/crawler.go +++ b/libp2p/crawler.go @@ -26,6 +26,7 @@ type CrawlerConfig struct { CheckExposed bool AddrDialType config.AddrType LogErrors bool + GossipSubPX bool Clock clock.Clock } @@ -35,6 +36,7 @@ func DefaultCrawlerConfig() *CrawlerConfig { CheckExposed: false, AddrDialType: config.AddrTypePublic, LogErrors: false, + GossipSubPX: false, Clock: clock.New(), } } diff --git a/libp2p/driver_crawler.go b/libp2p/driver_crawler.go index 31f8d38e..1a61efa2 100644 --- a/libp2p/driver_crawler.go +++ b/libp2p/driver_crawler.go @@ -75,6 +75,7 @@ func (p PeerInfo) DeduplicationKey() string { type CrawlDriverConfig struct { Version string + WorkerCount int Network config.Network Protocols []string DialTimeout time.Duration @@ -84,6 +85,7 @@ type CrawlDriverConfig struct { AddrDialType config.AddrType MeterProvider metric.MeterProvider TracerProvider trace.TracerProvider + GossipSubPX bool LogErrors bool } From 0ea186e964559067769fa19112ca84dc4d91ac68 Mon Sep 17 00:00:00 2001 From: Dennis Trautwein Date: Wed, 16 Apr 2025 13:30:00 +0200 Subject: [PATCH 2/5] update: filecoin bootstrappers --- config/bootstrap.go | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/config/bootstrap.go b/config/bootstrap.go index b353aeb1..d5bd887d 100644 --- a/config/bootstrap.go +++ b/config/bootstrap.go @@ -5,15 +5,14 @@ var ( // BootstrapPeersFilecoin extracted from: // https://github.com/filecoin-project/lotus/blob/b691adc4874e5e28353f036c077c08ef00ec3b2b/build/bootstrap/mainnet.pi BootstrapPeersFilecoin = []string{ - "/dns4/lotus-bootstrap.ipfsforce.com/tcp/41778/p2p/12D3KooWGhufNmZHF3sv48aQeS13ng5XVJZ9E6qy2Ms4VzqeUsHk", - "/dns4/bootstrap-0.starpool.in/tcp/12757/p2p/12D3KooWGHpBMeZbestVEWkfdnC9u7p6uFHXL1n7m1ZBqsEmiUzz", - "/dns4/bootstrap-1.starpool.in/tcp/12757/p2p/12D3KooWQZrGH1PxSNZPum99M1zNvjNFM33d1AAu5DcvdHptuU7u", - "/dns4/node.glif.io/tcp/1235/p2p/12D3KooWBF8cpp65hp2u9LK5mh19x67ftAam84z9LsfaquTDSBpt", - "/dns4/bootstarp-0.1475.io/tcp/61256/p2p/12D3KooWRzCVDwHUkgdK7eRgnoXbjDAELhxPErjHzbRLguSV1aRt", - "/dns4/bootstrap-venus.mainnet.filincubator.com/tcp/8888/p2p/QmQu8C6deXwKvJP2D8B6QGyhngc3ZiDnFzEHBDx8yeBXST", - "/dns4/bootstrap-mainnet-0.chainsafe-fil.io/tcp/34000/p2p/12D3KooWKKkCZbcigsWTEu1cgNetNbZJqeNtysRtFpq7DTqw3eqH", - "/dns4/bootstrap-mainnet-1.chainsafe-fil.io/tcp/34000/p2p/12D3KooWGnkd9GQKo3apkShQDaq1d6cKJJmsVe6KiQkacUk1T8oZ", - "/dns4/bootstrap-mainnet-2.chainsafe-fil.io/tcp/34000/p2p/12D3KooWHQRSDFv4FvAjtU32shQ7znz7oRbLBryXzZ9NMK2feyyH", + "/dns/node.glif.io/tcp/1235/p2p/12D3KooWBF8cpp65hp2u9LK5mh19x67ftAam84z9LsfaquTDSBpt", + "/dns/bootstrap-venus.mainnet.filincubator.com/tcp/8888/p2p/QmQu8C6deXwKvJP2D8B6QGyhngc3ZiDnFzEHBDx8yeBXST", + "/dns/bootstrap-mainnet-0.chainsafe-fil.io/tcp/34000/p2p/12D3KooWKKkCZbcigsWTEu1cgNetNbZJqeNtysRtFpq7DTqw3eqH", + "/dns/bootstrap-mainnet-1.chainsafe-fil.io/tcp/34000/p2p/12D3KooWGnkd9GQKo3apkShQDaq1d6cKJJmsVe6KiQkacUk1T8oZ", + "/dns/bootstrap-mainnet-2.chainsafe-fil.io/tcp/34000/p2p/12D3KooWHQRSDFv4FvAjtU32shQ7znz7oRbLBryXzZ9NMK2feyyH", + "/dns/n1.mainnet.fil.devtty.eu/udp/443/quic-v1/p2p/12D3KooWAke3M2ji7tGNKx3BQkTHCyxVhtV1CN68z6Fkrpmfr37F", + "/dns/n1.mainnet.fil.devtty.eu/tcp/443/p2p/12D3KooWAke3M2ji7tGNKx3BQkTHCyxVhtV1CN68z6Fkrpmfr37F", + "/dns/n1.mainnet.fil.devtty.eu/udp/443/quic-v1/webtransport/certhash/uEiAWlgd8EqbNhYLv86OdRvXHMosaUWFFDbhgGZgCkcmKnQ/certhash/uEiAvtq6tvZOZf_sIuityDDTyAXDJPfXSRRDK2xy9UVPsqA/p2p/12D3KooWAke3M2ji7tGNKx3BQkTHCyxVhtV1CN68z6Fkrpmfr37F", } // BootstrapPeersKusama extracted from: From 6e34d4378153d4bf5ce654e1fda567c220af5082 Mon Sep 17 00:00:00 2001 From: Dennis Trautwein Date: Wed, 16 Apr 2025 13:30:10 +0200 Subject: [PATCH 3/5] fix: log message typo --- discv4/driver_crawler.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/discv4/driver_crawler.go b/discv4/driver_crawler.go index 2f118ef6..1632085a 100644 --- a/discv4/driver_crawler.go +++ b/discv4/driver_crawler.go @@ -371,7 +371,7 @@ func (d *CrawlDriver) Close() { select { case <-d.tasksChan: case <-time.After(time.Second): - log.Warnln("Timed out waiting for packetsDone channel to close") + log.Warnln("Timed out waiting for tasksChan channel to close") } } From 50aade4971ed6e7ece3d02870e273ab06eeb0be5 Mon Sep 17 00:00:00 2001 From: Dennis Trautwein Date: Wed, 16 Apr 2025 13:30:19 +0200 Subject: [PATCH 4/5] bump: dependencies --- go.mod | 63 ++++++++++++++++-------------- go.sum | 121 ++++++++++++++++++++++++++++----------------------------- 2 files changed, 94 insertions(+), 90 deletions(-) diff --git a/go.mod b/go.mod index d3c3ceff..b166d152 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,8 @@ module github.com/dennis-tra/nebula-crawler -go 1.23 +go 1.23.0 + +toolchain go1.23.2 require ( github.com/ClickHouse/clickhouse-go/v2 v2.31.0 @@ -8,24 +10,26 @@ require ( github.com/btcsuite/btcd v0.24.2 github.com/cenkalti/backoff/v4 v4.3.0 github.com/deckarep/golang-set/v2 v2.7.0 - github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0 + github.com/decred/dcrd/dcrec/secp256k1/v4 v4.4.0 github.com/ethereum/go-ethereum v1.15.1 github.com/friendsofgo/errors v0.9.2 + github.com/gogo/protobuf v1.3.2 github.com/golang-migrate/migrate/v4 v4.18.2 github.com/google/uuid v1.6.0 github.com/hashicorp/golang-lru v1.0.2 github.com/lib/pq v1.10.9 - github.com/libp2p/go-libp2p v0.39.1 + github.com/libp2p/go-libp2p v0.41.1 github.com/libp2p/go-libp2p-kad-dht v0.29.0 github.com/libp2p/go-libp2p-kbucket v0.6.5 - github.com/libp2p/go-libp2p-mplex v0.9.0 + github.com/libp2p/go-libp2p-mplex v0.10.0 + github.com/libp2p/go-libp2p-pubsub v0.13.1 github.com/libp2p/go-msgio v0.3.0 github.com/mattn/go-sqlite3 v1.14.24 - github.com/multiformats/go-multiaddr v0.14.0 + github.com/multiformats/go-multiaddr v0.15.0 github.com/multiformats/go-multiaddr-dns v0.4.1 github.com/oschwald/geoip2-golang v1.11.0 github.com/prometheus-community/ecs_exporter v0.3.0 - github.com/prometheus/client_golang v1.20.5 + github.com/prometheus/client_golang v1.21.0 github.com/protolambda/zrnt v0.33.1 github.com/protolambda/ztyp v0.2.2 github.com/sirupsen/logrus v1.9.3 @@ -46,8 +50,8 @@ require ( go.uber.org/atomic v1.11.0 go.uber.org/goleak v1.3.0 go.uber.org/mock v0.5.0 - golang.org/x/net v0.35.0 - golang.org/x/sync v0.11.0 + golang.org/x/net v0.39.0 + golang.org/x/sync v0.13.0 ) require ( @@ -98,7 +102,6 @@ require ( github.com/godbus/dbus/v5 v5.1.0 // indirect github.com/gofrs/flock v0.12.1 // indirect github.com/gofrs/uuid v4.4.0+incompatible // indirect - github.com/gogo/protobuf v1.3.2 // indirect github.com/golang-jwt/jwt/v4 v4.5.1 // indirect github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect github.com/google/gopacket v1.1.19 // indirect @@ -108,6 +111,7 @@ require ( github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.1 // indirect github.com/hashicorp/errwrap v1.1.0 // indirect github.com/hashicorp/go-multierror v1.1.1 // indirect + github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect github.com/holiman/bloomfilter/v2 v2.0.3 // indirect github.com/holiman/uint256 v1.3.2 // indirect github.com/huin/goupnp v1.3.0 // indirect @@ -121,8 +125,8 @@ require ( github.com/jbenet/goprocess v0.1.4 // indirect github.com/jmespath/go-jmespath v0.4.0 // indirect github.com/kilic/bls12-381 v0.1.0 // indirect - github.com/klauspost/compress v1.17.11 // indirect - github.com/klauspost/cpuid/v2 v2.2.9 // indirect + github.com/klauspost/compress v1.18.0 // indirect + github.com/klauspost/cpuid/v2 v2.2.10 // indirect github.com/koron/go-ssdp v0.0.5 // indirect github.com/kr/pretty v0.3.1 // indirect github.com/kr/text v0.2.0 // indirect @@ -133,10 +137,9 @@ require ( github.com/libp2p/go-libp2p-record v0.3.1 // indirect github.com/libp2p/go-libp2p-routing-helpers v0.7.4 // indirect github.com/libp2p/go-mplex v0.7.0 // indirect - github.com/libp2p/go-nat v0.2.0 // indirect github.com/libp2p/go-netroute v0.2.2 // indirect github.com/libp2p/go-reuseport v0.4.0 // indirect - github.com/libp2p/go-yamux/v4 v4.0.2 // indirect + github.com/libp2p/go-yamux/v5 v5.0.0 // indirect github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd // indirect github.com/mattn/go-isatty v0.0.20 // indirect github.com/mattn/go-runewidth v0.0.16 // indirect @@ -167,21 +170,23 @@ require ( github.com/pierrec/lz4/v4 v4.1.22 // indirect github.com/pion/datachannel v1.5.10 // indirect github.com/pion/dtls/v2 v2.2.12 // indirect - github.com/pion/ice/v2 v2.3.37 // indirect + github.com/pion/dtls/v3 v3.0.4 // indirect + github.com/pion/ice/v4 v4.0.6 // indirect github.com/pion/interceptor v0.1.37 // indirect github.com/pion/logging v0.2.3 // indirect - github.com/pion/mdns v0.0.12 // indirect + github.com/pion/mdns/v2 v2.0.7 // indirect github.com/pion/randutil v0.1.0 // indirect github.com/pion/rtcp v1.2.15 // indirect github.com/pion/rtp v1.8.11 // indirect - github.com/pion/sctp v1.8.35 // indirect + github.com/pion/sctp v1.8.36 // indirect github.com/pion/sdp/v3 v3.0.10 // indirect - github.com/pion/srtp/v2 v2.0.20 // indirect + github.com/pion/srtp/v3 v3.0.4 // indirect github.com/pion/stun v0.6.1 // indirect + github.com/pion/stun/v3 v3.0.0 // indirect github.com/pion/transport/v2 v2.2.10 // indirect github.com/pion/transport/v3 v3.0.7 // indirect - github.com/pion/turn/v2 v2.1.6 // indirect - github.com/pion/webrtc/v3 v3.3.5 // indirect + github.com/pion/turn/v4 v4.0.0 // indirect + github.com/pion/webrtc/v4 v4.0.10 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/polydawn/refmt v0.89.0 // indirect @@ -190,7 +195,7 @@ require ( github.com/prometheus/procfs v0.15.1 // indirect github.com/protolambda/bls12-381-util v0.1.0 // indirect github.com/quic-go/qpack v0.5.1 // indirect - github.com/quic-go/quic-go v0.49.0 // indirect + github.com/quic-go/quic-go v0.50.0 // indirect github.com/quic-go/webtransport-go v0.8.1-0.20241018022711-4ac2c9250e66 // indirect github.com/raulk/go-watchdog v1.3.0 // indirect github.com/rivo/uniseg v0.4.7 // indirect @@ -222,20 +227,20 @@ require ( go.uber.org/fx v1.23.0 // indirect go.uber.org/multierr v1.11.0 // indirect go.uber.org/zap v1.27.0 // indirect - golang.org/x/crypto v0.33.0 // indirect - golang.org/x/exp v0.0.0-20250210185358-939b2ce775ac // indirect - golang.org/x/mod v0.23.0 // indirect - golang.org/x/sys v0.30.0 // indirect - golang.org/x/text v0.22.0 // indirect - golang.org/x/tools v0.30.0 // indirect + golang.org/x/crypto v0.37.0 // indirect + golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 // indirect + golang.org/x/mod v0.24.0 // indirect + golang.org/x/sys v0.32.0 // indirect + golang.org/x/text v0.24.0 // indirect + golang.org/x/tools v0.32.0 // indirect golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da // indirect gonum.org/v1/gonum v0.15.1 // indirect google.golang.org/genproto/googleapis/api v0.0.0-20250212204824-5a70512c5d8b // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20250212204824-5a70512c5d8b // indirect google.golang.org/grpc v1.70.0 // indirect - google.golang.org/protobuf v1.36.5 // indirect + google.golang.org/protobuf v1.36.6 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect - lukechampine.com/blake3 v1.3.0 // indirect + lukechampine.com/blake3 v1.4.0 // indirect rsc.io/tmplfunc v0.0.3 // indirect ) @@ -248,5 +253,5 @@ replace ( // replace go-libp2p with fork (branch nebula-v0.38.2). Changes: // - avoid running into dial backoffs even if forceDirectDial is set to false // - exports closeable host - github.com/libp2p/go-libp2p => github.com/probe-lab/go-libp2p v0.38.3-0.20250219152713-c85063380ac0 + github.com/libp2p/go-libp2p => github.com/probe-lab/go-libp2p v0.38.2-0.20250414195430-e33a86ad9d10 ) diff --git a/go.sum b/go.sum index 3380604f..8b895238 100644 --- a/go.sum +++ b/go.sum @@ -201,10 +201,10 @@ github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c h1:pFUpOrbxDR github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c/go.mod h1:6UhI8N9EjYm1c2odKpFpAYeR8dsBeM7PtzQhRgxRr9U= github.com/deckarep/golang-set/v2 v2.7.0 h1:gIloKvD7yH2oip4VLhsv3JyLLFnC0Y2mlusgcvJYW5k= github.com/deckarep/golang-set/v2 v2.7.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= -github.com/decred/dcrd/crypto/blake256 v1.0.1 h1:7PltbUIQB7u/FfZ39+DGa/ShuMyJ5ilcvdfma9wOH6Y= -github.com/decred/dcrd/crypto/blake256 v1.0.1/go.mod h1:2OfgNZ5wDpcsFmHmCK5gZTPcCXqlm2ArzUIkw9czNJo= -github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0 h1:rpfIENRNNilwHwZeG5+P150SMrnNEcHYvcCuK6dPZSg= -github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0/go.mod h1:v57UDF4pDQJcEfFUCRop3lJL149eHGSe9Jvczhzjo/0= +github.com/decred/dcrd/crypto/blake256 v1.1.0 h1:zPMNGQCm0g4QTY27fOCorQW7EryeQ/U0x++OzVrdms8= +github.com/decred/dcrd/crypto/blake256 v1.1.0/go.mod h1:2OfgNZ5wDpcsFmHmCK5gZTPcCXqlm2ArzUIkw9czNJo= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.4.0 h1:NMZiJj8QnKe1LgsbDayM4UoHwbvwDRwnI3hwNaAHRnc= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.4.0/go.mod h1:ZXNYxsqcloTdSy/rNShjYzMhyjf0LaoftYK0p+A3h40= github.com/dhui/dktest v0.4.4 h1:+I4s6JRE1yGuqflzwqG+aIaMdgXIorCf5P98JnaAWa8= github.com/dhui/dktest v0.4.4/go.mod h1:4+22R4lgsdAXrDyaH4Nqx2JEz2hLp49MqQmm9HLCQhM= github.com/distribution/reference v0.6.0 h1:0IXCQ5g4/QMHHkarYzh5l+u8T3t73zM5QvfrDyIgxBk= @@ -412,7 +412,6 @@ github.com/google/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3 github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gax-go v2.0.0+incompatible/go.mod h1:SFVmujtThgffbyetf+mdk2eWhX2bMyUtNHzFKcPA9HY= @@ -468,6 +467,8 @@ github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c= github.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= +github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k= +github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= github.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc= @@ -542,10 +543,10 @@ github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQL github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= -github.com/klauspost/compress v1.17.11 h1:In6xLpyWOi1+C7tXUUWv2ot1QvBjxevKAaI6IXrJmUc= -github.com/klauspost/compress v1.17.11/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90U12bZKk7uwG0= -github.com/klauspost/cpuid/v2 v2.2.9 h1:66ze0taIn2H33fBvCkXuv9BmCwDfafmiIVpKV9kKGuY= -github.com/klauspost/cpuid/v2 v2.2.9/go.mod h1:rqkxqrZ1EhYM9G+hXH7YdowN5R5RGN6NK4QwQ3WMXF8= +github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= +github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= +github.com/klauspost/cpuid/v2 v2.2.10 h1:tBs3QSyvjDyFTq3uoc/9xFpCuOsJQFNPiAhYdw2skhE= +github.com/klauspost/cpuid/v2 v2.2.10/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/koron/go-ssdp v0.0.5 h1:E1iSMxIs4WqxTbIBLtmNBeOOC+1sCIXQeqTWVnpmwhk= @@ -583,8 +584,10 @@ github.com/libp2p/go-libp2p-kad-dht v0.29.0 h1:045eW21lGlMSD9aKSZZGH4fnBMIInPwQL github.com/libp2p/go-libp2p-kad-dht v0.29.0/go.mod h1:mIci3rHSwDsxQWcCjfmxD8vMTgh5xLuvwb1D5WP8ZNk= github.com/libp2p/go-libp2p-kbucket v0.6.5 h1:Fsl1YvZcMwqrR4DYrTO02yo9PGYs2HBQIT3lGXFMTxg= github.com/libp2p/go-libp2p-kbucket v0.6.5/go.mod h1:U6WOd0BvnSp03IQSrjgM54tg7zh1UUNsXLJqAQzClTA= -github.com/libp2p/go-libp2p-mplex v0.9.0 h1:R58pDRAmuBXkYugbSSXR9wrTX3+1pFM1xP2bLuodIq8= -github.com/libp2p/go-libp2p-mplex v0.9.0/go.mod h1:ro1i4kuwiFT+uMPbIDIFkcLs1KRbNp0QwnUXM+P64Og= +github.com/libp2p/go-libp2p-mplex v0.10.0 h1:6NKusNu1cw1A/RKb+Lm5aPGFk7HWVIXxl2azpwWqUxc= +github.com/libp2p/go-libp2p-mplex v0.10.0/go.mod h1:7RT3qPFhDqz4yp5K5QwZB5vE902N8DmED3+e453fNrg= +github.com/libp2p/go-libp2p-pubsub v0.13.1 h1:tV3ttzzZSCk0EtEXnxVmWIXgjVxXx+20Jwjbs/Ctzjo= +github.com/libp2p/go-libp2p-pubsub v0.13.1/go.mod h1:MKPU5vMI8RRFyTP0HfdsF9cLmL1nHAeJm44AxJGJx44= github.com/libp2p/go-libp2p-record v0.3.1 h1:cly48Xi5GjNw5Wq+7gmjfBiG9HCzQVkiZOUZ8kUl+Fg= github.com/libp2p/go-libp2p-record v0.3.1/go.mod h1:T8itUkLcWQLCYMqtX7Th6r7SexyUJpIyPgks757td/E= github.com/libp2p/go-libp2p-routing-helpers v0.7.4 h1:6LqS1Bzn5CfDJ4tzvP9uwh42IB7TJLNFJA6dEeGBv84= @@ -595,14 +598,12 @@ github.com/libp2p/go-mplex v0.7.0 h1:BDhFZdlk5tbr0oyFq/xv/NPGfjbnrsDam1EvutpBDbY github.com/libp2p/go-mplex v0.7.0/go.mod h1:rW8ThnRcYWft/Jb2jeORBmPd6xuG3dGxWN/W168L9EU= github.com/libp2p/go-msgio v0.3.0 h1:mf3Z8B1xcFN314sWX+2vOTShIE0Mmn2TXn3YCUQGNj0= github.com/libp2p/go-msgio v0.3.0/go.mod h1:nyRM819GmVaF9LX3l03RMh10QdOroF++NBbxAb0mmDM= -github.com/libp2p/go-nat v0.2.0 h1:Tyz+bUFAYqGyJ/ppPPymMGbIgNRH+WqC5QrT5fKrrGk= -github.com/libp2p/go-nat v0.2.0/go.mod h1:3MJr+GRpRkyT65EpVPBstXLvOlAPzUVlG6Pwg9ohLJk= github.com/libp2p/go-netroute v0.2.2 h1:Dejd8cQ47Qx2kRABg6lPwknU7+nBnFRpko45/fFPuZ8= github.com/libp2p/go-netroute v0.2.2/go.mod h1:Rntq6jUAH0l9Gg17w5bFGhcC9a+vk4KNXs6s7IljKYE= github.com/libp2p/go-reuseport v0.4.0 h1:nR5KU7hD0WxXCJbmw7r2rhRYruNRl2koHw8fQscQm2s= github.com/libp2p/go-reuseport v0.4.0/go.mod h1:ZtI03j/wO5hZVDFo2jKywN6bYKWLOy8Se6DrI2E1cLU= -github.com/libp2p/go-yamux/v4 v4.0.2 h1:nrLh89LN/LEiqcFiqdKDRHjGstN300C1269K/EX0CPU= -github.com/libp2p/go-yamux/v4 v4.0.2/go.mod h1:C808cCRgOs1iBwY4S71T5oxgMxgLmqUw56qh4AeBW2o= +github.com/libp2p/go-yamux/v5 v5.0.0 h1:2djUh96d3Jiac/JpGkKs4TO49YhsfLopAoryfPmf+Po= +github.com/libp2p/go-yamux/v5 v5.0.0/go.mod h1:en+3cdX51U0ZslwRdRLrvQsdayFt3TSUKvBGErzpWbU= github.com/lunixbochs/vtclean v1.0.0/go.mod h1:pHhQNgMf3btfWnGBVipUOjRYhoOsdGqdm/+2c2E2WMI= github.com/magiconair/properties v1.8.6/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= @@ -686,8 +687,8 @@ github.com/multiformats/go-base32 v0.1.0/go.mod h1:Kj3tFY6zNr+ABYMqeUNeGvkIC/UYg github.com/multiformats/go-base36 v0.2.0 h1:lFsAbNOGeKtuKozrtBsAkSVhv1p9D0/qedU9rQyccr0= github.com/multiformats/go-base36 v0.2.0/go.mod h1:qvnKE++v+2MWCfePClUEjE78Z7P2a1UV0xHgWc0hkp4= github.com/multiformats/go-multiaddr v0.1.1/go.mod h1:aMKBKNEYmzmDmxfX88/vz+J5IU55txyt0p4aiWVohjo= -github.com/multiformats/go-multiaddr v0.14.0 h1:bfrHrJhrRuh/NXH5mCnemjpbGjzRw/b+tJFOD41g2tU= -github.com/multiformats/go-multiaddr v0.14.0/go.mod h1:6EkVAxtznq2yC3QT5CM1UTAwG0GTP3EWAIcjHuzQ+r4= +github.com/multiformats/go-multiaddr v0.15.0 h1:zB/HeaI/apcZiTDwhY5YqMvNVl/oQYvs3XySU+qeAVo= +github.com/multiformats/go-multiaddr v0.15.0/go.mod h1:JSVUmXDjsVFiW7RjIFMP7+Ev+h1DTbiJgVeTV/tcmP0= github.com/multiformats/go-multiaddr-dns v0.4.1 h1:whi/uCLbDS3mSEUMb1MsoT4uzUeZB0N32yzufqS0i5M= github.com/multiformats/go-multiaddr-dns v0.4.1/go.mod h1:7hfthtB4E4pQwirrz+J0CcDUfbWzTqEzVyYKKIKpgkc= github.com/multiformats/go-multiaddr-fmt v0.1.0 h1:WLEFClPycPkp4fnIzoFoV9FVd49/eQsuaL3/CWe167E= @@ -760,44 +761,43 @@ github.com/pion/datachannel v1.5.10/go.mod h1:p/jJfC9arb29W7WrxyKbepTU20CFgyx5oL github.com/pion/dtls/v2 v2.2.7/go.mod h1:8WiMkebSHFD0T+dIU+UeBaoV7kDhOW5oDCzZ7WZ/F9s= github.com/pion/dtls/v2 v2.2.12 h1:KP7H5/c1EiVAAKUmXyCzPiQe5+bCJrpOeKg/L05dunk= github.com/pion/dtls/v2 v2.2.12/go.mod h1:d9SYc9fch0CqK90mRk1dC7AkzzpwJj6u2GU3u+9pqFE= -github.com/pion/ice/v2 v2.3.37 h1:ObIdaNDu1rCo7hObhs34YSBcO7fjslJMZV0ux+uZWh0= -github.com/pion/ice/v2 v2.3.37/go.mod h1:mBF7lnigdqgtB+YHkaY/Y6s6tsyRyo4u4rPGRuOjUBQ= +github.com/pion/dtls/v3 v3.0.4 h1:44CZekewMzfrn9pmGrj5BNnTMDCFwr+6sLH+cCuLM7U= +github.com/pion/dtls/v3 v3.0.4/go.mod h1:R373CsjxWqNPf6MEkfdy3aSe9niZvL/JaKlGeFphtMg= +github.com/pion/ice/v4 v4.0.6 h1:jmM9HwI9lfetQV/39uD0nY4y++XZNPhvzIPCb8EwxUM= +github.com/pion/ice/v4 v4.0.6/go.mod h1:y3M18aPhIxLlcO/4dn9X8LzLLSma84cx6emMSu14FGw= github.com/pion/interceptor v0.1.37 h1:aRA8Zpab/wE7/c0O3fh1PqY0AJI3fCSEM5lRWJVorwI= github.com/pion/interceptor v0.1.37/go.mod h1:JzxbJ4umVTlZAf+/utHzNesY8tmRkM2lVmkS82TTj8Y= github.com/pion/logging v0.2.2/go.mod h1:k0/tDVsRCX2Mb2ZEmTqNa7CWsQPc+YYCB7Q+5pahoms= github.com/pion/logging v0.2.3 h1:gHuf0zpoh1GW67Nr6Gj4cv5Z9ZscU7g/EaoC/Ke/igI= github.com/pion/logging v0.2.3/go.mod h1:z8YfknkquMe1csOrxK5kc+5/ZPAzMxbKLX5aXpbpC90= -github.com/pion/mdns v0.0.12 h1:CiMYlY+O0azojWDmxdNr7ADGrnZ+V6Ilfner+6mSVK8= -github.com/pion/mdns v0.0.12/go.mod h1:VExJjv8to/6Wqm1FXK+Ii/Z9tsVk/F5sD/N70cnYFbk= +github.com/pion/mdns/v2 v2.0.7 h1:c9kM8ewCgjslaAmicYMFQIde2H9/lrZpjBkN8VwoVtM= +github.com/pion/mdns/v2 v2.0.7/go.mod h1:vAdSYNAT0Jy3Ru0zl2YiW3Rm/fJCwIeM0nToenfOJKA= github.com/pion/randutil v0.1.0 h1:CFG1UdESneORglEsnimhUjf33Rwjubwj6xfiOXBa3mA= github.com/pion/randutil v0.1.0/go.mod h1:XcJrSMMbbMRhASFVOlj/5hQial/Y8oH/HVo7TBZq+j8= -github.com/pion/rtcp v1.2.12/go.mod h1:sn6qjxvnwyAkkPzPULIbVqSKI5Dv54Rv7VG0kNxh9L4= github.com/pion/rtcp v1.2.15 h1:LZQi2JbdipLOj4eBjK4wlVoQWfrZbh3Q6eHtWtJBZBo= github.com/pion/rtcp v1.2.15/go.mod h1:jlGuAjHMEXwMUHK78RgX0UmEJFV4zUKOFHR7OP+D3D0= -github.com/pion/rtp v1.8.3/go.mod h1:pBGHaFt/yW7bf1jjWAoUjpSNoDnw98KTMg+jWWvziqU= github.com/pion/rtp v1.8.11 h1:17xjnY5WO5hgO6SD3/NTIUPvSFw/PbLsIJyz1r1yNIk= github.com/pion/rtp v1.8.11/go.mod h1:8uMBJj32Pa1wwx8Fuv/AsFhn8jsgw+3rUC2PfoBZ8p4= -github.com/pion/sctp v1.8.35 h1:qwtKvNK1Wc5tHMIYgTDJhfZk7vATGVHhXbUDfHbYwzA= -github.com/pion/sctp v1.8.35/go.mod h1:EcXP8zCYVTRy3W9xtOF7wJm1L1aXfKRQzaM33SjQlzg= +github.com/pion/sctp v1.8.36 h1:owNudmnz1xmhfYje5L/FCav3V9wpPRePHle3Zi+P+M0= +github.com/pion/sctp v1.8.36/go.mod h1:cNiLdchXra8fHQwmIoqw0MbLLMs+f7uQ+dGMG2gWebE= github.com/pion/sdp/v3 v3.0.10 h1:6MChLE/1xYB+CjumMw+gZ9ufp2DPApuVSnDT8t5MIgA= github.com/pion/sdp/v3 v3.0.10/go.mod h1:88GMahN5xnScv1hIMTqLdu/cOcUkj6a9ytbncwMCq2E= -github.com/pion/srtp/v2 v2.0.20 h1:HNNny4s+OUmG280ETrCdgFndp4ufx3/uy85EawYEhTk= -github.com/pion/srtp/v2 v2.0.20/go.mod h1:0KJQjA99A6/a0DOVTu1PhDSw0CXF2jTkqOoMg3ODqdA= +github.com/pion/srtp/v3 v3.0.4 h1:2Z6vDVxzrX3UHEgrUyIGM4rRouoC7v+NiF1IHtp9B5M= +github.com/pion/srtp/v3 v3.0.4/go.mod h1:1Jx3FwDoxpRaTh1oRV8A/6G1BnFL+QI82eK4ms8EEJQ= github.com/pion/stun v0.6.1 h1:8lp6YejULeHBF8NmV8e2787BogQhduZugh5PdhDyyN4= github.com/pion/stun v0.6.1/go.mod h1:/hO7APkX4hZKu/D0f2lHzNyvdkTGtIy3NDmLR7kSz/8= +github.com/pion/stun/v3 v3.0.0 h1:4h1gwhWLWuZWOJIJR9s2ferRO+W3zA/b6ijOI6mKzUw= +github.com/pion/stun/v3 v3.0.0/go.mod h1:HvCN8txt8mwi4FBvS3EmDghW6aQJ24T+y+1TKjB5jyU= github.com/pion/transport/v2 v2.2.1/go.mod h1:cXXWavvCnFF6McHTft3DWS9iic2Mftcz1Aq29pGcU5g= -github.com/pion/transport/v2 v2.2.3/go.mod h1:q2U/tf9FEfnSBGSW6w5Qp5PFWRLRj3NjLhCCgpRK4p0= github.com/pion/transport/v2 v2.2.4/go.mod h1:q2U/tf9FEfnSBGSW6w5Qp5PFWRLRj3NjLhCCgpRK4p0= github.com/pion/transport/v2 v2.2.10 h1:ucLBLE8nuxiHfvkFKnkDQRYWYfp8ejf4YBOPfaQpw6Q= github.com/pion/transport/v2 v2.2.10/go.mod h1:sq1kSLWs+cHW9E+2fJP95QudkzbK7wscs8yYgQToO5E= -github.com/pion/transport/v3 v3.0.1/go.mod h1:UY7kiITrlMv7/IKgd5eTUcaahZx5oUN3l9SzK5f5xE0= github.com/pion/transport/v3 v3.0.7 h1:iRbMH05BzSNwhILHoBoAPxoB9xQgOaJk+591KC9P1o0= github.com/pion/transport/v3 v3.0.7/go.mod h1:YleKiTZ4vqNxVwh77Z0zytYi7rXHl7j6uPLGhhz9rwo= -github.com/pion/turn/v2 v2.1.3/go.mod h1:huEpByKKHix2/b9kmTAM3YoX6MKP+/D//0ClgUYR2fY= -github.com/pion/turn/v2 v2.1.6 h1:Xr2niVsiPTB0FPtt+yAWKFUkU1eotQbGgpTIld4x1Gc= -github.com/pion/turn/v2 v2.1.6/go.mod h1:huEpByKKHix2/b9kmTAM3YoX6MKP+/D//0ClgUYR2fY= -github.com/pion/webrtc/v3 v3.3.5 h1:ZsSzaMz/i9nblPdiAkZoP+E6Kmjw+jnyq3bEmU3EtRg= -github.com/pion/webrtc/v3 v3.3.5/go.mod h1:liNa+E1iwyzyXqNUwvoMRNQ10x8h8FOeJKL8RkIbamE= +github.com/pion/turn/v4 v4.0.0 h1:qxplo3Rxa9Yg1xXDxxH8xaqcyGUtbHYw4QSCvmFWvhM= +github.com/pion/turn/v4 v4.0.0/go.mod h1:MuPDkm15nYSklKpN8vWJ9W2M0PlyQZqYt1McGuxG7mA= +github.com/pion/webrtc/v4 v4.0.10 h1:Hq/JLjhqLxi+NmCtE8lnRPDr8H4LcNvwg8OxVcdv56Q= +github.com/pion/webrtc/v4 v4.0.10/go.mod h1:ViHLVaNpiuvaH8pdiuQxuA9awuE6KVzAXx3vVWilOck= github.com/pkg/browser v0.0.0-20210115035449-ce105d075bb4/go.mod h1:N6UoU20jOqggOuDwUaBQpluzLNDqif3kq9z2wpdYEfQ= github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8/go.mod h1:HKlIX3XHQyzLZPlr7++PzdhaXEj94dEiJgZDTsxEqUI= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= @@ -814,8 +814,8 @@ github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndr github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s= github.com/probe-lab/go-ethereum v0.0.0-20241105111838-95c73e73f0fd h1:OcEput0J/lenpTd1XLoAqX3ubTBnR1Sda4alJtJD+lQ= github.com/probe-lab/go-ethereum v0.0.0-20241105111838-95c73e73f0fd/go.mod h1:+l/fr42Mma+xBnhefL/+z11/hcmJ2egl+ScIVPjhc7E= -github.com/probe-lab/go-libp2p v0.38.3-0.20250219152713-c85063380ac0 h1:4rbIhznWVgyL7NdG3d0Hr1qLhanzZn0tbetwVq8M7p8= -github.com/probe-lab/go-libp2p v0.38.3-0.20250219152713-c85063380ac0/go.mod h1:QWV4zGL3O9nXKdHirIC59DoRcZ446dfkjbOJ55NEWFo= +github.com/probe-lab/go-libp2p v0.38.2-0.20250414195430-e33a86ad9d10 h1:jVxLakUaY/KuibEFH3Rrvu8p0fyc4ku+cRibwel4Rd8= +github.com/probe-lab/go-libp2p v0.38.2-0.20250414195430-e33a86ad9d10/go.mod h1:Be8QYqC4JW6Xq8buukNeoZJjyT1XUDcGoIooCHm1ye4= github.com/prometheus-community/ecs_exporter v0.3.0 h1:mpuGsM/4OLpkHPa+4QfgbU4V1G86JvEmLzsgMnGFlEo= github.com/prometheus-community/ecs_exporter v0.3.0/go.mod h1:VLDwTg6bZLILyAJghsw/dBOILPe4Tb6A9KCovDLUCe4= github.com/prometheus/client_golang v0.8.0/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= @@ -824,8 +824,8 @@ github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5Fsn github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= github.com/prometheus/client_golang v1.11.1/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= -github.com/prometheus/client_golang v1.20.5 h1:cxppBPuYhUnsO6yo/aoRol4L7q7UFfdm+bR9r+8l63Y= -github.com/prometheus/client_golang v1.20.5/go.mod h1:PIEt8X02hGcP8JWbeHyeZ53Y/jReSnHgO035n//V5WE= +github.com/prometheus/client_golang v1.21.0 h1:DIsaGmiaBkSangBgMtWdNfxbMNdku5IK6iNhrEqWvdA= +github.com/prometheus/client_golang v1.21.0/go.mod h1:U9NM32ykUErtVBxdvD3zfi+EuFkkaBvMb09mIfe0Zgg= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= @@ -855,8 +855,8 @@ github.com/protolambda/ztyp v0.2.2 h1:rVcL3vBu9W/aV646zF6caLS/dyn9BN8NYiuJzicLNy github.com/protolambda/ztyp v0.2.2/go.mod h1:9bYgKGqg3wJqT9ac1gI2hnVb0STQq7p/1lapqrqY1dU= github.com/quic-go/qpack v0.5.1 h1:giqksBPnT/HDtZ6VhtFKgoLOWmlyo9Ei6u9PqzIMbhI= github.com/quic-go/qpack v0.5.1/go.mod h1:+PC4XFrEskIVkcLzpEkbLqq1uCoxPhQuvK5rH1ZgaEg= -github.com/quic-go/quic-go v0.49.0 h1:w5iJHXwHxs1QxyBv1EHKuC50GX5to8mJAxvtnttJp94= -github.com/quic-go/quic-go v0.49.0/go.mod h1:s2wDnmCdooUQBmQfpUSTCYBl1/D4FcqbULMMkASvR6s= +github.com/quic-go/quic-go v0.50.0 h1:3H/ld1pa3CYhkcc20TPIyG1bNsdhn9qZBGN3b9/UyUo= +github.com/quic-go/quic-go v0.50.0/go.mod h1:Vim6OmUvlYdwBhXP9ZVrtGmCMWa3wEqhq3NgYrI8b4E= github.com/quic-go/webtransport-go v0.8.1-0.20241018022711-4ac2c9250e66 h1:4WFk6u3sOT6pLa1kQ50ZVdm8BQFgJNA117cepZxtLIg= github.com/quic-go/webtransport-go v0.8.1-0.20241018022711-4ac2c9250e66/go.mod h1:Vp72IJajgeOL6ddqrAhmp7IM9zbTcgkQxD/YdxrVwMw= github.com/raulk/go-watchdog v1.3.0 h1:oUmdlHxdkXRJlwfG0O9omj8ukerm8MEQavSiDTEtBsk= @@ -1108,8 +1108,8 @@ golang.org/x/crypto v0.0.0-20220826181053-bd7e27e6170d/go.mod h1:IxCIyHEi3zRg3s0 golang.org/x/crypto v0.8.0/go.mod h1:mRqEX+O9/h5TFCrQhkgjo2yKi0yYA+9ecGkdQoHrywE= golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg= -golang.org/x/crypto v0.33.0 h1:IOBPskki6Lysi0lo9qQvbxiQ+FvsCC/YWOecCHAixus= -golang.org/x/crypto v0.33.0/go.mod h1:bVdXmD7IV/4GdElGPozy6U7lWdRXA4qyRVGJV57uQ5M= +golang.org/x/crypto v0.37.0 h1:kJNSjF/Xp7kU0iB2Z+9viTPMW4EqqsrywMXLJOOsXSE= +golang.org/x/crypto v0.37.0/go.mod h1:vg+k43peMZ0pUMhYmVAWysMK35e6ioLh3wB8ZCAfbVc= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -1120,8 +1120,8 @@ golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u0 golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/exp v0.0.0-20250210185358-939b2ce775ac h1:l5+whBCLH3iH2ZNHYLbAe58bo7yrN4mVcnkHDYz5vvs= -golang.org/x/exp v0.0.0-20250210185358-939b2ce775ac/go.mod h1:hH+7mtFmImwwcMvScyxUhjuVHR3HGaDPMn9rMSUUbxo= +golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 h1:R84qjqJb5nVJMxqWYb3np9L5ZsaDtB+a39EqjV0JSUM= +golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0/go.mod h1:S9Xr4PYopiDyqSyp5NjCrhFrqg6A5zA2E/iPHPhqnS8= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -1150,8 +1150,8 @@ golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.23.0 h1:Zb7khfcRGKk+kqfxFaP5tZqCnDZMjC5VtUBs87Hr6QM= -golang.org/x/mod v0.23.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY= +golang.org/x/mod v0.24.0 h1:ZfthKaKaT4NrhGVZHO1/WDTwGES4De8KtWO0SIbNJMU= +golang.org/x/mod v0.24.0/go.mod h1:IXM97Txy2VM4PJ3gI61r1YEk/gAj6zAHN3AdZt6S9Ww= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -1213,8 +1213,8 @@ golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= -golang.org/x/net v0.35.0 h1:T5GQRQb2y08kTAByq9L4/bz8cipCdA8FbRTXewonqY8= -golang.org/x/net v0.35.0/go.mod h1:EglIi67kWsHKlRzzVMUD93VMSWGFOMSZgxFjparz1Qk= +golang.org/x/net v0.39.0 h1:ZCu7HMWDxpXpaiKdhzIfaltL9Lp31x/3fCP11bc6/fY= +golang.org/x/net v0.39.0/go.mod h1:X7NRbYVEA+ewNkCNyJ513WmMdQ3BineSwVtN2zD/d+E= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181017192945-9dcd33a902f4/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181203162652-d668ce993890/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -1252,8 +1252,8 @@ golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20220513210516-0976fa681c29/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.11.0 h1:GGz8+XQP4FvTTrjZPzNKTMFtSXH80RAzG+5ghFPgK9w= -golang.org/x/sync v0.11.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.13.0 h1:AauUjRAJ9OSnvULf/ARrrVywoJDy0YS2AwQ98I37610= +golang.org/x/sync v0.13.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= golang.org/x/sys v0.0.0-20180810173357-98c5dad5d1a0/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -1355,13 +1355,12 @@ golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.30.0 h1:QjkSwP/36a20jFYWkSue1YwXzLmsV5Gfq7Eiy72C1uc= -golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.32.0 h1:s77OFDvIQeibCmezSnk/q6iAfkdiQaJi4VzroCFrN20= +golang.org/x/sys v0.32.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= @@ -1382,8 +1381,8 @@ golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/text v0.22.0 h1:bofq7m3/HAFvbF51jz3Q9wLg3jkvSPuiZu/pD1XwgtM= -golang.org/x/text v0.22.0/go.mod h1:YRoo4H8PVmsu+E3Ou7cqLVH8oXWIHVoX0jqUWALQhfY= +golang.org/x/text v0.24.0 h1:dd5Bzh4yt5KYA8f9CJHCP4FB4D51c2c6JvN37xJJkJ0= +golang.org/x/text v0.24.0/go.mod h1:L8rBsPeo2pSS+xqN0d5u2ikmjtmoJbDBT1b7nHvFCdU= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -1453,8 +1452,8 @@ golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/tools v0.30.0 h1:BgcpHewrV5AUp2G9MebG4XPFI1E2W41zU1SaqVA9vJY= -golang.org/x/tools v0.30.0/go.mod h1:c347cR/OJfw5TI+GfX7RUPNMdDRRbjvYTS0jPyvsVtY= +golang.org/x/tools v0.32.0 h1:Q7N1vhpkQv7ybVzLFtTjvQya2ewbwNDZzUgfXGqtMWU= +golang.org/x/tools v0.32.0/go.mod h1:ZxrU41P/wAbZD8EDa6dDCa6XfpkhJ7HFMjHJXfBDu8s= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -1653,8 +1652,8 @@ google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp0 google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.36.5 h1:tPhr+woSbjfYvY6/GPufUoYizxw1cF/yFoxJ2fmpwlM= -google.golang.org/protobuf v1.36.5/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= +google.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY= +google.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -1695,8 +1694,8 @@ honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWh honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -lukechampine.com/blake3 v1.3.0 h1:sJ3XhFINmHSrYCgl958hscfIa3bw8x4DqMP3u1YvoYE= -lukechampine.com/blake3 v1.3.0/go.mod h1:0OFRp7fBtAylGVCO40o87sbupkyIGgbpv1+M1k1LM6k= +lukechampine.com/blake3 v1.4.0 h1:xDbKOZCVbnZsfzM6mHSYcGRHZ3YrLDzqz8XnV4uaD5w= +lukechampine.com/blake3 v1.4.0/go.mod h1:MQJNQCTnR+kwOP/JEZSxj3MaQjp80FOFSNMMHXcSeX0= lukechampine.com/uint128 v1.1.1/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= lukechampine.com/uint128 v1.2.0/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= modernc.org/cc/v3 v3.36.0/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI= From e82618ba19c1f5163a5b105b47293294097bec97 Mon Sep 17 00:00:00 2001 From: Dennis Trautwein Date: Wed, 16 Apr 2025 13:30:33 +0200 Subject: [PATCH 5/5] feat: gossipsub px support --- libp2p/crawler.go | 7 + libp2p/crawler_p2p.go | 73 ++++++++- libp2p/driver_crawler.go | 339 +++++++++++++++++++++++++++++++++++---- 3 files changed, 387 insertions(+), 32 deletions(-) diff --git a/libp2p/crawler.go b/libp2p/crawler.go index 7d905e8a..99276303 100644 --- a/libp2p/crawler.go +++ b/libp2p/crawler.go @@ -46,8 +46,10 @@ type Crawler struct { cfg *CrawlerConfig host Host pm *pb.ProtocolMessenger + psTopics map[string]struct{} crawledPeers int client *kubo.Client + stateChan chan string } var _ core.Worker[PeerInfo, core.CrawlResult[PeerInfo]] = (*Crawler)(nil) @@ -61,6 +63,11 @@ func (c *Crawler) Work(ctx context.Context, task PeerInfo) (core.CrawlResult[Pee logEntry.Debugln("Crawling peer") defer logEntry.Debugln("Crawled peer") + if c.cfg.GossipSubPX { + c.stateChan <- "busy" + defer func() { c.stateChan <- "idle" }() + } + // adhere to the addr-dial-type command line flag and only work with // private/public addresses if the user asked for it. var filterFn func(info peer.AddrInfo) (peer.AddrInfo, peer.AddrInfo) diff --git a/libp2p/crawler_p2p.go b/libp2p/crawler_p2p.go index 4d2479fc..343db618 100644 --- a/libp2p/crawler_p2p.go +++ b/libp2p/crawler_p2p.go @@ -62,6 +62,11 @@ type P2PResult struct { Transport string } +// crawlP2P establishes a connection and crawls neighbor info from a peer. +// It returns a channel that streams the crawling results asynchronously. +// The method retrieves routing table, listen addresses, protocols, and agent. +// Connection attempts and errors are tracked for debugging or analysis. +// It supports context cancellation for graceful operation termination. func (c *Crawler) crawlP2P(ctx context.Context, pi PeerInfo) <-chan P2PResult { resultCh := make(chan P2PResult) @@ -85,7 +90,6 @@ func (c *Crawler) crawlP2P(ctx context.Context, pi PeerInfo) <-chan P2PResult { // If we could successfully connect to the peer we actually crawl it. if result.ConnectError == nil { - // keep track of the multi address over which we successfully connected result.ConnectMaddr = conn.RemoteMultiaddr() @@ -128,6 +132,68 @@ func (c *Crawler) crawlP2P(ctx context.Context, pi PeerInfo) <-chan P2PResult { // Extract listen addresses result.ListenMaddrs = ps.Addrs(pi.ID()) + + if c.cfg.GossipSubPX { + // give the other peer a chance to open a stream to and prune us + streams := openInboundGossipSubStreams(c.host, pi.ID()) + + // The maximum time to wait for the gossipsub px to complete + maxGossipSubWait := c.cfg.DialTimeout + + // the minimum time to wait for the gossipsub px to start + minGossipSubWait := 2 * time.Second + + // the time since we're connected to the peer + elapsed := time.Since(result.ConnectEndTime) + + // the remaining time until the maximum wait time is reached + remainingWait := maxGossipSubWait - elapsed + + // the interval to check the open gossipsub streams + interval := 250 * time.Millisecond + + // if 1) we are supposed to wait a little longer for the + // gossipsub exchange (remainingWait > 0) and 2) we either have + // at least one open gossipsubstream or haven't waited long enough + // for such a stream to be there yet then we will enter the for + // loop that waits the calculated remaining time before exiting + // or until we don't have any open gossipsub streams anymore by + // checking every 250ms if there are still any. + + if remainingWait > 0 && (streams != 0 || elapsed < minGossipSubWait) { + + // if we don't have an open stream yet and the check + // interval is way below the minimum wait time we increase + // the initial ticker delay + initialTickerDelay := interval + if streams == 0 && minGossipSubWait-elapsed > interval { + initialTickerDelay = minGossipSubWait - elapsed + } + + timer := time.NewTimer(remainingWait) + ticker := time.NewTicker(initialTickerDelay) + + defer timer.Stop() + defer ticker.Stop() + + for { + select { + case <-ctx.Done(): + // exit for loop because the context was cancelled + case <-timer.C: + // exit for loop because the maximum wait time was reached + case <-ticker.C: + ticker.Reset(interval) + if openInboundGossipSubStreams(c.host, pi.ID()) != 0 { + continue + } + // exit for loop because we don't have any open + // streams despite waiting minGossipSubWait + } + break + } + } + } } else { // if there was a connection error, parse it to a known one result.ConnectErrorStr = db.NetError(result.ConnectError) @@ -182,7 +248,10 @@ func (c *Crawler) connect(ctx context.Context, pi peer.AddrInfo) (network.Conn, switch true { case strings.Contains(err.Error(), db.ErrorStr[pgmodels.NetErrorConnectionRefused]): - // Might be transient because the remote doesn't want us to connect. Try again! + // Might be transient because the remote doesn't want us to connect. + // Try again, but reduce the maximum elapsed time because it's still + // unlikely to succeed + bo.MaxElapsedTime = 2 * c.cfg.DialTimeout case strings.Contains(err.Error(), db.ErrorStr[pgmodels.NetErrorConnectionGated]): // Hints at a configuration issue and should not happen, but if it // does it could be transient. Try again anyway, but at least log a warning. diff --git a/libp2p/driver_crawler.go b/libp2p/driver_crawler.go index 1a61efa2..c5142646 100644 --- a/libp2p/driver_crawler.go +++ b/libp2p/driver_crawler.go @@ -3,24 +3,31 @@ package libp2p import ( "encoding/binary" "fmt" + "math" "runtime" + "sort" + "sync" "time" - kbucket "github.com/libp2p/go-libp2p-kbucket" - - "github.com/libp2p/go-libp2p/p2p/net/swarm" - "github.com/libp2p/go-libp2p" pb "github.com/libp2p/go-libp2p-kad-dht/pb" + kbucket "github.com/libp2p/go-libp2p-kbucket" + pubsub "github.com/libp2p/go-libp2p-pubsub" + pubsub_pb "github.com/libp2p/go-libp2p-pubsub/pb" "github.com/libp2p/go-libp2p/core/connmgr" "github.com/libp2p/go-libp2p/core/host" "github.com/libp2p/go-libp2p/core/network" "github.com/libp2p/go-libp2p/core/peer" "github.com/libp2p/go-libp2p/core/protocol" + "github.com/libp2p/go-libp2p/core/record" + "github.com/libp2p/go-libp2p/p2p/net/swarm" "github.com/libp2p/go-libp2p/p2p/protocol/identify" + "github.com/libp2p/go-msgio" ma "github.com/multiformats/go-multiaddr" + log "github.com/sirupsen/logrus" "go.opentelemetry.io/otel/metric" "go.opentelemetry.io/otel/trace" + "golang.org/x/net/context" "github.com/dennis-tra/nebula-crawler/config" "github.com/dennis-tra/nebula-crawler/core" @@ -94,6 +101,7 @@ func (cfg *CrawlDriverConfig) CrawlerConfig() *CrawlerConfig { crawlerCfg.DialTimeout = cfg.DialTimeout crawlerCfg.CheckExposed = cfg.CheckExposed crawlerCfg.AddrDialType = cfg.AddrDialType + crawlerCfg.GossipSubPX = cfg.GossipSubPX crawlerCfg.LogErrors = cfg.LogErrors return crawlerCfg } @@ -105,12 +113,31 @@ func (cfg *CrawlDriverConfig) WriterConfig() *core.CrawlWriterConfig { } type CrawlDriver struct { - cfg *CrawlDriverConfig - hosts []Host - dbc db.Client - tasksChan chan PeerInfo - crawlerCount int - writerCount int + cfg *CrawlDriverConfig + hosts map[peer.ID]Host + dbc db.Client + + // pxPeersChan receives peers that we get to know + // via the GossipSub Peer Exchange PX mechanism + pxPeersChan chan []PeerInfo + + // tasksChan will be read by the engine and allows + // the driver to submit tasks (peers to crawl) to + // the engine. In the case when GossipSubPX is disabled, + // the channel will be closed immediately after the + // bootstrap peers have been sent to it. If GossipSubPX + // is enabled, the driver will sent new peers to it as + // they are discovered via GossipSub. + tasksChan chan PeerInfo + + // workerStateChan receives the strings "busy" or "idle" + // from the workers. This is used by the GossipSub monitoring + // go routine to determine if the crawl is still running. + // If all workers are idle for more than 1s it'll stop listening + // for GossipSub messages. + workerStateChan chan string + crawlerCount int + writerCount int } var _ core.Driver[PeerInfo, core.CrawlResult[PeerInfo]] = (*CrawlDriver)(nil) @@ -124,13 +151,13 @@ func NewCrawlDriver(dbc db.Client, cfg *CrawlDriverConfig) (*CrawlDriver, error) userAgent = "avail-light-client/rust-client" } - hosts := make([]Host, 0, runtime.NumCPU()) + hosts := make(map[peer.ID]Host, runtime.NumCPU()) for i := 0; i < runtime.NumCPU(); i++ { h, err := newLibp2pHost(userAgent) if err != nil { return nil, fmt.Errorf("new libp2p host: %w", err) } - hosts = append(hosts, h) + hosts[h.ID()] = h } tasksChan := make(chan PeerInfo, len(cfg.BootstrapPeers)) @@ -138,38 +165,60 @@ func NewCrawlDriver(dbc db.Client, cfg *CrawlDriverConfig) (*CrawlDriver, error) addrInfo := addrInfo tasksChan <- PeerInfo{AddrInfo: addrInfo} } - close(tasksChan) - return &CrawlDriver{ - cfg: cfg, - hosts: hosts, - dbc: dbc, - tasksChan: tasksChan, - crawlerCount: 0, - writerCount: 0, - }, nil + d := &CrawlDriver{ + cfg: cfg, + hosts: hosts, + dbc: dbc, + tasksChan: tasksChan, + pxPeersChan: make(chan []PeerInfo), + workerStateChan: make(chan string, cfg.WorkerCount), + crawlerCount: 0, + writerCount: 0, + } + + if cfg.GossipSubPX { + go d.monitorGossipSubPX() + + for _, h := range hosts { + for _, protID := range pubsub.GossipSubDefaultProtocols { + h.SetStreamHandler(protID, d.handleGossipSubStream) + } + } + } else { + close(tasksChan) + } + + return d, nil } func (d *CrawlDriver) NewWorker() (core.Worker[PeerInfo, core.CrawlResult[PeerInfo]], error) { - h := d.hosts[d.crawlerCount%len(d.hosts)] + hostsList := make([]string, 0, len(d.hosts)) + for _, h := range d.hosts { + hostsList = append(hostsList, string(h.ID())) + } + sort.Strings(hostsList) + hostID := peer.ID(hostsList[d.crawlerCount%len(d.hosts)]) ms := &msgSender{ - h: h, + h: d.hosts[hostID], protocols: protocol.ConvertFromStrings(d.cfg.Protocols), timeout: d.cfg.DialTimeout, } pm, err := pb.NewProtocolMessenger(ms) if err != nil { - return nil, err + return nil, fmt.Errorf("new protocol messenger: %w", err) } c := &Crawler{ - id: fmt.Sprintf("crawler-%02d", d.crawlerCount), - host: h, - pm: pm, - cfg: d.cfg.CrawlerConfig(), - client: kubo.NewClient(), + id: fmt.Sprintf("crawler-%02d", d.crawlerCount), + host: d.hosts[hostID], + pm: pm, + psTopics: make(map[string]struct{}), + cfg: d.cfg.CrawlerConfig(), + client: kubo.NewClient(), + stateChan: d.workerStateChan, } d.crawlerCount += 1 @@ -187,7 +236,82 @@ func (d *CrawlDriver) Tasks() <-chan PeerInfo { return d.tasksChan } -func (d *CrawlDriver) Close() {} +func (d *CrawlDriver) Close() { + shutdown := make(chan struct{}) + go func() { + d.shutdown() + close(shutdown) + }() + + select { + case <-shutdown: + case <-time.After(10 * time.Second): + log.Warnln("shutdown timed out") + } +} + +func (d *CrawlDriver) shutdown() { + var wgHostClose sync.WaitGroup + for _, h := range d.hosts { + wgHostClose.Add(1) + go func(h Host) { + defer wgHostClose.Done() + if err := h.Close(); err != nil { + log.WithError(err).Warnln("failed to close host") + } + }(h) + } + + var wgTasksClose sync.WaitGroup + wgTasksClose.Add(1) + go func() { + for range d.tasksChan { + } + wgTasksClose.Done() + }() + + wgHostClose.Wait() + close(d.pxPeersChan) + wgTasksClose.Wait() +} + +func (d *CrawlDriver) monitorGossipSubPX() { + defer close(d.tasksChan) + + timeout := time.Second + timer := time.NewTimer(math.MaxInt64) + + busyWorkers := 0 +LOOP: + for { + select { + case <-timer.C: + log.Infof("All workers idle for %s. Stop monitoring gossipsub streams.", timeout) + break LOOP + case state := <-d.workerStateChan: + switch state { + case "busy": + busyWorkers += 1 + case "idle": + busyWorkers -= 1 + } + if busyWorkers == 0 { + timer.Reset(timeout) + } else { + timer.Reset(math.MaxInt64) + } + case pxPeers, more := <-d.pxPeersChan: + if !more { + break LOOP + } + + log.Infof("Discovered %d peers via gossipsub\n", len(pxPeers)) + for _, pxPeer := range pxPeers { + d.tasksChan <- pxPeer + } + } + } +} func newLibp2pHost(userAgent string) (Host, error) { // Configure the resource manager to not limit anything @@ -206,5 +330,160 @@ func newLibp2pHost(userAgent string) (Host, error) { libp2p.UDPBlackHoleSuccessCounter(nil), libp2p.IPv6BlackHoleSuccessCounter(nil), ) + return h.(Host), err } + +// handleGossipSubStream manages a GossipSub stream between two peers. It first +// read the "hello" gossip sub message which contains all active subscriptions +// by the remote peer. Then we open and outgoing stream to the remote peer and +// just mirror back the subscriptions. Then we try to graft the remote peer on +// all topics in the hope that we are the one that exceeds Dhi for the mesh of +// the remote peer. In that case the peer will send a PRUNE message to us that +// contains signed peer records which we'll feed into the [core.Engine] to +// continue the crawl. +func (d *CrawlDriver) handleGossipSubStream(incomingStream network.Stream) { + defer incomingStream.Reset() + + remoteID := incomingStream.Conn().RemotePeer() + localID := incomingStream.Conn().LocalPeer() + + // read hello RPC from the remote to get to know all subscriptions + helloRPC, err := readRPC(incomingStream) + if err != nil { + return + } + + outgoingStream, err := d.hosts[localID].NewStream(context.Background(), remoteID, pubsub.GossipSubDefaultProtocols...) + if err != nil { + return + } + defer outgoingStream.Reset() + + // let the remote know that we're interested in the exact same topics + if err = writeRPC(outgoingStream, helloRPC); err != nil { + return + } + + graftRPC := &pubsub_pb.RPC{ + Control: &pubsub_pb.ControlMessage{ + Graft: make([]*pubsub_pb.ControlGraft, len(helloRPC.GetSubscriptions())), + }, + } + for i, sub := range helloRPC.GetSubscriptions() { + graftRPC.Control.Graft[i] = &pubsub_pb.ControlGraft{ + TopicID: sub.Topicid, + } + } + + // graft the remote peer on all topics we got to know in the hello RPC + if err = writeRPC(outgoingStream, graftRPC); err != nil { + return + } + + // wait until we get a PRUNE + for { + rpc, err := readRPC(incomingStream) + if err != nil { + return + } + + pxPeers := make([]PeerInfo, 0) + for _, prune := range rpc.GetControl().GetPrune() { + for _, p := range prune.GetPeers() { + addrInfo, err := parseSignedPeerRecord(p.SignedPeerRecord) + if err != nil { + log.WithError(err).Debugln("failed to parse signed peer record") + continue + } + pxPeers = append(pxPeers, PeerInfo{AddrInfo: *addrInfo}) + } + } + + if len(pxPeers) > 0 { + d.pxPeersChan <- pxPeers + return + } + } +} + +func readRPC(s network.Stream) (*pubsub_pb.RPC, error) { + data, err := msgio.NewVarintReader(s).ReadMsg() + if err != nil { + return nil, fmt.Errorf("failed to read message: %w", err) + } + + rpc := &pubsub_pb.RPC{} + if err = rpc.Unmarshal(data); err != nil { + return nil, fmt.Errorf("failed to unmarshal rpc message: %w", err) + } + + return rpc, nil +} + +func writeRPC(s network.Stream, rpc *pubsub_pb.RPC) error { + data, err := rpc.Marshal() + if err != nil { + return fmt.Errorf("failed to marshal rpc message: %w", err) + } + + if err = msgio.NewVarintWriter(s).WriteMsg(data); err != nil { + return fmt.Errorf("failed to read message: %w", err) + } + + return nil +} + +// parseSignedPeerRecord extracts peer information from a signed peer record. +// It validates and unmarshals the record to return a peer.AddrInfo instance. +// Returns an error if the record is invalid or unmarshalling fails. +func parseSignedPeerRecord(signedPeerRecord []byte) (*peer.AddrInfo, error) { + envelope, err := record.UnmarshalEnvelope(signedPeerRecord) + if err != nil { + return nil, fmt.Errorf("failed to unmarshal signed peer record: %w", err) + } + + pid, err := peer.IDFromPublicKey(envelope.PublicKey) + if err != nil { + return nil, fmt.Errorf("failed to derive peer ID: %s", err) + } + r, err := envelope.Record() + if err != nil { + return nil, fmt.Errorf("failed to obtain record: %w", err) + } + + rec, ok := r.(*peer.PeerRecord) + if !ok { + return nil, fmt.Errorf("not a peer record") + } + + addrInfo := peer.AddrInfo{ + ID: pid, + Addrs: rec.Addrs, + } + + return &addrInfo, nil +} + +// openInboundGossipSubStreams counts inbound GossipSub protocol streams. +// Returns the total number of open inbound GossipSub streams. +func openInboundGossipSubStreams(h host.Host, pid peer.ID) int { + openStreams := 0 + for _, conn := range h.Network().ConnsToPeer(pid) { + for _, stream := range conn.GetStreams() { + if stream.Stat().Direction != network.DirInbound { + continue + } + switch stream.Protocol() { + case pubsub.GossipSubID_v10: + case pubsub.GossipSubID_v11: + case pubsub.GossipSubID_v12: + case pubsub.FloodSubID: + default: + continue + } + openStreams += 1 + } + } + return openStreams +}