bool CTxDB::LoadBlockIndex() { // Get database cursor Dbc* pcursor = GetCursor(); if(!pcursor) return false; // Load mapBlockIndex unsigned int fFlags = DB_SET_RANGE; for(;;) { // Read next record CDataStream ssKey(SER_DISK, CLIENT_VERSION); if(fFlags == DB_SET_RANGE) ssKey << make_pair(string("blockindex"), uint256(0)); CDataStream ssValue(SER_DISK, CLIENT_VERSION); int ret = ReadAtCursor(pcursor, ssKey, ssValue, fFlags); fFlags = DB_NEXT; if(ret == DB_NOTFOUND) break; else if(ret) return false; // Unserialize try { string strType; ssKey >> strType; if(strType == "blockindex" && !fRequestShutdown) { CDiskBlockIndex diskindex; ssValue >> diskindex; uint256 blockHash = diskindex.GetBlockHash(); // Construct block index object CBlockIndex *pindexNew = InsertBlockIndex(blockHash); pindexNew->pprev = InsertBlockIndex(diskindex.hashPrev); pindexNew->pnext = InsertBlockIndex(diskindex.hashNext); pindexNew->nFile = diskindex.nFile; pindexNew->nBlockPos = diskindex.nBlockPos; pindexNew->nHeight = diskindex.nHeight; pindexNew->nMint = diskindex.nMint; pindexNew->nMoneySupply = diskindex.nMoneySupply; pindexNew->nFlags = diskindex.nFlags; pindexNew->nStakeModifier = diskindex.nStakeModifier; pindexNew->prevoutStake = diskindex.prevoutStake; pindexNew->nStakeTime = diskindex.nStakeTime; pindexNew->hashProofOfStake = diskindex.hashProofOfStake; pindexNew->nVersion = diskindex.nVersion; pindexNew->hashMerkleRoot = diskindex.hashMerkleRoot; pindexNew->nTime = diskindex.nTime; pindexNew->nBits = diskindex.nBits; pindexNew->nNonce = diskindex.nNonce; //Load Proof of Burn switch and indexes pindexNew->fProofOfBurn = diskindex.fProofOfBurn; pindexNew->burnHash = diskindex.burnHash; pindexNew->burnBlkHeight = diskindex.burnBlkHeight; pindexNew->burnCTx = diskindex.burnCTx; pindexNew->burnCTxOut = diskindex.burnCTxOut; pindexNew->nEffectiveBurnCoins = diskindex.nEffectiveBurnCoins; pindexNew->nBurnBits = diskindex.nBurnBits; // Watch for genesis block if(pindexGenesisBlock == NULL && blockHash == hashGenesisBlock) pindexGenesisBlock = pindexNew; if(!pindexNew->CheckIndex()) return error("LoadBlockIndex() : CheckIndex failed at %d", pindexNew->nHeight); // slimcoin: build setStakeSeen if(pindexNew->IsProofOfStake()) setStakeSeen.insert(pindexNew->GetProofOfStake()); else if(pindexNew->IsProofOfBurn()) //build the setBurnSeen setBurnSeen.insert(pindexNew->GetProofOfBurn()); }else break; // if shutdown requested or finished loading block index } // try catch(std::exception &e)