From 40530c08006088e6f610063f1c49428aa0b272f6 Mon Sep 17 00:00:00 2001 From: CryptoManiac Date: Thu, 31 Mar 2016 23:23:02 +0300 Subject: [PATCH] Split CMerkleTx::SetMerkleBranch --- src/main.cpp | 63 ++++++++++++++++++++---------------------------- src/main.h | 3 +- src/rpcblockchain.cpp | 2 +- src/wallet.cpp | 2 +- 4 files changed, 30 insertions(+), 40 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 292cc51..f62b1e9 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -435,51 +435,40 @@ CTransaction::GetLegacySigOpCount() const return nSigOps; } -int CMerkleTx::SetMerkleBranch(const CBlock* pblock) +int CMerkleTx::SetMerkleBranch() { - if (fClient) - { - if (hashBlock == 0) - return 0; - } - else - { - CBlock blockTmp; - - if (pblock == NULL) - { - // Load the block this tx is in - CTxIndex txindex; - if (!CTxDB("r").ReadTxIndex(GetHash(), txindex)) - return 0; - if (!blockTmp.ReadFromDisk(txindex.pos.nFile, txindex.pos.nBlockPos)) - return 0; - pblock = &blockTmp; - } - - // Update the tx's hashBlock - hashBlock = pblock->GetHash(); + // Load the block this tx is in + CTxIndex txindex; + if (!CTxDB("r").ReadTxIndex(GetHash(), txindex)) + return 0; + CBlock blockTmp; + if (!blockTmp.ReadFromDisk(txindex.pos.nFile, txindex.pos.nBlockPos)) + return 0; + return SetMerkleBranch(blockTmp); +} - // Locate the transaction - for (nIndex = 0; nIndex < (int)pblock->vtx.size(); nIndex++) - if (pblock->vtx[nIndex] == *(CTransaction*)this) - break; - if (nIndex == (int)pblock->vtx.size()) - { - vMerkleBranch.clear(); - nIndex = -1; - printf("ERROR: SetMerkleBranch() : couldn't find tx in block\n"); - return 0; - } +int CMerkleTx::SetMerkleBranch(const CBlock& block) +{ + // Update the tx's hashBlock + hashBlock = block.GetHash(); - // Fill in merkle branch - vMerkleBranch = pblock->GetMerkleBranch(nIndex); + // Locate the transaction + for (nIndex = 0; nIndex < (int)block.vtx.size(); nIndex++) + if (block.vtx[nIndex] == *(CTransaction*)this) + break; + if (nIndex == (int)block.vtx.size()) + { + vMerkleBranch.clear(); + nIndex = -1; + printf("ERROR: SetMerkleBranch() : couldn't find tx in block\n"); + return 0; } // Is the tx in a block that's in the main chain map::iterator mi = mapBlockIndex.find(hashBlock); if (mi == mapBlockIndex.end()) return 0; + const CBlockIndex* pindex = (*mi).second; if (!pindex || !pindex->IsInMainChain()) return 0; diff --git a/src/main.h b/src/main.h index 382ef1a..cbec5e7 100644 --- a/src/main.h +++ b/src/main.h @@ -794,7 +794,8 @@ public: ) - int SetMerkleBranch(const CBlock* pblock=NULL); + int SetMerkleBranch(); + int SetMerkleBranch(const CBlock &block); int GetDepthInMainChain(CBlockIndex* &pindexRet) const; int GetDepthInMainChain() const { CBlockIndex *pindexRet; return GetDepthInMainChain(pindexRet); } bool IsInMainChain() const { return GetDepthInMainChain() > 0; } diff --git a/src/rpcblockchain.cpp b/src/rpcblockchain.cpp index 054dca2..d19869d 100644 --- a/src/rpcblockchain.cpp +++ b/src/rpcblockchain.cpp @@ -104,7 +104,7 @@ Object blockToJSON(const CBlock& block, const CBlockIndex* blockindex, bool fPri Object result; result.push_back(Pair("hash", block.GetHash().GetHex())); CMerkleTx txGen(block.vtx[0]); - txGen.SetMerkleBranch(&block); + txGen.SetMerkleBranch(block); result.push_back(Pair("confirmations", (int)txGen.GetDepthInMainChain())); result.push_back(Pair("size", (int)::GetSerializeSize(block, SER_NETWORK, PROTOCOL_VERSION))); result.push_back(Pair("height", blockindex->nHeight)); diff --git a/src/wallet.cpp b/src/wallet.cpp index 2f4803f..85bf6ac 100644 --- a/src/wallet.cpp +++ b/src/wallet.cpp @@ -764,7 +764,7 @@ bool CWallet::AddToWalletIfInvolvingMe(const CTransaction& tx, const CBlock* pbl CWalletTx wtx(this,tx); // Get merkle branch if transaction was found in a block if (pblock) - wtx.SetMerkleBranch(pblock); + wtx.SetMerkleBranch(*pblock); return AddToWallet(wtx); } else -- 1.7.1