@cryptotaxi247 / kubo / commits / f067a8617

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=