Documentation ¶
Overview ¶
Package peerstore provides types and interfaces for local storage of address information, metadata, and public key material about dep2p peers.
Index ¶
Constants ¶
const ( // PermanentAddrTTL 用于"永久地址"(如引导节点)的TTL // 值为MaxInt64减去iota PermanentAddrTTL = math.MaxInt64 - iota // ConnectedAddrTTL 用于直接连接的对等点地址的TTL // 这基本上是永久的,因为在断开连接后我们会清除它们并以TempAddrTTL重新添加 ConnectedAddrTTL )
永久TTL常量 使用不同的值以便区分,但实际上都是永久的
Variables ¶
var ( // AddressTTL 是地址的过期时间 // 默认为1小时 AddressTTL = time.Hour // TempAddrTTL 用于短期地址的TTL // 默认为2分钟 TempAddrTTL = time.Minute * 2 // RecentlyConnectedAddrTTL 用于最近连接过的对等点的地址 // 表示我们对该对等点的地址有较高的确定性 // 默认为15分钟 RecentlyConnectedAddrTTL = time.Minute * 15 // OwnObservedAddrTTL 用于被其他对等点观察到的我们自己的外部地址 // 已弃用:观察到的地址将保持到我们与提供它的对等点断开连接为止 // 默认为30分钟 OwnObservedAddrTTL = time.Minute * 30 )
var ErrNotFound = errors.New("item not found")
ErrNotFound 表示在存储中未找到请求的项目
Functions ¶
Types ¶
type AddrBook ¶
type AddrBook interface { // AddAddr 调用 AddAddrs(p, []ma.Multiaddr{addr}, ttl) AddAddr(p peer.ID, addr ma.Multiaddr, ttl time.Duration) // AddAddrs 为AddrBook提供要使用的地址,具有给定的TTL(生存时间) // 在TTL之后,地址将不再有效 // 如果管理器有更长的TTL,则该地址的操作为空操作 AddAddrs(p peer.ID, addrs []ma.Multiaddr, ttl time.Duration) // SetAddr 调用 mgr.SetAddrs(p, addr, ttl) SetAddr(p peer.ID, addr ma.Multiaddr, ttl time.Duration) // SetAddrs 设置地址的TTL。这会清除之前的任何TTL // 当我们收到地址有效性的最佳估计时使用此方法 SetAddrs(p peer.ID, addrs []ma.Multiaddr, ttl time.Duration) // UpdateAddrs 更新具有给定oldTTL的给定对等点的关联地址,使其具有给定的newTTL UpdateAddrs(p peer.ID, oldTTL time.Duration, newTTL time.Duration) // Addrs 返回给定对等点的所有已知(且有效)地址 Addrs(p peer.ID) []ma.Multiaddr // AddrStream 返回一个通道,该通道会接收给定对等点的所有地址 // 如果在调用后添加了新地址,这些地址也会通过该通道发送 AddrStream(context.Context, peer.ID) <-chan ma.Multiaddr // ClearAddresses 移除所有先前存储的地址 ClearAddrs(p peer.ID) // PeersWithAddrs 返回AddrBook中存储的所有对等点ID PeersWithAddrs() peer.IDSlice }
AddrBook 保存对等点的多地址
type CertifiedAddrBook ¶
type CertifiedAddrBook interface { // ConsumePeerRecord 存储签名的对等点记录和其包含的地址,持续时间为ttl // 签名对等点记录中包含的地址将在ttl后过期 // 如果任何地址已存在于对等点存储中,它将在现有ttl和提供的ttl的最大值处过期 // 当与对等点关联的所有地址(无论是自认证的还是非自认证的)从AddrBook中移除时,签名的对等点记录本身将过期 // // 要删除签名的对等点记录,请使用`AddrBook.UpdateAddrs`、`AddrBook.SetAddrs`或`AddrBook.ClearAddrs`,并将ttl设为0 // 注意:未来对ConsumePeerRecord的调用不会使先前调用的自认证地址过期 // // `accepted`返回值表示记录已成功处理 // 如果`accepted`为false但未返回错误,则表示记录被忽略,很可能是因为存在具有更大seq值的同一对等点的较新记录 // // 包含签名对等点记录的信封可以通过调用GetPeerRecord(peerID)获取 ConsumePeerRecord(s *record.Envelope, ttl time.Duration) (accepted bool, err error) // GetPeerRecord 返回包含对等点记录的信封,如果不存在记录则返回nil GetPeerRecord(p peer.ID) *record.Envelope }
CertifiedAddrBook 管理签名的对等点记录和其中包含的"自认证"地址 将此接口与`AddrBook`一起使用
要测试给定的AddrBook/Peerstore实现是否支持认证地址,调用者应使用GetCertifiedAddrBook辅助函数或对CertifiedAddrBook接口进行类型断言:
if cab, ok := aPeerstore.(CertifiedAddrBook); ok { cab.ConsumePeerRecord(signedPeerRecord, aTTL) }
func GetCertifiedAddrBook ¶
func GetCertifiedAddrBook(ab AddrBook) (cab CertifiedAddrBook, ok bool)
GetCertifiedAddrBook 是一个辅助函数,通过类型断言将AddrBook"向上转换"为CertifiedAddrBook 如果给定的AddrBook也是CertifiedAddrBook,它将被返回,ok返回值将为true 如果AddrBook不是CertifiedAddrBook,则返回(nil, false)
注意:由于Peerstore嵌入了AddrBook接口,你也可以调用GetCertifiedAddrBook(myPeerstore)
type KeyBook ¶
type KeyBook interface { // PubKey 返回对等点的公钥 PubKey(peer.ID) ic.PubKey // AddPubKey 存储对等点的公钥 AddPubKey(peer.ID, ic.PubKey) error // PrivKey 返回对等点的私钥(如果已知) PrivKey(peer.ID) ic.PrivKey // AddPrivKey 存储对等点的私钥 AddPrivKey(peer.ID, ic.PrivKey) error // PeersWithKeys 返回KeyBook中存储的所有对等点ID PeersWithKeys() peer.IDSlice // RemovePeer 移除与对等点关联的所有密钥 RemovePeer(peer.ID) }
KeyBook 跟踪对等点的密钥
type Metrics ¶
type Metrics interface { // RecordLatency 记录新的延迟测量 RecordLatency(peer.ID, time.Duration) // LatencyEWMA 返回对等点延迟所有测量的指数加权移动平均值 LatencyEWMA(peer.ID) time.Duration // RemovePeer 移除存储的对等点的所有指标 RemovePeer(peer.ID) }
Metrics 跟踪一组对等点的指标
type PeerMetadata ¶
type PeerMetadata interface { // Get/Put 是其他对等点相关键值对的简单注册表 // 如果我们发现经常使用某些内容,它应该成为自己的方法集。这是最后的手段 Get(p peer.ID, key string) (interface{}, error) Put(p peer.ID, key string, val interface{}) error // RemovePeer 移除存储的对等点的所有值 RemovePeer(peer.ID) }
PeerMetadata 可以处理任何类型的值 值的序列化由实现决定 可能不支持动态类型内省,在这种情况下可能需要在序列化器中显式列出类型
更多信息请参考底层实现的文档
type Peerstore ¶
type Peerstore interface { io.Closer AddrBook KeyBook PeerMetadata Metrics ProtoBook // PeerInfo 返回给定peer.ID的peer.PeerInfo结构 // 这是Peerstore中关于该对等点信息的一个小切片,对其他服务有用 PeerInfo(peer.ID) peer.AddrInfo // Peers 返回所有内部存储中存储的对等点ID Peers() peer.IDSlice // RemovePeer 移除除地址外的所有对等点相关信息 // 要移除地址,请使用`AddrBook.ClearAddrs`或将地址TTL设置为0 RemovePeer(peer.ID) }
Peerstore 提供线程安全的对等点相关信息存储
type ProtoBook ¶
type ProtoBook interface { // GetProtocols 获取对等点支持的协议列表 GetProtocols(peer.ID) ([]protocol.ID, error) // AddProtocols 为对等点添加协议 AddProtocols(peer.ID, ...protocol.ID) error // SetProtocols 设置对等点的协议 SetProtocols(peer.ID, ...protocol.ID) error // RemoveProtocols 移除对等点的指定协议 RemoveProtocols(peer.ID, ...protocol.ID) error // SupportsProtocols 从给定的协议中返回对等点支持的协议集 // 如果返回的错误不为nil,则结果不确定 SupportsProtocols(peer.ID, ...protocol.ID) ([]protocol.ID, error) // FirstSupportedProtocol 返回对等点在给定协议中支持的第一个协议 // 如果对等点不支持任何给定的协议,此函数将返回空的protocol.ID和nil错误 // 如果返回的错误不为nil,则结果不确定 FirstSupportedProtocol(peer.ID, ...protocol.ID) (protocol.ID, error) // RemovePeer 移除与对等点关联的所有协议 RemovePeer(peer.ID) }
ProtoBook 跟踪对等点支持的协议