$ 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
}

参考链接