mirror of
https://github.com/Retropex/bitcoin.git
synced 2025-06-04 16:32:32 +02:00
Replace CWalletTx::SetConf by Confirmation initialization list
This commit is contained in:
parent
5aacc3eff1
commit
9700fcb47f
@ -382,7 +382,8 @@ UniValue importprunedfunds(const JSONRPCRequest& request)
|
|||||||
throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Something wrong with merkleblock");
|
throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Something wrong with merkleblock");
|
||||||
}
|
}
|
||||||
|
|
||||||
wtx.SetConf(CWalletTx::Status::CONFIRMED, merkleBlock.header.GetHash(), txnIndex);
|
CWalletTx::Confirmation confirm(CWalletTx::Status::CONFIRMED, merkleBlock.header.GetHash(), txnIndex);
|
||||||
|
wtx.m_confirm = confirm;
|
||||||
|
|
||||||
auto locked_chain = pwallet->chain().lock();
|
auto locked_chain = pwallet->chain().lock();
|
||||||
LOCK(pwallet->cs_wallet);
|
LOCK(pwallet->cs_wallet);
|
||||||
|
@ -276,7 +276,8 @@ BOOST_FIXTURE_TEST_CASE(coin_mark_dirty_immature_credit, TestChain100Setup)
|
|||||||
AssertLockHeld(spk_man->cs_wallet);
|
AssertLockHeld(spk_man->cs_wallet);
|
||||||
wallet.SetLastBlockProcessed(::ChainActive().Height(), ::ChainActive().Tip()->GetBlockHash());
|
wallet.SetLastBlockProcessed(::ChainActive().Height(), ::ChainActive().Tip()->GetBlockHash());
|
||||||
|
|
||||||
wtx.SetConf(CWalletTx::Status::CONFIRMED, ::ChainActive().Tip()->GetBlockHash(), 0);
|
CWalletTx::Confirmation confirm(CWalletTx::Status::CONFIRMED, ::ChainActive().Tip()->GetBlockHash(), 0);
|
||||||
|
wtx.m_confirm = confirm;
|
||||||
|
|
||||||
// Call GetImmatureCredit() once before adding the key to the wallet to
|
// Call GetImmatureCredit() once before adding the key to the wallet to
|
||||||
// cache the current immature credit amount, which is 0.
|
// cache the current immature credit amount, which is 0.
|
||||||
@ -317,7 +318,8 @@ static int64_t AddTx(CWallet& wallet, uint32_t lockTime, int64_t mockTime, int64
|
|||||||
wallet.AddToWallet(wtx);
|
wallet.AddToWallet(wtx);
|
||||||
}
|
}
|
||||||
if (block) {
|
if (block) {
|
||||||
wtx.SetConf(CWalletTx::Status::CONFIRMED, block->GetBlockHash(), 0);
|
CWalletTx::Confirmation confirm(CWalletTx::Status::CONFIRMED, block->GetBlockHash(), 0);
|
||||||
|
wtx.m_confirm = confirm;
|
||||||
}
|
}
|
||||||
wallet.AddToWallet(wtx);
|
wallet.AddToWallet(wtx);
|
||||||
return wallet.mapWallet.at(wtx.GetHash()).nTimeSmart;
|
return wallet.mapWallet.at(wtx.GetHash()).nTimeSmart;
|
||||||
@ -497,7 +499,8 @@ public:
|
|||||||
wallet->SetLastBlockProcessed(wallet->GetLastBlockHeight() + 1, ::ChainActive().Tip()->GetBlockHash());
|
wallet->SetLastBlockProcessed(wallet->GetLastBlockHeight() + 1, ::ChainActive().Tip()->GetBlockHash());
|
||||||
auto it = wallet->mapWallet.find(tx->GetHash());
|
auto it = wallet->mapWallet.find(tx->GetHash());
|
||||||
BOOST_CHECK(it != wallet->mapWallet.end());
|
BOOST_CHECK(it != wallet->mapWallet.end());
|
||||||
it->second.SetConf(CWalletTx::Status::CONFIRMED, ::ChainActive().Tip()->GetBlockHash(), 1);
|
CWalletTx::Confirmation confirm(CWalletTx::Status::CONFIRMED, ::ChainActive().Tip()->GetBlockHash(), 1);
|
||||||
|
it->second.m_confirm = confirm;
|
||||||
return it->second;
|
return it->second;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -848,19 +848,19 @@ void CWallet::LoadToWallet(CWalletTx& wtxIn)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CWallet::AddToWalletIfInvolvingMe(const CTransactionRef& ptx, CWalletTx::Status status, const uint256& block_hash, int posInBlock, bool fUpdate)
|
bool CWallet::AddToWalletIfInvolvingMe(const CTransactionRef& ptx, CWalletTx::Confirmation confirm, bool fUpdate)
|
||||||
{
|
{
|
||||||
const CTransaction& tx = *ptx;
|
const CTransaction& tx = *ptx;
|
||||||
{
|
{
|
||||||
AssertLockHeld(cs_wallet);
|
AssertLockHeld(cs_wallet);
|
||||||
|
|
||||||
if (!block_hash.IsNull()) {
|
if (!confirm.hashBlock.IsNull()) {
|
||||||
for (const CTxIn& txin : tx.vin) {
|
for (const CTxIn& txin : tx.vin) {
|
||||||
std::pair<TxSpends::const_iterator, TxSpends::const_iterator> range = mapTxSpends.equal_range(txin.prevout);
|
std::pair<TxSpends::const_iterator, TxSpends::const_iterator> range = mapTxSpends.equal_range(txin.prevout);
|
||||||
while (range.first != range.second) {
|
while (range.first != range.second) {
|
||||||
if (range.first->second != tx.GetHash()) {
|
if (range.first->second != tx.GetHash()) {
|
||||||
WalletLogPrintf("Transaction %s (in block %s) conflicts with wallet transaction %s (both spend %s:%i)\n", tx.GetHash().ToString(), block_hash.ToString(), range.first->second.ToString(), range.first->first.hash.ToString(), range.first->first.n);
|
WalletLogPrintf("Transaction %s (in block %s) conflicts with wallet transaction %s (both spend %s:%i)\n", tx.GetHash().ToString(), confirm.hashBlock.ToString(), range.first->second.ToString(), range.first->first.hash.ToString(), range.first->first.n);
|
||||||
MarkConflicted(block_hash, range.first->second);
|
MarkConflicted(confirm.hashBlock, range.first->second);
|
||||||
}
|
}
|
||||||
range.first++;
|
range.first++;
|
||||||
}
|
}
|
||||||
@ -888,7 +888,7 @@ bool CWallet::AddToWalletIfInvolvingMe(const CTransactionRef& ptx, CWalletTx::St
|
|||||||
|
|
||||||
// Block disconnection override an abandoned tx as unconfirmed
|
// Block disconnection override an abandoned tx as unconfirmed
|
||||||
// which means user may have to call abandontransaction again
|
// which means user may have to call abandontransaction again
|
||||||
wtx.SetConf(status, block_hash, posInBlock);
|
wtx.m_confirm = confirm;
|
||||||
|
|
||||||
return AddToWallet(wtx, false);
|
return AddToWallet(wtx, false);
|
||||||
}
|
}
|
||||||
@ -1022,9 +1022,9 @@ void CWallet::MarkConflicted(const uint256& hashBlock, const uint256& hashTx)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void CWallet::SyncTransaction(const CTransactionRef& ptx, CWalletTx::Status status, const uint256& block_hash, int posInBlock, bool update_tx)
|
void CWallet::SyncTransaction(const CTransactionRef& ptx, CWalletTx::Confirmation confirm, bool update_tx)
|
||||||
{
|
{
|
||||||
if (!AddToWalletIfInvolvingMe(ptx, status, block_hash, posInBlock, update_tx))
|
if (!AddToWalletIfInvolvingMe(ptx, confirm, update_tx))
|
||||||
return; // Not one of ours
|
return; // Not one of ours
|
||||||
|
|
||||||
// If a transaction changes 'conflicted' state, that changes the balance
|
// If a transaction changes 'conflicted' state, that changes the balance
|
||||||
@ -1036,7 +1036,8 @@ void CWallet::SyncTransaction(const CTransactionRef& ptx, CWalletTx::Status stat
|
|||||||
void CWallet::TransactionAddedToMempool(const CTransactionRef& ptx) {
|
void CWallet::TransactionAddedToMempool(const CTransactionRef& ptx) {
|
||||||
auto locked_chain = chain().lock();
|
auto locked_chain = chain().lock();
|
||||||
LOCK(cs_wallet);
|
LOCK(cs_wallet);
|
||||||
SyncTransaction(ptx, CWalletTx::Status::UNCONFIRMED, {} /* block hash */, 0 /* position in block */);
|
CWalletTx::Confirmation confirm(CWalletTx::Status::UNCONFIRMED, {}, 0);
|
||||||
|
SyncTransaction(ptx, confirm);
|
||||||
|
|
||||||
auto it = mapWallet.find(ptx->GetHash());
|
auto it = mapWallet.find(ptx->GetHash());
|
||||||
if (it != mapWallet.end()) {
|
if (it != mapWallet.end()) {
|
||||||
@ -1061,7 +1062,8 @@ void CWallet::BlockConnected(const CBlock& block, const std::vector<CTransaction
|
|||||||
m_last_block_processed_height = height;
|
m_last_block_processed_height = height;
|
||||||
m_last_block_processed = block_hash;
|
m_last_block_processed = block_hash;
|
||||||
for (size_t i = 0; i < block.vtx.size(); i++) {
|
for (size_t i = 0; i < block.vtx.size(); i++) {
|
||||||
SyncTransaction(block.vtx[i], CWalletTx::Status::CONFIRMED, block_hash, i);
|
CWalletTx::Confirmation confirm(CWalletTx::Status::CONFIRMED, m_last_block_processed, i);
|
||||||
|
SyncTransaction(block.vtx[i], confirm);
|
||||||
TransactionRemovedFromMempool(block.vtx[i]);
|
TransactionRemovedFromMempool(block.vtx[i]);
|
||||||
}
|
}
|
||||||
for (const CTransactionRef& ptx : vtxConflicted) {
|
for (const CTransactionRef& ptx : vtxConflicted) {
|
||||||
@ -1081,7 +1083,8 @@ void CWallet::BlockDisconnected(const CBlock& block, int height)
|
|||||||
m_last_block_processed_height = height - 1;
|
m_last_block_processed_height = height - 1;
|
||||||
m_last_block_processed = block.hashPrevBlock;
|
m_last_block_processed = block.hashPrevBlock;
|
||||||
for (const CTransactionRef& ptx : block.vtx) {
|
for (const CTransactionRef& ptx : block.vtx) {
|
||||||
SyncTransaction(ptx, CWalletTx::Status::UNCONFIRMED, {} /* block hash */, 0 /* position in block */);
|
CWalletTx::Confirmation confirm(CWalletTx::Status::UNCONFIRMED, {}, 0);
|
||||||
|
SyncTransaction(ptx, confirm);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1627,7 +1630,8 @@ CWallet::ScanResult CWallet::ScanForWalletTransactions(const uint256& start_bloc
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
for (size_t posInBlock = 0; posInBlock < block.vtx.size(); ++posInBlock) {
|
for (size_t posInBlock = 0; posInBlock < block.vtx.size(); ++posInBlock) {
|
||||||
SyncTransaction(block.vtx[posInBlock], CWalletTx::Status::CONFIRMED, block_hash, posInBlock, fUpdate);
|
CWalletTx::Confirmation confirm(CWalletTx::Status::CONFIRMED, block_hash, posInBlock);
|
||||||
|
SyncTransaction(block.vtx[posInBlock], confirm, fUpdate);
|
||||||
}
|
}
|
||||||
// scan succeeded, record block as most recent successfully scanned
|
// scan succeeded, record block as most recent successfully scanned
|
||||||
result.last_scanned_block = block_hash;
|
result.last_scanned_block = block_hash;
|
||||||
@ -3918,18 +3922,6 @@ CKeyPool::CKeyPool(const CPubKey& vchPubKeyIn, bool internalIn)
|
|||||||
m_pre_split = false;
|
m_pre_split = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CWalletTx::SetConf(Status status, const uint256& block_hash, int posInBlock)
|
|
||||||
{
|
|
||||||
// Update tx status
|
|
||||||
m_confirm.status = status;
|
|
||||||
|
|
||||||
// Update the tx's hashBlock
|
|
||||||
m_confirm.hashBlock = block_hash;
|
|
||||||
|
|
||||||
// set the position of the transaction in the block
|
|
||||||
m_confirm.nIndex = posInBlock;
|
|
||||||
}
|
|
||||||
|
|
||||||
int CWalletTx::GetDepthInMainChain(interfaces::Chain::Lock& locked_chain) const
|
int CWalletTx::GetDepthInMainChain(interfaces::Chain::Lock& locked_chain) const
|
||||||
{
|
{
|
||||||
if (isUnconfirmed() || isAbandoned()) return 0;
|
if (isUnconfirmed() || isAbandoned()) return 0;
|
||||||
|
@ -361,9 +361,10 @@ public:
|
|||||||
* where they instead point to block hash and index of the deepest conflicting tx.
|
* where they instead point to block hash and index of the deepest conflicting tx.
|
||||||
*/
|
*/
|
||||||
struct Confirmation {
|
struct Confirmation {
|
||||||
Status status = UNCONFIRMED;
|
Status status;
|
||||||
uint256 hashBlock = uint256();
|
uint256 hashBlock;
|
||||||
int nIndex = 0;
|
int nIndex;
|
||||||
|
Confirmation(Status s = UNCONFIRMED, uint256 h = uint256(), int i = 0) : status(s), hashBlock(h), nIndex(i) {}
|
||||||
};
|
};
|
||||||
|
|
||||||
Confirmation m_confirm;
|
Confirmation m_confirm;
|
||||||
@ -491,8 +492,6 @@ public:
|
|||||||
// in place.
|
// in place.
|
||||||
std::set<uint256> GetConflicts() const NO_THREAD_SAFETY_ANALYSIS;
|
std::set<uint256> GetConflicts() const NO_THREAD_SAFETY_ANALYSIS;
|
||||||
|
|
||||||
void SetConf(Status status, const uint256& block_hash, int posInBlock);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return depth of transaction in blockchain:
|
* Return depth of transaction in blockchain:
|
||||||
* <0 : conflicts with a transaction this deep in the blockchain
|
* <0 : conflicts with a transaction this deep in the blockchain
|
||||||
@ -642,7 +641,7 @@ private:
|
|||||||
* Abandoned state should probably be more carefully tracked via different
|
* Abandoned state should probably be more carefully tracked via different
|
||||||
* posInBlock signals or by checking mempool presence when necessary.
|
* posInBlock signals or by checking mempool presence when necessary.
|
||||||
*/
|
*/
|
||||||
bool AddToWalletIfInvolvingMe(const CTransactionRef& tx, CWalletTx::Status status, const uint256& block_hash, int posInBlock, bool fUpdate) EXCLUSIVE_LOCKS_REQUIRED(cs_wallet);
|
bool AddToWalletIfInvolvingMe(const CTransactionRef& tx, CWalletTx::Confirmation confirm, bool fUpdate) EXCLUSIVE_LOCKS_REQUIRED(cs_wallet);
|
||||||
|
|
||||||
/* Mark a transaction (and its in-wallet descendants) as conflicting with a particular block. */
|
/* Mark a transaction (and its in-wallet descendants) as conflicting with a particular block. */
|
||||||
void MarkConflicted(const uint256& hashBlock, const uint256& hashTx);
|
void MarkConflicted(const uint256& hashBlock, const uint256& hashTx);
|
||||||
@ -654,7 +653,7 @@ private:
|
|||||||
|
|
||||||
/* Used by TransactionAddedToMemorypool/BlockConnected/Disconnected/ScanForWalletTransactions.
|
/* Used by TransactionAddedToMemorypool/BlockConnected/Disconnected/ScanForWalletTransactions.
|
||||||
* Should be called with non-zero block_hash and posInBlock if this is for a transaction that is included in a block. */
|
* Should be called with non-zero block_hash and posInBlock if this is for a transaction that is included in a block. */
|
||||||
void SyncTransaction(const CTransactionRef& tx, CWalletTx::Status status, const uint256& block_hash, int posInBlock = 0, bool update_tx = true) EXCLUSIVE_LOCKS_REQUIRED(cs_wallet);
|
void SyncTransaction(const CTransactionRef& tx, CWalletTx::Confirmation confirm, bool update_tx = true) EXCLUSIVE_LOCKS_REQUIRED(cs_wallet);
|
||||||
|
|
||||||
std::atomic<uint64_t> m_wallet_flags{0};
|
std::atomic<uint64_t> m_wallet_flags{0};
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user