diff options
author | Pieter Wuille <pieter.wuille@gmail.com> | 2011-04-14 11:17:52 +0200 |
---|---|---|
committer | Gavin Andresen <gavinandresen@gmail.com> | 2011-04-20 11:39:15 -0400 |
commit | 8857aeb223c504799628bde989cf1cbf25094611 (patch) | |
tree | 1ed17e1eca0109aca605aa3b7308ac9410b52431 | |
parent | 72e962cf5589d708a6ba636c07ab7db7165ba965 (diff) |
Monitor incoming transactions for spends by (a copy of) your own wallet
-rw-r--r-- | main.cpp | 46 |
1 files changed, 11 insertions, 35 deletions
@@ -178,22 +178,12 @@ bool AddToWallet(const CWalletTx& wtxIn) return true; } -bool AddToWalletIfMine(const CTransaction& tx, const CBlock* pblock) +bool AddToWalletIfInvolvingMe(const CTransaction& tx, const CBlock* pblock, bool fUpdate = false) { - if (tx.IsMine() || mapWallet.count(tx.GetHash())) - { - CWalletTx wtx(tx); - // Get merkle branch if transaction was found in a block - if (pblock) - wtx.SetMerkleBranch(pblock); - return AddToWallet(wtx); - } - return true; -} - -bool AddToWalletIfFromMe(const CTransaction& tx, const CBlock* pblock) -{ - if (tx.IsFromMe() || mapWallet.count(tx.GetHash())) + uint256 hash = tx.GetHash(); + bool fExisted = mapWallet.count(hash); + if (fExisted && !fUpdate) return false; + if (fExisted || tx.IsMine() || tx.IsFromMe()) { CWalletTx wtx(tx); // Get merkle branch if transaction was found in a block @@ -201,7 +191,7 @@ bool AddToWalletIfFromMe(const CTransaction& tx, const CBlock* pblock) wtx.SetMerkleBranch(pblock); return AddToWallet(wtx); } - return true; + return false; } bool EraseFromWallet(uint256 hash) @@ -911,22 +901,8 @@ int ScanForWalletTransactions(CBlockIndex* pindexStart) block.ReadFromDisk(pindex, true); foreach(CTransaction& tx, block.vtx) { - uint256 hash = tx.GetHash(); - if (mapWallet.count(hash)) continue; - AddToWalletIfMine(tx, &block); - if (mapWallet.count(hash)) - { - ++ret; - printf("Added missing RECEIVE %s\n", hash.ToString().c_str()); - continue; - } - AddToWalletIfFromMe(tx, &block); - if (mapWallet.count(hash)) - { - ++ret; - printf("Added missing SEND %s\n", hash.ToString().c_str()); - continue; - } + if (AddToWalletIfInvolvingMe(tx, &block)) + ret++; } pindex = pindex->pnext; } @@ -1471,7 +1447,7 @@ bool CBlock::ConnectBlock(CTxDB& txdb, CBlockIndex* pindex) // Watch for transactions paying to me foreach(CTransaction& tx, vtx) - AddToWalletIfMine(tx, this); + AddToWalletIfInvolvingMe(tx, this, true); return true; } @@ -2714,7 +2690,7 @@ bool ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv) bool fMissingInputs = false; if (tx.AcceptToMemoryPool(true, &fMissingInputs)) { - AddToWalletIfMine(tx, NULL); + AddToWalletIfInvolvingMe(tx, NULL, true); RelayMessage(inv, vMsg); mapAlreadyAskedFor.erase(inv); vWorkQueue.push_back(inv.hash); @@ -2735,7 +2711,7 @@ bool ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv) if (tx.AcceptToMemoryPool(true)) { printf(" accepted orphan tx %s\n", inv.hash.ToString().substr(0,10).c_str()); - AddToWalletIfMine(tx, NULL); + AddToWalletIfInvolvingMe(tx, NULL, true); RelayMessage(inv, vMsg); mapAlreadyAskedFor.erase(inv); vWorkQueue.push_back(inv.hash); |