kbucket

package
v0.0.2 Latest Latest
Warning

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

Go to latest
Published: Jan 13, 2025 License: MIT Imports: 17 Imported by: 0

Documentation

Overview

kbucket 包实现了 kademlia 'k-bucket' 路由表

Index

Constants

This section is empty.

Variables

View Source
var ErrLookupFailure = errors.New("failed to find any peer in table")

ErrLookupFailure 当路由表查询没有返回结果时返回此错误。这不是预期的行为

View Source
var ErrPeerRejectedHighLatency = errors.New("节点被拒绝: 延迟太高")
View Source
var ErrPeerRejectedNoCapacity = errors.New("节点被拒绝: 容量不足")

Functions

func Closer

func Closer(a, b peer.ID, key string) bool

Closer 判断节点a是否比节点b更接近目标key 参数:

  • a: peer.ID 第一个节点ID
  • b: peer.ID 第二个节点ID
  • key: string 目标key

返回值:

  • bool 如果a比b更接近key则返回true

func CommonPrefixLen

func CommonPrefixLen(a, b ID) int

CommonPrefixLen 计算两个ID的公共前缀长度 参数:

  • a: ID 第一个ID
  • b: ID 第二个ID

返回值:

  • int 公共前缀的长度

func SortClosestPeers

func SortClosestPeers(peers []peer.ID, target ID) []peer.ID

SortClosestPeers 按照与目标的距离升序对给定的对等节点进行排序 参数:

  • peers: []peer.ID 要排序的对等节点ID列表
  • target: ID 目标标识符

返回值:

  • []peer.ID 排序后的新对等节点ID切片

Types

type ID

type ID []byte

ID 用于IpfsDHT,在XOR密钥空间中

dht.ID类型表示其内容已从peer.ID或util.Key进行哈希处理。这统一了密钥空间

func ConvertKey

func ConvertKey(id string) ID

ConvertKey 通过对本地key(字符串)进行哈希来创建DHT ID 参数:

  • id: string 要转换的key字符串

返回值:

  • ID 生成的DHT ID

func ConvertPeerID

func ConvertPeerID(id peer.ID) ID

ConvertPeerID 通过对Peer ID(Multihash)进行哈希来创建DHT ID 参数:

  • id: peer.ID 要转换的Peer ID

返回值:

  • ID 生成的DHT ID

type PeerInfo

type PeerInfo struct {
	// Id 对等节点的标识符
	Id peer.ID

	// LastUsefulAt 是对等节点最后一次对我们"有用"的时间点
	// 请参阅 DHT 文档中关于有用性的定义
	LastUsefulAt time.Time

	// LastSuccessfulOutboundQueryAt 是我们最后一次从对等节点获得成功查询响应的时间点
	LastSuccessfulOutboundQueryAt time.Time

	// AddedAt 是该对等节点被添加到路由表的时间
	AddedAt time.Time
	// contains filtered or unexported fields
}

PeerInfo 保存了 K-Bucket 中一个对等节点的所有相关信息

type RoutingTable

type RoutingTable struct {

	// 通知函数
	PeerRemoved func(peer.ID)
	PeerAdded   func(peer.ID)
	// contains filtered or unexported fields
}

RoutingTable 定义路由表

func NewRoutingTable

func NewRoutingTable(bucketsize int, localID ID, latency time.Duration, m peerstore.Metrics, usefulnessGracePeriod time.Duration,
	df *peerdiversity.Filter) (*RoutingTable, error)

NewRoutingTable 创建一个新的路由表 参数:

  • bucketsize: int 桶大小
  • localID: ID 本地节点ID
  • latency: time.Duration 延迟容忍度
  • m: peerstore.Metrics 度量对象
  • usefulnessGracePeriod: time.Duration 有用性宽限期
  • df: *peerdiversity.Filter 多样性过滤器

返回值:

  • *RoutingTable 路由表对象
  • error 错误信息

func (*RoutingTable) Close

func (rt *RoutingTable) Close() error

Close 关闭路由表和所有相关进程 可以安全地多次调用 返回值:

  • error 错误信息

func (*RoutingTable) Find

func (rt *RoutingTable) Find(id peer.ID) peer.ID

Find 通过ID查找特定节点或返回nil 参数:

  • id: peer.ID 要查找的节点ID

返回值:

  • peer.ID 找到的节点ID,如果未找到则为空

func (*RoutingTable) GenRandPeerID

func (rt *RoutingTable) GenRandPeerID(targetCpl uint) (peer.ID, error)

GenRandPeerID 为给定的公共前缀长度生成一个随机对等节点ID 参数:

  • targetCpl: uint 目标公共前缀长度

返回值:

  • peer.ID 生成的对等节点ID
  • error 错误信息

func (*RoutingTable) GenRandomKey

func (rt *RoutingTable) GenRandomKey(targetCpl uint) (ID, error)

GenRandomKey 生成一个与本地标识符具有指定公共前缀长度(Cpl)的随机密钥 参数:

  • targetCpl: uint 目标公共前缀长度

返回值:

  • ID 生成的密钥
  • error 错误信息

注意: 返回的密钥与本地密钥的前 targetCpl 位匹配,第 targetCpl+1 位是本地密钥该位的反转,其余位是随机生成的

func (*RoutingTable) GetDiversityStats

func (rt *RoutingTable) GetDiversityStats() []peerdiversity.CplDiversityStats

GetDiversityStats 如果配置了多样性过滤器,则返回路由表的多样性统计信息 返回值:

  • []peerdiversity.CplDiversityStats 多样性统计信息

func (*RoutingTable) GetPeerInfos

func (rt *RoutingTable) GetPeerInfos() []PeerInfo

GetPeerInfos 返回我们在桶中存储的节点信息 返回值:

  • []PeerInfo 节点信息列表

func (*RoutingTable) GetTrackedCplsForRefresh

func (rt *RoutingTable) GetTrackedCplsForRefresh() []time.Time

GetTrackedCplsForRefresh 返回我们正在跟踪刷新的公共前缀长度 参数:

返回值:

  • []time.Time 公共前缀长度对应的刷新时间列表

注意: 调用者可以自由修改返回的切片,因为这是一个防御性副本

func (*RoutingTable) ListPeers

func (rt *RoutingTable) ListPeers() []peer.ID

ListPeers 获取路由表并返回表中所有桶的所有节点列表 返回值:

  • []peer.ID 所有节点的ID列表

func (*RoutingTable) MarkAllPeersIrreplaceable

func (rt *RoutingTable) MarkAllPeersIrreplaceable()

MarkAllPeersIrreplaceable 将路由表中的所有节点标记为不可替换 这意味着我们永远不会替换表中的现有节点来为新节点腾出空间 但是,它们仍然可以通过调用 `RemovePeer` API 来移除

func (*RoutingTable) NPeersForCpl

func (rt *RoutingTable) NPeersForCpl(cpl uint) int

NPeersForCpl 返回给定 Cpl 的节点数量 参数:

  • cpl: uint 公共前缀长度

返回值:

  • int 节点数量

func (*RoutingTable) NearestPeer

func (rt *RoutingTable) NearestPeer(id ID) peer.ID

NearestPeer 返回最接近给定ID的单个节点 参数:

  • id: ID 目标ID

返回值:

  • peer.ID 最近节点的ID,如果未找到则为空

func (*RoutingTable) NearestPeers

func (rt *RoutingTable) NearestPeers(id ID, count int) []peer.ID

NearestPeers 返回距离给定ID最近的'count'个节点列表 参数:

  • id: ID 目标ID
  • count: int 要返回的节点数量

返回值:

  • []peer.ID 最近节点的ID列表

func (*RoutingTable) Print

func (rt *RoutingTable) Print()

Print 打印关于提供的路由表的描述性语句

func (*RoutingTable) RemovePeer

func (rt *RoutingTable) RemovePeer(p peer.ID)

RemovePeer 当调用者确定节点对查询无用时应调用此函数 例如:节点可能已停止支持 DHT 协议 它会从路由表中驱逐节点 参数:

  • p: peer.ID 要移除的节点ID

func (*RoutingTable) ResetCplRefreshedAtForID

func (rt *RoutingTable) ResetCplRefreshedAtForID(id ID, newTime time.Time)

ResetCplRefreshedAtForID 重置给定ID的公共前缀长度的刷新时间 参数:

  • id: ID 对等节点ID
  • newTime: time.Time 新的刷新时间

返回值:

func (*RoutingTable) Size

func (rt *RoutingTable) Size() int

Size 返回路由表中的节点总数 返回值:

  • int 节点总数

func (*RoutingTable) TryAddPeer

func (rt *RoutingTable) TryAddPeer(p peer.ID, queryPeer bool, isReplaceable bool) (bool, error)

TryAddPeer 尝试将节点添加到路由表中 如果节点已存在于路由表中且之前已查询过,此调用无效 如果节点已存在于路由表中但之前未查询过,我们将其 LastUsefulAt 值设置为当前时间 这是必要的,因为我们首次连接到节点时不会将其标记为"有用"(通过设置 LastUsefulAt 值)

如果是查询节点(即我们查询它或它查询我们),我们将 LastSuccessfulOutboundQuery 设置为当前时间 如果只是我们连接到/它连接到我们而没有任何 DHT 查询的节点,我们认为它没有 LastSuccessfulOutboundQuery

如果节点所属的逻辑桶已满且不是最后一个桶,我们尝试用新节点替换该桶中 LastSuccessfulOutboundQuery 超过最大允许阈值的现有节点 如果该桶中不存在这样的节点,我们不会将节点添加到路由表中并返回错误 "ErrPeerRejectedNoCapacity"

参数:

  • p: peer.ID 待添加的节点ID
  • queryPeer: bool 是否为查询节点
  • isReplaceable: bool 是否可替换

返回值:

  • bool 如果节点是新添加到路由表中则为 true,否则为 false
  • error 添加节点时发生的错误。如果错误不为 nil,布尔值将始终为 false,即如果节点不在路由表中,它不会被添加

返回值 false 且 error=nil 表示节点已存在于路由表中

func (*RoutingTable) UpdateLastSuccessfulOutboundQueryAt

func (rt *RoutingTable) UpdateLastSuccessfulOutboundQueryAt(p peer.ID, t time.Time) bool

UpdateLastSuccessfulOutboundQueryAt 更新节点的 LastSuccessfulOutboundQueryAt 时间 参数:

  • p: peer.ID 节点ID
  • t: time.Time 时间

返回值:

  • bool 如果更新成功则为 true,否则为 false

func (*RoutingTable) UpdateLastUsefulAt

func (rt *RoutingTable) UpdateLastUsefulAt(p peer.ID, t time.Time) bool

UpdateLastUsefulAt 更新节点的 LastUsefulAt 时间 参数:

  • p: peer.ID 节点ID
  • t: time.Time 时间

返回值:

  • bool 如果更新成功则为 true,否则为 false

func (*RoutingTable) UsefulNewPeer

func (rt *RoutingTable) UsefulNewPeer(p peer.ID) bool

UsefulNewPeer 验证给定的 peer.ID 是否适合路由表 如果节点不在路由表中,或者对应的桶未满,或者包含可替换的节点,或者是最后一个桶且添加节点会导致展开,则返回 true 参数:

  • p: peer.ID 待验证的节点ID

返回值:

  • bool 是否有用

Directories

Path Synopsis

Jump to

Keyboard shortcuts

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