$ bitcoin-cli help getunconfirmedbalance
getunconfirmedbalance
返回服务器端未确认的总余额

源码剖析

getunconfirmedbalance 对应的函数在文件 rpcserver.h 中被引用。

extern UniValue getunconfirmedbalance(const UniValue& params, bool fHelp);

实现在文件 rpcwallet.cpp 中。

UniValue getunconfirmedbalance(const UniValue &params, bool fHelp)
{
    if (!EnsureWalletIsAvailable(fHelp)) // 1. 确保钱包可用
        return NullUniValue;
    
    if (fHelp || params.size() > 0)
        throw runtime_error(
                "getunconfirmedbalance\n"
                "Returns the server's total unconfirmed balance\n"); // 2. 帮助内容

    LOCK2(cs_main, pwalletMain->cs_wallet);

    return ValueFromAmount(pwalletMain->GetUnconfirmedBalance()); // 3. 获取未确认的余额
}

1. 确保钱包可用

参考比特币 RPC 命令「fundrawtransaction」1. 确保钱包可用

2. 帮助内容

参考比特币 RPC 命令「getbestblockhash」1. 帮助内容

3. 获取未确认的余额

获取未确认的余额函数 pwalletMain->GetUnconfirmedBalance() 定义在文件 wallet.cpp 中。

bool CWalletTx::InMempool() const
{
    LOCK(mempool.cs);
    if (mempool.exists(GetHash())) {
        return true;
    }
    return false;
}
...
CAmount CWallet::GetUnconfirmedBalance() const
{
    CAmount nTotal = 0;
    {
        LOCK2(cs_main, cs_wallet);
        for (map<uint256, CWalletTx>::const_iterator it = mapWallet.begin(); it != mapWallet.end(); ++it)
        { // 遍历钱包交易映射列表
            const CWalletTx* pcoin = &(*it).second; // 获取钱包交易
            if (!pcoin->IsTrusted() && pcoin->GetDepthInMainChain() == 0 && pcoin->InMempool()) // 该交易不可信(未确认) 且 交易所在链深度为 0 且 交易在内存池中(未上链)
                nTotal += pcoin->GetAvailableCredit(); // 获取累加可用余额
        }
    }
    return nTotal;
}

参考链接