kademlia

package
v0.8.4 Latest Latest
Warning

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

Go to latest
Published: Apr 4, 2019 License: AGPL-3.0 Imports: 21 Imported by: 0

Documentation

Index

Constants

View Source
const (
	// KademliaBucket is the string representing the bucket used for the kademlia routing table k-bucket ids
	KademliaBucket = "kbuckets"
	// NodeBucket is the string representing the bucket used for the kademlia routing table node ids
	NodeBucket = "nodes"
)

Variables

View Source
var (
	// NodeErr is the class for all errors pertaining to node operations
	NodeErr = errs.Class("node error")
	// BootstrapErr is the class for all errors pertaining to bootstrapping a node
	BootstrapErr = errs.Class("bootstrap node error")
	// NodeNotFound is returned when a lookup can not produce the requested node
	NodeNotFound = errs.Class("node not found")
)
View Source
var EndpointError = errs.Class("kademlia endpoint error")

EndpointError defines errors class for Endpoint

View Source
var ErrMaxRetries = errs.Class("max retries exceeded for id:")

ErrMaxRetries is used when a lookup has been retried the max number of times

View Source
var (
	// Error defines a Kademlia error
	Error = errs.Class("kademlia error")
)
View Source
var RoutingErr = errs.Class("routing table error")

RoutingErr is the class for all errors pertaining to routing table operations

Functions

func Restrict

func Restrict(r pb.Restriction, n []*pb.Node) []*pb.Node

Restrict is used to limit nodes returned that don't match the miniumum storage requirements

Types

type Config

type Config struct {
	BootstrapAddr   string `help:"the Kademlia node to bootstrap against" default:""`
	DBPath          string `help:"the path for storage node db services to be created on" default:"$CONFDIR/kademlia"`
	ExternalAddress string `user:"true" help:"the public address of the Kademlia node, useful for nodes behind NAT" default:""`
	Operator        OperatorConfig

	// TODO: reduce the number of flags here
	Alpha int `help:"alpha is a system wide concurrency parameter" default:"5"`
	RoutingTableConfig
}

Config defines all of the things that are needed to start up Kademlia server endpoints (and not necessarily client code).

func (Config) BootstrapNodes

func (c Config) BootstrapNodes() []pb.Node

BootstrapNodes returns bootstrap nodes defined in the config

func (Config) Verify

func (c Config) Verify(log *zap.Logger) error

Verify verifies whether kademlia config is valid.

type Conn

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

Conn represents a kademlia connection

type Dialer

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

Dialer is a kademlia dialer

func NewDialer

func NewDialer(log *zap.Logger, transport transport.Client) *Dialer

NewDialer creates a dialer for kademlia.

func (*Dialer) Close

func (dialer *Dialer) Close() error

Close closes the pool resources and prevents new connections to be made.

func (*Dialer) FetchInfo

func (dialer *Dialer) FetchInfo(ctx context.Context, target pb.Node) (*pb.InfoResponse, error)

FetchInfo connects to a node and returns its node info.

func (*Dialer) FetchPeerIdentity

func (dialer *Dialer) FetchPeerIdentity(ctx context.Context, target pb.Node) (_ *identity.PeerIdentity, err error)

FetchPeerIdentity connects to a node and returns its peer identity

func (*Dialer) FetchPeerIdentityUnverified

func (dialer *Dialer) FetchPeerIdentityUnverified(ctx context.Context, address string, opts ...grpc.CallOption) (_ *identity.PeerIdentity, err error)

FetchPeerIdentityUnverified connects to an address and returns its peer identity (no node ID verification).

func (*Dialer) Lookup

func (dialer *Dialer) Lookup(ctx context.Context, self pb.Node, ask pb.Node, find pb.Node) ([]*pb.Node, error)

Lookup queries ask about find, and also sends information about self.

func (*Dialer) PingNode

func (dialer *Dialer) PingNode(ctx context.Context, target pb.Node) (bool, error)

PingNode pings target.

type Endpoint

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

Endpoint implements the kademlia Endpoints

func NewEndpoint

func NewEndpoint(log *zap.Logger, service *Kademlia, routingTable *RoutingTable) *Endpoint

NewEndpoint returns a new kademlia endpoint

func (*Endpoint) Ping

func (endpoint *Endpoint) Ping(ctx context.Context, req *pb.PingRequest) (*pb.PingResponse, error)

Ping provides an easy way to verify a node is online and accepting requests

func (*Endpoint) Query

func (endpoint *Endpoint) Query(ctx context.Context, req *pb.QueryRequest) (*pb.QueryResponse, error)

Query is a node to node communication query

func (*Endpoint) RequestInfo

func (endpoint *Endpoint) RequestInfo(ctx context.Context, req *pb.InfoRequest) (*pb.InfoResponse, error)

RequestInfo returns the node info

type Inspector

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

Inspector is a gRPC service for inspecting kademlia internals

func NewInspector

func NewInspector(kad *Kademlia, identity *identity.FullIdentity) *Inspector

NewInspector creates an Inspector

func (*Inspector) CountNodes

func (srv *Inspector) CountNodes(ctx context.Context, req *pb.CountNodesRequest) (*pb.CountNodesResponse, error)

CountNodes returns the number of nodes in the routing table

func (*Inspector) DumpNodes

func (srv *Inspector) DumpNodes(ctx context.Context, req *pb.DumpNodesRequest) (*pb.DumpNodesResponse, error)

DumpNodes returns all of the nodes in the routing table database.

func (*Inspector) FindNear

func (srv *Inspector) FindNear(ctx context.Context, req *pb.FindNearRequest) (*pb.FindNearResponse, error)

FindNear sends back limit of near nodes

func (*Inspector) GetBuckets

func (srv *Inspector) GetBuckets(ctx context.Context, req *pb.GetBucketsRequest) (*pb.GetBucketsResponse, error)

GetBuckets returns all kademlia buckets for current kademlia instance

func (*Inspector) LookupNode

func (srv *Inspector) LookupNode(ctx context.Context, req *pb.LookupNodeRequest) (*pb.LookupNodeResponse, error)

LookupNode triggers a Kademlia lookup and returns the node the network found.

func (*Inspector) NodeInfo

func (srv *Inspector) NodeInfo(ctx context.Context, req *pb.NodeInfoRequest) (*pb.NodeInfoResponse, error)

NodeInfo sends a PING RPC to a node and returns its local info.

func (*Inspector) PingNode

func (srv *Inspector) PingNode(ctx context.Context, req *pb.PingNodeRequest) (*pb.PingNodeResponse, error)

PingNode sends a PING RPC to the provided node ID in the Kad network.

type Kademlia

type Kademlia struct {
	RefreshBuckets sync2.Cycle
	// contains filtered or unexported fields
}

Kademlia is an implementation of kademlia adhering to the DHT interface.

func NewService

func NewService(log *zap.Logger, self pb.Node, transport transport.Client, rt *RoutingTable, config Config) (*Kademlia, error)

NewService returns a newly configured Kademlia instance

func (*Kademlia) Bootstrap

func (k *Kademlia) Bootstrap(ctx context.Context) error

Bootstrap contacts one of a set of pre defined trusted nodes on the network and begins populating the local Kademlia node

func (*Kademlia) Close

func (k *Kademlia) Close() error

Close closes all kademlia connections and prevents new ones from being created.

func (*Kademlia) DumpNodes

func (k *Kademlia) DumpNodes(ctx context.Context) ([]*pb.Node, error)

DumpNodes returns all the nodes in the node database

func (*Kademlia) FetchInfo

func (k *Kademlia) FetchInfo(ctx context.Context, node pb.Node) (*pb.InfoResponse, error)

FetchInfo connects to a node address and returns the node info

func (*Kademlia) FetchPeerIdentity

func (k *Kademlia) FetchPeerIdentity(ctx context.Context, nodeID storj.NodeID) (*identity.PeerIdentity, error)

FetchPeerIdentity connects to a node and returns its peer identity

func (*Kademlia) FindNear

func (k *Kademlia) FindNear(ctx context.Context, start storj.NodeID, limit int, restrictions ...pb.Restriction) ([]*pb.Node, error)

FindNear returns all nodes from a starting node up to a maximum limit stored in the local routing table limiting the result by the specified restrictions

func (*Kademlia) FindNode

func (k *Kademlia) FindNode(ctx context.Context, ID storj.NodeID) (pb.Node, error)

FindNode looks up the provided NodeID first in the local Node, and if it is not found begins searching the network for the NodeID. Returns and error if node was not found

func (*Kademlia) GetBootstrapNodes

func (k *Kademlia) GetBootstrapNodes() []pb.Node

GetBootstrapNodes gets the bootstrap nodes.

func (*Kademlia) GetBucketIds

func (k *Kademlia) GetBucketIds() (storage.Keys, error)

GetBucketIds returns a storage.Keys type of bucket ID's in the Kademlia instance

func (*Kademlia) LastPinged

func (k *Kademlia) LastPinged() time.Time

LastPinged returns last time someone pinged this node.

func (*Kademlia) LastQueried

func (k *Kademlia) LastQueried() time.Time

LastQueried returns last time someone queried this node.

func (*Kademlia) Local

func (k *Kademlia) Local() pb.Node

Local returns the local nodes ID

func (*Kademlia) Ping

func (k *Kademlia) Ping(ctx context.Context, node pb.Node) (pb.Node, error)

Ping checks that the provided node is still accessible on the network

func (*Kademlia) Pinged

func (k *Kademlia) Pinged()

Pinged notifies the service it has been remotely pinged.

func (*Kademlia) Queried

func (k *Kademlia) Queried()

Queried notifies the service it has been remotely queried

func (*Kademlia) Run

func (k *Kademlia) Run(ctx context.Context) error

Run occasionally refreshes stale kad buckets

func (*Kademlia) Seen

func (k *Kademlia) Seen() []*pb.Node

Seen returns all nodes that this kademlia instance has successfully communicated with

func (*Kademlia) SetBootstrapNodes

func (k *Kademlia) SetBootstrapNodes(nodes []pb.Node)

SetBootstrapNodes sets the bootstrap nodes. Must be called before anything starting to use kademlia.

func (*Kademlia) SetBucketRefreshThreshold

func (k *Kademlia) SetBucketRefreshThreshold(threshold time.Duration)

SetBucketRefreshThreshold changes the threshold when buckets are considered stale and need refreshing.

func (*Kademlia) WaitForBootstrap

func (k *Kademlia) WaitForBootstrap()

WaitForBootstrap waits for bootstrap pinging has been completed.

type OperatorConfig

type OperatorConfig struct {
	Email  string `user:"true" help:"operator email address" default:""`
	Wallet string `user:"true" help:"operator wallet adress" default:""`
}

OperatorConfig defines properties related to storage node operator metadata

func (OperatorConfig) Verify

func (c OperatorConfig) Verify(log *zap.Logger) error

Verify verifies whether operator config is valid.

type RoutingTable

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

RoutingTable implements the RoutingTable interface

func NewRoutingTable

func NewRoutingTable(logger *zap.Logger, localNode pb.Node, kdb, ndb storage.KeyValueStore, config *RoutingTableConfig) (*RoutingTable, error)

NewRoutingTable returns a newly configured instance of a RoutingTable

func (*RoutingTable) CacheSize

func (rt *RoutingTable) CacheSize() int

CacheSize returns the total current size of the replacement cache

func (*RoutingTable) Close

func (rt *RoutingTable) Close() error

Close closes without closing dependencies

func (*RoutingTable) ConnFailure

func (rt *RoutingTable) ConnFailure(ctx context.Context, node *pb.Node, err error)

ConnFailure implements the Transport failure function

func (*RoutingTable) ConnSuccess

func (rt *RoutingTable) ConnSuccess(ctx context.Context, node *pb.Node)

ConnSuccess implements the Transport success function

func (*RoutingTable) ConnectionFailed

func (rt *RoutingTable) ConnectionFailed(node *pb.Node) error

ConnectionFailed removes a node from the routing table when a connection fails for the node on the network

func (*RoutingTable) ConnectionSuccess

func (rt *RoutingTable) ConnectionSuccess(node *pb.Node) error

ConnectionSuccess updates or adds a node to the routing table when a successful connection is made to the node on the network

func (*RoutingTable) DumpNodes

func (rt *RoutingTable) DumpNodes() ([]*pb.Node, error)

DumpNodes iterates through all nodes in the nodeBucketDB and marshals them to &pb.Nodes, then returns them

func (*RoutingTable) FindNear

func (rt *RoutingTable) FindNear(target storj.NodeID, limit int, restrictions ...pb.Restriction) ([]*pb.Node, error)

FindNear returns the node corresponding to the provided nodeID returns all Nodes (excluding self) closest via XOR to the provided nodeID up to the provided limit

func (*RoutingTable) GetBucketIds

func (rt *RoutingTable) GetBucketIds() (storage.Keys, error)

GetBucketIds returns a storage.Keys type of bucket ID's in the Kademlia instance

func (*RoutingTable) GetBucketTimestamp

func (rt *RoutingTable) GetBucketTimestamp(bIDBytes []byte) (time.Time, error)

GetBucketTimestamp retrieves time of the last node lookup for a bucket

func (*RoutingTable) GetNodes

func (rt *RoutingTable) GetNodes(id storj.NodeID) ([]*pb.Node, bool)

GetNodes retrieves nodes within the same kbucket as the given node id Note: id doesn't need to be stored at time of search

func (*RoutingTable) K

func (rt *RoutingTable) K() int

K returns the currently configured maximum of nodes to store in a bucket

func (*RoutingTable) Local

func (rt *RoutingTable) Local() pb.Node

Local returns the local nodes ID

func (*RoutingTable) SetBucketTimestamp

func (rt *RoutingTable) SetBucketTimestamp(bIDBytes []byte, now time.Time) error

SetBucketTimestamp records the time of the last node lookup for a bucket

func (*RoutingTable) UpdateSelf

func (rt *RoutingTable) UpdateSelf(node *pb.Node) error

UpdateSelf updates a node on the routing table

type RoutingTableConfig

type RoutingTableConfig struct {
	BucketSize           int `help:"size of each Kademlia bucket" default:"20"`
	ReplacementCacheSize int `help:"size of Kademlia replacement cache" default:"5"`
}

RoutingTableConfig configures the routing table

Directories

Path Synopsis

Jump to

Keyboard shortcuts

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