Skip to content

Commit 23f1b59

Browse files
committed
corehttp/routing: wire GetClosestPeers()
This allows Kubo to respond to the GetClosestPeers() http routing v1 endpoint as spec'ed here: ipfs/specs#476 It is based on work from ipfs/boxo#1021 We let IpfsNode implmement the contentRouter.Client interface with the new method. We use our DHTs to get the closest peers. We try to respect the count/closerThan options here. We then trigger FindPeers lookups to fill-in information about the peers (addresses) and return the result. Tests are missing and will come up once discussions around the spec and the boxo pr have settled.
1 parent 241b723 commit 23f1b59

7 files changed

Lines changed: 69 additions & 18 deletions

File tree

core/corehttp/routing.go

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,57 @@ func (r *contentRouter) PutIPNS(ctx context.Context, name ipns.Name, record *ipn
9696
return r.n.Routing.PutValue(ctx, string(name.RoutingKey()), raw)
9797
}
9898

99+
func (r *contentRouter) GetClosestPeers(ctx context.Context, pid peer.ID) (iter.ResultIter[*types.PeerRecord], error) {
100+
// Per the spec, if the peer ID is empty, we should use self.
101+
if pid == "" {
102+
pid = r.n.Identity
103+
}
104+
105+
peers, err := r.n.DHT.WAN.GetClosestPeers(ctx, string(pid))
106+
if err != nil {
107+
return nil, err
108+
}
109+
110+
lanPeers, err := r.n.DHT.LAN.GetClosestPeers(ctx, string(pid))
111+
if err != nil {
112+
return nil, err
113+
}
114+
peers = append(peers, lanPeers...)
115+
116+
// We have some DHT-closest peers. Find addresses for them. We can
117+
// use any routers for that, we can find records for DHT peers on
118+
// non-DHT routers with whatever protocols. FIXME: right? right??
119+
var records []*types.PeerRecord
120+
for _, p := range peers {
121+
record := types.PeerRecord{
122+
ID: &p,
123+
Schema: types.SchemaPeer,
124+
// we dont seem to care about protocol/extra infos
125+
// FIXME: should FindPeers care? That info seems to
126+
// not cross the FindPeer API.
127+
}
128+
// FindPeers will an iterator with a single item because
129+
// that's how it's implemented above. Treat it as if it
130+
// returned several records for a peer anyways. And merge them into the one above.
131+
peerIter, err := r.FindPeers(ctx, p, -1)
132+
if err != nil {
133+
continue
134+
}
135+
defer peerIter.Close()
136+
137+
for peerIter.Next() {
138+
val := peerIter.Val()
139+
if val.Err != nil {
140+
continue
141+
}
142+
record.Addrs = append(record.Addrs, val.Val.Addrs...)
143+
}
144+
records = append(records, &record)
145+
}
146+
147+
return iter.ToResultIter(iter.FromSlice(records)), nil
148+
}
149+
99150
type peerChanIter struct {
100151
ch <-chan peer.AddrInfo
101152
cancel context.CancelFunc

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.25
77
replace github.com/ipfs/kubo => ./../../..
88

99
require (
10-
github.com/ipfs/boxo v0.35.0
10+
github.com/ipfs/boxo v0.34.1-0.20250926121443-0a8bc14175c8
1111
github.com/ipfs/kubo v0.0.0-00010101000000-000000000000
1212
github.com/libp2p/go-libp2p v0.43.0
1313
github.com/multiformats/go-multiaddr v0.16.1
@@ -120,7 +120,7 @@ require (
120120
github.com/libp2p/go-libp2p-pubsub v0.14.2 // indirect
121121
github.com/libp2p/go-libp2p-pubsub-router v0.6.0 // indirect
122122
github.com/libp2p/go-libp2p-record v0.3.1 // indirect
123-
github.com/libp2p/go-libp2p-routing-helpers v0.7.5 // indirect
123+
github.com/libp2p/go-libp2p-routing-helpers v0.7.6-0.20250925120012-fe2c8e446449 // indirect
124124
github.com/libp2p/go-libp2p-xor v0.1.0 // indirect
125125
github.com/libp2p/go-msgio v0.3.0 // indirect
126126
github.com/libp2p/go-netroute v0.2.2 // indirect

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -291,8 +291,8 @@ github.com/ipfs-shipyard/nopfs/ipfs v0.25.0 h1:OqNqsGZPX8zh3eFMO8Lf8EHRRnSGBMqcd
291291
github.com/ipfs-shipyard/nopfs/ipfs v0.25.0/go.mod h1:BxhUdtBgOXg1B+gAPEplkg/GpyTZY+kCMSfsJvvydqU=
292292
github.com/ipfs/bbloom v0.0.4 h1:Gi+8EGJ2y5qiD5FbsbpX/TMNcJw8gSqr7eyjHa4Fhvs=
293293
github.com/ipfs/bbloom v0.0.4/go.mod h1:cS9YprKXpoZ9lT0n/Mw/a6/aFV6DTjTLYHeA+gyqMG0=
294-
github.com/ipfs/boxo v0.35.0 h1:3Mku5arSbAZz0dvb4goXRsQuZkFkPrGr5yYdu0YM1pY=
295-
github.com/ipfs/boxo v0.35.0/go.mod h1:uhaF0DGnbgEiXDTmD249jCGbxVkMm6+Ew85q6Uub7lo=
294+
github.com/ipfs/boxo v0.34.1-0.20250926121443-0a8bc14175c8 h1:Pf8Q7YLAmEH4XFDWdsniM/OAT6h51AMx9lSkE0HioM0=
295+
github.com/ipfs/boxo v0.34.1-0.20250926121443-0a8bc14175c8/go.mod h1:pg/fQZBzMgUksLQsyDDPDDTwebm9xakgxdNq2n2CjhM=
296296
github.com/ipfs/go-bitfield v1.1.0 h1:fh7FIo8bSwaJEh6DdTWbCeZ1eqOaOkKFI74SCnsWbGA=
297297
github.com/ipfs/go-bitfield v1.1.0/go.mod h1:paqf1wjq/D2BBmzfTVFlJQ9IlFOZpg422HL0HqsGWHU=
298298
github.com/ipfs/go-block-format v0.0.3/go.mod h1:4LmD4ZUw0mhO+JSKdpWwrzATiEfM7WWgQ8H5l6P8MVk=
@@ -446,8 +446,8 @@ github.com/libp2p/go-libp2p-pubsub-router v0.6.0 h1:D30iKdlqDt5ZmLEYhHELCMRj8b4s
446446
github.com/libp2p/go-libp2p-pubsub-router v0.6.0/go.mod h1:FY/q0/RBTKsLA7l4vqC2cbRbOvyDotg8PJQ7j8FDudE=
447447
github.com/libp2p/go-libp2p-record v0.3.1 h1:cly48Xi5GjNw5Wq+7gmjfBiG9HCzQVkiZOUZ8kUl+Fg=
448448
github.com/libp2p/go-libp2p-record v0.3.1/go.mod h1:T8itUkLcWQLCYMqtX7Th6r7SexyUJpIyPgks757td/E=
449-
github.com/libp2p/go-libp2p-routing-helpers v0.7.5 h1:HdwZj9NKovMx0vqq6YNPTh6aaNzey5zHD7HeLJtq6fI=
450-
github.com/libp2p/go-libp2p-routing-helpers v0.7.5/go.mod h1:3YaxrwP0OBPDD7my3D0KxfR89FlcX/IEbxDEDfAmj98=
449+
github.com/libp2p/go-libp2p-routing-helpers v0.7.6-0.20250925120012-fe2c8e446449 h1:Rfa4ltusUBgkPpRBXQdGBLMAzzoBMb+76sVGOblunTg=
450+
github.com/libp2p/go-libp2p-routing-helpers v0.7.6-0.20250925120012-fe2c8e446449/go.mod h1:Q1VSaOawgsvaa3hGl/PejADIhl2deiqSEsQDpB3Ggss=
451451
github.com/libp2p/go-libp2p-testing v0.12.0 h1:EPvBb4kKMWO29qP4mZGyhVzUyR25dvfUIK5WDu6iPUA=
452452
github.com/libp2p/go-libp2p-testing v0.12.0/go.mod h1:KcGDRXyN7sQCllucn1cOOS+Dmm7ujhfEyXQL5lvkcPg=
453453
github.com/libp2p/go-libp2p-xor v0.1.0 h1:hhQwT4uGrBcuAkUGXADuPltalOdpf9aag9kaYNT2tLA=

go.mod

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ require (
2222
github.com/hashicorp/go-version v1.7.0
2323
github.com/ipfs-shipyard/nopfs v0.0.14
2424
github.com/ipfs-shipyard/nopfs/ipfs v0.25.0
25-
github.com/ipfs/boxo v0.35.0
25+
github.com/ipfs/boxo v0.34.1-0.20250926121443-0a8bc14175c8
2626
github.com/ipfs/go-block-format v0.2.3
2727
github.com/ipfs/go-cid v0.5.0
2828
github.com/ipfs/go-cidutil v0.1.0
@@ -58,7 +58,7 @@ require (
5858
github.com/libp2p/go-libp2p-pubsub v0.14.2
5959
github.com/libp2p/go-libp2p-pubsub-router v0.6.0
6060
github.com/libp2p/go-libp2p-record v0.3.1
61-
github.com/libp2p/go-libp2p-routing-helpers v0.7.5
61+
github.com/libp2p/go-libp2p-routing-helpers v0.7.6-0.20250925120012-fe2c8e446449
6262
github.com/libp2p/go-libp2p-testing v0.12.0
6363
github.com/libp2p/go-socket-activation v0.1.1
6464
github.com/miekg/dns v1.1.68

go.sum

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -358,8 +358,8 @@ github.com/ipfs-shipyard/nopfs/ipfs v0.25.0 h1:OqNqsGZPX8zh3eFMO8Lf8EHRRnSGBMqcd
358358
github.com/ipfs-shipyard/nopfs/ipfs v0.25.0/go.mod h1:BxhUdtBgOXg1B+gAPEplkg/GpyTZY+kCMSfsJvvydqU=
359359
github.com/ipfs/bbloom v0.0.4 h1:Gi+8EGJ2y5qiD5FbsbpX/TMNcJw8gSqr7eyjHa4Fhvs=
360360
github.com/ipfs/bbloom v0.0.4/go.mod h1:cS9YprKXpoZ9lT0n/Mw/a6/aFV6DTjTLYHeA+gyqMG0=
361-
github.com/ipfs/boxo v0.35.0 h1:3Mku5arSbAZz0dvb4goXRsQuZkFkPrGr5yYdu0YM1pY=
362-
github.com/ipfs/boxo v0.35.0/go.mod h1:uhaF0DGnbgEiXDTmD249jCGbxVkMm6+Ew85q6Uub7lo=
361+
github.com/ipfs/boxo v0.34.1-0.20250926121443-0a8bc14175c8 h1:Pf8Q7YLAmEH4XFDWdsniM/OAT6h51AMx9lSkE0HioM0=
362+
github.com/ipfs/boxo v0.34.1-0.20250926121443-0a8bc14175c8/go.mod h1:pg/fQZBzMgUksLQsyDDPDDTwebm9xakgxdNq2n2CjhM=
363363
github.com/ipfs/go-bitfield v1.1.0 h1:fh7FIo8bSwaJEh6DdTWbCeZ1eqOaOkKFI74SCnsWbGA=
364364
github.com/ipfs/go-bitfield v1.1.0/go.mod h1:paqf1wjq/D2BBmzfTVFlJQ9IlFOZpg422HL0HqsGWHU=
365365
github.com/ipfs/go-block-format v0.0.3/go.mod h1:4LmD4ZUw0mhO+JSKdpWwrzATiEfM7WWgQ8H5l6P8MVk=
@@ -530,8 +530,8 @@ github.com/libp2p/go-libp2p-pubsub-router v0.6.0 h1:D30iKdlqDt5ZmLEYhHELCMRj8b4s
530530
github.com/libp2p/go-libp2p-pubsub-router v0.6.0/go.mod h1:FY/q0/RBTKsLA7l4vqC2cbRbOvyDotg8PJQ7j8FDudE=
531531
github.com/libp2p/go-libp2p-record v0.3.1 h1:cly48Xi5GjNw5Wq+7gmjfBiG9HCzQVkiZOUZ8kUl+Fg=
532532
github.com/libp2p/go-libp2p-record v0.3.1/go.mod h1:T8itUkLcWQLCYMqtX7Th6r7SexyUJpIyPgks757td/E=
533-
github.com/libp2p/go-libp2p-routing-helpers v0.7.5 h1:HdwZj9NKovMx0vqq6YNPTh6aaNzey5zHD7HeLJtq6fI=
534-
github.com/libp2p/go-libp2p-routing-helpers v0.7.5/go.mod h1:3YaxrwP0OBPDD7my3D0KxfR89FlcX/IEbxDEDfAmj98=
533+
github.com/libp2p/go-libp2p-routing-helpers v0.7.6-0.20250925120012-fe2c8e446449 h1:Rfa4ltusUBgkPpRBXQdGBLMAzzoBMb+76sVGOblunTg=
534+
github.com/libp2p/go-libp2p-routing-helpers v0.7.6-0.20250925120012-fe2c8e446449/go.mod h1:Q1VSaOawgsvaa3hGl/PejADIhl2deiqSEsQDpB3Ggss=
535535
github.com/libp2p/go-libp2p-testing v0.12.0 h1:EPvBb4kKMWO29qP4mZGyhVzUyR25dvfUIK5WDu6iPUA=
536536
github.com/libp2p/go-libp2p-testing v0.12.0/go.mod h1:KcGDRXyN7sQCllucn1cOOS+Dmm7ujhfEyXQL5lvkcPg=
537537
github.com/libp2p/go-libp2p-xor v0.1.0 h1:hhQwT4uGrBcuAkUGXADuPltalOdpf9aag9kaYNT2tLA=

test/dependencies/go.mod

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@ require (
136136
github.com/huin/goupnp v1.3.0 // indirect
137137
github.com/inconshreveable/mousetrap v1.1.0 // indirect
138138
github.com/ipfs/bbloom v0.0.4 // indirect
139-
github.com/ipfs/boxo v0.35.0 // indirect
139+
github.com/ipfs/boxo v0.34.1-0.20250926121443-0a8bc14175c8 // indirect
140140
github.com/ipfs/go-bitfield v1.1.0 // indirect
141141
github.com/ipfs/go-block-format v0.2.3 // indirect
142142
github.com/ipfs/go-cid v0.5.0 // indirect
@@ -187,7 +187,7 @@ require (
187187
github.com/libp2p/go-libp2p-kad-dht v0.35.0 // indirect
188188
github.com/libp2p/go-libp2p-kbucket v0.8.0 // indirect
189189
github.com/libp2p/go-libp2p-record v0.3.1 // indirect
190-
github.com/libp2p/go-libp2p-routing-helpers v0.7.5 // indirect
190+
github.com/libp2p/go-libp2p-routing-helpers v0.7.6-0.20250925120012-fe2c8e446449 // indirect
191191
github.com/libp2p/go-msgio v0.3.0 // indirect
192192
github.com/libp2p/go-netroute v0.2.2 // indirect
193193
github.com/libp2p/go-reuseport v0.4.0 // indirect

test/dependencies/go.sum

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -334,8 +334,8 @@ github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2
334334
github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
335335
github.com/ipfs/bbloom v0.0.4 h1:Gi+8EGJ2y5qiD5FbsbpX/TMNcJw8gSqr7eyjHa4Fhvs=
336336
github.com/ipfs/bbloom v0.0.4/go.mod h1:cS9YprKXpoZ9lT0n/Mw/a6/aFV6DTjTLYHeA+gyqMG0=
337-
github.com/ipfs/boxo v0.35.0 h1:3Mku5arSbAZz0dvb4goXRsQuZkFkPrGr5yYdu0YM1pY=
338-
github.com/ipfs/boxo v0.35.0/go.mod h1:uhaF0DGnbgEiXDTmD249jCGbxVkMm6+Ew85q6Uub7lo=
337+
github.com/ipfs/boxo v0.34.1-0.20250926121443-0a8bc14175c8 h1:Pf8Q7YLAmEH4XFDWdsniM/OAT6h51AMx9lSkE0HioM0=
338+
github.com/ipfs/boxo v0.34.1-0.20250926121443-0a8bc14175c8/go.mod h1:pg/fQZBzMgUksLQsyDDPDDTwebm9xakgxdNq2n2CjhM=
339339
github.com/ipfs/go-bitfield v1.1.0 h1:fh7FIo8bSwaJEh6DdTWbCeZ1eqOaOkKFI74SCnsWbGA=
340340
github.com/ipfs/go-bitfield v1.1.0/go.mod h1:paqf1wjq/D2BBmzfTVFlJQ9IlFOZpg422HL0HqsGWHU=
341341
github.com/ipfs/go-block-format v0.2.3 h1:mpCuDaNXJ4wrBJLrtEaGFGXkferrw5eqVvzaHhtFKQk=
@@ -474,8 +474,8 @@ github.com/libp2p/go-libp2p-kbucket v0.8.0 h1:QAK7RzKJpYe+EuSEATAaaHYMYLkPDGC18m
474474
github.com/libp2p/go-libp2p-kbucket v0.8.0/go.mod h1:JMlxqcEyKwO6ox716eyC0hmiduSWZZl6JY93mGaaqc4=
475475
github.com/libp2p/go-libp2p-record v0.3.1 h1:cly48Xi5GjNw5Wq+7gmjfBiG9HCzQVkiZOUZ8kUl+Fg=
476476
github.com/libp2p/go-libp2p-record v0.3.1/go.mod h1:T8itUkLcWQLCYMqtX7Th6r7SexyUJpIyPgks757td/E=
477-
github.com/libp2p/go-libp2p-routing-helpers v0.7.5 h1:HdwZj9NKovMx0vqq6YNPTh6aaNzey5zHD7HeLJtq6fI=
478-
github.com/libp2p/go-libp2p-routing-helpers v0.7.5/go.mod h1:3YaxrwP0OBPDD7my3D0KxfR89FlcX/IEbxDEDfAmj98=
477+
github.com/libp2p/go-libp2p-routing-helpers v0.7.6-0.20250925120012-fe2c8e446449 h1:Rfa4ltusUBgkPpRBXQdGBLMAzzoBMb+76sVGOblunTg=
478+
github.com/libp2p/go-libp2p-routing-helpers v0.7.6-0.20250925120012-fe2c8e446449/go.mod h1:Q1VSaOawgsvaa3hGl/PejADIhl2deiqSEsQDpB3Ggss=
479479
github.com/libp2p/go-libp2p-testing v0.12.0 h1:EPvBb4kKMWO29qP4mZGyhVzUyR25dvfUIK5WDu6iPUA=
480480
github.com/libp2p/go-libp2p-testing v0.12.0/go.mod h1:KcGDRXyN7sQCllucn1cOOS+Dmm7ujhfEyXQL5lvkcPg=
481481
github.com/libp2p/go-msgio v0.3.0 h1:mf3Z8B1xcFN314sWX+2vOTShIE0Mmn2TXn3YCUQGNj0=

0 commit comments

Comments
 (0)