diff options
Diffstat (limited to 'main.cpp')
| -rw-r--r-- | main.cpp | 73 |
1 files changed, 66 insertions, 7 deletions
@@ -187,6 +187,19 @@ bool AddToWalletIfMine(const CTransaction& tx, const CBlock* pblock) return true; } +bool AddToWalletIfFromMe(const CTransaction& tx, const CBlock* pblock) +{ + if (tx.IsFromMe() || 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 EraseFromWallet(uint256 hash) { CRITICAL_BLOCK(cs_mapWallet) @@ -404,7 +417,7 @@ void CWalletTx::GetAmounts(int64& nGenerated, list<pair<string, int64> >& listRe if (IsCoinBase()) { - if (GetBlocksToMaturity() == 0) + if (GetDepthInMainChain() >= COINBASE_MATURITY) nGenerated = GetCredit(); return; } @@ -849,11 +862,50 @@ bool CWalletTx::AcceptWalletTransaction(CTxDB& txdb, bool fCheckInputs) return false; } +int ScanForWalletTransactions(CBlockIndex* pindexStart) +{ + int ret = 0; + + CBlockIndex* pindex = pindexStart; + CRITICAL_BLOCK(cs_mapWallet) + { + while (pindex) + { + CBlock block; + 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; + } + } + pindex = pindex->pnext; + } + } + return ret; +} + void ReacceptWalletTransactions() { CTxDB txdb("r"); - CRITICAL_BLOCK(cs_mapWallet) + bool fRepeat = true; + while (fRepeat) CRITICAL_BLOCK(cs_mapWallet) { + fRepeat = false; + vector<CDiskTxPos> vMissingTx; foreach(PAIRTYPE(const uint256, CWalletTx)& item, mapWallet) { CWalletTx& wtx = item.second; @@ -875,12 +927,15 @@ void ReacceptWalletTransactions() { if (!txindex.vSpent[i].IsNull() && wtx.vout[i].IsMine()) { - printf("ReacceptWalletTransactions found spent coin %sbc %s\n", FormatMoney(wtx.GetCredit()).c_str(), wtx.GetHash().ToString().c_str()); wtx.fSpent = true; - wtx.WriteToDisk(); - break; + vMissingTx.push_back(txindex.vSpent[i]); } } + if (wtx.fSpent) + { + printf("ReacceptWalletTransactions found spent coin %sbc %s\n", FormatMoney(wtx.GetCredit()).c_str(), wtx.GetHash().ToString().c_str()); + wtx.WriteToDisk(); + } } } else @@ -890,6 +945,12 @@ void ReacceptWalletTransactions() wtx.AcceptWalletTransaction(txdb, false); } } + if (!vMissingTx.empty()) + { + // TODO: optimize this to scan just part of the block chain? + if (ScanForWalletTransactions(pindexGenesisBlock)) + fRepeat = true; // Found missing transactions: re-do Reaccept. + } } } @@ -1361,8 +1422,6 @@ bool CBlock::ConnectBlock(CTxDB& txdb, CBlockIndex* pindex) return true; } - - bool Reorganize(CTxDB& txdb, CBlockIndex* pindexNew) { printf("REORGANIZE\n"); |