Ejemplo n.º 1
0
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)