fix(go-log@2.9/go-libp2p@0.45): dynamic log level control and tail (#11039)
This fix restores dynamic log level control and tail for go-libp2p loggers Updated to: https://github.com/libp2p/go-libp2p/releases/tag/v0.45.0 https://github.com/ipfs/go-log/releases/tag/v2.9.0 these changes restore dynamic log level control and tail for go-libp2p subsystems after the migration to slog, fixing the regression introduced in https://github.com/libp2p/go-libp2p/pull/3364 Fixes https://github.com/ipfs/kubo/issues/11035 For details why and how, see explainer in https://github.com/ipfs/go-log/releases/tag/v2.9.0
Marcin Rataj committed
Nov 6, 2025 at 16:00 UTC
f067a86170bf163e671641d78f0c73d113f507a2
9 files changed
+196
-19
cmd/ipfs/kubo/start.go
+13
@@ -8,6 +8,7 @@ import (
8
"errors"
9
"fmt"
10
"io"
11
+ "log/slog"
12
"net"
13
"net/http"
14
"os"
@@ -33,6 +34,7 @@ import (
34
"github.com/ipfs/kubo/repo"
35
"github.com/ipfs/kubo/repo/fsrepo"
36
"github.com/ipfs/kubo/tracing"
37
+ "github.com/libp2p/go-libp2p/gologshim"
38
ma "github.com/multiformats/go-multiaddr"
39
madns "github.com/multiformats/go-multiaddr-dns"
40
manet "github.com/multiformats/go-multiaddr/net"
@@ -50,6 +52,17 @@ var (
52
tracer trace.Tracer
53
)
54
55
+func init() {
56
+ // Set go-log's slog handler as the application-wide default.
57
+ // This ensures all slog-based logging uses go-log's formatting.
58
+ slog.SetDefault(slog.New(logging.SlogHandler()))
59
+
60
+ // Wire go-log's slog bridge to go-libp2p's gologshim.
61
+ // This provides go-libp2p loggers with the "logger" attribute
62
+ // for per-subsystem level control (e.g., `ipfs log level libp2p-swarm debug`).
63
+ gologshim.SetDefaultHandler(logging.SlogHandler())
64
+}
65
+
66
// declared as a var for testing purposes.
67
var dnsResolver = madns.DefaultResolver
68
docs/changelogs/v0.39.md
+2
-1
@@ -154,8 +154,9 @@ For Docker users, the legacy `ipfs/go-ipfs` image name now shows a deprecation n
154
155
### 📦️ Important dependency updates
156
157
-- update `go-libp2p` to [v0.44.0](https://github.com/libp2p/go-libp2p/releases/tag/v0.44.0) with self-healing UPnP port mappings
157
+- update `go-libp2p` to [v0.45.0](https://github.com/libp2p/go-libp2p/releases/tag/v0.45.0) (incl. [v0.44.0](https://github.com/libp2p/go-libp2p/releases/tag/v0.44.0)) with self-healing UPnP port mappings and go-log/slog interop fixes
158
- update `quic-go` to [v0.55.0](https://github.com/quic-go/quic-go/releases/tag/v0.55.0)
159
+- update `go-log` to [v2.9.0](https://github.com/ipfs/go-log/releases/tag/v2.9.0) with slog integration for go-libp2p
160
- update `go-ds-pebble` to [v0.5.6](https://github.com/ipfs/go-ds-pebble/releases/tag/v0.5.6) (includes pebble [v2.1.1](https://github.com/cockroachdb/pebble/releases/tag/v2.1.1))
161
- update `boxo` to [v0.35.1](https://github.com/ipfs/boxo/releases/tag/v0.35.1)
162
- update `ipfs-webui` to [v4.10.0](https://github.com/ipfs/ipfs-webui/releases/tag/v4.10.0)
docs/examples/kubo-as-a-library/go.mod
+2
-2
@@ -9,7 +9,7 @@ replace github.com/ipfs/kubo => ./../../..
9
require (
10
github.com/ipfs/boxo v0.35.1
11
github.com/ipfs/kubo v0.0.0-00010101000000-000000000000
12
- github.com/libp2p/go-libp2p v0.44.0
12
+ github.com/libp2p/go-libp2p v0.45.0
13
github.com/multiformats/go-multiaddr v0.16.1
14
)
15
@@ -93,7 +93,7 @@ require (
93
github.com/ipfs/go-ipld-format v0.6.3 // indirect
94
github.com/ipfs/go-ipld-git v0.1.1 // indirect
95
github.com/ipfs/go-ipld-legacy v0.2.2 // indirect
96
- github.com/ipfs/go-log/v2 v2.8.2 // indirect
96
+ github.com/ipfs/go-log/v2 v2.9.0 // indirect
97
github.com/ipfs/go-metrics-interface v0.3.0 // indirect
98
github.com/ipfs/go-peertaskqueue v0.8.2 // indirect
99
github.com/ipfs/go-test v0.2.3 // indirect
docs/examples/kubo-as-a-library/go.sum
+4
-4
@@ -349,8 +349,8 @@ github.com/ipfs/go-ipld-git v0.1.1/go.mod h1:+VyMqF5lMcJh4rwEppV0e6g4nCCHXThLYYD
349
github.com/ipfs/go-ipld-legacy v0.2.2 h1:DThbqCPVLpWBcGtU23KDLiY2YRZZnTkXQyfz8aOfBkQ=
350
github.com/ipfs/go-ipld-legacy v0.2.2/go.mod h1:hhkj+b3kG9b2BcUNw8IFYAsfeNo8E3U7eYlWeAOPyDU=
351
github.com/ipfs/go-log v0.0.1/go.mod h1:kL1d2/hzSpI0thNYjiKfjanbVNU+IIGA/WnNESY9leM=
352
-github.com/ipfs/go-log/v2 v2.8.2 h1:nVG4nNHUwwI/sTs9Bi5iE8sXFQwXs3AjkkuWhg7+Y2I=
353
-github.com/ipfs/go-log/v2 v2.8.2/go.mod h1:UhIYAwMV7Nb4ZmihUxfIRM2Istw/y9cAk3xaK+4Zs2c=
352
+github.com/ipfs/go-log/v2 v2.9.0 h1:l4b06AwVXwldIzbVPZy5z7sKp9lHFTX0KWfTBCtHaOk=
353
+github.com/ipfs/go-log/v2 v2.9.0/go.mod h1:UhIYAwMV7Nb4ZmihUxfIRM2Istw/y9cAk3xaK+4Zs2c=
354
github.com/ipfs/go-metrics-interface v0.3.0 h1:YwG7/Cy4R94mYDUuwsBfeziJCVm9pBMJ6q/JR9V40TU=
355
github.com/ipfs/go-metrics-interface v0.3.0/go.mod h1:OxxQjZDGocXVdyTPocns6cOLwHieqej/jos7H4POwoY=
356
github.com/ipfs/go-peertaskqueue v0.8.2 h1:PaHFRaVFdxQk1Qo3OKiHPYjmmusQy7gKQUaL8JDszAU=
@@ -424,8 +424,8 @@ github.com/libp2p/go-flow-metrics v0.0.1/go.mod h1:Iv1GH0sG8DtYN3SVJ2eG221wMiNpZ
424
github.com/libp2p/go-flow-metrics v0.0.3/go.mod h1:HeoSNUrOJVK1jEpDqVEiUOIXqhbnS27omG0uWU5slZs=
425
github.com/libp2p/go-flow-metrics v0.3.0 h1:q31zcHUvHnwDO0SHaukewPYgwOBSxtt830uJtUx6784=
426
github.com/libp2p/go-flow-metrics v0.3.0/go.mod h1:nuhlreIwEguM1IvHAew3ij7A8BMlyHQJ279ao24eZZo=
427
-github.com/libp2p/go-libp2p v0.44.0 h1:5Gtt8OrF8yiXmH+Mx4+/iBeFRMK1TY3a8OrEBDEqAvs=
428
-github.com/libp2p/go-libp2p v0.44.0/go.mod h1:NovCojezAt4dnDd4fH048K7PKEqH0UFYYqJRjIIu8zc=
427
+github.com/libp2p/go-libp2p v0.45.0 h1:Pdhr2HsFXaYjtfiNcBP4CcRUONvbMFdH3puM9vV4Tiw=
428
+github.com/libp2p/go-libp2p v0.45.0/go.mod h1:NovCojezAt4dnDd4fH048K7PKEqH0UFYYqJRjIIu8zc=
429
github.com/libp2p/go-libp2p-asn-util v0.4.1 h1:xqL7++IKD9TBFMgnLPZR6/6iYhawHKHl950SO9L6n94=
430
github.com/libp2p/go-libp2p-asn-util v0.4.1/go.mod h1:d/NI6XZ9qxw67b4e+NgpQexCIiFYJjErASrYW4PFDN8=
431
github.com/libp2p/go-libp2p-core v0.2.4/go.mod h1:STh4fdfa5vDYr0/SzYYeqnt+E6KfEV5VxfIrm0bcI0g=
go.mod
+2
-2
@@ -39,7 +39,7 @@ require (
39
github.com/ipfs/go-ipld-format v0.6.3
40
github.com/ipfs/go-ipld-git v0.1.1
41
github.com/ipfs/go-ipld-legacy v0.2.2
42
- github.com/ipfs/go-log/v2 v2.8.2
42
+ github.com/ipfs/go-log/v2 v2.9.0
43
github.com/ipfs/go-metrics-interface v0.3.0
44
github.com/ipfs/go-metrics-prometheus v0.1.0
45
github.com/ipfs/go-test v0.2.3
@@ -51,7 +51,7 @@ require (
51
github.com/jbenet/go-temp-err-catcher v0.1.0
52
github.com/julienschmidt/httprouter v1.3.0
53
github.com/libp2p/go-doh-resolver v0.5.0
54
- github.com/libp2p/go-libp2p v0.44.0
54
+ github.com/libp2p/go-libp2p v0.45.0
55
github.com/libp2p/go-libp2p-http v0.5.0
56
github.com/libp2p/go-libp2p-kad-dht v0.35.2-0.20251025120456-f33906fd2f32
57
github.com/libp2p/go-libp2p-kbucket v0.8.0
go.sum
+4
-4
@@ -416,8 +416,8 @@ github.com/ipfs/go-ipld-git v0.1.1/go.mod h1:+VyMqF5lMcJh4rwEppV0e6g4nCCHXThLYYD
416
github.com/ipfs/go-ipld-legacy v0.2.2 h1:DThbqCPVLpWBcGtU23KDLiY2YRZZnTkXQyfz8aOfBkQ=
417
github.com/ipfs/go-ipld-legacy v0.2.2/go.mod h1:hhkj+b3kG9b2BcUNw8IFYAsfeNo8E3U7eYlWeAOPyDU=
418
github.com/ipfs/go-log v0.0.1/go.mod h1:kL1d2/hzSpI0thNYjiKfjanbVNU+IIGA/WnNESY9leM=
419
-github.com/ipfs/go-log/v2 v2.8.2 h1:nVG4nNHUwwI/sTs9Bi5iE8sXFQwXs3AjkkuWhg7+Y2I=
420
-github.com/ipfs/go-log/v2 v2.8.2/go.mod h1:UhIYAwMV7Nb4ZmihUxfIRM2Istw/y9cAk3xaK+4Zs2c=
419
+github.com/ipfs/go-log/v2 v2.9.0 h1:l4b06AwVXwldIzbVPZy5z7sKp9lHFTX0KWfTBCtHaOk=
420
+github.com/ipfs/go-log/v2 v2.9.0/go.mod h1:UhIYAwMV7Nb4ZmihUxfIRM2Istw/y9cAk3xaK+4Zs2c=
421
github.com/ipfs/go-metrics-interface v0.3.0 h1:YwG7/Cy4R94mYDUuwsBfeziJCVm9pBMJ6q/JR9V40TU=
422
github.com/ipfs/go-metrics-interface v0.3.0/go.mod h1:OxxQjZDGocXVdyTPocns6cOLwHieqej/jos7H4POwoY=
423
github.com/ipfs/go-metrics-prometheus v0.1.0 h1:bApWOHkrH3VTBHzTHrZSfq4n4weOZDzZFxUXv+HyKcA=
@@ -504,8 +504,8 @@ github.com/libp2p/go-flow-metrics v0.0.1/go.mod h1:Iv1GH0sG8DtYN3SVJ2eG221wMiNpZ
504
github.com/libp2p/go-flow-metrics v0.0.3/go.mod h1:HeoSNUrOJVK1jEpDqVEiUOIXqhbnS27omG0uWU5slZs=
505
github.com/libp2p/go-flow-metrics v0.3.0 h1:q31zcHUvHnwDO0SHaukewPYgwOBSxtt830uJtUx6784=
506
github.com/libp2p/go-flow-metrics v0.3.0/go.mod h1:nuhlreIwEguM1IvHAew3ij7A8BMlyHQJ279ao24eZZo=
507
-github.com/libp2p/go-libp2p v0.44.0 h1:5Gtt8OrF8yiXmH+Mx4+/iBeFRMK1TY3a8OrEBDEqAvs=
508
-github.com/libp2p/go-libp2p v0.44.0/go.mod h1:NovCojezAt4dnDd4fH048K7PKEqH0UFYYqJRjIIu8zc=
507
+github.com/libp2p/go-libp2p v0.45.0 h1:Pdhr2HsFXaYjtfiNcBP4CcRUONvbMFdH3puM9vV4Tiw=
508
+github.com/libp2p/go-libp2p v0.45.0/go.mod h1:NovCojezAt4dnDd4fH048K7PKEqH0UFYYqJRjIIu8zc=
509
github.com/libp2p/go-libp2p-asn-util v0.4.1 h1:xqL7++IKD9TBFMgnLPZR6/6iYhawHKHl950SO9L6n94=
510
github.com/libp2p/go-libp2p-asn-util v0.4.1/go.mod h1:d/NI6XZ9qxw67b4e+NgpQexCIiFYJjErASrYW4PFDN8=
511
github.com/libp2p/go-libp2p-core v0.2.4/go.mod h1:STh4fdfa5vDYr0/SzYYeqnt+E6KfEV5VxfIrm0bcI0g=
test/cli/log_level_test.go
+163
@@ -1,11 +1,16 @@
1
package cli
2
3
import (
4
+ "bufio"
5
+ "context"
6
"encoding/json"
7
"fmt"
8
"net/http"
9
+ "os"
10
+ "os/exec"
11
"strings"
12
"testing"
13
+ "time"
14
15
"github.com/ipfs/kubo/test/cli/harness"
16
. "github.com/ipfs/kubo/test/cli/testutils"
@@ -599,6 +604,164 @@ func TestLogLevel(t *testing.T) {
604
})
605
})
606
607
+ // Constants for slog interop tests
608
+ const (
609
+ slogTestLogTailTimeout = 10 * time.Second
610
+ slogTestLogWaitTimeout = 5 * time.Second
611
+ slogTestLogStartupDelay = 1 * time.Second // Wait for log tail to start
612
+ slogTestSubsystemCmdsHTTP = "cmds/http" // Native go-log subsystem
613
+ slogTestSubsystemNetIdentify = "net/identify" // go-libp2p slog subsystem
614
+ )
615
+
616
+ // logMatch represents a matched log entry for slog interop tests
617
+ type logMatch struct {
618
+ subsystem string
619
+ line string
620
+ }
621
+
622
+ // startLogMonitoring starts ipfs log tail and returns command and channel for matched logs.
623
+ startLogMonitoring := func(t *testing.T, node *harness.Node) (*exec.Cmd, chan logMatch) {
624
+ t.Helper()
625
+
626
+ ctx, cancel := context.WithTimeout(context.Background(), slogTestLogTailTimeout)
627
+ t.Cleanup(cancel)
628
+
629
+ cmd := exec.CommandContext(ctx, node.IPFSBin, "log", "tail")
630
+ cmd.Env = append([]string(nil), os.Environ()...)
631
+ for k, v := range node.Runner.Env {
632
+ cmd.Env = append(cmd.Env, fmt.Sprintf("%s=%s", k, v))
633
+ }
634
+ cmd.Dir = node.Runner.Dir
635
+
636
+ stdout, err := cmd.StdoutPipe()
637
+ require.NoError(t, err)
638
+ require.NoError(t, cmd.Start())
639
+
640
+ matches := make(chan logMatch, 10)
641
+
642
+ go func() {
643
+ scanner := bufio.NewScanner(stdout)
644
+ for scanner.Scan() {
645
+ line := scanner.Text()
646
+ // Check for actual logger field in JSON, not just substring match
647
+ if strings.Contains(line, `"logger":"cmds/http"`) {
648
+ matches <- logMatch{slogTestSubsystemCmdsHTTP, line}
649
+ }
650
+ if strings.Contains(line, `"logger":"net/identify"`) {
651
+ matches <- logMatch{slogTestSubsystemNetIdentify, line}
652
+ }
653
+ }
654
+ }()
655
+
656
+ return cmd, matches
657
+ }
658
+
659
+ // waitForBothSubsystems waits for both native go-log and slog subsystems to appear in logs.
660
+ waitForBothSubsystems := func(t *testing.T, matches chan logMatch, timeout time.Duration) {
661
+ t.Helper()
662
+
663
+ seen := make(map[string]struct{})
664
+ deadline := time.After(timeout)
665
+
666
+ for len(seen) < 2 {
667
+ select {
668
+ case match := <-matches:
669
+ if _, exists := seen[match.subsystem]; !exists {
670
+ t.Logf("Found %s log", match.subsystem)
671
+ seen[match.subsystem] = struct{}{}
672
+ }
673
+ case <-deadline:
674
+ t.Fatalf("Timeout waiting for logs. Seen: %v", seen)
675
+ }
676
+ }
677
+
678
+ assert.Contains(t, seen, slogTestSubsystemCmdsHTTP, "should see cmds/http (native go-log)")
679
+ assert.Contains(t, seen, slogTestSubsystemNetIdentify, "should see net/identify (slog from go-libp2p)")
680
+ }
681
+
682
+ // triggerIdentifyProtocol connects node1 to node2, triggering net/identify logs.
683
+ triggerIdentifyProtocol := func(t *testing.T, node1, node2 *harness.Node) {
684
+ t.Helper()
685
+
686
+ // Get node2's peer ID and address
687
+ node2ID := node2.PeerID().String()
688
+ addrsRes := node2.IPFS("id", "-f", "<addrs>")
689
+ require.NoError(t, addrsRes.Err)
690
+
691
+ addrs := strings.Split(strings.TrimSpace(addrsRes.Stdout.String()), "\n")
692
+ require.NotEmpty(t, addrs, "node2 should have at least one address")
693
+
694
+ // Connect node1 to node2
695
+ multiaddr := fmt.Sprintf("%s/p2p/%s", addrs[0], node2ID)
696
+ res := node1.IPFS("swarm", "connect", multiaddr)
697
+ require.NoError(t, res.Err)
698
+ }
699
+
700
+ // verifySlogInterop verifies that both native go-log and slog from go-libp2p
701
+ // appear in ipfs log tail with correct formatting and level control.
702
+ verifySlogInterop := func(t *testing.T, node1, node2 *harness.Node) {
703
+ t.Helper()
704
+
705
+ cmd, matches := startLogMonitoring(t, node1)
706
+ defer func() {
707
+ _ = cmd.Process.Kill()
708
+ }()
709
+
710
+ time.Sleep(slogTestLogStartupDelay)
711
+
712
+ // Trigger cmds/http (native go-log)
713
+ node1.IPFS("version")
714
+
715
+ // Trigger net/identify (slog from go-libp2p)
716
+ triggerIdentifyProtocol(t, node1, node2)
717
+
718
+ waitForBothSubsystems(t, matches, slogTestLogWaitTimeout)
719
+ }
720
+
721
+ // This test verifies that go-log's slog bridge works with go-libp2p's gologshim
722
+ // when log levels are set via GOLOG_LOG_LEVEL environment variable.
723
+ // It tests both native go-log loggers (cmds/http) and slog-based loggers from
724
+ // go-libp2p (net/identify), ensuring both types appear in `ipfs log tail`.
725
+ t.Run("slog interop via env var", func(t *testing.T) {
726
+ t.Parallel()
727
+ h := harness.NewT(t)
728
+
729
+ node1 := h.NewNode().Init()
730
+ node1.Runner.Env["GOLOG_LOG_LEVEL"] = "error,cmds/http=debug,net/identify=debug"
731
+ node1.StartDaemon()
732
+ defer node1.StopDaemon()
733
+
734
+ node2 := h.NewNode().Init().StartDaemon()
735
+ defer node2.StopDaemon()
736
+
737
+ verifySlogInterop(t, node1, node2)
738
+ })
739
+
740
+ // This test verifies that go-log's slog bridge works with go-libp2p's gologshim
741
+ // when log levels are set dynamically via `ipfs log level` CLI commands.
742
+ // It tests the key feature that SetLogLevel auto-creates level entries for subsystems
743
+ // that don't exist yet, enabling `ipfs log level net/identify debug` to work even
744
+ // before the net/identify logger is created. This is critical for slog interop.
745
+ t.Run("slog interop via CLI", func(t *testing.T) {
746
+ t.Parallel()
747
+ h := harness.NewT(t)
748
+
749
+ node1 := h.NewNode().Init().StartDaemon()
750
+ defer node1.StopDaemon()
751
+
752
+ node2 := h.NewNode().Init().StartDaemon()
753
+ defer node2.StopDaemon()
754
+
755
+ // Set levels via CLI for both subsystems BEFORE triggering events
756
+ res := node1.IPFS("log", "level", slogTestSubsystemCmdsHTTP, "debug")
757
+ require.NoError(t, res.Err)
758
+
759
+ res = node1.IPFS("log", "level", slogTestSubsystemNetIdentify, "debug")
760
+ require.NoError(t, res.Err) // Auto-creates level entry for slog subsystem
761
+
762
+ verifySlogInterop(t, node1, node2)
763
+ })
764
+
765
}
766
767
func getExpectedSubsystems(t *testing.T, node *harness.Node) []string {
test/dependencies/go.mod
+2
-2
@@ -8,7 +8,7 @@ require (
8
github.com/Kubuxu/gocovmerge v0.0.0-20161216165753-7ecaa51963cd
9
github.com/golangci/golangci-lint v1.64.8
10
github.com/ipfs/go-cidutil v0.1.0
11
- github.com/ipfs/go-log/v2 v2.8.2
11
+ github.com/ipfs/go-log/v2 v2.9.0
12
github.com/ipfs/go-test v0.2.3
13
github.com/ipfs/hang-fds v0.1.0
14
github.com/ipfs/iptb v1.4.1
@@ -182,7 +182,7 @@ require (
182
github.com/libp2p/go-cidranger v1.1.0 // indirect
183
github.com/libp2p/go-doh-resolver v0.5.0 // indirect
184
github.com/libp2p/go-flow-metrics v0.3.0 // indirect
185
- github.com/libp2p/go-libp2p v0.44.0 // indirect
185
+ github.com/libp2p/go-libp2p v0.45.0 // indirect
186
github.com/libp2p/go-libp2p-asn-util v0.4.1 // indirect
187
github.com/libp2p/go-libp2p-kad-dht v0.35.2-0.20251025120456-f33906fd2f32 // indirect
188
github.com/libp2p/go-libp2p-kbucket v0.8.0 // indirect
test/dependencies/go.sum
+4
-4
@@ -364,8 +364,8 @@ github.com/ipfs/go-ipld-format v0.6.3 h1:9/lurLDTotJpZSuL++gh3sTdmcFhVkCwsgx2+rA
364
github.com/ipfs/go-ipld-format v0.6.3/go.mod h1:74ilVN12NXVMIV+SrBAyC05UJRk0jVvGqdmrcYZvCBk=
365
github.com/ipfs/go-ipld-legacy v0.2.2 h1:DThbqCPVLpWBcGtU23KDLiY2YRZZnTkXQyfz8aOfBkQ=
366
github.com/ipfs/go-ipld-legacy v0.2.2/go.mod h1:hhkj+b3kG9b2BcUNw8IFYAsfeNo8E3U7eYlWeAOPyDU=
367
-github.com/ipfs/go-log/v2 v2.8.2 h1:nVG4nNHUwwI/sTs9Bi5iE8sXFQwXs3AjkkuWhg7+Y2I=
368
-github.com/ipfs/go-log/v2 v2.8.2/go.mod h1:UhIYAwMV7Nb4ZmihUxfIRM2Istw/y9cAk3xaK+4Zs2c=
367
+github.com/ipfs/go-log/v2 v2.9.0 h1:l4b06AwVXwldIzbVPZy5z7sKp9lHFTX0KWfTBCtHaOk=
368
+github.com/ipfs/go-log/v2 v2.9.0/go.mod h1:UhIYAwMV7Nb4ZmihUxfIRM2Istw/y9cAk3xaK+4Zs2c=
369
github.com/ipfs/go-metrics-interface v0.3.0 h1:YwG7/Cy4R94mYDUuwsBfeziJCVm9pBMJ6q/JR9V40TU=
370
github.com/ipfs/go-metrics-interface v0.3.0/go.mod h1:OxxQjZDGocXVdyTPocns6cOLwHieqej/jos7H4POwoY=
371
github.com/ipfs/go-peertaskqueue v0.8.2 h1:PaHFRaVFdxQk1Qo3OKiHPYjmmusQy7gKQUaL8JDszAU=
@@ -458,8 +458,8 @@ github.com/libp2p/go-doh-resolver v0.5.0 h1:4h7plVVW+XTS+oUBw2+8KfoM1jF6w8XmO7+s
458
github.com/libp2p/go-doh-resolver v0.5.0/go.mod h1:aPDxfiD2hNURgd13+hfo29z9IC22fv30ee5iM31RzxU=
459
github.com/libp2p/go-flow-metrics v0.3.0 h1:q31zcHUvHnwDO0SHaukewPYgwOBSxtt830uJtUx6784=
460
github.com/libp2p/go-flow-metrics v0.3.0/go.mod h1:nuhlreIwEguM1IvHAew3ij7A8BMlyHQJ279ao24eZZo=
461
-github.com/libp2p/go-libp2p v0.44.0 h1:5Gtt8OrF8yiXmH+Mx4+/iBeFRMK1TY3a8OrEBDEqAvs=
462
-github.com/libp2p/go-libp2p v0.44.0/go.mod h1:NovCojezAt4dnDd4fH048K7PKEqH0UFYYqJRjIIu8zc=
461
+github.com/libp2p/go-libp2p v0.45.0 h1:Pdhr2HsFXaYjtfiNcBP4CcRUONvbMFdH3puM9vV4Tiw=
462
+github.com/libp2p/go-libp2p v0.45.0/go.mod h1:NovCojezAt4dnDd4fH048K7PKEqH0UFYYqJRjIIu8zc=
463
github.com/libp2p/go-libp2p-asn-util v0.4.1 h1:xqL7++IKD9TBFMgnLPZR6/6iYhawHKHl950SO9L6n94=
464
github.com/libp2p/go-libp2p-asn-util v0.4.1/go.mod h1:d/NI6XZ9qxw67b4e+NgpQexCIiFYJjErASrYW4PFDN8=
465
github.com/libp2p/go-libp2p-kad-dht v0.35.2-0.20251025120456-f33906fd2f32 h1:xZj18PsLD157snR/BFo547jwOkGDH7jZjMEkBDOoD4Q=