Skip to content

Commit 6753cf8

Browse files
committed
feat(autotls): certs for your node's own IP
A node with a publicly dialable /tcp/443 listener now gets its TLS certificate for its own IP address, straight from Let's Encrypt, instead of registering a name with the libp2p.direct broker. Browsers reach it at /ip4/<ip>/tcp/443/tls/ws with no DNS lookup and nobody else in the path, and HTTPProvider serves the trustless gateway behind the same certificate on the same port. The only thing to configure is the listener. The ACME challenge that proves an address is defined on port 443 and nowhere else, so a node on any other port, or one the authority cannot reach, keeps using the broker exactly as before. - AutoTLS.IPCerts, on by default, opts back out to the broker path - AutoTLS.IPCertsPort is an advanced knob for a local ACME server; a public authority connects to 443 and ignores anything else p2p-forge and boxo are pinned to unreleased commits from ipshipyard/p2p-forge#94 and ipfs/boxo#1196 until those land.
1 parent bbc0e69 commit 6753cf8

12 files changed

Lines changed: 98 additions & 28 deletions

File tree

config/autotls.go

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,23 @@ type AutoTLS struct {
1616
// Optional, controls if Kubo should add /tls/sni/.../ws listener to every /tcp port if no explicit /ws is defined in Addresses.Swarm
1717
AutoWSS Flag `json:",omitempty"`
1818

19+
// IPCerts lets a node that is publicly reachable on TCP port 443 get a
20+
// TLS certificate for its own IP address straight from the certificate
21+
// authority, instead of registering a domain name with the p2p-forge
22+
// broker. The authority checks the address by connecting to it, which
23+
// only works on port 443, so this applies to a node with a
24+
// /ip4/../tcp/443 or /ip6/../tcp/443 listener in Addresses.Swarm and to
25+
// nothing else. Nodes without one keep using the broker, as does a node
26+
// whose port 443 turns out to be unreachable.
27+
IPCerts Flag `json:",omitempty"`
28+
29+
// IPCertsPort overrides the TCP port the certificate authority is
30+
// expected to connect to when it checks an IP address. Advanced,
31+
// test-only: public authorities always use 443 and ignore anything else,
32+
// so changing this only makes sense against a local ACME server such as
33+
// the one in test/autotls.
34+
IPCertsPort *OptionalInteger `json:",omitempty"`
35+
1936
// Optional, controls whether to skip network DNS lookups for p2p-forge domains.
2037
// Applies to resolution via DNS.Resolvers, including /dns* multiaddrs in go-libp2p.
2138
// When enabled (default), A/AAAA queries for *.libp2p.direct are resolved
@@ -76,6 +93,8 @@ const (
7693
DefaultRegistrationEndpoint = p2pforge.DefaultForgeEndpoint
7794
DefaultCAEndpoint = p2pforge.DefaultCAEndpoint
7895
DefaultAutoWSS = true // requires AutoTLS.Enabled
96+
DefaultAutoTLSIPCerts = true // requires AutoTLS.Enabled and a /tcp/443 listener
97+
DefaultAutoTLSIPCertsPort = p2pforge.DefaultIPCertPort
7998
DefaultAutoTLSShortAddrs = true // requires AutoTLS.Enabled
8099
DefaultAutoTLSSkipDNSLookup = true // skip network DNS for p2p-forge domains
81100
DefaultAutoTLSRegistrationDelay = 1 * time.Hour

core/node/libp2p/addrs.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -466,6 +466,16 @@ func P2PForgeCertMgr(repoPath string, cfg config.AutoTLS, atlsLog *logging.ZapEv
466466
p2pforge.WithCertificateStorage(certStorage),
467467
p2pforge.WithShortForgeAddrs(cfg.ShortAddrs.WithDefault(config.DefaultAutoTLSShortAddrs)),
468468
}
469+
// AutoTLS.IPCerts: ask the CA for a certificate covering this node's
470+
// own public IP address, which it validates by connecting to that
471+
// address on AutoTLS.IPCertsPort. A node reachable there never talks
472+
// to the p2p-forge broker; one that is not falls back to it.
473+
if cfg.IPCerts.WithDefault(config.DefaultAutoTLSIPCerts) {
474+
opts = append(opts,
475+
p2pforge.WithIPCerts(),
476+
p2pforge.WithIPCertPort(int(cfg.IPCertsPort.WithDefault(config.DefaultAutoTLSIPCertsPort))),
477+
)
478+
}
469479
// AutoTLS.TrustedCARootsPEM: optional CA bundle for private or
470480
// self-hosted ACME deployments (including the in-process Pebble
471481
// used by the AutoTLS E2E test).

docs/changelogs/vTBD.md

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,13 @@
11
# Kubo changelog vTBD
22

3-
<a href="https://ipshipyard.com/"><img align="right" src="https://github.com/user-attachments/assets/39ed3504-bb71-47f6-9bf8-cb9a1698f272" /></a>
4-
5-
This release was brought to you by the [Shipyard](https://ipshipyard.com/) team.
6-
73
- [vTBD](#vtbd)
84

95
## vTBD
106

117
- [Overview](#overview)
128
- [🔦 Highlights](#-highlights)
139
- [🌐 Experimental `HTTPProvider`: serve local data over plain HTTP/2](#-experimental-httpprovider-serve-local-data-over-plain-http2)
10+
- [🔒 AutoTLS without a broker: certificates for your own IP](#-autotls-without-a-broker-certificates-for-your-own-ip)
1411
- [📝 Changelog](#-changelog)
1512
- [👨‍👩‍👧‍👦 Contributors](#-contributors)
1613

@@ -28,6 +25,16 @@ This is a meaningful step toward broader IPFS interoperability: a stock HTTP cli
2825

2926
Off by default. See [`HTTPProvider`](https://github.com/ipfs/kubo/blob/master/docs/config.md#httpprovider) for the available settings and how to turn it on.
3027

28+
#### 🔒 AutoTLS without a broker: certificates for your own IP
29+
30+
If your node is reachable on TCP port 443, AutoTLS now gets its TLS certificate for your node's own IP address, directly from Let's Encrypt. No name is registered with the `libp2p.direct` broker, and no DNS lookup sits between a browser and your node.
31+
32+
The only change needed is a port 443 listener in [`Addresses.Swarm`](https://github.com/ipfs/kubo/blob/master/docs/config.md#addressesswarm), such as `/ip4/0.0.0.0/tcp/443`. Let's Encrypt checks the address by connecting back to it and speaking TLS, which your node answers on the same listener it already serves peers on, so nothing extra is exposed. Such a node announces `/ip4/<your-ip>/tcp/443/tls/ws` (and the matching `/tls/http` when [`HTTPProvider.AnnounceMultiaddrs`](https://github.com/ipfs/kubo/blob/master/docs/config.md#httpproviderannouncemultiaddrs) is on) in place of its `libp2p.direct` address.
33+
34+
Nodes on any other port, or whose port 443 turns out to be unreachable, keep using the broker exactly as before.
35+
36+
Certificates covering an IP address are short-lived by policy, valid for about six days, so a node has to stay online to keep renewing. Requests are paced to stay well inside Let's Encrypt's rate limits, and the pacing survives daemon restarts. See [`AutoTLS.IPCerts`](https://github.com/ipfs/kubo/blob/master/docs/config.md#autotlsipcerts).
37+
3138
### 📝 Changelog
3239

3340
### 👨‍👩‍👧‍👦 Contributors

docs/config.md

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@ config file at runtime.
3030
- [`AutoTLS`](#autotls)
3131
- [`AutoTLS.Enabled`](#autotlsenabled)
3232
- [`AutoTLS.AutoWSS`](#autotlsautowss)
33+
- [`AutoTLS.IPCerts`](#autotlsipcerts)
34+
- [`AutoTLS.IPCertsPort`](#autotlsipcertsport)
3335
- [`AutoTLS.ShortAddrs`](#autotlsshortaddrs)
3436
- [`AutoTLS.DomainSuffix`](#autotlsdomainsuffix)
3537
- [`AutoTLS.RegistrationEndpoint`](#autotlsregistrationendpoint)
@@ -798,6 +800,38 @@ Default: `true` (if `AutoTLS.Enabled`)
798800

799801
Type: `flag`
800802

803+
### `AutoTLS.IPCerts`
804+
805+
Optional. Lets a node get its TLS certificate for its own IP address, straight from the certificate authority, instead of registering a name with the `libp2p.direct` broker.
806+
807+
The only thing this needs is a `/tcp/443` listener in [`Addresses.Swarm`](#addressesswarm) that the internet can reach, for example `/ip4/0.0.0.0/tcp/443`. The authority checks the address by connecting back to it on port 443 and speaking TLS, which the node answers on the very listener it serves peers on. Nothing else is exposed, and no extra port is opened.
808+
809+
A node that gets such a certificate announces `/ip4/<your-ip>/tcp/443/tls/ws` (and, with [`HTTPProvider.AnnounceMultiaddrs`](#httpproviderannouncemultiaddrs), the matching `/tls/http`) and stops announcing its `libp2p.direct` name. Browsers and other peers connect to the IP directly, so no DNS lookup and no third-party service sit between a client and the node.
810+
811+
A node without a reachable port 443 keeps using the broker, as does one whose certificate request fails, so turning this off is only needed to force the broker path.
812+
813+
**Note:**
814+
815+
- Certificates for IP addresses are short-lived, currently valid for about six days, and are renewed a few days ahead of expiry. A node that stays offline past expiry falls back to the broker until it has renewed.
816+
- Binding port 443 needs root or `CAP_NET_BIND_SERVICE` on Linux. Kubo has to listen on 443 itself, including behind a router: forward the router's port 443 to port 443 on this node, not to some other port.
817+
- Address changes are handled: a certificate is requested per reachable address, and an address that goes away stops being renewed and announced. A node whose public address is not on any of its own interfaces, which is the normal case behind a router, waits a few minutes for other peers to tell it that address before deciding it needs the broker.
818+
- Requests are paced to stay inside the authority's [rate limits](https://letsencrypt.org/docs/rate-limits/): a failure is retried after an hour, doubling to at most a day, and the wait is written to disk before each attempt, so a node that keeps crashing cannot spend its budget one restart at a time.
819+
- Let's Encrypt issues IP certificates only under its short-lived [profile](https://letsencrypt.org/docs/profiles/), and only for `http-01` or `tls-alpn-01` validation. Kubo uses `tls-alpn-01`, which is why port 443 is the only port that works.
820+
821+
Default: `true` (if `AutoTLS.Enabled` and a reachable `/tcp/443` listener exists)
822+
823+
Type: `flag`
824+
825+
### `AutoTLS.IPCertsPort`
826+
827+
Optional. Overrides the TCP port the certificate authority is expected to connect to when it checks an IP address for [`AutoTLS.IPCerts`](#autotlsipcerts).
828+
829+
Advanced, meant for testing against a local ACME server. Public authorities always connect to port 443 and ignore anything else, so changing this on a production node only stops certificates from being issued.
830+
831+
Default: `443`
832+
833+
Type: `optionalInteger`
834+
801835
### `AutoTLS.ShortAddrs`
802836

803837
Optional. Controls if final AutoTLS listeners are announced under shorter `/dnsX/A.B.C.D.peerid.libp2p.direct/tcp/4001/tls/ws` addresses instead of fully resolved `/ip4/A.B.C.D/tcp/4001/tls/sni/A-B-C-D.peerid.libp2p.direct/tls/ws`.

docs/examples/kubo-as-a-library/go.mod

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ go 1.26.5
77
replace github.com/ipfs/kubo => ./../../..
88

99
require (
10-
github.com/ipfs/boxo v0.42.0
10+
github.com/ipfs/boxo v0.42.1-0.20260725202316-54899a7b7f82
1111
github.com/ipfs/kubo v0.0.0-00010101000000-000000000000
1212
github.com/libp2p/go-libp2p v0.48.1-0.20260709142922-ec408fcc60c9
1313
github.com/multiformats/go-multiaddr v0.16.1
@@ -102,7 +102,7 @@ require (
102102
github.com/ipld/go-car/v2 v2.17.0 // indirect
103103
github.com/ipld/go-codec-dagpb v1.7.0 // indirect
104104
github.com/ipld/go-ipld-prime v0.24.0 // indirect
105-
github.com/ipshipyard/p2p-forge v0.10.0 // indirect
105+
github.com/ipshipyard/p2p-forge v0.10.1-0.20260726184807-aaab2247e49a // indirect
106106
github.com/jackpal/go-nat-pmp v1.0.2 // indirect
107107
github.com/jbenet/go-temp-err-catcher v0.1.0 // indirect
108108
github.com/klauspost/compress v1.18.4 // indirect

docs/examples/kubo-as-a-library/go.sum

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -268,8 +268,8 @@ github.com/ipfs-shipyard/nopfs/ipfs v0.25.0 h1:OqNqsGZPX8zh3eFMO8Lf8EHRRnSGBMqcd
268268
github.com/ipfs-shipyard/nopfs/ipfs v0.25.0/go.mod h1:BxhUdtBgOXg1B+gAPEplkg/GpyTZY+kCMSfsJvvydqU=
269269
github.com/ipfs/bbloom v0.1.0 h1:nIWwfIE3AaG7RCDQIsrUonGCOTp7qSXzxH7ab/ss964=
270270
github.com/ipfs/bbloom v0.1.0/go.mod h1:lDy3A3i6ndgEW2z1CaRFvDi5/ZTzgM1IxA/pkL7Wgts=
271-
github.com/ipfs/boxo v0.42.0 h1:081LA7V9orgvGsCHMpxAjPz51JSDZtUaptZ9FwMcqP4=
272-
github.com/ipfs/boxo v0.42.0/go.mod h1:YoQNNShPIELwAGxmxemjZ/g7gqPUT8WDVO4ehPJU4Zg=
271+
github.com/ipfs/boxo v0.42.1-0.20260725202316-54899a7b7f82 h1:ivpzM0G3Ut/SMxyGYMMTApHDJqUR1D79QcJKO3D7xz0=
272+
github.com/ipfs/boxo v0.42.1-0.20260725202316-54899a7b7f82/go.mod h1:YoQNNShPIELwAGxmxemjZ/g7gqPUT8WDVO4ehPJU4Zg=
273273
github.com/ipfs/go-bitfield v1.1.0 h1:fh7FIo8bSwaJEh6DdTWbCeZ1eqOaOkKFI74SCnsWbGA=
274274
github.com/ipfs/go-bitfield v1.1.0/go.mod h1:paqf1wjq/D2BBmzfTVFlJQ9IlFOZpg422HL0HqsGWHU=
275275
github.com/ipfs/go-block-format v0.2.4 h1:pgsT9i8zB4YQkBIQRrBwqbQiXPogRCiQnfxd2bC4koI=
@@ -342,8 +342,8 @@ github.com/ipld/go-ipld-prime v0.24.0 h1:6th8Z6Peh5bCWuRAVZcDO1sHzZdVF6F2cCCDG36
342342
github.com/ipld/go-ipld-prime v0.24.0/go.mod h1:DYZxr/5caLNFbcuU6zLOgwSW7CgUEoC4wJiZMEU8Zhs=
343343
github.com/ipld/go-ipld-prime/storage/bsadapter v0.0.0-20250821084354-a425e60cd714 h1:cqNk8PEwHnK0vqWln+U/YZhQc9h2NB3KjUjDPZo5Q2s=
344344
github.com/ipld/go-ipld-prime/storage/bsadapter v0.0.0-20250821084354-a425e60cd714/go.mod h1:ZEUdra3CoqRVRYgAX/jAJO9aZGz6SKtKEG628fHHktY=
345-
github.com/ipshipyard/p2p-forge v0.10.0 h1:OcfcyjoHkeiIskhT4fHN/N82HfpgAteb1Eg3ZNAGE/U=
346-
github.com/ipshipyard/p2p-forge v0.10.0/go.mod h1:1keK1MRRCu5oNe9uFKfNIIZXOFEF9hgD1iK1DUsjsXQ=
345+
github.com/ipshipyard/p2p-forge v0.10.1-0.20260726184807-aaab2247e49a h1:N3OIOL8jsY08/Nu3LY6DGl99Vdn17CeLxCs6uKiJq0Q=
346+
github.com/ipshipyard/p2p-forge v0.10.1-0.20260726184807-aaab2247e49a/go.mod h1:1keK1MRRCu5oNe9uFKfNIIZXOFEF9hgD1iK1DUsjsXQ=
347347
github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus=
348348
github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc=
349349
github.com/jbenet/go-cienv v0.1.0/go.mod h1:TqNnHUmJgXau0nCzC7kXWeotg3J9W34CUv5Djy1+FlA=

go.mod

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ require (
2323
github.com/hashicorp/go-version v1.9.0
2424
github.com/ipfs-shipyard/nopfs v0.0.14
2525
github.com/ipfs-shipyard/nopfs/ipfs v0.25.0
26-
github.com/ipfs/boxo v0.42.0
26+
github.com/ipfs/boxo v0.42.1-0.20260725202316-54899a7b7f82
2727
github.com/ipfs/go-block-format v0.2.4
2828
github.com/ipfs/go-cid v0.6.2
2929
github.com/ipfs/go-cidutil v0.1.2
@@ -48,7 +48,7 @@ require (
4848
github.com/ipld/go-car/v2 v2.17.0
4949
github.com/ipld/go-codec-dagpb v1.7.0
5050
github.com/ipld/go-ipld-prime v0.24.0
51-
github.com/ipshipyard/p2p-forge v0.10.0
51+
github.com/ipshipyard/p2p-forge v0.10.1-0.20260726184807-aaab2247e49a
5252
github.com/jbenet/go-temp-err-catcher v0.1.0
5353
github.com/julienschmidt/httprouter v1.3.0
5454
github.com/libp2p/go-doh-resolver v0.6.0

go.sum

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -340,8 +340,8 @@ github.com/ipfs-shipyard/nopfs/ipfs v0.25.0 h1:OqNqsGZPX8zh3eFMO8Lf8EHRRnSGBMqcd
340340
github.com/ipfs-shipyard/nopfs/ipfs v0.25.0/go.mod h1:BxhUdtBgOXg1B+gAPEplkg/GpyTZY+kCMSfsJvvydqU=
341341
github.com/ipfs/bbloom v0.1.0 h1:nIWwfIE3AaG7RCDQIsrUonGCOTp7qSXzxH7ab/ss964=
342342
github.com/ipfs/bbloom v0.1.0/go.mod h1:lDy3A3i6ndgEW2z1CaRFvDi5/ZTzgM1IxA/pkL7Wgts=
343-
github.com/ipfs/boxo v0.42.0 h1:081LA7V9orgvGsCHMpxAjPz51JSDZtUaptZ9FwMcqP4=
344-
github.com/ipfs/boxo v0.42.0/go.mod h1:YoQNNShPIELwAGxmxemjZ/g7gqPUT8WDVO4ehPJU4Zg=
343+
github.com/ipfs/boxo v0.42.1-0.20260725202316-54899a7b7f82 h1:ivpzM0G3Ut/SMxyGYMMTApHDJqUR1D79QcJKO3D7xz0=
344+
github.com/ipfs/boxo v0.42.1-0.20260725202316-54899a7b7f82/go.mod h1:YoQNNShPIELwAGxmxemjZ/g7gqPUT8WDVO4ehPJU4Zg=
345345
github.com/ipfs/go-bitfield v1.1.0 h1:fh7FIo8bSwaJEh6DdTWbCeZ1eqOaOkKFI74SCnsWbGA=
346346
github.com/ipfs/go-bitfield v1.1.0/go.mod h1:paqf1wjq/D2BBmzfTVFlJQ9IlFOZpg422HL0HqsGWHU=
347347
github.com/ipfs/go-block-format v0.2.4 h1:pgsT9i8zB4YQkBIQRrBwqbQiXPogRCiQnfxd2bC4koI=
@@ -416,8 +416,8 @@ github.com/ipld/go-ipld-prime v0.24.0 h1:6th8Z6Peh5bCWuRAVZcDO1sHzZdVF6F2cCCDG36
416416
github.com/ipld/go-ipld-prime v0.24.0/go.mod h1:DYZxr/5caLNFbcuU6zLOgwSW7CgUEoC4wJiZMEU8Zhs=
417417
github.com/ipld/go-ipld-prime/storage/bsadapter v0.0.0-20250821084354-a425e60cd714 h1:cqNk8PEwHnK0vqWln+U/YZhQc9h2NB3KjUjDPZo5Q2s=
418418
github.com/ipld/go-ipld-prime/storage/bsadapter v0.0.0-20250821084354-a425e60cd714/go.mod h1:ZEUdra3CoqRVRYgAX/jAJO9aZGz6SKtKEG628fHHktY=
419-
github.com/ipshipyard/p2p-forge v0.10.0 h1:OcfcyjoHkeiIskhT4fHN/N82HfpgAteb1Eg3ZNAGE/U=
420-
github.com/ipshipyard/p2p-forge v0.10.0/go.mod h1:1keK1MRRCu5oNe9uFKfNIIZXOFEF9hgD1iK1DUsjsXQ=
419+
github.com/ipshipyard/p2p-forge v0.10.1-0.20260726184807-aaab2247e49a h1:N3OIOL8jsY08/Nu3LY6DGl99Vdn17CeLxCs6uKiJq0Q=
420+
github.com/ipshipyard/p2p-forge v0.10.1-0.20260726184807-aaab2247e49a/go.mod h1:1keK1MRRCu5oNe9uFKfNIIZXOFEF9hgD1iK1DUsjsXQ=
421421
github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus=
422422
github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc=
423423
github.com/jbenet/go-cienv v0.1.0/go.mod h1:TqNnHUmJgXau0nCzC7kXWeotg3J9W34CUv5Djy1+FlA=

test/autotls/go.mod

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ require (
1010
github.com/coredns/coredns v1.14.3
1111
github.com/ipfs/go-cid v0.6.2
1212
github.com/ipfs/kubo v0.0.0-00010101000000-000000000000
13-
github.com/ipshipyard/p2p-forge v0.10.0
13+
github.com/ipshipyard/p2p-forge v0.10.1-0.20260726184807-aaab2247e49a
1414
github.com/letsencrypt/pebble/v2 v2.10.1
1515
github.com/multiformats/go-multiaddr v0.16.1
1616
github.com/stretchr/testify v1.11.1
@@ -91,7 +91,7 @@ require (
9191
github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect
9292
github.com/huin/goupnp v1.3.0 // indirect
9393
github.com/ipfs/bbloom v0.1.0 // indirect
94-
github.com/ipfs/boxo v0.42.0 // indirect
94+
github.com/ipfs/boxo v0.42.1-0.20260725202316-54899a7b7f82 // indirect
9595
github.com/ipfs/go-bitfield v1.1.0 // indirect
9696
github.com/ipfs/go-block-format v0.2.4 // indirect
9797
github.com/ipfs/go-cidutil v0.1.2 // indirect

test/autotls/go.sum

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -209,8 +209,8 @@ github.com/huin/goupnp v1.3.0 h1:UvLUlWDNpoUdYzb2TCn+MuTWtcjXKSza2n6CBdQ0xXc=
209209
github.com/huin/goupnp v1.3.0/go.mod h1:gnGPsThkYa7bFi/KWmEysQRf48l2dvR5bxr2OFckNX8=
210210
github.com/ipfs/bbloom v0.1.0 h1:nIWwfIE3AaG7RCDQIsrUonGCOTp7qSXzxH7ab/ss964=
211211
github.com/ipfs/bbloom v0.1.0/go.mod h1:lDy3A3i6ndgEW2z1CaRFvDi5/ZTzgM1IxA/pkL7Wgts=
212-
github.com/ipfs/boxo v0.42.0 h1:081LA7V9orgvGsCHMpxAjPz51JSDZtUaptZ9FwMcqP4=
213-
github.com/ipfs/boxo v0.42.0/go.mod h1:YoQNNShPIELwAGxmxemjZ/g7gqPUT8WDVO4ehPJU4Zg=
212+
github.com/ipfs/boxo v0.42.1-0.20260725202316-54899a7b7f82 h1:ivpzM0G3Ut/SMxyGYMMTApHDJqUR1D79QcJKO3D7xz0=
213+
github.com/ipfs/boxo v0.42.1-0.20260725202316-54899a7b7f82/go.mod h1:YoQNNShPIELwAGxmxemjZ/g7gqPUT8WDVO4ehPJU4Zg=
214214
github.com/ipfs/go-bitfield v1.1.0 h1:fh7FIo8bSwaJEh6DdTWbCeZ1eqOaOkKFI74SCnsWbGA=
215215
github.com/ipfs/go-bitfield v1.1.0/go.mod h1:paqf1wjq/D2BBmzfTVFlJQ9IlFOZpg422HL0HqsGWHU=
216216
github.com/ipfs/go-block-format v0.2.4 h1:pgsT9i8zB4YQkBIQRrBwqbQiXPogRCiQnfxd2bC4koI=
@@ -263,8 +263,8 @@ github.com/ipld/go-ipld-prime v0.24.0 h1:6th8Z6Peh5bCWuRAVZcDO1sHzZdVF6F2cCCDG36
263263
github.com/ipld/go-ipld-prime v0.24.0/go.mod h1:DYZxr/5caLNFbcuU6zLOgwSW7CgUEoC4wJiZMEU8Zhs=
264264
github.com/ipld/go-ipld-prime/storage/bsadapter v0.0.0-20250821084354-a425e60cd714 h1:cqNk8PEwHnK0vqWln+U/YZhQc9h2NB3KjUjDPZo5Q2s=
265265
github.com/ipld/go-ipld-prime/storage/bsadapter v0.0.0-20250821084354-a425e60cd714/go.mod h1:ZEUdra3CoqRVRYgAX/jAJO9aZGz6SKtKEG628fHHktY=
266-
github.com/ipshipyard/p2p-forge v0.10.0 h1:OcfcyjoHkeiIskhT4fHN/N82HfpgAteb1Eg3ZNAGE/U=
267-
github.com/ipshipyard/p2p-forge v0.10.0/go.mod h1:1keK1MRRCu5oNe9uFKfNIIZXOFEF9hgD1iK1DUsjsXQ=
266+
github.com/ipshipyard/p2p-forge v0.10.1-0.20260726184807-aaab2247e49a h1:N3OIOL8jsY08/Nu3LY6DGl99Vdn17CeLxCs6uKiJq0Q=
267+
github.com/ipshipyard/p2p-forge v0.10.1-0.20260726184807-aaab2247e49a/go.mod h1:1keK1MRRCu5oNe9uFKfNIIZXOFEF9hgD1iK1DUsjsXQ=
268268
github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus=
269269
github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc=
270270
github.com/jbenet/go-temp-err-catcher v0.1.0 h1:zpb3ZH6wIE8Shj2sKS+khgRvf7T7RABoLk/+KKHggpk=

0 commit comments

Comments
 (0)