network

package module
v0.1.1 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Oct 25, 2025 License: MIT Imports: 23 Imported by: 0

README

Universal Network Module Based on go-libp2p

Overview

This is a universal network module based on go-libp2p, which can be used in various P2P application scenarios such as blockchain and chat systems. The module provides simple and easy-to-use APIs, supporting both broadcast mode and point-to-point request mode, with filtering functionality for broadcast mode.

Features

  • Dual Communication Modes: Supports broadcast mode (publish/subscribe) and point-to-point request/response mode
  • Easy to Use: Provides clean API interfaces to reduce the complexity of P2P network programming
  • Message Filtering: Broadcast mode supports message filtering functionality
  • Automatic Discovery: Supports mDNS local node discovery (can be configured to enable/disable)
  • Secure Transport: Based on libp2p secure transport protocols
  • Extensibility: Modular design, easy to integrate into different types of projects

Installation

go get github.com/lengzhao/network

Quick Start

1. Create Network Instance
import (
    "github.com/lengzhao/network"
)

// Method 1: Use NewNetworkConfig to create default configuration (recommended)
cfg := network.NewNetworkConfig()
cfg.Host = "0.0.0.0"
cfg.Port = 8000
cfg.MaxPeers = 100
cfg.PrivateKeyPath = "./private_key.pem"
cfg.BootstrapPeers = []string{} // Optional bootstrap nodes

// Create network instance
net, err := network.New(cfg)
if err != nil {
    log.Fatalf("Failed to create network: %v", err)
}
2. Register Message Handlers
// Register broadcast message handler
net.RegisterMessageHandler("chat", func(from string, topic string, data []byte) error {
    fmt.Printf("Received broadcast message from %s on topic %s: %s\n", from, topic, string(data))
    return nil
})

// Register point-to-point request handler
net.RegisterRequestHandler("echo", func(from string, reqType string, data []byte) ([]byte, error) {
    // Echo request data as response
    return data, nil
})
3. Register Message Filter (Optional)
// Register message filter
net.RegisterMessageFilter("chat", func(from string, topic string, data []byte) bool {
    // Filter out messages containing "spam"
    if string(data) == "spam" {
        return false
    }
    return true
})
4. Start Network
ctx, cancel := context.WithCancel(context.Background())
defer cancel()

// Run network in goroutine
go func() {
    if err := net.Run(ctx); err != nil {
        log.Printf("Network stopped with error: %v", err)
    }
}()

// Wait for network to start
time.Sleep(1 * time.Second)
5. Use Network Functions
// Broadcast message
err = net.BroadcastMessage("chat", []byte("Hello, world!"))
if err != nil {
    log.Printf("Failed to broadcast message: %v", err)
}

// Send point-to-point request
response, err := net.SendRequest(targetPeerID, "echo", []byte("Hello!"))
if err != nil {
    log.Printf("Failed to send request: %v", err)
} else {
    fmt.Printf("Received response: %s\n", string(response))
}

Configuration Options

NetworkConfig Configuration Description
Field Name Type Description Default Value
Host string Listening address "0.0.0.0"
Port int Listening port 0
MaxPeers int Maximum number of connections 100
PrivateKeyPath string Private key file path ""
BootstrapPeers []string Bootstrap node address list Empty array
PeerWhitelist []string Node whitelist (list of node ID strings) Empty array
LogConfig *log.LogConfig Log configuration nil
DisableMDNS bool Whether to disable MDNS discovery false (when created with NewNetworkConfig())
EnablePeerScoring bool Whether to enable Peer scoring true
DiscoveryInterval time.Duration Node discovery interval 1 minute
MaxIPColocation int Maximum number of nodes per IP address 3
ScoreInspectInterval time.Duration Score inspection interval 1 minute
IPColocationWeight float64 IP colocation weight -0.1
BehaviourWeight float64 Behavior weight -1.0
BehaviourDecay float64 Behavior decay factor 0.98

Note: When directly creating a NetworkConfig struct, the zero value of DisableMDNS is false, meaning mDNS is enabled by default. It is recommended to use the network.NewNetworkConfig() function to create configuration instances to get correct default values.

API Reference

NetworkInterface Interface
type NetworkInterface interface {
    // Run Start the network module and run
    Run(ctx context.Context) error

    // BroadcastMessage Broadcast message to specified topic
    BroadcastMessage(topic string, data []byte) error

    // RegisterMessageHandler Register broadcast message handler
    RegisterMessageHandler(topic string, handler MessageHandler)

    // RegisterRequestHandler Register point-to-point request handler
    RegisterRequestHandler(requestType string, handler RequestHandler)

    // SendRequest Send point-to-point request
    SendRequest(peerID string, requestType string, data []byte) ([]byte, error)

    // ConnectToPeer Connect to specified peer
    ConnectToPeer(addr string) error

    // GetPeers Get list of connected peers
    GetPeers() []string

    // GetLocalAddresses Get local peer address list
    GetLocalAddresses() []string

    // GetLocalPeerID Get local peer ID
    GetLocalPeerID() string

    // RegisterMessageFilter Register broadcast message filter
    RegisterMessageFilter(topic string, filter MessageFilter)
}

Run Examples

# Run basic example
go run examples/base/basic_example.go

# Run two-node example
go run examples/two_node/two_node_example.go

# Run MDNS configuration example
go run examples/mdns/mdns_example.go

Testing

# Run unit tests
go test -v ./...

Dependencies

License

MIT

Documentation

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func SavePrivateKeyToFile

func SavePrivateKeyToFile(priv crypto.PrivKey, path string) error

SavePrivateKeyToFile Save private key to file

Types

type MessageFilter

type MessageFilter = func(from string, topic string, data []byte) bool

MessageFilter Used to filter broadcast messages

type MessageHandler

type MessageHandler = func(from string, topic string, data []byte) error

MessageHandler Used to handle messages received in broadcast mode

type Network

type Network struct {
	// contains filtered or unexported fields
}

Network network layer - modern P2P network based on libp2p

func (*Network) BroadcastMessage

func (n *Network) BroadcastMessage(topic string, data []byte) error

BroadcastMessage broadcast message

func (*Network) ClosedStream

func (n *Network) ClosedStream(libp2pnetwork.Network, libp2pnetwork.Stream)

func (*Network) ConnectToPeer

func (n *Network) ConnectToPeer(addr string) error

ConnectToPeer connect to specified node (external API)

func (*Network) Connected

func (n *Network) Connected(net libp2pnetwork.Network, conn libp2pnetwork.Conn)

func (*Network) Disconnected

func (n *Network) Disconnected(net libp2pnetwork.Network, conn libp2pnetwork.Conn)

func (*Network) GetLocalAddresses

func (n *Network) GetLocalAddresses() []string

GetLocalAddresses get local node address list

func (*Network) GetLocalPeerID

func (n *Network) GetLocalPeerID() string

GetLocalPeerID Get local peer ID

func (*Network) GetPeers

func (n *Network) GetPeers() []string

GetPeers get connected nodes

func (*Network) HandlePeerFound

func (n *Network) HandlePeerFound(pi peer.AddrInfo)

HandlePeerFound Implement mdns.Notifee interface to handle discovered peers

func (*Network) IsPeerConnected

func (n *Network) IsPeerConnected(peerID peer.ID) bool

IsPeerConnected Check if peer is connected

func (*Network) Listen

Implement network.Notifiee interface

func (*Network) ListenClose

func (n *Network) ListenClose(libp2pnetwork.Network, multiaddr.Multiaddr)

func (*Network) OpenedStream

func (n *Network) OpenedStream(libp2pnetwork.Network, libp2pnetwork.Stream)

func (*Network) RegisterMessageFilter

func (n *Network) RegisterMessageFilter(topic string, filter MessageFilter)

RegisterMessageFilter register message filter

func (*Network) RegisterMessageHandler

func (n *Network) RegisterMessageHandler(topic string, handler MessageHandler)

RegisterMessageHandler register message handler Automatically subscribe to the corresponding topic to receive messages

func (*Network) RegisterRequestHandler

func (n *Network) RegisterRequestHandler(requestType string, handler RequestHandler)

RegisterRequestHandler register point-to-point request handler

func (*Network) Run

func (n *Network) Run(ctx context.Context) error

Run run the network

func (*Network) SendRequest

func (n *Network) SendRequest(peerID string, requestType string, data []byte) ([]byte, error)

SendRequest send point-to-point request

type NetworkConfig

type NetworkConfig struct {
	Host           string   // Listening address
	Port           int      // Listening port
	MaxPeers       int      // Maximum number of connections
	PrivateKeyPath string   // Private key file path
	BootstrapPeers []string // Bootstrap node address list

	// Newly added configuration fields
	EnablePeerScoring  bool    // Whether to enable Peer scoring
	MaxIPColocation    int     // Maximum number of nodes per IP address
	IPColocationWeight float64 // IP colocation weight
	BehaviourWeight    float64 // Behavior weight
	BehaviourDecay     float64 // Behavior decay factor
	AppSpecificScore   float64 // Application specific score
}

NetworkConfig network configuration

func NewNetworkConfig

func NewNetworkConfig() *NetworkConfig

NewNetworkConfig creates a new network configuration instance with default values

type NetworkInterface

type NetworkInterface interface {
	// Run Start the network module and run
	Run(ctx context.Context) error

	// BroadcastMessage Broadcast message to specified topic
	BroadcastMessage(topic string, data []byte) error

	// RegisterMessageHandler Register broadcast message handler
	RegisterMessageHandler(topic string, handler MessageHandler)

	// RegisterRequestHandler Register point-to-point request handler
	RegisterRequestHandler(requestType string, handler RequestHandler)

	// SendRequest Send point-to-point request
	SendRequest(peerID string, requestType string, data []byte) ([]byte, error)

	// ConnectToPeer Connect to specified peer
	ConnectToPeer(addr string) error

	// GetPeers Get list of connected peers
	GetPeers() []string

	// GetLocalAddresses Get local peer address list
	GetLocalAddresses() []string

	// GetLocalPeerID Get local peer ID
	GetLocalPeerID() string

	// RegisterMessageFilter Register broadcast message filter
	RegisterMessageFilter(topic string, filter MessageFilter)
}

NetworkInterface Network interface, defines all externally provided functions

func New

func New(cfg *NetworkConfig, ops ...libp2p.Option) (NetworkInterface, error)

New create a new network instance

type RequestHandler

type RequestHandler = func(from string, reqType string, data []byte) ([]byte, error)

RequestHandler Used to handle requests in point-to-point mode

Directories

Path Synopsis
examples
base command
chat command
peer_scoring command
two_node command

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL