您的位置:首页 > 其它

Bitcoin Core源码剖析之Banman模块

2020-02-02 11:38 1351 查看

Banman模块介绍

功能:检测、阻止Dos攻击。
原理:检测行为异常的用户、断开其连接。(即使代码发生错误也不会破坏整个网络。)
注意事项:
1、向恶意节点的同伴节点(node’s peer)发送某个东西,使得同伴节点丢弃它,这种方式是不被允许的。因为会被攻击者利用从而隔离一个节点或者分割整个网络。
2、通过发送东西、丢弃节点的方式,只对当前节版本有效、对上版本无效,这种方式是非常危险的,因为它在运行新代码的节点与运行老代码的节点之间产生网络分割。

历史改动/前世今生

2017年10月6日,重构,从src/net.cpp中抽离、封装成独立的模块。
2017年10月6日,重构,一群好(wu)玩(liao)的人把banman成员变量的命名风格由“小驼峰式”改为“匈牙利式”。
2018年10月31日,重构,将函数内部变量的命名风格由“小驼峰式”改为“匈牙利式”。
2018年10月31日,重构,为了避免对参数进行二次赋值,做了小小的重构。
2018年12月12日,新功能,允许“行为异常”的peer连接。
2019年1月3日,重构,为了使代码简洁,新增CBanEntry的构造函数。

结构

class BanMan
{
public:
~BanMan();
BanMan(fs::path ban_file, CClientUIInterface* client_interface, int64_t default_ban_time);
void Ban(const CNetAddr& net_addr, const BanReason& ban_reason, int64_t ban_time_offset = 0, bool since_unix_epoch = false);
void Ban(const CSubNet& sub_net, const BanReason& ban_reason, int64_t ban_time_offset = 0, bool since_unix_epoch = false);
void ClearBanned();
int IsBannedLevel(CNetAddr net_addr);
bool IsBanned(CNetAddr net_addr);
bool IsBanned(CSubNet sub_net);
bool Unban(const CNetAddr& net_addr);
bool Unban(const CSubNet& sub_net);
void GetBanned(banmap_t& banmap);
void DumpBanlist();
private:
void SetBanned(const banmap_t& banmap);
bool BannedSetIsDirty();
//!set the "dirty" flag for the banlist
void SetBannedSetDirty(bool dirty = true);
//!clean unused entries (if bantime has expired)
void SweepBanned();

CCriticalSection m_cs_banned;
banmap_t m_banned GUARDED_BY(m_cs_banned);
bool m_is_dirty GUARDED_BY(m_cs_banned);
CClientUIInterface* m_client_interface = nullptr;
CBanDB m_ban_db;
const int64_t m_default_ban_time;
};

其它小模块

CBanDB				//banman.dat的读取、写入
CSubNet				//节点的ip
CBanEntry			//节点被ban的原因、时间
typedef std::map<CSubNet, CBanEntry> banmap_t;		//map

本质

通过该类的结构的观察,我们可以判断该类主要做了以下事情:
1、在

Ban
函数、
unban
函数和
IsBanned
函数中对banmap_t进行增、删、查等操作。
2、在
DumpBanlist
函数中,通过CBanDB模块对banman.dat文件进行读取和写入。

那么banman.dat里存储了什么?按照怎样的方式进行存储的?有兴趣的读者可以自行研读bitcoin core的代码。
(本文点赞数达到99+后,我会写相关文章来聊聊CBanDB模块通过怎样的方式把数据存入banman.dat、banman.dat里存了哪些数据、我是怎么追踪整个存储过程的。)

  • 点赞
  • 收藏
  • 分享
  • 文章举报
Bitcoin信仰玩家 发布了2 篇原创文章 · 获赞 0 · 访问量 554 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: