|
|
@ -732,53 +732,6 @@ unsigned int GetP2SHSigOpCount(const CTransaction& tx, const CCoinsViewCache& in |
|
|
|
return nSigOps; |
|
|
|
return nSigOps; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
int CMerkleTx::SetMerkleBranch(const CBlock* pblock) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
AssertLockHeld(cs_main); |
|
|
|
|
|
|
|
CBlock blockTmp; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (pblock == NULL) { |
|
|
|
|
|
|
|
CCoins coins; |
|
|
|
|
|
|
|
if (pcoinsTip->GetCoins(GetHash(), coins)) { |
|
|
|
|
|
|
|
CBlockIndex *pindex = chainActive[coins.nHeight]; |
|
|
|
|
|
|
|
if (pindex) { |
|
|
|
|
|
|
|
if (!ReadBlockFromDisk(blockTmp, pindex)) |
|
|
|
|
|
|
|
return 0; |
|
|
|
|
|
|
|
pblock = &blockTmp; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (pblock) { |
|
|
|
|
|
|
|
// Update the tx's hashBlock
|
|
|
|
|
|
|
|
hashBlock = pblock->GetHash(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 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; |
|
|
|
|
|
|
|
LogPrintf("ERROR: SetMerkleBranch() : couldn't find tx in block\n"); |
|
|
|
|
|
|
|
return 0; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Fill in merkle branch
|
|
|
|
|
|
|
|
vMerkleBranch = pblock->GetMerkleBranch(nIndex); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Is the tx in a block that's in the main chain
|
|
|
|
|
|
|
|
map<uint256, CBlockIndex*>::iterator mi = mapBlockIndex.find(hashBlock); |
|
|
|
|
|
|
|
if (mi == mapBlockIndex.end()) |
|
|
|
|
|
|
|
return 0; |
|
|
|
|
|
|
|
CBlockIndex* pindex = (*mi).second; |
|
|
|
|
|
|
|
if (!pindex || !chainActive.Contains(pindex)) |
|
|
|
|
|
|
|
return 0; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return chainActive.Height() - pindex->nHeight + 1; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -1028,58 +981,6 @@ bool AcceptToMemoryPool(CTxMemPool& pool, CValidationState &state, const CTransa |
|
|
|
return true; |
|
|
|
return true; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int CMerkleTx::GetDepthInMainChainINTERNAL(CBlockIndex* &pindexRet) const |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
if (hashBlock == 0 || nIndex == -1) |
|
|
|
|
|
|
|
return 0; |
|
|
|
|
|
|
|
AssertLockHeld(cs_main); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Find the block it claims to be in
|
|
|
|
|
|
|
|
map<uint256, CBlockIndex*>::iterator mi = mapBlockIndex.find(hashBlock); |
|
|
|
|
|
|
|
if (mi == mapBlockIndex.end()) |
|
|
|
|
|
|
|
return 0; |
|
|
|
|
|
|
|
CBlockIndex* pindex = (*mi).second; |
|
|
|
|
|
|
|
if (!pindex || !chainActive.Contains(pindex)) |
|
|
|
|
|
|
|
return 0; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Make sure the merkle branch connects to this block
|
|
|
|
|
|
|
|
if (!fMerkleVerified) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
if (CBlock::CheckMerkleBranch(GetHash(), vMerkleBranch, nIndex) != pindex->hashMerkleRoot) |
|
|
|
|
|
|
|
return 0; |
|
|
|
|
|
|
|
fMerkleVerified = true; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
pindexRet = pindex; |
|
|
|
|
|
|
|
return chainActive.Height() - pindex->nHeight + 1; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int CMerkleTx::GetDepthInMainChain(CBlockIndex* &pindexRet) const |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
AssertLockHeld(cs_main); |
|
|
|
|
|
|
|
int nResult = GetDepthInMainChainINTERNAL(pindexRet); |
|
|
|
|
|
|
|
if (nResult == 0 && !mempool.exists(GetHash())) |
|
|
|
|
|
|
|
return -1; // Not in chain, not in mempool
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return nResult; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int CMerkleTx::GetBlocksToMaturity() const |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
if (!IsCoinBase()) |
|
|
|
|
|
|
|
return 0; |
|
|
|
|
|
|
|
return max(0, (COINBASE_MATURITY+1) - GetDepthInMainChain()); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
bool CMerkleTx::AcceptToMemoryPool(bool fLimitFree, bool fRejectInsaneFee) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
CValidationState state; |
|
|
|
|
|
|
|
return ::AcceptToMemoryPool(mempool, state, *this, fLimitFree, NULL, fRejectInsaneFee); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Return transaction in tx, and if it was found inside a block, its hash is placed in hashBlock
|
|
|
|
// Return transaction in tx, and if it was found inside a block, its hash is placed in hashBlock
|
|
|
|
bool GetTransaction(const uint256 &hash, CTransaction &txOut, uint256 &hashBlock, bool fAllowSlow) |
|
|
|
bool GetTransaction(const uint256 &hash, CTransaction &txOut, uint256 &hashBlock, bool fAllowSlow) |
|
|
|
{ |
|
|
|
{ |
|
|
|