aboutsummaryrefslogtreecommitdiff
path: root/src/index
diff options
context:
space:
mode:
Diffstat (limited to 'src/index')
-rw-r--r--src/index/txindex.cpp25
-rw-r--r--src/index/txindex.h10
2 files changed, 31 insertions, 4 deletions
diff --git a/src/index/txindex.cpp b/src/index/txindex.cpp
index 7992d85338..2a661f0330 100644
--- a/src/index/txindex.cpp
+++ b/src/index/txindex.cpp
@@ -254,9 +254,30 @@ bool TxIndex::BlockUntilSyncedToCurrentChain()
return true;
}
-bool TxIndex::FindTx(const uint256& txid, CDiskTxPos& pos) const
+bool TxIndex::FindTx(const uint256& tx_hash, uint256& block_hash, CTransactionRef& tx) const
{
- return m_db->ReadTxPos(txid, pos);
+ CDiskTxPos postx;
+ if (!m_db->ReadTxPos(tx_hash, postx)) {
+ return false;
+ }
+
+ CAutoFile file(OpenBlockFile(postx, true), SER_DISK, CLIENT_VERSION);
+ if (file.IsNull()) {
+ return error("%s: OpenBlockFile failed", __func__);
+ }
+ CBlockHeader header;
+ try {
+ file >> header;
+ fseek(file.Get(), postx.nTxOffset, SEEK_CUR);
+ file >> tx;
+ } catch (const std::exception& e) {
+ return error("%s: Deserialize or I/O error - %s", __func__, e.what());
+ }
+ if (tx->GetHash() != tx_hash) {
+ return error("%s: txid mismatch", __func__);
+ }
+ block_hash = header.GetHash();
+ return true;
}
void TxIndex::Interrupt()
diff --git a/src/index/txindex.h b/src/index/txindex.h
index 41199f0b3f..ac746de05b 100644
--- a/src/index/txindex.h
+++ b/src/index/txindex.h
@@ -6,6 +6,7 @@
#define BITCOIN_INDEX_TXINDEX_H
#include <primitives/block.h>
+#include <primitives/transaction.h>
#include <threadinterrupt.h>
#include <txdb.h>
#include <uint256.h>
@@ -69,8 +70,13 @@ public:
/// up from far behind, this method does not block and immediately returns false.
bool BlockUntilSyncedToCurrentChain();
- /// Look up the on-disk location of a transaction by hash.
- bool FindTx(const uint256& txid, CDiskTxPos& pos) const;
+ /// Look up a transaction by hash.
+ ///
+ /// @param[in] tx_hash The hash of the transaction to be returned.
+ /// @param[out] block_hash The hash of the block the transaction is found in.
+ /// @param[out] tx The transaction itself.
+ /// @return true if transaction is found, false otherwise
+ bool FindTx(const uint256& tx_hash, uint256& block_hash, CTransactionRef& tx) const;
void Interrupt();