在去中心化的端到端网络里,discovery 协议用于节点之间相互发现。相连的节点之间共享自己已知的活跃节点列表,从而实现节点信息的传播,让非相连的节点之间也能相互发现。
通过 discovery 协议发现网络中的节点信息后,CKB 通过 feeler 等其它协议来判断目标节点是否可达、网络质量等,再收敛网络的拓扑结构,本文不涉及。
CKB 会将已知的活跃节点记录在本地数据库 peer-database,文件路径在 network/peer_store/addr_manager.db
。
如果 peer-database 为空,则 CKB 从配置文件 ckb.toml 里读取配置项 network.bootnodes
,随机连接一个种子节点。更过关于 bootnode 的说明,参看 bitcoin seed nodes。
两个 CKB 节点建立连接后,双方发送询问请求,询问对端已知的活跃节点信息并作出相应的响应。之后双方不再询问,而是定期主动地向对端发送己方的活跃节点信息。
消息结构以 molecule 编码:
union DiscoveryPayload {
// 询问请求,询问对端已知的活跃节点信息
GetNodes,
// 已知的活跃节点信息
Nodes,
}
table GetNodes {
version: Uint32,
// 表示想获取的节点信息的最大数量
count: Uint32,
// 公开的 listen port
listen_port: PortOpt,
}
table Nodes {
// announce = false 指响应 `GetNodes` 消息
// announce = true 指主动向对端发送己方的活跃节点信息
announce: Bool,
items: NodeVec,
}
- 去中心化的端到端网络对节点发现机制的实时性要求不高(对于节点的加入和退出,不要求快速通知到其它节点,也不要求当事节点快速了解其它节点),不要求了解到整个网络的全量节点信息。