mirror of
https://github.com/bitcoin/bitcoin.git
synced 2026-01-19 06:43:45 +01:00
Optimize JSON-RPC getblockhash
- If the height is in the first half, start at the genesis block and go up, rather than at the top - Cache the last lookup and use it as a reference point if it's close to the next request, to make linear lookups always fast
This commit is contained in:
19
src/main.cpp
19
src/main.cpp
@@ -802,6 +802,24 @@ bool GetTransaction(const uint256 &hash, CTransaction &tx, uint256 &hashBlock)
|
||||
// CBlock and CBlockIndex
|
||||
//
|
||||
|
||||
static CBlockIndex* pblockindexFBBHLast;
|
||||
CBlockIndex* FindBlockByHeight(int nHeight)
|
||||
{
|
||||
CBlockIndex *pblockindex;
|
||||
if (nHeight < nBestHeight / 2)
|
||||
pblockindex = pindexGenesisBlock;
|
||||
else
|
||||
pblockindex = pindexBest;
|
||||
if (pblockindexFBBHLast && abs(nHeight - pblockindex->nHeight) > abs(nHeight - pblockindexFBBHLast->nHeight))
|
||||
pblockindex = pblockindexFBBHLast;
|
||||
while (pblockindex->nHeight > nHeight)
|
||||
pblockindex = pblockindex->pprev;
|
||||
while (pblockindex->nHeight < nHeight)
|
||||
pblockindex = pblockindex->pnext;
|
||||
pblockindexFBBHLast = pblockindex;
|
||||
return pblockindex;
|
||||
}
|
||||
|
||||
bool CBlock::ReadFromDisk(const CBlockIndex* pindex, bool fReadTransactions)
|
||||
{
|
||||
if (!fReadTransactions)
|
||||
@@ -1615,6 +1633,7 @@ bool CBlock::SetBestChain(CTxDB& txdb, CBlockIndex* pindexNew)
|
||||
// New best block
|
||||
hashBestChain = hash;
|
||||
pindexBest = pindexNew;
|
||||
pblockindexFBBHLast = NULL;
|
||||
nBestHeight = pindexBest->nHeight;
|
||||
bnBestChainWork = pindexNew->bnChainWork;
|
||||
nTimeBestReceived = GetTime();
|
||||
|
||||
Reference in New Issue
Block a user