From 771ffb5e28a75bf2a99283b3a9c7c40dc0f7907d Mon Sep 17 00:00:00 2001 From: Gavin Andresen Date: Thu, 12 Jul 2012 19:46:24 -0400 Subject: [PATCH] Bug fix: sendrawtransaction was not relaying properly --- src/rpcrawtransaction.cpp | 33 +++++++++++++++++++++++---------- 1 file changed, 23 insertions(+), 10 deletions(-) diff --git a/src/rpcrawtransaction.cpp b/src/rpcrawtransaction.cpp index 63c2dfe0a..8ffe4844c 100644 --- a/src/rpcrawtransaction.cpp +++ b/src/rpcrawtransaction.cpp @@ -10,6 +10,7 @@ #include "db.h" #include "init.h" #include "main.h" +#include "net.h" #include "wallet.h" using namespace std; @@ -454,17 +455,29 @@ Value sendrawtransaction(const Array& params, bool fHelp) catch (std::exception &e) { throw JSONRPCError(-22, "TX decode failed"); } + uint256 hashTx = tx.GetHash(); - // push to local node - CTxDB txdb("r"); - if (!tx.AcceptToMemoryPool(txdb)) - throw JSONRPCError(-22, "TX rejected"); - - SyncWithWallets(tx, NULL, true); + // See if the transaction is already in a block + // or in the memory pool: + CTransaction existingTx; + uint256 hashBlock = 0; + if (GetTransaction(hashTx, existingTx, hashBlock)) + { + if (hashBlock != 0) + throw JSONRPCError(-5, string("transaction already in block ")+hashBlock.GetHex()); + // Not in block, but already in the memory pool; will drop + // through to re-relay it. + } + else + { + // push to local node + CTxDB txdb("r"); + if (!tx.AcceptToMemoryPool(txdb)) + throw JSONRPCError(-22, "TX rejected"); - // relay to network - CInv inv(MSG_TX, tx.GetHash()); - RelayInventory(inv); + SyncWithWallets(tx, NULL, true); + } + RelayMessage(CInv(MSG_TX, hashTx), tx); - return tx.GetHash().GetHex(); + return hashTx.GetHex(); }