This commit is contained in:
Atakan Özgün
2025-12-04 04:03:47 +03:00
parent b5f4f363ee
commit b7af675930
2 changed files with 36 additions and 13 deletions

47
main.go
View File

@@ -17,24 +17,50 @@ import (
"github.com/libp2p/go-libp2p/core/peer"
"github.com/libp2p/go-libp2p/p2p/discovery/routing"
dutil "github.com/libp2p/go-libp2p/p2p/discovery/util"
"github.com/libp2p/go-libp2p/p2p/host/autorelay"
"github.com/multiformats/go-multiaddr"
)
const protocolID = "/onion-chat/1.0.0"
// IPFS'in resmi Relay sunucuları (Halka açık ve güvenilir)
var relayNodes = []string{
"/ip4/147.75.83.83/tcp/4001/p2p/QmbLHAnMoJPWSCR5Zhtx6BHJX9KiKNN6tpvbUcqanj75Nb",
"/ip4/147.75.76.67/tcp/4001/p2p/QmcZf59bWwK5XFi76CZX8cbJ4BhTzzA3gU1ZjYZcYW3dwt",
"/ip4/147.75.109.213/tcp/4001/p2p/QmNnooDu7bfjPFoTZYxMNLWUQJyrVwtbZg5gBMjTezGAJN",
}
func main() {
rendezvousString := flag.String("r", "gizli-tunel-sifresi", "Buluşma noktası için gizli kelime")
flag.Parse()
ctx := context.Background()
// 1. Libp2p Host'u oluştur (ZORLANMIŞ GİZLİLİK MODU)
// 1. Statik Relay Listesini Hazırla
var staticRelays []peer.AddrInfo
for _, s := range relayNodes {
ma, err := multiaddr.NewMultiaddr(s)
if err != nil {
continue
}
ai, err := peer.AddrInfoFromP2pAddr(ma)
if err != nil {
continue
}
staticRelays = append(staticRelays, *ai)
}
// 2. Libp2p Host'u oluştur
h, err := libp2p.New(
libp2p.ListenAddrStrings("/ip4/0.0.0.0/tcp/0", "/ip4/0.0.0.0/udp/0/quic-v1"),
libp2p.EnableHolePunching(),
libp2p.EnableNATService(),
libp2p.EnableRelay(),
libp2p.EnableAutoRelay(),
// ÖNEMLİ: Kendimizi "Gizli" olarak işaretliyoruz ki sistem bizi Relay kullanmaya zorlasın.
// MANUEL RELAY AYARI (Hata çözen kısım)
// Hazır fonksiyon yerine yukarıdaki listeyi kullanıyoruz.
libp2p.EnableAutoRelay(autorelay.WithStaticRelays(staticRelays)),
libp2p.ForceReachabilityPrivate(),
)
if err != nil {
@@ -44,7 +70,7 @@ func main() {
fmt.Printf("[*] Düğüm Başladı ID: %s\n", h.ID())
fmt.Println("[*] Küresel ağa bağlanılıyor (Bootstrapping)...")
// 2. DHT Başlat (ModeClient: Biz sunucu değiliz, sadece istemciyiz diyoruz, daha hızlı bağlanır)
// 3. DHT Başlat (ModeClient)
kademliaDHT, err := dht.New(ctx, h, dht.Mode(dht.ModeClient))
if err != nil {
log.Fatal(err)
@@ -54,7 +80,7 @@ func main() {
log.Fatal(err)
}
// 3. Bootstrap Düğümlerine Bağlan
// 4. Bootstrap Düğümlerine Bağlan
var wg sync.WaitGroup
for _, peerAddr := range dht.DefaultBootstrapPeers {
peerinfo, _ := peer.AddrInfoFromP2pAddr(peerAddr)
@@ -68,13 +94,11 @@ func main() {
wg.Wait()
fmt.Println("[+] IPFS Ağına Bağlanıldı.")
// 4. RELAY ADRESİ BEKLEME DÖNGÜSÜ (YENİ)
// Relay adresi almadan reklam yaparsak kimse bize bağlanamaz.
// 5. RELAY ADRESİ BEKLEME DÖNGÜSÜ
fmt.Print("[*] Bir Relay sunucusundan yer ayrılması bekleniyor...")
for {
hasRelay := false
for _, addr := range h.Addrs() {
// Adresler içinde /p2p-circuit/ var mı diye bakıyoruz
if strings.Contains(addr.String(), "p2p-circuit") {
hasRelay = true
break
@@ -88,15 +112,15 @@ func main() {
time.Sleep(time.Second * 1)
}
// 5. Stream Handler
// 6. Stream Handler
h.SetStreamHandler(protocolID, handleStream)
// 6. Discovery (Keşif) - ARTIK GÜVENLE YAYIN YAPABİLİRİZ
// 7. Discovery (Keşif)
routingDiscovery := routing.NewRoutingDiscovery(kademliaDHT)
dutil.Advertise(ctx, routingDiscovery, *rendezvousString)
fmt.Printf("[*] '%s' frekansında yayın yapılıyor.\n", *rendezvousString)
// 7. Arkadaşı Ara ve Bağlan
// 8. Arkadaşı Ara ve Bağlan
go func() {
for {
peerChan, err := routingDiscovery.FindPeers(ctx, *rendezvousString)
@@ -111,7 +135,6 @@ func main() {
fmt.Printf("[?] Bulunan Peer: %s. Bağlanılıyor...\n", peer.ID)
// Bağlantıyı daha agresif dene
ctxConnect, cancel := context.WithTimeout(ctx, time.Second*30)
err := h.Connect(ctxConnect, peer)
cancel()