mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-02-08 10:31:50 -05:00
[wallet] Move methods from Chain::Lock interface to simple Chain
Remove findPruned and findFork, no more used after 17954.
This commit is contained in:
parent
0a76287387
commit
841178820d
7 changed files with 97 additions and 123 deletions
|
@ -55,58 +55,6 @@ bool FillBlock(const CBlockIndex* index, const FoundBlock& block, UniqueLock<Rec
|
||||||
|
|
||||||
class LockImpl : public Chain::Lock, public UniqueLock<RecursiveMutex>
|
class LockImpl : public Chain::Lock, public UniqueLock<RecursiveMutex>
|
||||||
{
|
{
|
||||||
bool haveBlockOnDisk(int height) override
|
|
||||||
{
|
|
||||||
LockAssertion lock(::cs_main);
|
|
||||||
CBlockIndex* block = ::ChainActive()[height];
|
|
||||||
return block && ((block->nStatus & BLOCK_HAVE_DATA) != 0) && block->nTx > 0;
|
|
||||||
}
|
|
||||||
Optional<int> findFirstBlockWithTimeAndHeight(int64_t time, int height, uint256* hash) override
|
|
||||||
{
|
|
||||||
LockAssertion lock(::cs_main);
|
|
||||||
CBlockIndex* block = ::ChainActive().FindEarliestAtLeast(time, height);
|
|
||||||
if (block) {
|
|
||||||
if (hash) *hash = block->GetBlockHash();
|
|
||||||
return block->nHeight;
|
|
||||||
}
|
|
||||||
return nullopt;
|
|
||||||
}
|
|
||||||
Optional<int> findFork(const uint256& hash, Optional<int>* height) override
|
|
||||||
{
|
|
||||||
LockAssertion lock(::cs_main);
|
|
||||||
const CBlockIndex* block = LookupBlockIndex(hash);
|
|
||||||
const CBlockIndex* fork = block ? ::ChainActive().FindFork(block) : nullptr;
|
|
||||||
if (height) {
|
|
||||||
if (block) {
|
|
||||||
*height = block->nHeight;
|
|
||||||
} else {
|
|
||||||
height->reset();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (fork) {
|
|
||||||
return fork->nHeight;
|
|
||||||
}
|
|
||||||
return nullopt;
|
|
||||||
}
|
|
||||||
CBlockLocator getTipLocator() override
|
|
||||||
{
|
|
||||||
LockAssertion lock(::cs_main);
|
|
||||||
return ::ChainActive().GetLocator();
|
|
||||||
}
|
|
||||||
Optional<int> findLocatorFork(const CBlockLocator& locator) override
|
|
||||||
{
|
|
||||||
LockAssertion lock(::cs_main);
|
|
||||||
if (CBlockIndex* fork = FindForkInGlobalIndex(::ChainActive(), locator)) {
|
|
||||||
return fork->nHeight;
|
|
||||||
}
|
|
||||||
return nullopt;
|
|
||||||
}
|
|
||||||
bool checkFinalTx(const CTransaction& tx) override
|
|
||||||
{
|
|
||||||
LockAssertion lock(::cs_main);
|
|
||||||
return CheckFinalTx(tx);
|
|
||||||
}
|
|
||||||
|
|
||||||
using UniqueLock::UniqueLock;
|
using UniqueLock::UniqueLock;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -234,6 +182,40 @@ public:
|
||||||
assert(block);
|
assert(block);
|
||||||
return block->GetBlockHash();
|
return block->GetBlockHash();
|
||||||
}
|
}
|
||||||
|
bool haveBlockOnDisk(int height) override
|
||||||
|
{
|
||||||
|
LOCK(cs_main);
|
||||||
|
CBlockIndex* block = ::ChainActive()[height];
|
||||||
|
return block && ((block->nStatus & BLOCK_HAVE_DATA) != 0) && block->nTx > 0;
|
||||||
|
}
|
||||||
|
Optional<int> findFirstBlockWithTimeAndHeight(int64_t time, int height, uint256* hash) override
|
||||||
|
{
|
||||||
|
LOCK(cs_main);
|
||||||
|
CBlockIndex* block = ::ChainActive().FindEarliestAtLeast(time, height);
|
||||||
|
if (block) {
|
||||||
|
if (hash) *hash = block->GetBlockHash();
|
||||||
|
return block->nHeight;
|
||||||
|
}
|
||||||
|
return nullopt;
|
||||||
|
}
|
||||||
|
CBlockLocator getTipLocator() override
|
||||||
|
{
|
||||||
|
LOCK(cs_main);
|
||||||
|
return ::ChainActive().GetLocator();
|
||||||
|
}
|
||||||
|
bool checkFinalTx(const CTransaction& tx) override
|
||||||
|
{
|
||||||
|
LOCK(cs_main);
|
||||||
|
return CheckFinalTx(tx);
|
||||||
|
}
|
||||||
|
Optional<int> findLocatorFork(const CBlockLocator& locator) override
|
||||||
|
{
|
||||||
|
LOCK(cs_main);
|
||||||
|
if (CBlockIndex* fork = FindForkInGlobalIndex(::ChainActive(), locator)) {
|
||||||
|
return fork->nHeight;
|
||||||
|
}
|
||||||
|
return nullopt;
|
||||||
|
}
|
||||||
bool findBlock(const uint256& hash, const FoundBlock& block) override
|
bool findBlock(const uint256& hash, const FoundBlock& block) override
|
||||||
{
|
{
|
||||||
WAIT_LOCK(cs_main, lock);
|
WAIT_LOCK(cs_main, lock);
|
||||||
|
|
|
@ -86,36 +86,6 @@ public:
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
virtual ~Lock() {}
|
virtual ~Lock() {}
|
||||||
|
|
||||||
//! Check that the block is available on disk (i.e. has not been
|
|
||||||
//! pruned), and contains transactions.
|
|
||||||
virtual bool haveBlockOnDisk(int height) = 0;
|
|
||||||
|
|
||||||
//! Return height of the first block in the chain with timestamp equal
|
|
||||||
//! or greater than the given time and height equal or greater than the
|
|
||||||
//! given height, or nullopt if there is no block with a high enough
|
|
||||||
//! timestamp and height. Also return the block hash as an optional output parameter
|
|
||||||
//! (to avoid the cost of a second lookup in case this information is needed.)
|
|
||||||
virtual Optional<int> findFirstBlockWithTimeAndHeight(int64_t time, int height, uint256* hash) = 0;
|
|
||||||
|
|
||||||
//! Return height of the specified block if it is on the chain, otherwise
|
|
||||||
//! return the height of the highest block on chain that's an ancestor
|
|
||||||
//! of the specified block, or nullopt if there is no common ancestor.
|
|
||||||
//! Also return the height of the specified block as an optional output
|
|
||||||
//! parameter (to avoid the cost of a second hash lookup in case this
|
|
||||||
//! information is desired).
|
|
||||||
virtual Optional<int> findFork(const uint256& hash, Optional<int>* height) = 0;
|
|
||||||
|
|
||||||
//! Get locator for the current chain tip.
|
|
||||||
virtual CBlockLocator getTipLocator() = 0;
|
|
||||||
|
|
||||||
//! Return height of the highest block on chain in common with the locator,
|
|
||||||
//! which will either be the original block used to create the locator,
|
|
||||||
//! or one of its ancestors.
|
|
||||||
virtual Optional<int> findLocatorFork(const CBlockLocator& locator) = 0;
|
|
||||||
|
|
||||||
//! Check if transaction will be final given chain height current time.
|
|
||||||
virtual bool checkFinalTx(const CTransaction& tx) = 0;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
//! Return Lock interface. Chain is locked when this is called, and
|
//! Return Lock interface. Chain is locked when this is called, and
|
||||||
|
@ -135,6 +105,28 @@ public:
|
||||||
//! Get block hash. Height must be valid or this function will abort.
|
//! Get block hash. Height must be valid or this function will abort.
|
||||||
virtual uint256 getBlockHash(int height) = 0;
|
virtual uint256 getBlockHash(int height) = 0;
|
||||||
|
|
||||||
|
//! Check that the block is available on disk (i.e. has not been
|
||||||
|
//! pruned), and contains transactions.
|
||||||
|
virtual bool haveBlockOnDisk(int height) = 0;
|
||||||
|
|
||||||
|
//! Return height of the first block in the chain with timestamp equal
|
||||||
|
//! or greater than the given time and height equal or greater than the
|
||||||
|
//! given height, or nullopt if there is no block with a high enough
|
||||||
|
//! timestamp and height. Also return the block hash as an optional output parameter
|
||||||
|
//! (to avoid the cost of a second lookup in case this information is needed.)
|
||||||
|
virtual Optional<int> findFirstBlockWithTimeAndHeight(int64_t time, int height, uint256* hash) = 0;
|
||||||
|
|
||||||
|
//! Get locator for the current chain tip.
|
||||||
|
virtual CBlockLocator getTipLocator() = 0;
|
||||||
|
|
||||||
|
//! Return height of the highest block on chain in common with the locator,
|
||||||
|
//! which will either be the original block used to create the locator,
|
||||||
|
//! or one of its ancestors.
|
||||||
|
virtual Optional<int> findLocatorFork(const CBlockLocator& locator) = 0;
|
||||||
|
|
||||||
|
//! Check if transaction will be final given chain height current time.
|
||||||
|
virtual bool checkFinalTx(const CTransaction& tx) = 0;
|
||||||
|
|
||||||
//! Return whether node has the block and optionally return block metadata
|
//! Return whether node has the block and optionally return block metadata
|
||||||
//! or contents.
|
//! or contents.
|
||||||
virtual bool findBlock(const uint256& hash, const FoundBlock& block={}) = 0;
|
virtual bool findBlock(const uint256& hash, const FoundBlock& block={}) = 0;
|
||||||
|
|
|
@ -60,7 +60,7 @@ WalletTx MakeWalletTx(CWallet& wallet, const CWalletTx& wtx)
|
||||||
}
|
}
|
||||||
|
|
||||||
//! Construct wallet tx status struct.
|
//! Construct wallet tx status struct.
|
||||||
WalletTxStatus MakeWalletTxStatus(interfaces::Chain::Lock& locked_chain, const CWalletTx& wtx)
|
WalletTxStatus MakeWalletTxStatus(CWallet& wallet, const CWalletTx& wtx)
|
||||||
{
|
{
|
||||||
WalletTxStatus result;
|
WalletTxStatus result;
|
||||||
result.block_height = wtx.m_confirm.block_height > 0 ? wtx.m_confirm.block_height : std::numeric_limits<int>::max();
|
result.block_height = wtx.m_confirm.block_height > 0 ? wtx.m_confirm.block_height : std::numeric_limits<int>::max();
|
||||||
|
@ -68,8 +68,8 @@ WalletTxStatus MakeWalletTxStatus(interfaces::Chain::Lock& locked_chain, const C
|
||||||
result.depth_in_main_chain = wtx.GetDepthInMainChain();
|
result.depth_in_main_chain = wtx.GetDepthInMainChain();
|
||||||
result.time_received = wtx.nTimeReceived;
|
result.time_received = wtx.nTimeReceived;
|
||||||
result.lock_time = wtx.tx->nLockTime;
|
result.lock_time = wtx.tx->nLockTime;
|
||||||
result.is_final = locked_chain.checkFinalTx(*wtx.tx);
|
result.is_final = wallet.chain().checkFinalTx(*wtx.tx);
|
||||||
result.is_trusted = wtx.IsTrusted(locked_chain);
|
result.is_trusted = wtx.IsTrusted();
|
||||||
result.is_abandoned = wtx.isAbandoned();
|
result.is_abandoned = wtx.isAbandoned();
|
||||||
result.is_coinbase = wtx.IsCoinBase();
|
result.is_coinbase = wtx.IsCoinBase();
|
||||||
result.is_in_main_chain = wtx.IsInMainChain();
|
result.is_in_main_chain = wtx.IsInMainChain();
|
||||||
|
@ -322,7 +322,7 @@ public:
|
||||||
num_blocks = m_wallet->GetLastBlockHeight();
|
num_blocks = m_wallet->GetLastBlockHeight();
|
||||||
block_time = -1;
|
block_time = -1;
|
||||||
CHECK_NONFATAL(m_wallet->chain().findBlock(m_wallet->GetLastBlockHash(), FoundBlock().time(block_time)));
|
CHECK_NONFATAL(m_wallet->chain().findBlock(m_wallet->GetLastBlockHash(), FoundBlock().time(block_time)));
|
||||||
tx_status = MakeWalletTxStatus(*locked_chain, mi->second);
|
tx_status = MakeWalletTxStatus(*m_wallet, mi->second);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
WalletTx getWalletTxDetails(const uint256& txid,
|
WalletTx getWalletTxDetails(const uint256& txid,
|
||||||
|
@ -338,7 +338,7 @@ public:
|
||||||
num_blocks = m_wallet->GetLastBlockHeight();
|
num_blocks = m_wallet->GetLastBlockHeight();
|
||||||
in_mempool = mi->second.InMempool();
|
in_mempool = mi->second.InMempool();
|
||||||
order_form = mi->second.vOrderForm;
|
order_form = mi->second.vOrderForm;
|
||||||
tx_status = MakeWalletTxStatus(*locked_chain, mi->second);
|
tx_status = MakeWalletTxStatus(*m_wallet, mi->second);
|
||||||
return MakeWalletTx(*m_wallet, mi->second);
|
return MakeWalletTx(*m_wallet, mi->second);
|
||||||
}
|
}
|
||||||
return {};
|
return {};
|
||||||
|
@ -413,7 +413,7 @@ public:
|
||||||
auto locked_chain = m_wallet->chain().lock();
|
auto locked_chain = m_wallet->chain().lock();
|
||||||
LOCK(m_wallet->cs_wallet);
|
LOCK(m_wallet->cs_wallet);
|
||||||
CoinsList result;
|
CoinsList result;
|
||||||
for (const auto& entry : m_wallet->ListCoins(*locked_chain)) {
|
for (const auto& entry : m_wallet->ListCoins()) {
|
||||||
auto& group = result[entry.first];
|
auto& group = result[entry.first];
|
||||||
for (const auto& coin : entry.second) {
|
for (const auto& coin : entry.second) {
|
||||||
group.emplace_back(COutPoint(coin.tx->GetHash(), coin.i),
|
group.emplace_back(COutPoint(coin.tx->GetHash(), coin.i),
|
||||||
|
|
|
@ -148,7 +148,7 @@ static void WalletTxToJSON(interfaces::Chain& chain, interfaces::Chain::Lock& lo
|
||||||
CHECK_NONFATAL(chain.findBlock(wtx.m_confirm.hashBlock, FoundBlock().time(block_time)));
|
CHECK_NONFATAL(chain.findBlock(wtx.m_confirm.hashBlock, FoundBlock().time(block_time)));
|
||||||
entry.pushKV("blocktime", block_time);
|
entry.pushKV("blocktime", block_time);
|
||||||
} else {
|
} else {
|
||||||
entry.pushKV("trusted", wtx.IsTrusted(locked_chain));
|
entry.pushKV("trusted", wtx.IsTrusted());
|
||||||
}
|
}
|
||||||
uint256 hash = wtx.GetHash();
|
uint256 hash = wtx.GetHash();
|
||||||
entry.pushKV("txid", hash.GetHex());
|
entry.pushKV("txid", hash.GetHex());
|
||||||
|
@ -572,7 +572,7 @@ static UniValue signmessage(const JSONRPCRequest& request)
|
||||||
return signature;
|
return signature;
|
||||||
}
|
}
|
||||||
|
|
||||||
static CAmount GetReceived(interfaces::Chain::Lock& locked_chain, const CWallet& wallet, const UniValue& params, bool by_label) EXCLUSIVE_LOCKS_REQUIRED(wallet.cs_wallet)
|
static CAmount GetReceived(const CWallet& wallet, const UniValue& params, bool by_label) EXCLUSIVE_LOCKS_REQUIRED(wallet.cs_wallet)
|
||||||
{
|
{
|
||||||
std::set<CTxDestination> address_set;
|
std::set<CTxDestination> address_set;
|
||||||
|
|
||||||
|
@ -602,7 +602,7 @@ static CAmount GetReceived(interfaces::Chain::Lock& locked_chain, const CWallet&
|
||||||
CAmount amount = 0;
|
CAmount amount = 0;
|
||||||
for (const std::pair<const uint256, CWalletTx>& wtx_pair : wallet.mapWallet) {
|
for (const std::pair<const uint256, CWalletTx>& wtx_pair : wallet.mapWallet) {
|
||||||
const CWalletTx& wtx = wtx_pair.second;
|
const CWalletTx& wtx = wtx_pair.second;
|
||||||
if (wtx.IsCoinBase() || !locked_chain.checkFinalTx(*wtx.tx) || wtx.GetDepthInMainChain() < min_depth) {
|
if (wtx.IsCoinBase() || !wallet.chain().checkFinalTx(*wtx.tx) || wtx.GetDepthInMainChain() < min_depth) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -655,7 +655,7 @@ static UniValue getreceivedbyaddress(const JSONRPCRequest& request)
|
||||||
auto locked_chain = pwallet->chain().lock();
|
auto locked_chain = pwallet->chain().lock();
|
||||||
LOCK(pwallet->cs_wallet);
|
LOCK(pwallet->cs_wallet);
|
||||||
|
|
||||||
return ValueFromAmount(GetReceived(*locked_chain, *pwallet, request.params, /* by_label */ false));
|
return ValueFromAmount(GetReceived(*pwallet, request.params, /* by_label */ false));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -696,7 +696,7 @@ static UniValue getreceivedbylabel(const JSONRPCRequest& request)
|
||||||
auto locked_chain = pwallet->chain().lock();
|
auto locked_chain = pwallet->chain().lock();
|
||||||
LOCK(pwallet->cs_wallet);
|
LOCK(pwallet->cs_wallet);
|
||||||
|
|
||||||
return ValueFromAmount(GetReceived(*locked_chain, *pwallet, request.params, /* by_label */ true));
|
return ValueFromAmount(GetReceived(*pwallet, request.params, /* by_label */ true));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1049,7 +1049,7 @@ static UniValue ListReceived(interfaces::Chain::Lock& locked_chain, const CWalle
|
||||||
for (const std::pair<const uint256, CWalletTx>& pairWtx : pwallet->mapWallet) {
|
for (const std::pair<const uint256, CWalletTx>& pairWtx : pwallet->mapWallet) {
|
||||||
const CWalletTx& wtx = pairWtx.second;
|
const CWalletTx& wtx = pairWtx.second;
|
||||||
|
|
||||||
if (wtx.IsCoinBase() || !locked_chain.checkFinalTx(*wtx.tx)) {
|
if (wtx.IsCoinBase() || !pwallet->chain().checkFinalTx(*wtx.tx)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2942,7 +2942,7 @@ static UniValue listunspent(const JSONRPCRequest& request)
|
||||||
cctl.m_max_depth = nMaxDepth;
|
cctl.m_max_depth = nMaxDepth;
|
||||||
auto locked_chain = pwallet->chain().lock();
|
auto locked_chain = pwallet->chain().lock();
|
||||||
LOCK(pwallet->cs_wallet);
|
LOCK(pwallet->cs_wallet);
|
||||||
pwallet->AvailableCoins(*locked_chain, vecOutputs, !include_unsafe, &cctl, nMinimumAmount, nMaximumAmount, nMinimumSumAmount, nMaximumCount);
|
pwallet->AvailableCoins(vecOutputs, !include_unsafe, &cctl, nMinimumAmount, nMaximumAmount, nMinimumSumAmount, nMaximumCount);
|
||||||
}
|
}
|
||||||
|
|
||||||
LOCK(pwallet->cs_wallet);
|
LOCK(pwallet->cs_wallet);
|
||||||
|
|
|
@ -556,7 +556,7 @@ BOOST_FIXTURE_TEST_CASE(ListCoins, ListCoinsTestingSetup)
|
||||||
{
|
{
|
||||||
auto locked_chain = m_chain->lock();
|
auto locked_chain = m_chain->lock();
|
||||||
LOCK(wallet->cs_wallet);
|
LOCK(wallet->cs_wallet);
|
||||||
list = wallet->ListCoins(*locked_chain);
|
list = wallet->ListCoins();
|
||||||
}
|
}
|
||||||
BOOST_CHECK_EQUAL(list.size(), 1U);
|
BOOST_CHECK_EQUAL(list.size(), 1U);
|
||||||
BOOST_CHECK_EQUAL(boost::get<PKHash>(list.begin()->first).ToString(), coinbaseAddress);
|
BOOST_CHECK_EQUAL(boost::get<PKHash>(list.begin()->first).ToString(), coinbaseAddress);
|
||||||
|
@ -573,7 +573,7 @@ BOOST_FIXTURE_TEST_CASE(ListCoins, ListCoinsTestingSetup)
|
||||||
{
|
{
|
||||||
auto locked_chain = m_chain->lock();
|
auto locked_chain = m_chain->lock();
|
||||||
LOCK(wallet->cs_wallet);
|
LOCK(wallet->cs_wallet);
|
||||||
list = wallet->ListCoins(*locked_chain);
|
list = wallet->ListCoins();
|
||||||
}
|
}
|
||||||
BOOST_CHECK_EQUAL(list.size(), 1U);
|
BOOST_CHECK_EQUAL(list.size(), 1U);
|
||||||
BOOST_CHECK_EQUAL(boost::get<PKHash>(list.begin()->first).ToString(), coinbaseAddress);
|
BOOST_CHECK_EQUAL(boost::get<PKHash>(list.begin()->first).ToString(), coinbaseAddress);
|
||||||
|
@ -584,7 +584,7 @@ BOOST_FIXTURE_TEST_CASE(ListCoins, ListCoinsTestingSetup)
|
||||||
auto locked_chain = m_chain->lock();
|
auto locked_chain = m_chain->lock();
|
||||||
LOCK(wallet->cs_wallet);
|
LOCK(wallet->cs_wallet);
|
||||||
std::vector<COutput> available;
|
std::vector<COutput> available;
|
||||||
wallet->AvailableCoins(*locked_chain, available);
|
wallet->AvailableCoins(available);
|
||||||
BOOST_CHECK_EQUAL(available.size(), 2U);
|
BOOST_CHECK_EQUAL(available.size(), 2U);
|
||||||
}
|
}
|
||||||
for (const auto& group : list) {
|
for (const auto& group : list) {
|
||||||
|
@ -597,7 +597,7 @@ BOOST_FIXTURE_TEST_CASE(ListCoins, ListCoinsTestingSetup)
|
||||||
auto locked_chain = m_chain->lock();
|
auto locked_chain = m_chain->lock();
|
||||||
LOCK(wallet->cs_wallet);
|
LOCK(wallet->cs_wallet);
|
||||||
std::vector<COutput> available;
|
std::vector<COutput> available;
|
||||||
wallet->AvailableCoins(*locked_chain, available);
|
wallet->AvailableCoins(available);
|
||||||
BOOST_CHECK_EQUAL(available.size(), 0U);
|
BOOST_CHECK_EQUAL(available.size(), 0U);
|
||||||
}
|
}
|
||||||
// Confirm ListCoins still returns same result as before, despite coins
|
// Confirm ListCoins still returns same result as before, despite coins
|
||||||
|
@ -605,7 +605,7 @@ BOOST_FIXTURE_TEST_CASE(ListCoins, ListCoinsTestingSetup)
|
||||||
{
|
{
|
||||||
auto locked_chain = m_chain->lock();
|
auto locked_chain = m_chain->lock();
|
||||||
LOCK(wallet->cs_wallet);
|
LOCK(wallet->cs_wallet);
|
||||||
list = wallet->ListCoins(*locked_chain);
|
list = wallet->ListCoins();
|
||||||
}
|
}
|
||||||
BOOST_CHECK_EQUAL(list.size(), 1U);
|
BOOST_CHECK_EQUAL(list.size(), 1U);
|
||||||
BOOST_CHECK_EQUAL(boost::get<PKHash>(list.begin()->first).ToString(), coinbaseAddress);
|
BOOST_CHECK_EQUAL(boost::get<PKHash>(list.begin()->first).ToString(), coinbaseAddress);
|
||||||
|
|
|
@ -1927,16 +1927,16 @@ bool CWalletTx::InMempool() const
|
||||||
return fInMempool;
|
return fInMempool;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CWalletTx::IsTrusted(interfaces::Chain::Lock& locked_chain) const
|
bool CWalletTx::IsTrusted() const
|
||||||
{
|
{
|
||||||
std::set<uint256> s;
|
std::set<uint256> s;
|
||||||
return IsTrusted(locked_chain, s);
|
return IsTrusted(s);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CWalletTx::IsTrusted(interfaces::Chain::Lock& locked_chain, std::set<uint256>& trusted_parents) const
|
bool CWalletTx::IsTrusted(std::set<uint256>& trusted_parents) const
|
||||||
{
|
{
|
||||||
// Quick answer in most cases
|
// Quick answer in most cases
|
||||||
if (!locked_chain.checkFinalTx(*tx)) return false;
|
if (!pwallet->chain().checkFinalTx(*tx)) return false;
|
||||||
int nDepth = GetDepthInMainChain();
|
int nDepth = GetDepthInMainChain();
|
||||||
if (nDepth >= 1) return true;
|
if (nDepth >= 1) return true;
|
||||||
if (nDepth < 0) return false;
|
if (nDepth < 0) return false;
|
||||||
|
@ -1958,7 +1958,7 @@ bool CWalletTx::IsTrusted(interfaces::Chain::Lock& locked_chain, std::set<uint25
|
||||||
// If we've already trusted this parent, continue
|
// If we've already trusted this parent, continue
|
||||||
if (trusted_parents.count(parent->GetHash())) continue;
|
if (trusted_parents.count(parent->GetHash())) continue;
|
||||||
// Recurse to check that the parent is also trusted
|
// Recurse to check that the parent is also trusted
|
||||||
if (!parent->IsTrusted(locked_chain, trusted_parents)) return false;
|
if (!parent->IsTrusted(trusted_parents)) return false;
|
||||||
trusted_parents.insert(parent->GetHash());
|
trusted_parents.insert(parent->GetHash());
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
|
@ -2050,7 +2050,7 @@ CWallet::Balance CWallet::GetBalance(const int min_depth, bool avoid_reuse) cons
|
||||||
for (const auto& entry : mapWallet)
|
for (const auto& entry : mapWallet)
|
||||||
{
|
{
|
||||||
const CWalletTx& wtx = entry.second;
|
const CWalletTx& wtx = entry.second;
|
||||||
const bool is_trusted{wtx.IsTrusted(*locked_chain, trusted_parents)};
|
const bool is_trusted{wtx.IsTrusted(trusted_parents)};
|
||||||
const int tx_depth{wtx.GetDepthInMainChain()};
|
const int tx_depth{wtx.GetDepthInMainChain()};
|
||||||
const CAmount tx_credit_mine{wtx.GetAvailableCredit(/* fUseCache */ true, ISMINE_SPENDABLE | reuse_filter)};
|
const CAmount tx_credit_mine{wtx.GetAvailableCredit(/* fUseCache */ true, ISMINE_SPENDABLE | reuse_filter)};
|
||||||
const CAmount tx_credit_watchonly{wtx.GetAvailableCredit(/* fUseCache */ true, ISMINE_WATCH_ONLY | reuse_filter)};
|
const CAmount tx_credit_watchonly{wtx.GetAvailableCredit(/* fUseCache */ true, ISMINE_WATCH_ONLY | reuse_filter)};
|
||||||
|
@ -2076,7 +2076,7 @@ CAmount CWallet::GetAvailableBalance(const CCoinControl* coinControl) const
|
||||||
|
|
||||||
CAmount balance = 0;
|
CAmount balance = 0;
|
||||||
std::vector<COutput> vCoins;
|
std::vector<COutput> vCoins;
|
||||||
AvailableCoins(*locked_chain, vCoins, true, coinControl);
|
AvailableCoins(vCoins, true, coinControl);
|
||||||
for (const COutput& out : vCoins) {
|
for (const COutput& out : vCoins) {
|
||||||
if (out.fSpendable) {
|
if (out.fSpendable) {
|
||||||
balance += out.tx->tx->vout[out.i].nValue;
|
balance += out.tx->tx->vout[out.i].nValue;
|
||||||
|
@ -2085,7 +2085,7 @@ CAmount CWallet::GetAvailableBalance(const CCoinControl* coinControl) const
|
||||||
return balance;
|
return balance;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CWallet::AvailableCoins(interfaces::Chain::Lock& locked_chain, std::vector<COutput>& vCoins, bool fOnlySafe, const CCoinControl* coinControl, const CAmount& nMinimumAmount, const CAmount& nMaximumAmount, const CAmount& nMinimumSumAmount, const uint64_t nMaximumCount) const
|
void CWallet::AvailableCoins(std::vector<COutput>& vCoins, bool fOnlySafe, const CCoinControl* coinControl, const CAmount& nMinimumAmount, const CAmount& nMaximumAmount, const CAmount& nMinimumSumAmount, const uint64_t nMaximumCount) const
|
||||||
{
|
{
|
||||||
AssertLockHeld(cs_wallet);
|
AssertLockHeld(cs_wallet);
|
||||||
|
|
||||||
|
@ -2103,7 +2103,7 @@ void CWallet::AvailableCoins(interfaces::Chain::Lock& locked_chain, std::vector<
|
||||||
const uint256& wtxid = entry.first;
|
const uint256& wtxid = entry.first;
|
||||||
const CWalletTx& wtx = entry.second;
|
const CWalletTx& wtx = entry.second;
|
||||||
|
|
||||||
if (!locked_chain.checkFinalTx(*wtx.tx)) {
|
if (!chain().checkFinalTx(*wtx.tx)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2119,7 +2119,7 @@ void CWallet::AvailableCoins(interfaces::Chain::Lock& locked_chain, std::vector<
|
||||||
if (nDepth == 0 && !wtx.InMempool())
|
if (nDepth == 0 && !wtx.InMempool())
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
bool safeTx = wtx.IsTrusted(locked_chain, trusted_parents);
|
bool safeTx = wtx.IsTrusted(trusted_parents);
|
||||||
|
|
||||||
// We should not consider coins from transactions that are replacing
|
// We should not consider coins from transactions that are replacing
|
||||||
// other transactions.
|
// other transactions.
|
||||||
|
@ -2207,14 +2207,14 @@ void CWallet::AvailableCoins(interfaces::Chain::Lock& locked_chain, std::vector<
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
std::map<CTxDestination, std::vector<COutput>> CWallet::ListCoins(interfaces::Chain::Lock& locked_chain) const
|
std::map<CTxDestination, std::vector<COutput>> CWallet::ListCoins() const
|
||||||
{
|
{
|
||||||
AssertLockHeld(cs_wallet);
|
AssertLockHeld(cs_wallet);
|
||||||
|
|
||||||
std::map<CTxDestination, std::vector<COutput>> result;
|
std::map<CTxDestination, std::vector<COutput>> result;
|
||||||
std::vector<COutput> availableCoins;
|
std::vector<COutput> availableCoins;
|
||||||
|
|
||||||
AvailableCoins(locked_chain, availableCoins);
|
AvailableCoins(availableCoins);
|
||||||
|
|
||||||
for (const COutput& coin : availableCoins) {
|
for (const COutput& coin : availableCoins) {
|
||||||
CTxDestination address;
|
CTxDestination address;
|
||||||
|
@ -2706,7 +2706,7 @@ bool CWallet::CreateTransaction(const std::vector<CRecipient>& vecSend, CTransac
|
||||||
txNew.nLockTime = GetLocktimeForNewTransaction(chain(), GetLastBlockHash(), GetLastBlockHeight());
|
txNew.nLockTime = GetLocktimeForNewTransaction(chain(), GetLastBlockHash(), GetLastBlockHeight());
|
||||||
{
|
{
|
||||||
std::vector<COutput> vAvailableCoins;
|
std::vector<COutput> vAvailableCoins;
|
||||||
AvailableCoins(*locked_chain, vAvailableCoins, true, &coin_control, 1, MAX_MONEY, MAX_MONEY, 0);
|
AvailableCoins(vAvailableCoins, true, &coin_control, 1, MAX_MONEY, MAX_MONEY, 0);
|
||||||
CoinSelectionParams coin_selection_params; // Parameters for coin selection, init with dummy
|
CoinSelectionParams coin_selection_params; // Parameters for coin selection, init with dummy
|
||||||
|
|
||||||
// Create change script that will be used if we need change
|
// Create change script that will be used if we need change
|
||||||
|
@ -3293,7 +3293,7 @@ std::map<CTxDestination, CAmount> CWallet::GetAddressBalances(interfaces::Chain:
|
||||||
{
|
{
|
||||||
const CWalletTx& wtx = walletEntry.second;
|
const CWalletTx& wtx = walletEntry.second;
|
||||||
|
|
||||||
if (!wtx.IsTrusted(locked_chain, trusted_parents))
|
if (!wtx.IsTrusted(trusted_parents))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (wtx.IsImmatureCoinBase())
|
if (wtx.IsImmatureCoinBase())
|
||||||
|
@ -3813,7 +3813,7 @@ std::shared_ptr<CWallet> CWallet::CreateWalletFromFile(interfaces::Chain& chain,
|
||||||
}
|
}
|
||||||
|
|
||||||
auto locked_chain = chain.lock();
|
auto locked_chain = chain.lock();
|
||||||
walletInstance->chainStateFlushed(locked_chain->getTipLocator());
|
walletInstance->chainStateFlushed(chain.getTipLocator());
|
||||||
} else if (wallet_creation_flags & WALLET_FLAG_DISABLE_PRIVATE_KEYS) {
|
} else if (wallet_creation_flags & WALLET_FLAG_DISABLE_PRIVATE_KEYS) {
|
||||||
// Make it impossible to disable private keys after creation
|
// Make it impossible to disable private keys after creation
|
||||||
error = strprintf(_("Error loading %s: Private keys can only be disabled during creation").translated, walletFile);
|
error = strprintf(_("Error loading %s: Private keys can only be disabled during creation").translated, walletFile);
|
||||||
|
@ -3935,7 +3935,7 @@ std::shared_ptr<CWallet> CWallet::CreateWalletFromFile(interfaces::Chain& chain,
|
||||||
WalletBatch batch(*walletInstance->database);
|
WalletBatch batch(*walletInstance->database);
|
||||||
CBlockLocator locator;
|
CBlockLocator locator;
|
||||||
if (batch.ReadBestBlock(locator)) {
|
if (batch.ReadBestBlock(locator)) {
|
||||||
if (const Optional<int> fork_height = locked_chain->findLocatorFork(locator)) {
|
if (const Optional<int> fork_height = chain.findLocatorFork(locator)) {
|
||||||
rescan_height = *fork_height;
|
rescan_height = *fork_height;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3960,7 +3960,7 @@ std::shared_ptr<CWallet> CWallet::CreateWalletFromFile(interfaces::Chain& chain,
|
||||||
// If a block is pruned after this check, we will load the wallet,
|
// If a block is pruned after this check, we will load the wallet,
|
||||||
// but fail the rescan with a generic error.
|
// but fail the rescan with a generic error.
|
||||||
int block_height = *tip_height;
|
int block_height = *tip_height;
|
||||||
while (block_height > 0 && locked_chain->haveBlockOnDisk(block_height - 1) && rescan_height != block_height) {
|
while (block_height > 0 && chain.haveBlockOnDisk(block_height - 1) && rescan_height != block_height) {
|
||||||
--block_height;
|
--block_height;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3982,7 +3982,7 @@ std::shared_ptr<CWallet> CWallet::CreateWalletFromFile(interfaces::Chain& chain,
|
||||||
if (!time_first_key || time < *time_first_key) time_first_key = time;
|
if (!time_first_key || time < *time_first_key) time_first_key = time;
|
||||||
}
|
}
|
||||||
if (time_first_key) {
|
if (time_first_key) {
|
||||||
if (Optional<int> first_block = locked_chain->findFirstBlockWithTimeAndHeight(*time_first_key - TIMESTAMP_WINDOW, rescan_height, nullptr)) {
|
if (Optional<int> first_block = chain.findFirstBlockWithTimeAndHeight(*time_first_key - TIMESTAMP_WINDOW, rescan_height, nullptr)) {
|
||||||
rescan_height = *first_block;
|
rescan_height = *first_block;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3994,7 +3994,7 @@ std::shared_ptr<CWallet> CWallet::CreateWalletFromFile(interfaces::Chain& chain,
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
walletInstance->chainStateFlushed(locked_chain->getTipLocator());
|
walletInstance->chainStateFlushed(chain.getTipLocator());
|
||||||
walletInstance->database->IncrementUpdateCounter();
|
walletInstance->database->IncrementUpdateCounter();
|
||||||
|
|
||||||
// Restore wallet transaction metadata after -zapwallettxes=1
|
// Restore wallet transaction metadata after -zapwallettxes=1
|
||||||
|
|
|
@ -499,8 +499,8 @@ public:
|
||||||
bool IsEquivalentTo(const CWalletTx& tx) const;
|
bool IsEquivalentTo(const CWalletTx& tx) const;
|
||||||
|
|
||||||
bool InMempool() const;
|
bool InMempool() const;
|
||||||
bool IsTrusted(interfaces::Chain::Lock& locked_chain) const;
|
bool IsTrusted() const;
|
||||||
bool IsTrusted(interfaces::Chain::Lock& locked_chain, std::set<uint256>& trusted_parents) const;
|
bool IsTrusted(std::set<uint256>& trusted_parents) const;
|
||||||
|
|
||||||
int64_t GetTxTime() const;
|
int64_t GetTxTime() const;
|
||||||
|
|
||||||
|
@ -808,12 +808,12 @@ public:
|
||||||
/**
|
/**
|
||||||
* populate vCoins with vector of available COutputs.
|
* populate vCoins with vector of available COutputs.
|
||||||
*/
|
*/
|
||||||
void AvailableCoins(interfaces::Chain::Lock& locked_chain, std::vector<COutput>& vCoins, bool fOnlySafe = true, const CCoinControl* coinControl = nullptr, const CAmount& nMinimumAmount = 1, const CAmount& nMaximumAmount = MAX_MONEY, const CAmount& nMinimumSumAmount = MAX_MONEY, const uint64_t nMaximumCount = 0) const EXCLUSIVE_LOCKS_REQUIRED(cs_wallet);
|
void AvailableCoins(std::vector<COutput>& vCoins, bool fOnlySafe = true, const CCoinControl* coinControl = nullptr, const CAmount& nMinimumAmount = 1, const CAmount& nMaximumAmount = MAX_MONEY, const CAmount& nMinimumSumAmount = MAX_MONEY, const uint64_t nMaximumCount = 0) const EXCLUSIVE_LOCKS_REQUIRED(cs_wallet);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return list of available coins and locked coins grouped by non-change output address.
|
* Return list of available coins and locked coins grouped by non-change output address.
|
||||||
*/
|
*/
|
||||||
std::map<CTxDestination, std::vector<COutput>> ListCoins(interfaces::Chain::Lock& locked_chain) const EXCLUSIVE_LOCKS_REQUIRED(cs_wallet);
|
std::map<CTxDestination, std::vector<COutput>> ListCoins() const EXCLUSIVE_LOCKS_REQUIRED(cs_wallet);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Find non-change parent output.
|
* Find non-change parent output.
|
||||||
|
|
Loading…
Add table
Reference in a new issue