aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJameson Lopp <jameson@team.casa>2021-07-01 10:17:28 -0400
committerJameson Lopp <jameson.lopp@gmail.com>2021-07-03 07:31:27 -0400
commit78f4c8b98eada337346ffb206339c3ebae4ff43b (patch)
tree5f08795aaacdf50ee7cf7d5481d5f0173fbaab20 /src
parent2749613020ed96a4e9204f8b98c44524b0a62d0d (diff)
prefer to use txindex if available for GetTransaction
Fixes #22382
Diffstat (limited to 'src')
-rw-r--r--src/rpc/rawtransaction.cpp10
-rw-r--r--src/validation.cpp23
-rw-r--r--src/validation.h11
3 files changed, 24 insertions, 20 deletions
diff --git a/src/rpc/rawtransaction.cpp b/src/rpc/rawtransaction.cpp
index ccb3123714..30addf8af6 100644
--- a/src/rpc/rawtransaction.cpp
+++ b/src/rpc/rawtransaction.cpp
@@ -74,12 +74,10 @@ static RPCHelpMan getrawtransaction()
"getrawtransaction",
"\nReturn the raw transaction data.\n"
- "\nBy default this function only works for mempool transactions. When called with a blockhash\n"
- "argument, getrawtransaction will return the transaction if the specified block is available and\n"
- "the transaction is found in that block. When called without a blockhash argument, getrawtransaction\n"
- "will return the transaction if it is in the mempool, or if -txindex is enabled and the transaction\n"
- "is in a block in the blockchain.\n"
-
+ "\nBy default, this call only returns a transaction if it is in the mempool. If -txindex is enabled\n"
+ "and no blockhash argument is passed, it will return the transaction if it is in the mempool or any block.\n"
+ "If -txindex is not enabled and a blockhash argument is passed, it will return the transaction if\n"
+ "the specified block is available and the transaction is found in that block.\n"
"\nHint: Use gettransaction for wallet transactions.\n"
"\nIf verbose is 'true', returns an Object with information about 'txid'.\n"
diff --git a/src/validation.cpp b/src/validation.cpp
index df0ec3bd4f..6a145a088a 100644
--- a/src/validation.cpp
+++ b/src/validation.cpp
@@ -1159,6 +1159,20 @@ CTransactionRef GetTransaction(const CBlockIndex* const block_index, const CTxMe
{
LOCK(cs_main);
+ if (mempool && !block_index) {
+ CTransactionRef ptx = mempool->get(hash);
+ if (ptx) return ptx;
+ }
+ if (g_txindex) {
+ CTransactionRef tx;
+ uint256 block_hash;
+ if (g_txindex->FindTx(hash, block_hash, tx)) {
+ if (!block_index || block_index->GetBlockHash() == block_hash) {
+ hashBlock = block_hash;
+ return tx;
+ }
+ }
+ }
if (block_index) {
CBlock block;
if (ReadBlockFromDisk(block, block_index, consensusParams)) {
@@ -1169,15 +1183,6 @@ CTransactionRef GetTransaction(const CBlockIndex* const block_index, const CTxMe
}
}
}
- return nullptr;
- }
- if (mempool) {
- CTransactionRef ptx = mempool->get(hash);
- if (ptx) return ptx;
- }
- if (g_txindex) {
- CTransactionRef tx;
- if (g_txindex->FindTx(hash, hashBlock, tx)) return tx;
}
return nullptr;
}
diff --git a/src/validation.h b/src/validation.h
index fc702b7183..0cebf3967d 100644
--- a/src/validation.h
+++ b/src/validation.h
@@ -142,15 +142,16 @@ void StartScriptCheckWorkerThreads(int threads_num);
/** Stop all of the script checking worker threads */
void StopScriptCheckWorkerThreads();
/**
- * Return transaction from the block at block_index.
- * If block_index is not provided, fall back to mempool.
- * If mempool is not provided or the tx couldn't be found in mempool, fall back to g_txindex.
+ * Return transaction with a given hash.
+ * If mempool is provided and block_index is not provided, check it first for the tx.
+ * If -txindex is available, check it next for the tx.
+ * Finally, if block_index is provided, check for tx by reading entire block from disk.
*
* @param[in] block_index The block to read from disk, or nullptr
- * @param[in] mempool If block_index is not provided, look in the mempool, if provided
+ * @param[in] mempool If provided, check mempool for tx
* @param[in] hash The txid
* @param[in] consensusParams The params
- * @param[out] hashBlock The hash of block_index, if the tx was found via block_index
+ * @param[out] hashBlock The block hash, if the tx was found via -txindex or block_index
* @returns The tx if found, otherwise nullptr
*/
CTransactionRef GetTransaction(const CBlockIndex* const block_index, const CTxMemPool* const mempool, const uint256& hash, const Consensus::Params& consensusParams, uint256& hashBlock);