prefer to use txindex if available for GetTransaction

Fixes #22382
pull/826/head
Jameson Lopp 3 years ago committed by Jameson Lopp
parent 2749613020
commit 78f4c8b98e
No known key found for this signature in database
GPG Key ID: 7E15222D71C6D9FD

@ -74,12 +74,10 @@ static RPCHelpMan getrawtransaction()
"getrawtransaction", "getrawtransaction",
"\nReturn the raw transaction data.\n" "\nReturn the raw transaction data.\n"
"\nBy default this function only works for mempool transactions. When called with a blockhash\n" "\nBy default, this call only returns a transaction if it is in the mempool. If -txindex is enabled\n"
"argument, getrawtransaction will return the transaction if the specified block is available and\n" "and no blockhash argument is passed, it will return the transaction if it is in the mempool or any block.\n"
"the transaction is found in that block. When called without a blockhash argument, getrawtransaction\n" "If -txindex is not enabled and a blockhash argument is passed, it will return the transaction if\n"
"will return the transaction if it is in the mempool, or if -txindex is enabled and the transaction\n" "the specified block is available and the transaction is found in that block.\n"
"is in a block in the blockchain.\n"
"\nHint: Use gettransaction for wallet transactions.\n" "\nHint: Use gettransaction for wallet transactions.\n"
"\nIf verbose is 'true', returns an Object with information about 'txid'.\n" "\nIf verbose is 'true', returns an Object with information about 'txid'.\n"

@ -1159,6 +1159,20 @@ CTransactionRef GetTransaction(const CBlockIndex* const block_index, const CTxMe
{ {
LOCK(cs_main); 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) { if (block_index) {
CBlock block; CBlock block;
if (ReadBlockFromDisk(block, block_index, consensusParams)) { 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; return nullptr;
} }

@ -142,15 +142,16 @@ void StartScriptCheckWorkerThreads(int threads_num);
/** Stop all of the script checking worker threads */ /** Stop all of the script checking worker threads */
void StopScriptCheckWorkerThreads(); void StopScriptCheckWorkerThreads();
/** /**
* Return transaction from the block at block_index. * Return transaction with a given hash.
* If block_index is not provided, fall back to mempool. * If mempool is provided and block_index is not provided, check it first for the tx.
* If mempool is not provided or the tx couldn't be found in mempool, fall back to g_txindex. * 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] 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] hash The txid
* @param[in] consensusParams The params * @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 * @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); CTransactionRef GetTransaction(const CBlockIndex* const block_index, const CTxMemPool* const mempool, const uint256& hash, const Consensus::Params& consensusParams, uint256& hashBlock);

Loading…
Cancel
Save