RPC scaninput: Don't scan spent inputs.
authorCryptoManiac <balthazar@yandex.ru>
Sun, 4 Oct 2015 17:25:55 +0000 (10:25 -0700)
committerCryptoManiac <balthazar@yandex.ru>
Sun, 4 Oct 2015 17:25:55 +0000 (10:25 -0700)
src/rpcmining.cpp

index 325ef2c..899743b 100644 (file)
@@ -10,6 +10,7 @@
 #include "miner.h"
 #include "kernel.h"
 #include "bitcoinrpc.h"
+#include <boost/format.hpp>
 
 using namespace json_spirit;
 using namespace std;
@@ -118,6 +119,15 @@ Value scaninput(const Array& params, bool fHelp)
         if (!txdb.ReadTxIndex(tx.GetHash(), txindex))
             throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Unable to read block index item");
 
+        // Check for spent flag
+        // It doesn't make sense to scan spent inputs.
+        if (!txindex.vSpent[nOut].IsNull())
+        {
+            stringstream strErrorMsg;
+            strErrorMsg << boost::format("%s prev tx already used at %s") % tx.GetHash().ToString() % txindex.vSpent[nOut].ToString();
+            throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, strErrorMsg.str());
+        }
+
         // Read block header
         if (!block.ReadFromDisk(txindex.pos.nFile, txindex.pos.nBlockPos, false))
             throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "CBlock::ReadFromDisk() failed");