PPCoin: Fix CreateCoinStake() signature bug since 747f99fb
authorSunny King <sunnyking9999@gmail.com>
Fri, 27 Apr 2012 19:18:12 +0000 (20:18 +0100)
committerSunny King <sunnyking9999@gmail.com>
Fri, 27 Apr 2012 19:18:12 +0000 (20:18 +0100)
        ConnectInputs() : VerifySignature failed

src/script.cpp
src/wallet.cpp

index 4e588f8..12c6b6f 100644 (file)
@@ -1,5 +1,5 @@
 // Copyright (c) 2009-2010 Satoshi Nakamoto
-// Copyright (c) 2011 The Bitcoin developers
+// Copyright (c) 2011-2012 The Bitcoin developers
 // Distributed under the MIT/X11 software license, see the accompanying
 // file license.txt or http://www.opensource.org/licenses/mit-license.php.
 #include "headers.h"
@@ -1165,6 +1165,7 @@ bool SignSignature(const CKeyStore &keystore, const CTransaction& txFrom, CTrans
     assert(nIn < txTo.vin.size());
     CTxIn& txin = txTo.vin[nIn];
     assert(txin.prevout.n < txFrom.vout.size());
+    assert(txin.prevout.hash == txFrom.GetHash());
     const CTxOut& txout = txFrom.vout[txin.prevout.n];
 
     // Leave out the signature from the hash, since a signature can't sign itself.
index 1b30be8..f993ab7 100644 (file)
@@ -1081,6 +1081,7 @@ bool CWallet::CreateCoinStake(CScript scriptPubKey, unsigned int nBits, CTransac
         if (nBalance <= nBalanceReserve)
             return false;
         set<pair<const CWalletTx*,unsigned int> > setCoins;
+        vector<const CWalletTx*> vwtxPrev;
         int64 nValueIn = 0;
         if (!SelectCoins(nBalance - nBalanceReserve, txNew.nTime, setCoins, nValueIn))
             return false;
@@ -1111,6 +1112,7 @@ bool CWallet::CreateCoinStake(CScript scriptPubKey, unsigned int nBits, CTransac
                 txNew.vin.push_back(CTxIn(pcoin.first->GetHash(), pcoin.second));
                 nCredit += pcoin.first->vout[pcoin.second].nValue;
                 // Only spend one tx for now
+                vwtxPrev.push_back(pcoin.first);
                 break;
             }
         }
@@ -1121,7 +1123,7 @@ bool CWallet::CreateCoinStake(CScript scriptPubKey, unsigned int nBits, CTransac
             uint64 nCoinAge;
             CTxDB txdb("r");
             if (!txNew.GetCoinAge(txdb, nCoinAge))
-                return false;
+                return error("CreateCoinStake : failed to calculate coin age");
             nCredit += GetProofOfStakeReward(nCoinAge);
         }
         // Fill vout
@@ -1130,12 +1132,10 @@ bool CWallet::CreateCoinStake(CScript scriptPubKey, unsigned int nBits, CTransac
 
         // Sign
         int nIn = 0;
-        BOOST_FOREACH(const PAIRTYPE(const CWalletTx*,unsigned int)& coin, setCoins)
+        BOOST_FOREACH(const CWalletTx* pcoin, vwtxPrev)
         {
-            if (!SignSignature(*this, *coin.first, txNew, nIn++))
-                return false;
-            // Only spend one tx for now
-            break;
+            if (!SignSignature(*this, *pcoin, txNew, nIn++))
+                return error("CreateCoinStake : failed to sign coinstake");
         }
     }
     return true;