README ¶
Insolar – Host Network
Physical networking layer
Overview
We took Kademlia DHT original specifications and made significant improvements to make it ready for real world application by enterprises.
Key features of our blockchain network layer:
- Support of heterogeneous network topology with different types of nodes being able to communicate with each other. In classic peer-to-peer networks, any node can communicate directly with any other node on the network. In a real enterprise environment, this condition is often unacceptable for a variety of reasons including security.
- Network routing with a node or node group becoming relays for others nodes. The network can continue to function despite various network restrictions such as firewalls, NATs, etc.
- Ability to limit number of gateways to corporate node group via relays to keep the node group secure while being able to interact with the rest of the network through relays. This feature mitigates the risk of DDoS attacks.
Key components
Transport
Network transport interface. It allows to abstract our network from physical transport. It can either be IP based network or any other kind of message courier (e.g. an industrial message bus).
Node
Node is a fundamental part of networking system. Each node has:
- one real network address (IP or any other transport protocol address)
- multiple abstract network IDs (either node's own or ones belonging to relayed nodes)
Routing
It is actually a Kademlia hash table used to store network nodes and calculate distances between them. See Kademlia whitepaper and XLattice design specification for details.
Message
A set of data transferred by this module between nodes.
- Request message
- Response message
Now messages are serialized simply with encoding/gob. In future there will be a powerful robust serialization system based on Google's Protocol Buffers.
RPC
RPC module allows higher level components to register methods that can be called by other network nodes.
Usage
package main
import (
"github.com/insolar/insolar/network/host"
"github.com/insolar/insolar/network/host/connection"
"github.com/insolar/insolar/network/host/node"
"github.com/insolar/insolar/network/host/relay"
"github.com/insolar/insolar/network/host/resolver"
"github.com/insolar/insolar/network/host/rpc"
"github.com/insolar/insolar/network/host/store"
"github.com/insolar/insolar/network/host/transport"
)
func main() {
configuration := host.NewNetworkConfiguration(
resolver.NewStunResolver(""),
connection.NewConnectionFactory(),
transport.NewUTPTransportFactory(),
store.NewMemoryStoreFactory(),
rpc.NewRPCFactory(map[string]rpc.RemoteProcedure{}),
relay.NewProxy())
dhtNetwork, err := configuration.CreateNetwork("0.0.0.0:31337", &host.Options{})
if err != nil {
panic(err)
}
defer configuration.CloseNetwork()
dhtNetwork.Listen()
}
For more detailed usage example see cmd/example/network/host/main.go
Documentation ¶
Overview ¶
Package host is an implementation of Kademlia DHT. It is mostly based on original specification but has multiple backward-incompatible changes.
Usage:
package main import ( "github.com/insolar/insolar/network/host" "github.com/insolar/insolar/network/host/connection" "github.com/insolar/insolar/network/host/node" "github.com/insolar/insolar/network/host/relay" "github.com/insolar/insolar/network/host/resolver" "github.com/insolar/insolar/network/host/rpc" "github.com/insolar/insolar/network/host/store" "github.com/insolar/insolar/network/host/transport" ) func main() { configuration := host.NewNetworkConfiguration( resolver.NewStunResolver(""), connection.NewConnectionFactory(), transport.NewUTPTransportFactory(), store.NewMemoryStoreFactory(), rpc.NewRPCFactory(map[string]rpc.RemoteProcedure{}), relay.NewProxy()) dhtNetwork, err := configuration.CreateNetwork("0.0.0.0:31337", &host.Options{}) if err != nil { panic(err) } defer configuration.CloseNetwork() dhtNetwork.Listen() }
Index ¶
- type AuthInfo
- type Configuration
- type Context
- type ContextBuilder
- type DHT
- func (dht *DHT) AnalyzeNetwork(ctx Context) error
- func (dht *DHT) AuthenticationRequest(ctx Context, command, targetID string) error
- func (dht *DHT) Bootstrap() error
- func (dht *DHT) CheckOriginRequest(ctx Context, targetID string) error
- func (dht *DHT) Disconnect()
- func (dht *DHT) FindNode(ctx Context, key string) (*node.Node, bool, error)
- func (dht *DHT) Get(ctx Context, key string) ([]byte, bool, error)
- func (dht *DHT) GetDistance(id1, id2 []byte) *big.Int
- func (dht *DHT) GetOriginID(ctx Context) string
- func (dht *DHT) Listen() error
- func (dht *DHT) NumNodes(ctx Context) int
- func (dht *DHT) ObtainIP(ctx Context) error
- func (dht *DHT) ObtainIPRequest(ctx Context, targetID string) error
- func (dht *DHT) RelayRequest(ctx Context, command, targetID string) error
- func (dht *DHT) RemoteProcedureCall(ctx Context, target string, method string, args [][]byte) (result []byte, err error)
- func (dht *DHT) Store(ctx Context, data []byte) (id string, err error)
- type HighKnownOuterNodesNode
- type Options
- type Subnet
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
This section is empty.
Types ¶
type AuthInfo ¶ added in v0.0.3
type AuthInfo struct { // Sent/received unique auth keys. SentKeys map[string][]byte ReceivedKeys map[string][]byte // contains filtered or unexported fields }
AuthInfo collects some information about authentication.
type Configuration ¶
type Configuration struct {
// contains filtered or unexported fields
}
Configuration is a helper to initialize network easily.
func NewNetworkConfiguration ¶
func NewNetworkConfiguration( addressResolver resolver.PublicAddressResolver, connectionFactory connection.Factory, transportFactory transport.Factory, storeFactory store.Factory, rpcFactory rpc.Factory, proxy relay.Proxy, ) *Configuration
NewNetworkConfiguration creates new Configuration.
func (*Configuration) CloseNetwork ¶
func (cfg *Configuration) CloseNetwork() error
CloseNetwork stops networking.
func (*Configuration) CreateNetwork ¶
func (cfg *Configuration) CreateNetwork(address string, options *Options) (*DHT, error)
CreateNetwork creates and returns DHT network with parameters stored in Configuration.
type Context ¶
Context type is localized for future purposes. Network Node can have multiple IDs, but each action must be executed with only one ID. Context is used in all actions to select specific ID to work with.
type ContextBuilder ¶
type ContextBuilder struct {
// contains filtered or unexported fields
}
ContextBuilder allows to lazy configure and build new Context.
func NewContextBuilder ¶
func NewContextBuilder(dht *DHT) ContextBuilder
NewContextBuilder creates new ContextBuilder.
func (ContextBuilder) Build ¶
func (cb ContextBuilder) Build() (ctx Context, err error)
Build builds and returns new Context.
func (ContextBuilder) SetDefaultNode ¶
func (cb ContextBuilder) SetDefaultNode() ContextBuilder
SetDefaultNode sets first node id in Context.
func (ContextBuilder) SetNodeByID ¶
func (cb ContextBuilder) SetNodeByID(nodeID id.ID) ContextBuilder
SetNodeByID sets node id in Context.
type DHT ¶
type DHT struct {
// contains filtered or unexported fields
}
DHT represents the state of the local node in the distributed hash table.
func NewDHT ¶
func NewDHT(store store.Store, origin *node.Origin, transport transport.Transport, rpc rpc.RPC, options *Options, proxy relay.Proxy) (dht *DHT, err error)
NewDHT initializes a new DHT node.
func (*DHT) AnalyzeNetwork ¶ added in v0.0.3
AnalyzeNetwork is func to analyze the network after IP obtaining.
func (*DHT) AuthenticationRequest ¶ added in v0.0.3
AuthenticationRequest sends an authentication request.
func (*DHT) Bootstrap ¶
Bootstrap attempts to bootstrap the network using the BootstrapNodes provided to the Options struct. This will trigger an iterateBootstrap to the provided BootstrapNodes.
func (*DHT) CheckOriginRequest ¶ added in v0.0.3
CheckOriginRequest send a request to check target node originality
func (*DHT) Disconnect ¶
func (dht *DHT) Disconnect()
Disconnect will trigger a Stop from the network.
func (*DHT) Get ¶
Get retrieves data from the transport using key. Key is the base58 encoded identifier of the data.
func (*DHT) GetDistance ¶ added in v0.0.3
GetDistance returns a distance between id1 and id2.
func (*DHT) GetOriginID ¶
GetOriginID returns the base58 encoded identifier of the local node.
func (*DHT) NumNodes ¶
NumNodes returns the total number of nodes stored in the local routing table.
func (*DHT) ObtainIPRequest ¶ added in v0.0.3
ObtainIPRequest is request to self IP obtaining.
func (*DHT) RelayRequest ¶
RelayRequest sends relay request to target.
type HighKnownOuterNodesNode ¶ added in v0.0.3
type HighKnownOuterNodesNode struct { ID string OuterNodes int // high known outer nodes by ID node SelfKnownOuterNodes int }
HighKnownOuterNodesNode collects an information about node in home subnet which have a more known outer nodes.
type Options ¶
type Options struct { // The nodes being used to bootstrap the network. Without a bootstrap // node there is no way to connect to the network. NetworkNodes can be // initialized via node.NewNode(). BootstrapNodes []*node.Node // The time after which a key/value pair expires; // this is a time-to-live (TTL) from the original publication date. ExpirationTime time.Duration // Seconds after which an otherwise unaccessed bucket must be refreshed. RefreshTime time.Duration // The interval between Kademlia replication events, when a node is // required to publish its entire database. ReplicateTime time.Duration // The time after which the original publisher must // republish a key/value pair. Currently not implemented. RepublishTime time.Duration // The maximum time to wait for a response from a node before discarding // it from the bucket. PingTimeout time.Duration // The maximum time to wait for a response to any message. MessageTimeout time.Duration }
Options contains configuration options for the local node.
type Subnet ¶ added in v0.0.3
type Subnet struct { SubnetIDs map[string][]string // key - ip, value - id HomeSubnetKey string // key of home subnet fo SubnetIDs PossibleRelayIDs []string PossibleProxyIDs []string HighKnownNodes HighKnownOuterNodesNode }
Subnet collects some information about self network part
Directories ¶
Path | Synopsis |
---|---|
Package connection encapsulates connection creation process and provides connection factories.
|
Package connection encapsulates connection creation process and provides connection factories. |
Package message provides network messaging protocol and serialization layer.
|
Package message provides network messaging protocol and serialization layer. |
Package node is a fundamental part of networking system.
|
Package node is a fundamental part of networking system. |
Package relay is an implementation of relay mechanism.
|
Package relay is an implementation of relay mechanism. |
Package resolver provides interface (and default implementation) to retrieve public network address.
|
Package resolver provides interface (and default implementation) to retrieve public network address. |
Package routing implements Kademlia hash tables with XOR distance metrics.
|
Package routing implements Kademlia hash tables with XOR distance metrics. |
Package rpc allows higher level components to register methods that can be called by other network nodes.
|
Package rpc allows higher level components to register methods that can be called by other network nodes. |
Package store provides interfaces and default in-memory implementation of storage for DHT metadata.
|
Package store provides interfaces and default in-memory implementation of storage for DHT metadata. |
Package transport provides network transport interface.
|
Package transport provides network transport interface. |