From 9cb3d570daef2c040d29e58411b2c66e0fb00bc6 Mon Sep 17 00:00:00 2001 From: Sunny King Date: Fri, 27 Apr 2012 20:18:12 +0100 Subject: [PATCH] PPCoin: Fix CreateCoinStake() signature bug since 747f99fb ConnectInputs() : VerifySignature failed --- src/script.cpp | 3 ++- src/wallet.cpp | 12 ++++++------ 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/src/script.cpp b/src/script.cpp index 4e588f8..12c6b6f 100644 --- a/src/script.cpp +++ b/src/script.cpp @@ -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. diff --git a/src/wallet.cpp b/src/wallet.cpp index 1b30be8..f993ab7 100644 --- a/src/wallet.cpp +++ b/src/wallet.cpp @@ -1081,6 +1081,7 @@ bool CWallet::CreateCoinStake(CScript scriptPubKey, unsigned int nBits, CTransac if (nBalance <= nBalanceReserve) return false; set > setCoins; + vector 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; -- 1.7.1