比特币 RPC 命令「getunconfirmedbalance」
$ bitcoin-cli help getunconfirmedbalance getunconfirmedbalance 返回服务器端未确认的总余额
源码剖析
getunconfirmedbalance
对应的函数在文件 rpcserver.h
中被引用。
extern UniValue getunconfirmedbalance(const UniValue& params, bool fHelp);
实现在文件 rpcwallet.cpp
中。
UniValue getunconfirmedbalance(const UniValue ¶ms, 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;
}