52 lines
1.2 KiB
Go
52 lines
1.2 KiB
Go
package p2p
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"time"
|
|
|
|
dht "github.com/libp2p/go-libp2p-kad-dht"
|
|
routingdiscovery "github.com/libp2p/go-libp2p/p2p/discovery/routing"
|
|
)
|
|
|
|
const rendezvousString = "dejo-global"
|
|
|
|
// InitDHT inicializa o Kademlia DHT e ativa descoberta global de peers.
|
|
func (p *P2PNode) InitDHT(ctx context.Context) error {
|
|
d, err := dht.New(ctx, p.Host)
|
|
if err != nil {
|
|
return fmt.Errorf("erro ao iniciar DHT: %w", err)
|
|
}
|
|
|
|
if err := d.Bootstrap(ctx); err != nil {
|
|
return fmt.Errorf("erro ao bootstrap DHT: %w", err)
|
|
}
|
|
|
|
routing := routingdiscovery.NewRoutingDiscovery(d)
|
|
_, err = routing.Advertise(ctx, rendezvousString)
|
|
if err != nil {
|
|
return fmt.Errorf("erro ao anunciar no DHT: %w", err)
|
|
}
|
|
|
|
fmt.Println("📡 Anunciado no DHT com tag:", rendezvousString)
|
|
|
|
go func() {
|
|
for {
|
|
peers, err := routing.FindPeers(ctx, rendezvousString)
|
|
if err != nil {
|
|
fmt.Println("Erro ao buscar peers:", err)
|
|
continue
|
|
}
|
|
for pinfo := range peers {
|
|
if pinfo.ID == p.Host.ID() {
|
|
continue // ignora si mesmo
|
|
}
|
|
fmt.Println("🌍 Peer encontrado via DHT:", pinfo.ID)
|
|
_ = p.Host.Connect(ctx, pinfo)
|
|
}
|
|
time.Sleep(10 * time.Second)
|
|
}
|
|
}()
|
|
|
|
return nil
|
|
} |