commit inicial do projeto
This commit is contained in:
66
internal/p2p/host.go
Normal file
66
internal/p2p/host.go
Normal file
@ -0,0 +1,66 @@
|
||||
package p2p
|
||||
|
||||
import (
|
||||
"crypto/rand"
|
||||
"fmt"
|
||||
"log"
|
||||
|
||||
"github.com/libp2p/go-libp2p"
|
||||
crypto "github.com/libp2p/go-libp2p/core/crypto"
|
||||
hostlib "github.com/libp2p/go-libp2p/core/host"
|
||||
"github.com/libp2p/go-libp2p/core/network"
|
||||
"github.com/libp2p/go-libp2p/core/peer"
|
||||
ma "github.com/multiformats/go-multiaddr"
|
||||
)
|
||||
|
||||
// NewSecureHost cria um nó P2P com proteção básica anti-Sybil/DDoS
|
||||
func NewSecureHost(port int) (hostlib.Host, error) {
|
||||
// Gera par de chaves (identidade)
|
||||
priv, pub, err := crypto.GenerateKeyPairWithReader(crypto.Ed25519, 2048, rand.Reader)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("falha ao gerar chave: %v", err)
|
||||
}
|
||||
|
||||
pid, err := peer.IDFromPublicKey(pub)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("erro ao obter PeerID: %v", err)
|
||||
}
|
||||
|
||||
addr, _ := ma.NewMultiaddr(fmt.Sprintf("/ip4/0.0.0.0/tcp/%d", port))
|
||||
h, err := libp2p.New(
|
||||
libp2p.ListenAddrs(addr),
|
||||
libp2p.Identity(priv),
|
||||
)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("erro ao criar host libp2p: %v", err)
|
||||
}
|
||||
|
||||
log.Printf("✅ Host P2P criado: %s (%s)\n", pid.String(), addr)
|
||||
|
||||
// Proteção: loga e valida conexões
|
||||
h.Network().Notify(&connLogger{})
|
||||
|
||||
return h, nil
|
||||
}
|
||||
|
||||
// connLogger registra e controla conexões suspeitas
|
||||
type connLogger struct{}
|
||||
|
||||
func (c *connLogger) Connected(n network.Network, conn network.Conn) {
|
||||
if err := LimitConnections(conn); err != nil {
|
||||
log.Printf("🚫 Conexão rejeitada: %s (%v)", conn.RemotePeer(), err)
|
||||
conn.Close()
|
||||
return
|
||||
}
|
||||
log.Printf("🔗 Peer conectado: %s (%s)", conn.RemotePeer(), conn.RemoteMultiaddr())
|
||||
}
|
||||
|
||||
func (c *connLogger) Disconnected(n network.Network, conn network.Conn) {
|
||||
log.Printf("❌ Peer desconectado: %s", conn.RemotePeer())
|
||||
ClearConnection(conn)
|
||||
}
|
||||
|
||||
func (c *connLogger) OpenedStream(n network.Network, s network.Stream) {}
|
||||
func (c *connLogger) ClosedStream(n network.Network, s network.Stream) {}
|
||||
func (c *connLogger) Listen(n network.Network, addr ma.Multiaddr) {}
|
||||
func (c *connLogger) ListenClose(n network.Network, addr ma.Multiaddr) {}
|
||||
Reference in New Issue
Block a user