Documentation
¶
Overview ¶
kbucket 包实现了 kademlia 'k-bucket' 路由表
Index ¶
- Variables
- func Closer(a, b peer.ID, key string) bool
- func CommonPrefixLen(a, b ID) int
- func SortClosestPeers(peers []peer.ID, target ID) []peer.ID
- type ID
- type PeerInfo
- type RoutingTable
- func (rt *RoutingTable) Close() error
- func (rt *RoutingTable) Find(id peer.ID) peer.ID
- func (rt *RoutingTable) GenRandPeerID(targetCpl uint) (peer.ID, error)
- func (rt *RoutingTable) GenRandomKey(targetCpl uint) (ID, error)
- func (rt *RoutingTable) GetDiversityStats() []peerdiversity.CplDiversityStats
- func (rt *RoutingTable) GetPeerInfos() []PeerInfo
- func (rt *RoutingTable) GetTrackedCplsForRefresh() []time.Time
- func (rt *RoutingTable) ListPeers() []peer.ID
- func (rt *RoutingTable) MarkAllPeersIrreplaceable()
- func (rt *RoutingTable) NPeersForCpl(cpl uint) int
- func (rt *RoutingTable) NearestPeer(id ID) peer.ID
- func (rt *RoutingTable) NearestPeers(id ID, count int) []peer.ID
- func (rt *RoutingTable) Print()
- func (rt *RoutingTable) RemovePeer(p peer.ID)
- func (rt *RoutingTable) ResetCplRefreshedAtForID(id ID, newTime time.Time)
- func (rt *RoutingTable) Size() int
- func (rt *RoutingTable) TryAddPeer(p peer.ID, queryPeer bool, isReplaceable bool) (bool, error)
- func (rt *RoutingTable) UpdateLastSuccessfulOutboundQueryAt(p peer.ID, t time.Time) bool
- func (rt *RoutingTable) UpdateLastUsefulAt(p peer.ID, t time.Time) bool
- func (rt *RoutingTable) UsefulNewPeer(p peer.ID) bool
Constants ¶
This section is empty.
Variables ¶
var ErrLookupFailure = errors.New("failed to find any peer in table")
ErrLookupFailure 当路由表查询没有返回结果时返回此错误。这不是预期的行为
var ErrPeerRejectedHighLatency = errors.New("节点被拒绝: 延迟太高")
var ErrPeerRejectedNoCapacity = errors.New("节点被拒绝: 容量不足")
Functions ¶
func Closer ¶
Closer 判断节点a是否比节点b更接近目标key 参数:
- a: peer.ID 第一个节点ID
- b: peer.ID 第二个节点ID
- key: string 目标key
返回值:
- bool 如果a比b更接近key则返回true
Types ¶
type ID ¶
type ID []byte
ID 用于IpfsDHT,在XOR密钥空间中
dht.ID类型表示其内容已从peer.ID或util.Key进行哈希处理。这统一了密钥空间
func ConvertPeerID ¶
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) 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) TryAddPeer ¶
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 ¶
UpdateLastSuccessfulOutboundQueryAt 更新节点的 LastSuccessfulOutboundQueryAt 时间 参数:
- p: peer.ID 节点ID
- t: time.Time 时间
返回值:
- bool 如果更新成功则为 true,否则为 false
func (*RoutingTable) UpdateLastUsefulAt ¶
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 是否有用