比特币 RPC 命令「listbanned」
$ bitcoin-cli help listbanned listbanned 列出所有已禁止的 IP /子网。 例子: > bitcoin-cli listbanned > curl --user myusername:mypassword --data-binary '{"jsonrpc": "1.0", "id":"curltest", "method": "listbanned", "params": [] }' -H 'content-type: text/plain;' http://127.0.0.1:8332/
源码剖析
listbanned
对应的函数在文件 rpcserver.h
中被引用。
extern UniValue listbanned(const UniValue& params, bool fHelp);
实现在文件 rpcnet.cpp
中。
UniValue listbanned(const UniValue& params, bool fHelp)
{
if (fHelp || params.size() != 0)
throw runtime_error(
"listbanned\n"
"\nList all banned IPs/Subnets.\n"
"\nExamples:\n"
+ HelpExampleCli("listbanned", "")
+ HelpExampleRpc("listbanned", "")
); // 1. 帮助内容
banmap_t banMap;
CNode::GetBanned(banMap); // 2. 获取禁止映射列表
UniValue bannedAddresses(UniValue::VARR); // 3. 构建已禁止的地址集对象并返回
for (banmap_t::iterator it = banMap.begin(); it != banMap.end(); it++)
{
CBanEntry banEntry = (*it).second;
UniValue rec(UniValue::VOBJ);
rec.push_back(Pair("address", (*it).first.ToString()));
rec.push_back(Pair("banned_until", banEntry.nBanUntil));
rec.push_back(Pair("ban_created", banEntry.nCreateTime));
rec.push_back(Pair("ban_reason", banEntry.banReasonToString()));
bannedAddresses.push_back(rec);
}
return bannedAddresses;
}
1. 帮助内容
参考比特币 RPC 命令「getbestblockhash」1. 帮助内容。
2. 获取禁止映射列表
类型 banmap_t
定义在文件 net.h
中。
typedef std::map<CSubNet, CBanEntry> banmap_t;
获取屏蔽映射列表函数 CNode::GetBanned(banMap)
声明在文件 net.h
的节点类 CNode
中。
/** Information about a peer */
class CNode // 关于一个对端的信息
{
...
protected:
// Denial-of-service detection/prevention
// Key is IP address, value is banned-until-time
static banmap_t setBanned;
static CCriticalSection cs_setBanned;
...
public:
...
static void GetBanned(banmap_t &banmap);
...
};
实现在文件 net.cpp
中。
banmap_t CNode::setBanned;
CCriticalSection CNode::cs_setBanned;
...
void CNode::GetBanned(banmap_t &banMap)
{
LOCK(cs_setBanned);
banMap = setBanned; //create a thread safe copy
}