changeset 296:0b03a5606452 draft

SelectCoins first pass tries not to use coins with less than 6 confirmations git-svn-id: https://bitcoin.svn.sourceforge.net/svnroot/bitcoin/trunk@177 1a98c847-1fd6-4fd8-948a-caf3550aa51b
author s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
date Tue, 09 Nov 2010 19:47:07 +0000
parents 20eee25f3a5b
children 40dcdec22fda 11c594a638fc
files main.cpp main.h
diffstat 2 files changed, 34 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/main.cpp
+++ b/main.cpp
@@ -3400,7 +3400,7 @@
 }
 
 
-bool SelectCoins(int64 nTargetValue, set<CWalletTx*>& setCoinsRet)
+bool SelectCoinsMinConf(int64 nTargetValue, int nConfMine, int nConfTheirs, set<CWalletTx*>& setCoinsRet)
 {
     setCoinsRet.clear();
 
@@ -3422,6 +3422,11 @@
        {
             if (!pcoin->IsFinal() || pcoin->fSpent || !pcoin->IsConfirmed())
                 continue;
+
+            int nDepth = pcoin->GetDepthInMainChain();
+            if (nDepth < (pcoin->IsFromMe() ? nConfMine : nConfTheirs))
+                continue;
+
             int64 n = pcoin->GetCredit();
             if (n <= 0)
                 continue;
@@ -3506,6 +3511,13 @@
     return true;
 }
 
+bool SelectCoins(int64 nTargetValue, set<CWalletTx*>& setCoinsRet)
+{
+    return (SelectCoinsMinConf(nTargetValue, 1, 6, setCoinsRet) ||
+            SelectCoinsMinConf(nTargetValue, 1, 1, setCoinsRet) ||
+            SelectCoinsMinConf(nTargetValue, 0, 1, setCoinsRet));
+}
+
 
 
 
--- a/main.h
+++ b/main.h
@@ -487,6 +487,11 @@
         return false;
     }
 
+    bool IsFromMe() const
+    {
+        return (GetDebit() > 0);
+    }
+
     int64 GetDebit() const
     {
         int64 nDebit = 0;
@@ -789,8 +794,23 @@
         return nCreditCached;
     }
 
+    bool IsFromMe() const
+    {
+        return (GetDebit() > 0);
+    }
+
     bool IsConfirmed() const
     {
+        // Quick answer in most cases
+        if (!IsFinal())
+            return false;
+        if (GetDepthInMainChain() >= 1)
+            return true;
+        if (!IsFromMe()) // using wtx's cached debit
+            return false;
+
+        // If no confirmations but it's from us, we can still
+        // consider it confirmed if all dependencies are confirmed
         map<uint256, const CMerkleTx*> mapPrev;
         vector<const CMerkleTx*> vWorkQueue;
         vWorkQueue.reserve(vtxPrev.size()+1);
@@ -803,7 +823,7 @@
                 return false;
             if (ptx->GetDepthInMainChain() >= 1)
                 return true;
-            if (ptx->GetDebit() <= 0)
+            if (!ptx->IsFromMe())
                 return false;
 
             if (mapPrev.empty())