mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-11-13 07:28:59 +01:00
Refactor/encapsulate chain globals into a CChain class
This commit is contained in:
83
src/main.h
83
src/main.h
@@ -74,14 +74,8 @@ extern CScript COINBASE_FLAGS;
|
||||
|
||||
extern CCriticalSection cs_main;
|
||||
extern std::map<uint256, CBlockIndex*> mapBlockIndex;
|
||||
extern std::vector<CBlockIndex*> vBlockIndexByHeight;
|
||||
extern std::set<CBlockIndex*, CBlockIndexWorkComparator> setBlockIndexValid;
|
||||
extern CBlockIndex* pindexGenesisBlock;
|
||||
extern int nBestHeight;
|
||||
extern uint256 nBestChainWork;
|
||||
extern uint256 nBestInvalidWork;
|
||||
extern uint256 hashBestChain;
|
||||
extern CBlockIndex* pindexBest;
|
||||
extern unsigned int nTransactionsUpdated;
|
||||
extern uint64 nLastBlockTx;
|
||||
extern uint64 nLastBlockSize;
|
||||
@@ -153,8 +147,6 @@ void UnloadBlockIndex();
|
||||
bool VerifyDB(int nCheckLevel, int nCheckDepth);
|
||||
/** Print the loaded block tree */
|
||||
void PrintBlockTree();
|
||||
/** Find a block by height in the currently-connected chain */
|
||||
CBlockIndex* FindBlockByHeight(int nHeight);
|
||||
/** Process protocol messages received from a given node */
|
||||
bool ProcessMessages(CNode* pfrom);
|
||||
/** Send queued protocol messages to be sent to a give node */
|
||||
@@ -819,15 +811,6 @@ public:
|
||||
return (CBigNum(1)<<256) / (bnTarget+1);
|
||||
}
|
||||
|
||||
bool IsInMainChain() const
|
||||
{
|
||||
return nHeight < (int)vBlockIndexByHeight.size() && vBlockIndexByHeight[nHeight] == this;
|
||||
}
|
||||
|
||||
CBlockIndex *GetNextInMainChain() const {
|
||||
return nHeight+1 >= (int)vBlockIndexByHeight.size() ? NULL : vBlockIndexByHeight[nHeight+1];
|
||||
}
|
||||
|
||||
bool CheckIndex() const
|
||||
{
|
||||
return CheckProofOfWork(GetBlockHash(), nBits);
|
||||
@@ -849,17 +832,7 @@ public:
|
||||
return pbegin[(pend - pbegin)/2];
|
||||
}
|
||||
|
||||
int64 GetMedianTime() const
|
||||
{
|
||||
const CBlockIndex* pindex = this;
|
||||
for (int i = 0; i < nMedianTimeSpan/2; i++)
|
||||
{
|
||||
if (!pindex->GetNextInMainChain())
|
||||
return GetBlockTime();
|
||||
pindex = pindex->GetNextInMainChain();
|
||||
}
|
||||
return pindex->GetMedianTimePast();
|
||||
}
|
||||
int64 GetMedianTime() const;
|
||||
|
||||
/**
|
||||
* Returns true if there are nRequired or more blocks of minVersion or above
|
||||
@@ -870,8 +843,8 @@ public:
|
||||
|
||||
std::string ToString() const
|
||||
{
|
||||
return strprintf("CBlockIndex(pprev=%p, pnext=%p, nHeight=%d, merkle=%s, hashBlock=%s)",
|
||||
pprev, GetNextInMainChain(), nHeight,
|
||||
return strprintf("CBlockIndex(pprev=%p, nHeight=%d, merkle=%s, hashBlock=%s)",
|
||||
pprev, nHeight,
|
||||
hashMerkleRoot.ToString().c_str(),
|
||||
GetBlockHash().ToString().c_str());
|
||||
}
|
||||
@@ -1011,9 +984,59 @@ public:
|
||||
}
|
||||
};
|
||||
|
||||
/** An in-memory indexed chain of blocks. */
|
||||
class CChain {
|
||||
private:
|
||||
std::vector<CBlockIndex*> vChain;
|
||||
|
||||
public:
|
||||
/** Returns the index entry for the genesis block of this chain, or NULL if none. */
|
||||
CBlockIndex *Genesis() const {
|
||||
return vChain.size() > 0 ? vChain[0] : NULL;
|
||||
}
|
||||
|
||||
/** Returns the index entry for the tip of this chain, or NULL if none. */
|
||||
CBlockIndex *Tip() const {
|
||||
return vChain.size() > 0 ? vChain[vChain.size() - 1] : NULL;
|
||||
}
|
||||
|
||||
/** Returns the index entry at a particular height in this chain, or NULL if no such height exists. */
|
||||
CBlockIndex *operator[](int nHeight) const {
|
||||
if (nHeight < 0 || nHeight >= (int)vChain.size())
|
||||
return NULL;
|
||||
return vChain[nHeight];
|
||||
}
|
||||
|
||||
/** Compare two chains efficiently. */
|
||||
friend bool operator==(const CChain &a, const CChain &b) {
|
||||
return a.vChain.size() == b.vChain.size() &&
|
||||
a.vChain[a.vChain.size() - 1] == b.vChain[b.vChain.size() - 1];
|
||||
}
|
||||
|
||||
/** Efficiently check whether a block is present in this chain. */
|
||||
bool Contains(const CBlockIndex *pindex) const {
|
||||
return (*this)[pindex->nHeight] == pindex;
|
||||
}
|
||||
|
||||
/** Find the successor of a block in this chain, or NULL if the given index is not found or is the tip. */
|
||||
CBlockIndex *Next(const CBlockIndex *pindex) const {
|
||||
if (Contains(pindex))
|
||||
return (*this)[pindex->nHeight + 1];
|
||||
else
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/** Return the maximal height in the chain. Is equal to chain.Tip() ? chain.Tip()->nHeight : -1. */
|
||||
int Height() const {
|
||||
return vChain.size() - 1;
|
||||
}
|
||||
|
||||
/** Set/initialize a chain with a given tip. Returns the forking point. */
|
||||
CBlockIndex *SetTip(CBlockIndex *pindex);
|
||||
};
|
||||
|
||||
/** The currently-connected chain of blocks. */
|
||||
extern CChain chainActive;
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user