bytom源码分析-P2P网络-地址簿
简介
https://github.com/Bytom/bytom
本章介绍bytom代码P2P网络中addrbook地址簿
作者使用MacOS操作系统,其他平台也大同小异
Golang Version: 1.8
addrbook介绍
addrbook用于存储P2P网络中保留最近的对端节点地址
在MacOS下,默认的地址簿路径存储在~/Library/Bytom/addrbook.json
地址簿格式
~/Library/Bytom/addrbook.json
1 | { |
地址类型
在addrbook中存储的地址有两种:
p2p/addrbook.go
1 | const ( |
注意: 一个地址的类型变更不在此文章中做介绍,后期的文章会讨论该问题
地址簿相关结构体
地址簿
1 | type AddrBook struct { |
已知地址
1 | type knownAddress struct { |
routabilityStrict参数表示地址簿是否存储的ip是否可路由。可路由是根据RFC划分,具体参考资料:RFC标准
初始化地址簿
1 | // NewAddrBook creates a new address book. |
bytomd启动时加载本地地址簿
loadFromFile在bytomd启动时,首先会加载本地的地址簿
1 | // OnStart implements Service. |
定时更新地址簿
bytomd会定时更新本地地址簿,默认2分钟一次
1 | func (a *AddrBook) saveRoutine() { |
添加新地址
当peer之间交换addr时,节点会收到对端节点已知的地址信息,这些信息会被当前节点添加到地址簿中
1 | func (a *AddrBook) AddAddress(addr *NetAddress, src *NetAddress) { |
选择最优节点
地址簿中存储众多地址,在p2p网络中需选择最优的地址去连接
PickAddress(newBias int)函数中newBias是由pex_reactor产生的地址评分。如何计算地址分数在其他章节中再讲
根据地址评分随机选择地址可增加区块链安全性
1 | // Pick an address to connect to with new/old bias. |
移除一个地址
当一个地址被标记为Bad时则从地址集中移除。目前bytomd的代码版本并未调用过
1 | func (a *AddrBook) MarkBad(addr *NetAddress) { |