Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
50 changes: 50 additions & 0 deletions lib/dht.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,11 @@ package vole

import (
"context"
"fmt"
"time"

"github.com/libp2p/go-libp2p"
dht "github.com/libp2p/go-libp2p-kad-dht"
"github.com/libp2p/go-libp2p/core/host"
"github.com/libp2p/go-libp2p/core/network"
"github.com/libp2p/go-libp2p/core/peer"
Expand Down Expand Up @@ -107,6 +110,53 @@ func DhtGetClosestPeers(ctx context.Context, key []byte, proto protocol.ID, ma m
return ais, nil
}

func DhtFindPeer(ctx context.Context, peerToFind peer.ID, bootstrappers []peer.AddrInfo) (*peer.AddrInfo, error) {
h, err := libp2p.New(libp2p.NoListenAddrs)
if err != nil {
return nil, fmt.Errorf("failed to create host: %w", err)
}
defer h.Close()

dhtOpts := []dht.Option{
dht.Mode(dht.ModeClient),
dht.BootstrapPeers(bootstrappers...),
}

kademliaDHT, err := dht.New(ctx, h, dhtOpts...)
if err != nil {
return nil, fmt.Errorf("failed to create dht client: %w", err)
}
defer kademliaDHT.Close()

if err = kademliaDHT.Bootstrap(ctx); err != nil {
return nil, fmt.Errorf("bootstrap failed: %w", err)
}

deadline := time.NewTimer(5 * time.Second)
defer deadline.Stop()

ticker := time.NewTicker(100 * time.Millisecond)
defer ticker.Stop()

for kademliaDHT.RoutingTable().Size() < 10 {
select {
case <-deadline.C:
return nil, fmt.Errorf("routing table warmup timed out (size=%d)", kademliaDHT.RoutingTable().Size())
case <-ctx.Done():
return nil, fmt.Errorf("routing table warmup canceled: %w (size=%d)", ctx.Err(), kademliaDHT.RoutingTable().Size())
case <-ticker.C:
// keep polling
}
}

peerInfo, err := kademliaDHT.FindPeer(ctx, peerToFind)
if err != nil {
return nil, fmt.Errorf("FindPeer failed: %w", err)
}

return &peerInfo, nil
}

func DhtPing(ctx context.Context, proto protocol.ID, ma multiaddr.Multiaddr) error {
ai, err := peer.AddrInfoFromP2pAddr(ma)
if err != nil {
Expand Down
53 changes: 52 additions & 1 deletion main.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import (
"github.com/urfave/cli/v2"

"github.com/ipfs/go-cid"
dht "github.com/libp2p/go-libp2p-kad-dht"
"github.com/libp2p/go-libp2p/core/peer"
"github.com/libp2p/go-libp2p/core/protocol"
"github.com/libp2p/go-libp2p/p2p/protocol/identify"
Expand Down Expand Up @@ -234,6 +235,56 @@ func main() {
},
},
},
{
Name: "findpeer",
ArgsUsage: "<peer-id> <optional-bootstrapper-multiaddr>",
Usage: "findpeer resolves the multiaddrs for a peer ID",
Description: "creates a libp2p peer and sends DHT get closest peers requests until the peer is found. An optional bootstrapper can be provided, otherwise it falls back to the default bootstrappers",
Action: func(c *cli.Context) error {
if c.NArg() == 0 || c.NArg() > 2 {
return fmt.Errorf("invalid number of arguments")
}

peerIDStr := c.Args().Get(0)
bootstrappers := make([]peer.AddrInfo, 0)

if c.NArg() == 2 {
maStr := c.Args().Get(1)

ma, err := multiaddr.NewMultiaddr(maStr)
if err != nil {
return err
}

bootstrapper, err := peer.AddrInfoFromP2pAddr(ma)
if err != nil {
return fmt.Errorf("failed to parse bootstrapper multiaddr: %w", err)
}

bootstrappers = append(bootstrappers, *bootstrapper)

} else {
bootstrappers = dht.GetDefaultBootstrapPeerAddrInfos()
}

peerID, err := peer.Decode(peerIDStr)
if err != nil {
return err
}

ais, err := vole.DhtFindPeer(c.Context, peerID, bootstrappers)
if err != nil {
return err
}

for _, a := range ais.Addrs {
fmt.Println(a)
}

return nil
},
Flags: []cli.Flag{},
},
{
Name: "ping",
ArgsUsage: "<multiaddr>",
Expand Down Expand Up @@ -345,7 +396,6 @@ Note: may not work with some transports such as p2p-circuit (not applicable) and
Name: "ping",
ArgsUsage: "<multiaddr>",
Flags: []cli.Flag{

&cli.BoolFlag{
Name: "force-relay",
Usage: `Ping the peer over a relay instead of a direct connection`,
Expand Down Expand Up @@ -440,6 +490,7 @@ var bitswapGetCmd = &cli.Command{
return vole.GetBitswapCID(root, ai)
},
}

var bitswapCheckCmd = &cli.Command{
Name: "check",
ArgsUsage: "<cid> <multiaddr>",
Expand Down