Skip to content

Instantly share code, notes, and snippets.

@keroro520
Created August 31, 2022 10:39
Show Gist options
  • Save keroro520/bcb40812dd877921619ccc123b2969c3 to your computer and use it in GitHub Desktop.
Save keroro520/bcb40812dd877921619ccc123b2969c3 to your computer and use it in GitHub Desktop.
discovery-intro.md

Discovery 网络协议

用途

在去中心化的端到端网络里,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,
}

杂七杂八

  • 去中心化的端到端网络对节点发现机制的实时性要求不高(对于节点的加入和退出,不要求快速通知到其它节点,也不要求当事节点快速了解其它节点),不要求了解到整个网络的全量节点信息。

参考资料

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment