Documentation ¶
Overview ¶
Package dht implements a distributed hash table that satisfies the ipfs routing interface. This DHT is modeled after kademlia with S/Kademlia modifications.
Index ¶
- Constants
- Variables
- func GetDefaultBootstrapPeerAddrInfos() []peer.AddrInfo
- func NewRTPeerDiversityFilter(h host.Host, maxPerCpl, maxForTable int) *rtPeerIPGroupFilter
- func PrivateQueryFilter(_ interface{}, ai peer.AddrInfo) bool
- func PrivateRoutingTableFilter(dht interface{}, p peer.ID) bool
- func PublicQueryFilter(_ interface{}, ai peer.AddrInfo) bool
- func PublicRoutingTableFilter(dht interface{}, p peer.ID) bool
- func PublishLookupEvent(ctx context.Context, ev *LookupEvent)
- func Quorum(n int) routing.Option
- func RegisterForLookupEvents(ctx context.Context) (context.Context, <-chan *LookupEvent)
- type IpfsDHT
- func (dht *IpfsDHT) Bootstrap(ctx context.Context) error
- func (dht *IpfsDHT) Close() error
- func (dht *IpfsDHT) Context() context.Context
- func (dht *IpfsDHT) FindLocal(ctx context.Context, id peer.ID) peer.AddrInfo
- func (dht *IpfsDHT) FindPeer(ctx context.Context, id peer.ID) (_ peer.AddrInfo, err error)
- func (dht *IpfsDHT) FindProviders(ctx context.Context, c cid.Cid) ([]peer.AddrInfo, error)
- func (dht *IpfsDHT) FindProvidersAsync(ctx context.Context, key cid.Cid, count int) <-chan peer.AddrInfo
- func (dht *IpfsDHT) ForceRefresh() <-chan error
- func (dht *IpfsDHT) GetClosestPeers(ctx context.Context, key string) ([]peer.ID, error)
- func (dht *IpfsDHT) GetPublicKey(ctx context.Context, p peer.ID) (ci.PubKey, error)
- func (dht *IpfsDHT) GetRoutingTableDiversityStats() []peerdiversity.CplDiversityStats
- func (dht *IpfsDHT) GetValue(ctx context.Context, key string, opts ...routing.Option) (_ []byte, err error)
- func (dht *IpfsDHT) Host() host.Host
- func (dht *IpfsDHT) Mode() ModeOpt
- func (dht *IpfsDHT) NetworkSize() (int32, error)
- func (dht *IpfsDHT) PeerID() peer.ID
- func (dht *IpfsDHT) PeerKey() []byte
- func (dht *IpfsDHT) Ping(ctx context.Context, p peer.ID) error
- func (dht *IpfsDHT) Provide(ctx context.Context, key cid.Cid, brdcst bool) (err error)
- func (dht *IpfsDHT) ProviderStore() providers.ProviderStore
- func (dht *IpfsDHT) PutValue(ctx context.Context, key string, value []byte, opts ...routing.Option) (err error)
- func (dht *IpfsDHT) RefreshRoutingTable() <-chan error
- func (dht *IpfsDHT) RoutingTable() *kb.RoutingTable
- func (dht *IpfsDHT) SearchValue(ctx context.Context, key string, opts ...routing.Option) (<-chan []byte, error)
- type KeyKadID
- type LookupEvent
- type LookupTerminateEvent
- type LookupTerminationReason
- type LookupUpdateEvent
- type ModeOpt
- type Option
- func AddressFilter(f func([]ma.Multiaddr) []ma.Multiaddr) Option
- func BootstrapPeers(bootstrappers ...peer.AddrInfo) Option
- func BootstrapPeersFunc(getBootstrapPeers func() []peer.AddrInfo) Option
- func BucketSize(bucketSize int) Option
- func Concurrency(alpha int) Option
- func Datastore(ds ds.Batching) Option
- func DisableAutoRefresh() Option
- func DisableProviders() Option
- func DisableValues() Option
- func EnableOptimisticProvide() Option
- func LookupCheckConcurrency(n int) Option
- func MaxRecordAge(maxAge time.Duration) Option
- func Mode(m ModeOpt) Option
- func NamespacedValidator(ns string, v record.Validator) Option
- func OptimisticProvideJobsPoolSize(size int) Option
- func ProtocolExtension(ext protocol.ID) Option
- func ProtocolPrefix(prefix protocol.ID) Option
- func ProviderStore(ps providers.ProviderStore) Option
- func QueryFilter(filter QueryFilterFunc) Option
- func Resiliency(beta int) Option
- func RoutingTableFilter(filter RouteTableFilterFunc) Option
- func RoutingTableLatencyTolerance(latency time.Duration) Option
- func RoutingTablePeerDiversityFilter(pg peerdiversity.PeerIPGroupFilter) Option
- func RoutingTableRefreshPeriod(period time.Duration) Option
- func RoutingTableRefreshQueryTimeout(timeout time.Duration) Option
- func V1ProtocolOverride(proto protocol.ID) Option
- func Validator(v record.Validator) Option
- type PeerKadID
- type QueryFilterFunc
- type RouteTableFilterFunc
Constants ¶
const DefaultPrefix protocol.ID = "/ipfs"
DefaultPrefix is the application specific prefix attached to all DHT protocols by default.
Variables ¶
var ( // ProtocolDHT is the default DHT protocol. ProtocolDHT protocol.ID = "/ipfs/kad/1.0.0" // DefaultProtocols spoken by the DHT. DefaultProtocols = []protocol.ID{ProtocolDHT} )
var DefaultBootstrapPeers []multiaddr.Multiaddr
DefaultBootstrapPeers is a set of public DHT bootstrap peers provided by libp2p.
var ErrNoPeersQueried = errors.New("failed to query any peers")
ErrNoPeersQueried is returned when we failed to connect to any peers.
var ErrReadTimeout = net.ErrReadTimeout
ErrReadTimeout is an error that occurs when no message is read within the timeout period.
var LookupEventBufferSize = 16
LookupEventBufferSize is the number of events to buffer.
Functions ¶
func GetDefaultBootstrapPeerAddrInfos ¶
GetDefaultBootstrapPeerAddrInfos returns the peer.AddrInfos for the default bootstrap peers so we can use these for initializing the DHT by passing these to the BootstrapPeers(...) option.
func NewRTPeerDiversityFilter ¶
NewRTPeerDiversityFilter constructs the `PeerIPGroupFilter` that will be used to configure the diversity filter for the Routing Table. Please see the docs for `peerdiversity.PeerIPGroupFilter` AND `peerdiversity.Filter` for more details.
func PrivateQueryFilter ¶
PrivateQueryFilter doens't currently restrict which peers we are willing to query from the local DHT.
func PrivateRoutingTableFilter ¶
PrivateRoutingTableFilter allows a peer to be added to the routing table if the connections to that peer indicate that it is on a private network
func PublicQueryFilter ¶
PublicQueryFilter returns true if the peer is suspected of being publicly accessible
func PublicRoutingTableFilter ¶
PublicRoutingTableFilter allows a peer to be added to the routing table if the connections to that peer indicate that it is on a public network
func PublishLookupEvent ¶
func PublishLookupEvent(ctx context.Context, ev *LookupEvent)
PublishLookupEvent publishes a query event to the query event channel associated with the given context, if any.
func Quorum ¶
Quorum is a DHT option that tells the DHT how many peers it needs to get values from before returning the best one. Zero means the DHT query should complete instead of returning early.
Default: 0
func RegisterForLookupEvents ¶
func RegisterForLookupEvents(ctx context.Context) (context.Context, <-chan *LookupEvent)
RegisterForLookupEvents registers a lookup event channel with the given context. The returned context can be passed to DHT queries to receive lookup events on the returned channels.
The passed context MUST be canceled when the caller is no longer interested in query events.
Types ¶
type IpfsDHT ¶
IpfsDHT is an implementation of Kademlia with S/Kademlia modifications. It is used to implement the base Routing module.
func New ¶
New creates a new DHT with the specified host and options. Please note that being connected to a DHT peer does not necessarily imply that it's also in the DHT Routing Table. If the Routing Table has more than "minRTRefreshThreshold" peers, we consider a peer as a Routing Table candidate ONLY when we successfully get a query response from it OR if it send us a query.
func NewDHT ¶
NewDHT creates a new DHT object with the given peer as the 'local' host. IpfsDHT's initialized with this function will respond to DHT requests, whereas IpfsDHT's initialized with NewDHTClient will not.
func NewDHTClient ¶
NewDHTClient creates a new DHT object with the given peer as the 'local' host. IpfsDHT clients initialized with this function will not respond to DHT requests. If you need a peer to respond to DHT requests, use NewDHT instead.
func (*IpfsDHT) Bootstrap ¶
Bootstrap tells the DHT to get into a bootstrapped state satisfying the IpfsRouter interface.
func (*IpfsDHT) FindLocal ¶
FindLocal looks for a peer with a given ID connected to this dht and returns the peer and the table it was found in.
func (*IpfsDHT) FindProviders ¶
FindProviders searches until the context expires.
func (*IpfsDHT) FindProvidersAsync ¶
func (dht *IpfsDHT) FindProvidersAsync(ctx context.Context, key cid.Cid, count int) <-chan peer.AddrInfo
FindProvidersAsync is the same thing as FindProviders, but returns a channel. Peers will be returned on the channel as soon as they are found, even before the search query completes. If count is zero then the query will run until it completes. Note: not reading from the returned channel may block the query from progressing.
func (*IpfsDHT) ForceRefresh ¶
ForceRefresh acts like RefreshRoutingTable but forces the DHT to refresh all buckets in the Routing Table irrespective of when they were last refreshed.
The returned channel will block until the refresh finishes, then yield the error and close. The channel is buffered and safe to ignore.
func (*IpfsDHT) GetClosestPeers ¶
GetClosestPeers is a Kademlia 'node lookup' operation. Returns a channel of the K closest peers to the given key.
If the context is canceled, this function will return the context error along with the closest K peers it has found so far.
func (*IpfsDHT) GetPublicKey ¶
GetPublicKey gets the public key when given a Peer ID. It will extract from the Peer ID if inlined or ask the node it belongs to or ask the DHT.
func (*IpfsDHT) GetRoutingTableDiversityStats ¶
func (dht *IpfsDHT) GetRoutingTableDiversityStats() []peerdiversity.CplDiversityStats
GetRoutingTableDiversityStats returns the diversity stats for the Routing Table.
func (*IpfsDHT) GetValue ¶
func (dht *IpfsDHT) GetValue(ctx context.Context, key string, opts ...routing.Option) (_ []byte, err error)
GetValue searches for the value corresponding to given Key.
func (*IpfsDHT) NetworkSize ¶
NetworkSize returns the most recent estimation of the DHT network size. EXPERIMENTAL: We do not provide any guarantees that this method will continue to exist in the codebase. Use it at your own risk.
func (*IpfsDHT) Provide ¶
Provide makes this node announce that it can provide a value for the given key
func (*IpfsDHT) ProviderStore ¶
func (dht *IpfsDHT) ProviderStore() providers.ProviderStore
ProviderStore returns the provider storage object for storing and retrieving provider records.
func (*IpfsDHT) PutValue ¶
func (dht *IpfsDHT) PutValue(ctx context.Context, key string, value []byte, opts ...routing.Option) (err error)
PutValue adds value corresponding to given Key. This is the top level "Store" operation of the DHT
func (*IpfsDHT) RefreshRoutingTable ¶
RefreshRoutingTable tells the DHT to refresh it's routing tables.
The returned channel will block until the refresh finishes, then yield the error and close. The channel is buffered and safe to ignore.
func (*IpfsDHT) RoutingTable ¶
func (dht *IpfsDHT) RoutingTable() *kb.RoutingTable
RoutingTable returns the DHT's routingTable.
type KeyKadID ¶
KeyKadID contains the Kademlia key in string and binary form.
func NewKeyKadID ¶
NewKeyKadID creates a KeyKadID from a string Kademlia ID.
type LookupEvent ¶
type LookupEvent struct { // Node is the ID of the node performing the lookup. Node *PeerKadID // ID is a unique identifier for the lookup instance. ID uuid.UUID // Key is the Kademlia key used as a lookup target. Key *KeyKadID // Request, if not nil, describes a state update event, associated with an outgoing query request. Request *LookupUpdateEvent // Response, if not nil, describes a state update event, associated with an outgoing query response. Response *LookupUpdateEvent // Terminate, if not nil, describe a termination event. Terminate *LookupTerminateEvent }
LookupEvent is emitted for every notable event that happens during a DHT lookup. LookupEvent supports JSON marshalling because all of its fields do, recursively.
func NewLookupEvent ¶
func NewLookupEvent( node peer.ID, id uuid.UUID, key string, request *LookupUpdateEvent, response *LookupUpdateEvent, terminate *LookupTerminateEvent, ) *LookupEvent
NewLookupEvent creates a LookupEvent automatically converting the node libp2p Peer ID to a PeerKadID and the string Kademlia key to a KeyKadID.
type LookupTerminateEvent ¶
type LookupTerminateEvent struct { // Reason is the reason for lookup termination. Reason LookupTerminationReason }
LookupTerminateEvent describes a lookup termination event.
func NewLookupTerminateEvent ¶
func NewLookupTerminateEvent(reason LookupTerminationReason) *LookupTerminateEvent
NewLookupTerminateEvent creates a new lookup termination event with a given reason.
type LookupTerminationReason ¶
type LookupTerminationReason int
LookupTerminationReason captures reasons for terminating a lookup.
const ( // LookupStopped indicates that the lookup was aborted by the user's stopFn. LookupStopped LookupTerminationReason = iota // LookupCancelled indicates that the lookup was aborted by the context. LookupCancelled // LookupStarvation indicates that the lookup terminated due to lack of unqueried peers. LookupStarvation // LookupCompleted indicates that the lookup terminated successfully, reaching the Kademlia end condition. LookupCompleted )
func (LookupTerminationReason) MarshalJSON ¶
func (r LookupTerminationReason) MarshalJSON() ([]byte, error)
MarshalJSON returns the JSON encoding of the passed lookup termination reason.
func (LookupTerminationReason) String ¶
func (r LookupTerminationReason) String() string
type LookupUpdateEvent ¶
type LookupUpdateEvent struct { // Cause is the peer whose response (or lack of response) caused the update event. // If Cause is nil, this is the first update event in the lookup, caused by the seeding. Cause *PeerKadID // Source is the peer who informed us about the peer IDs in this update (below). Source *PeerKadID // Heard is a set of peers whose state in the lookup's peerset is being set to "heard". Heard []*PeerKadID // Waiting is a set of peers whose state in the lookup's peerset is being set to "waiting". Waiting []*PeerKadID // Queried is a set of peers whose state in the lookup's peerset is being set to "queried". Queried []*PeerKadID // Unreachable is a set of peers whose state in the lookup's peerset is being set to "unreachable". Unreachable []*PeerKadID }
LookupUpdateEvent describes a lookup state update event.
func NewLookupUpdateEvent ¶
func NewLookupUpdateEvent( cause peer.ID, source peer.ID, heard []peer.ID, waiting []peer.ID, queried []peer.ID, unreachable []peer.ID, ) *LookupUpdateEvent
NewLookupUpdateEvent creates a new lookup update event, automatically converting the passed peer IDs to peer Kad IDs.
type ModeOpt ¶
ModeOpt describes what mode the dht should operate in
const ( // ModeAuto utilizes EvtLocalReachabilityChanged events sent over the event bus to dynamically switch the DHT // between Client and Server modes based on network conditions ModeAuto ModeOpt = iota // ModeClient operates the DHT as a client only, it cannot respond to incoming queries ModeClient // ModeServer operates the DHT as a server, it can both send and respond to queries ModeServer // ModeAutoServer operates in the same way as ModeAuto, but acts as a server when reachability is unknown ModeAutoServer )
type Option ¶
func AddressFilter ¶
AddressFilter allows to configure the address filtering function. This function is run before addresses are added to the peerstore. It is most useful to avoid adding localhost / local addresses.
func BootstrapPeers ¶
BootstrapPeers configures the bootstrapping nodes that we will connect to to seed and refresh our Routing Table if it becomes empty.
func BootstrapPeersFunc ¶
BootstrapPeersFunc configures the function that returns the bootstrapping nodes that we will connect to to seed and refresh our Routing Table if it becomes empty.
func BucketSize ¶
BucketSize configures the bucket size (k in the Kademlia paper) of the routing table.
The default value is 20.
func Concurrency ¶
Concurrency configures the number of concurrent requests (alpha in the Kademlia paper) for a given query path.
The default value is 10.
func Datastore ¶
Datastore configures the DHT to use the specified datastore.
Defaults to an in-memory (temporary) map.
func DisableAutoRefresh ¶
func DisableAutoRefresh() Option
DisableAutoRefresh completely disables 'auto-refresh' on the DHT routing table. This means that we will neither refresh the routing table periodically nor when the routing table size goes below the minimum threshold.
func DisableProviders ¶
func DisableProviders() Option
DisableProviders disables storing and retrieving provider records.
Defaults to enabled.
WARNING: do not change this unless you're using a forked DHT (i.e., a private network and/or distinct DHT protocols with the `Protocols` option).
func DisableValues ¶
func DisableValues() Option
DisableValues disables storing and retrieving value records (including public keys).
Defaults to enabled.
WARNING: do not change this unless you're using a forked DHT (i.e., a private network and/or distinct DHT protocols with the `Protocols` option).
func EnableOptimisticProvide ¶
func EnableOptimisticProvide() Option
EnableOptimisticProvide enables an optimization that skips the last hops of the provide process. This works by using the network size estimator (which uses the keyspace density of queries) to optimistically send ADD_PROVIDER requests when we most likely have found the last hop. It will also run some ADD_PROVIDER requests asynchronously in the background after returning, this allows to optimistically return earlier if some threshold number of RPCs have succeeded. The number of background/in-flight queries can be configured with the OptimisticProvideJobsPoolSize option.
EXPERIMENTAL: This is an experimental option and might be removed in the future. Use at your own risk.
func LookupCheckConcurrency ¶
LookupInterval configures maximal number of go routines that can be used to perform a lookup check operation, before adding a new node to the routing table.
func MaxRecordAge ¶
MaxRecordAge specifies the maximum time that any node will hold onto a record ("PutValue record") from the time its received. This does not apply to any other forms of validity that the record may contain. For example, a record may contain an ipns entry with an EOL saying its valid until the year 2020 (a great time in the future). For that record to stick around it must be rebroadcasted more frequently than once every 'MaxRecordAge'
func Mode ¶
Mode configures which mode the DHT operates in (Client, Server, Auto).
Defaults to ModeAuto.
func NamespacedValidator ¶
NamespacedValidator adds a validator namespaced under `ns`. This option fails if the DHT is not using a `record.NamespacedValidator` as its validator (it uses one by default but this can be overridden with the `Validator` option). Adding a namespaced validator without changing the `Validator` will result in adding a new validator in addition to the default public key and IPNS validators. The "pk" and "ipns" namespaces cannot be overridden here unless a new `Validator` has been set first.
Example: Given a validator registered as `NamespacedValidator("ipns", myValidator)`, all records with keys starting with `/ipns/` will be validated with `myValidator`.
func OptimisticProvideJobsPoolSize ¶
OptimisticProvideJobsPoolSize allows to configure the asynchronicity limit for in-flight ADD_PROVIDER RPCs. It makes sense to set it to a multiple of optProvReturnRatio * BucketSize. Check the description of EnableOptimisticProvide for more details.
EXPERIMENTAL: This is an experimental option and might be removed in the future. Use at your own risk.
func ProtocolExtension ¶
ProtocolExtension adds an application specific protocol to the DHT protocol. For example, /ipfs/lan/kad/1.0.0 instead of /ipfs/kad/1.0.0. extension should be of the form /lan.
func ProtocolPrefix ¶
ProtocolPrefix sets an application specific prefix to be attached to all DHT protocols. For example, /myapp/kad/1.0.0 instead of /ipfs/kad/1.0.0. Prefix should be of the form /myapp.
Defaults to dht.DefaultPrefix
func ProviderStore ¶
func ProviderStore(ps providers.ProviderStore) Option
ProviderStore sets the provider storage manager.
func QueryFilter ¶
func QueryFilter(filter QueryFilterFunc) Option
QueryFilter sets a function that approves which peers may be dialed in a query
func Resiliency ¶
Resiliency configures the number of peers closest to a target that must have responded in order for a given query path to complete.
The default value is 3.
func RoutingTableFilter ¶
func RoutingTableFilter(filter RouteTableFilterFunc) Option
RoutingTableFilter sets a function that approves which peers may be added to the routing table. The host should already have at least one connection to the peer under consideration.
func RoutingTableLatencyTolerance ¶
RoutingTableLatencyTolerance sets the maximum acceptable latency for peers in the routing table's cluster.
func RoutingTablePeerDiversityFilter ¶
func RoutingTablePeerDiversityFilter(pg peerdiversity.PeerIPGroupFilter) Option
RoutingTablePeerDiversityFilter configures the implementation of the `PeerIPGroupFilter` that will be used to construct the diversity filter for the Routing Table. Please see the docs for `peerdiversity.PeerIPGroupFilter` AND `peerdiversity.Filter` for more details.
func RoutingTableRefreshPeriod ¶
RoutingTableRefreshPeriod sets the period for refreshing buckets in the routing table. The DHT will refresh buckets every period by:
- First searching for nearby peers to figure out how many buckets we should try to fill.
- Then searching for a random key in each bucket that hasn't been queried in the last refresh period.
func RoutingTableRefreshQueryTimeout ¶
RoutingTableRefreshQueryTimeout sets the timeout for routing table refresh queries.
func V1ProtocolOverride ¶
V1ProtocolOverride overrides the protocolID used for /kad/1.0.0 with another. This is an advanced feature, and should only be used to handle legacy networks that have not been using protocolIDs of the form /app/kad/1.0.0.
This option will override and ignore the ProtocolPrefix and ProtocolExtension options
func Validator ¶
Validator configures the DHT to use the specified validator.
Defaults to a namespaced validator that can validate both public key (under the "pk" namespace) and IPNS records (under the "ipns" namespace). Setting the validator implies that the user wants to control the validators and therefore the default public key and IPNS validators will not be added.
type PeerKadID ¶
PeerKadID contains a libp2p Peer ID and a binary Kademlia ID.
func NewPeerKadID ¶
NewPeerKadID creates a PeerKadID from a libp2p Peer ID.
func NewPeerKadIDSlice ¶
NewPeerKadIDSlice creates a slice of PeerKadID from the passed slice of libp2p Peer IDs.
func OptPeerKadID ¶
OptPeerKadID returns a pointer to a PeerKadID or nil if the passed Peer ID is it's default value.
type QueryFilterFunc ¶
type QueryFilterFunc = dhtcfg.QueryFilterFunc
QueryFilterFunc is a filter applied when considering peers to dial when querying
type RouteTableFilterFunc ¶
type RouteTableFilterFunc = dhtcfg.RouteTableFilterFunc
RouteTableFilterFunc is a filter applied when considering connections to keep in the local route table.
Source Files ¶
Directories ¶
Path | Synopsis |
---|---|
Package dual provides an implementation of a split or "dual" dht, where two parallel instances are maintained for the global internet and the local LAN respectively.
|
Package dual provides an implementation of a split or "dual" dht, where two parallel instances are maintained for the global internet and the local LAN respectively. |