Files

89 lines
1.6 KiB
Go
Raw Permalink Normal View History

2026-01-27 16:04:45 +01:00
package main
import (
"context"
"fmt"
"log"
"os"
"os/signal"
"syscall"
"time"
libp2p "github.com/libp2p/go-libp2p"
dht "github.com/libp2p/go-libp2p-kad-dht"
"github.com/libp2p/go-libp2p/core/crypto"
"github.com/libp2p/go-libp2p/core/host"
)
func main() {
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
priv, err := loadOrCreateKey("bootstrap.key")
if err != nil {
log.Fatal(err)
}
h, err := libp2p.New(
libp2p.Identity(priv),
libp2p.ListenAddrStrings(
"/ip4/0.0.0.0/tcp/4001",
),
)
if err != nil {
log.Fatal(err)
}
kad, err := dht.New(ctx, h,
dht.Mode(dht.ModeServer),
dht.BootstrapPeers(),
)
if err != nil {
log.Fatal(err)
}
if err := kad.Bootstrap(ctx); err != nil {
log.Fatal(err)
}
printAddrs(h)
waitForSignal()
}
func loadOrCreateKey(path string) (crypto.PrivKey, error) {
if data, err := os.ReadFile(path); err == nil {
return crypto.UnmarshalPrivateKey(data)
}
priv, _, err := crypto.GenerateEd25519Key(nil)
if err != nil {
return nil, err
}
data, err := crypto.MarshalPrivateKey(priv)
if err != nil {
return nil, err
}
if err := os.WriteFile(path, data, 0600); err != nil {
return nil, err
}
return priv, nil
}
func printAddrs(h host.Host) {
fmt.Println("Bootstrap node started")
fmt.Println("PeerID:", h.ID())
for _, a := range h.Addrs() {
fmt.Printf("%s/p2p/%s\n", a, h.ID())
}
}
func waitForSignal() {
ch := make(chan os.Signal, 1)
signal.Notify(ch, syscall.SIGINT, syscall.SIGTERM)
<-ch
fmt.Println("Shutting down bootstrap node")
time.Sleep(1 * time.Second)
}