Skip to content

Commit 5d605bc

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 776c21a commit 5d605bc

File tree

7 files changed

+69
-18
lines changed

7 files changed

+69
-18
lines changed

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.34.1-0.20250925224331-260f4b387f28
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
@@ -119,7 +119,7 @@ require (
119119
github.com/libp2p/go-libp2p-pubsub v0.14.2 // indirect
120120
github.com/libp2p/go-libp2p-pubsub-router v0.6.0 // indirect
121121
github.com/libp2p/go-libp2p-record v0.3.1 // indirect
122-
github.com/libp2p/go-libp2p-routing-helpers v0.7.5 // indirect
122+
github.com/libp2p/go-libp2p-routing-helpers v0.7.6-0.20250925120012-fe2c8e446449 // indirect
123123
github.com/libp2p/go-libp2p-xor v0.1.0 // indirect
124124
github.com/libp2p/go-msgio v0.3.0 // indirect
125125
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
@@ -289,8 +289,8 @@ github.com/ipfs-shipyard/nopfs/ipfs v0.25.0 h1:OqNqsGZPX8zh3eFMO8Lf8EHRRnSGBMqcd
289289
github.com/ipfs-shipyard/nopfs/ipfs v0.25.0/go.mod h1:BxhUdtBgOXg1B+gAPEplkg/GpyTZY+kCMSfsJvvydqU=
290290
github.com/ipfs/bbloom v0.0.4 h1:Gi+8EGJ2y5qiD5FbsbpX/TMNcJw8gSqr7eyjHa4Fhvs=
291291
github.com/ipfs/bbloom v0.0.4/go.mod h1:cS9YprKXpoZ9lT0n/Mw/a6/aFV6DTjTLYHeA+gyqMG0=
292-
github.com/ipfs/boxo v0.34.1-0.20250925224331-260f4b387f28 h1:kDoj2V7ghhLdQeQUtzr605tb6NJ4AzwRYtXFJas+Wyc=
293-
github.com/ipfs/boxo v0.34.1-0.20250925224331-260f4b387f28/go.mod h1:uhaF0DGnbgEiXDTmD249jCGbxVkMm6+Ew85q6Uub7lo=
292+
github.com/ipfs/boxo v0.34.1-0.20250926121443-0a8bc14175c8 h1:Pf8Q7YLAmEH4XFDWdsniM/OAT6h51AMx9lSkE0HioM0=
293+
github.com/ipfs/boxo v0.34.1-0.20250926121443-0a8bc14175c8/go.mod h1:pg/fQZBzMgUksLQsyDDPDDTwebm9xakgxdNq2n2CjhM=
294294
github.com/ipfs/go-bitfield v1.1.0 h1:fh7FIo8bSwaJEh6DdTWbCeZ1eqOaOkKFI74SCnsWbGA=
295295
github.com/ipfs/go-bitfield v1.1.0/go.mod h1:paqf1wjq/D2BBmzfTVFlJQ9IlFOZpg422HL0HqsGWHU=
296296
github.com/ipfs/go-block-format v0.0.3/go.mod h1:4LmD4ZUw0mhO+JSKdpWwrzATiEfM7WWgQ8H5l6P8MVk=
@@ -444,8 +444,8 @@ github.com/libp2p/go-libp2p-pubsub-router v0.6.0 h1:D30iKdlqDt5ZmLEYhHELCMRj8b4s
444444
github.com/libp2p/go-libp2p-pubsub-router v0.6.0/go.mod h1:FY/q0/RBTKsLA7l4vqC2cbRbOvyDotg8PJQ7j8FDudE=
445445
github.com/libp2p/go-libp2p-record v0.3.1 h1:cly48Xi5GjNw5Wq+7gmjfBiG9HCzQVkiZOUZ8kUl+Fg=
446446
github.com/libp2p/go-libp2p-record v0.3.1/go.mod h1:T8itUkLcWQLCYMqtX7Th6r7SexyUJpIyPgks757td/E=
447-
github.com/libp2p/go-libp2p-routing-helpers v0.7.5 h1:HdwZj9NKovMx0vqq6YNPTh6aaNzey5zHD7HeLJtq6fI=
448-
github.com/libp2p/go-libp2p-routing-helpers v0.7.5/go.mod h1:3YaxrwP0OBPDD7my3D0KxfR89FlcX/IEbxDEDfAmj98=
447+
github.com/libp2p/go-libp2p-routing-helpers v0.7.6-0.20250925120012-fe2c8e446449 h1:Rfa4ltusUBgkPpRBXQdGBLMAzzoBMb+76sVGOblunTg=
448+
github.com/libp2p/go-libp2p-routing-helpers v0.7.6-0.20250925120012-fe2c8e446449/go.mod h1:Q1VSaOawgsvaa3hGl/PejADIhl2deiqSEsQDpB3Ggss=
449449
github.com/libp2p/go-libp2p-testing v0.12.0 h1:EPvBb4kKMWO29qP4mZGyhVzUyR25dvfUIK5WDu6iPUA=
450450
github.com/libp2p/go-libp2p-testing v0.12.0/go.mod h1:KcGDRXyN7sQCllucn1cOOS+Dmm7ujhfEyXQL5lvkcPg=
451451
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.34.1-0.20250925224331-260f4b387f28
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
@@ -356,8 +356,8 @@ github.com/ipfs-shipyard/nopfs/ipfs v0.25.0 h1:OqNqsGZPX8zh3eFMO8Lf8EHRRnSGBMqcd
356356
github.com/ipfs-shipyard/nopfs/ipfs v0.25.0/go.mod h1:BxhUdtBgOXg1B+gAPEplkg/GpyTZY+kCMSfsJvvydqU=
357357
github.com/ipfs/bbloom v0.0.4 h1:Gi+8EGJ2y5qiD5FbsbpX/TMNcJw8gSqr7eyjHa4Fhvs=
358358
github.com/ipfs/bbloom v0.0.4/go.mod h1:cS9YprKXpoZ9lT0n/Mw/a6/aFV6DTjTLYHeA+gyqMG0=
359-
github.com/ipfs/boxo v0.34.1-0.20250925224331-260f4b387f28 h1:kDoj2V7ghhLdQeQUtzr605tb6NJ4AzwRYtXFJas+Wyc=
360-
github.com/ipfs/boxo v0.34.1-0.20250925224331-260f4b387f28/go.mod h1:uhaF0DGnbgEiXDTmD249jCGbxVkMm6+Ew85q6Uub7lo=
359+
github.com/ipfs/boxo v0.34.1-0.20250926121443-0a8bc14175c8 h1:Pf8Q7YLAmEH4XFDWdsniM/OAT6h51AMx9lSkE0HioM0=
360+
github.com/ipfs/boxo v0.34.1-0.20250926121443-0a8bc14175c8/go.mod h1:pg/fQZBzMgUksLQsyDDPDDTwebm9xakgxdNq2n2CjhM=
361361
github.com/ipfs/go-bitfield v1.1.0 h1:fh7FIo8bSwaJEh6DdTWbCeZ1eqOaOkKFI74SCnsWbGA=
362362
github.com/ipfs/go-bitfield v1.1.0/go.mod h1:paqf1wjq/D2BBmzfTVFlJQ9IlFOZpg422HL0HqsGWHU=
363363
github.com/ipfs/go-block-format v0.0.3/go.mod h1:4LmD4ZUw0mhO+JSKdpWwrzATiEfM7WWgQ8H5l6P8MVk=
@@ -528,8 +528,8 @@ github.com/libp2p/go-libp2p-pubsub-router v0.6.0 h1:D30iKdlqDt5ZmLEYhHELCMRj8b4s
528528
github.com/libp2p/go-libp2p-pubsub-router v0.6.0/go.mod h1:FY/q0/RBTKsLA7l4vqC2cbRbOvyDotg8PJQ7j8FDudE=
529529
github.com/libp2p/go-libp2p-record v0.3.1 h1:cly48Xi5GjNw5Wq+7gmjfBiG9HCzQVkiZOUZ8kUl+Fg=
530530
github.com/libp2p/go-libp2p-record v0.3.1/go.mod h1:T8itUkLcWQLCYMqtX7Th6r7SexyUJpIyPgks757td/E=
531-
github.com/libp2p/go-libp2p-routing-helpers v0.7.5 h1:HdwZj9NKovMx0vqq6YNPTh6aaNzey5zHD7HeLJtq6fI=
532-
github.com/libp2p/go-libp2p-routing-helpers v0.7.5/go.mod h1:3YaxrwP0OBPDD7my3D0KxfR89FlcX/IEbxDEDfAmj98=
531+
github.com/libp2p/go-libp2p-routing-helpers v0.7.6-0.20250925120012-fe2c8e446449 h1:Rfa4ltusUBgkPpRBXQdGBLMAzzoBMb+76sVGOblunTg=
532+
github.com/libp2p/go-libp2p-routing-helpers v0.7.6-0.20250925120012-fe2c8e446449/go.mod h1:Q1VSaOawgsvaa3hGl/PejADIhl2deiqSEsQDpB3Ggss=
533533
github.com/libp2p/go-libp2p-testing v0.12.0 h1:EPvBb4kKMWO29qP4mZGyhVzUyR25dvfUIK5WDu6iPUA=
534534
github.com/libp2p/go-libp2p-testing v0.12.0/go.mod h1:KcGDRXyN7sQCllucn1cOOS+Dmm7ujhfEyXQL5lvkcPg=
535535
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
@@ -135,7 +135,7 @@ require (
135135
github.com/huin/goupnp v1.3.0 // indirect
136136
github.com/inconshreveable/mousetrap v1.1.0 // indirect
137137
github.com/ipfs/bbloom v0.0.4 // indirect
138-
github.com/ipfs/boxo v0.34.1-0.20250925224331-260f4b387f28 // indirect
138+
github.com/ipfs/boxo v0.34.1-0.20250926121443-0a8bc14175c8 // indirect
139139
github.com/ipfs/go-bitfield v1.1.0 // indirect
140140
github.com/ipfs/go-block-format v0.2.3 // indirect
141141
github.com/ipfs/go-cid v0.5.0 // indirect
@@ -186,7 +186,7 @@ require (
186186
github.com/libp2p/go-libp2p-kad-dht v0.34.1-0.20250918150625-2e3cea182b63 // indirect
187187
github.com/libp2p/go-libp2p-kbucket v0.8.0 // indirect
188188
github.com/libp2p/go-libp2p-record v0.3.1 // indirect
189-
github.com/libp2p/go-libp2p-routing-helpers v0.7.5 // indirect
189+
github.com/libp2p/go-libp2p-routing-helpers v0.7.6-0.20250925120012-fe2c8e446449 // indirect
190190
github.com/libp2p/go-msgio v0.3.0 // indirect
191191
github.com/libp2p/go-netroute v0.2.2 // indirect
192192
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
@@ -332,8 +332,8 @@ github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2
332332
github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
333333
github.com/ipfs/bbloom v0.0.4 h1:Gi+8EGJ2y5qiD5FbsbpX/TMNcJw8gSqr7eyjHa4Fhvs=
334334
github.com/ipfs/bbloom v0.0.4/go.mod h1:cS9YprKXpoZ9lT0n/Mw/a6/aFV6DTjTLYHeA+gyqMG0=
335-
github.com/ipfs/boxo v0.34.1-0.20250925224331-260f4b387f28 h1:kDoj2V7ghhLdQeQUtzr605tb6NJ4AzwRYtXFJas+Wyc=
336-
github.com/ipfs/boxo v0.34.1-0.20250925224331-260f4b387f28/go.mod h1:uhaF0DGnbgEiXDTmD249jCGbxVkMm6+Ew85q6Uub7lo=
335+
github.com/ipfs/boxo v0.34.1-0.20250926121443-0a8bc14175c8 h1:Pf8Q7YLAmEH4XFDWdsniM/OAT6h51AMx9lSkE0HioM0=
336+
github.com/ipfs/boxo v0.34.1-0.20250926121443-0a8bc14175c8/go.mod h1:pg/fQZBzMgUksLQsyDDPDDTwebm9xakgxdNq2n2CjhM=
337337
github.com/ipfs/go-bitfield v1.1.0 h1:fh7FIo8bSwaJEh6DdTWbCeZ1eqOaOkKFI74SCnsWbGA=
338338
github.com/ipfs/go-bitfield v1.1.0/go.mod h1:paqf1wjq/D2BBmzfTVFlJQ9IlFOZpg422HL0HqsGWHU=
339339
github.com/ipfs/go-block-format v0.2.3 h1:mpCuDaNXJ4wrBJLrtEaGFGXkferrw5eqVvzaHhtFKQk=
@@ -472,8 +472,8 @@ github.com/libp2p/go-libp2p-kbucket v0.8.0 h1:QAK7RzKJpYe+EuSEATAaaHYMYLkPDGC18m
472472
github.com/libp2p/go-libp2p-kbucket v0.8.0/go.mod h1:JMlxqcEyKwO6ox716eyC0hmiduSWZZl6JY93mGaaqc4=
473473
github.com/libp2p/go-libp2p-record v0.3.1 h1:cly48Xi5GjNw5Wq+7gmjfBiG9HCzQVkiZOUZ8kUl+Fg=
474474
github.com/libp2p/go-libp2p-record v0.3.1/go.mod h1:T8itUkLcWQLCYMqtX7Th6r7SexyUJpIyPgks757td/E=
475-
github.com/libp2p/go-libp2p-routing-helpers v0.7.5 h1:HdwZj9NKovMx0vqq6YNPTh6aaNzey5zHD7HeLJtq6fI=
476-
github.com/libp2p/go-libp2p-routing-helpers v0.7.5/go.mod h1:3YaxrwP0OBPDD7my3D0KxfR89FlcX/IEbxDEDfAmj98=
475+
github.com/libp2p/go-libp2p-routing-helpers v0.7.6-0.20250925120012-fe2c8e446449 h1:Rfa4ltusUBgkPpRBXQdGBLMAzzoBMb+76sVGOblunTg=
476+
github.com/libp2p/go-libp2p-routing-helpers v0.7.6-0.20250925120012-fe2c8e446449/go.mod h1:Q1VSaOawgsvaa3hGl/PejADIhl2deiqSEsQDpB3Ggss=
477477
github.com/libp2p/go-libp2p-testing v0.12.0 h1:EPvBb4kKMWO29qP4mZGyhVzUyR25dvfUIK5WDu6iPUA=
478478
github.com/libp2p/go-libp2p-testing v0.12.0/go.mod h1:KcGDRXyN7sQCllucn1cOOS+Dmm7ujhfEyXQL5lvkcPg=
479479
github.com/libp2p/go-msgio v0.3.0 h1:mf3Z8B1xcFN314sWX+2vOTShIE0Mmn2TXn3YCUQGNj0=

0 commit comments

Comments
 (0)