|
|
@ -2043,25 +2043,25 @@ bool SetBestChain(CValidationState &state, CBlockIndex* pindexNew) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
bool CBlock::AddToBlockIndex(CValidationState &state, const CDiskBlockPos &pos) |
|
|
|
bool AddToBlockIndex(CBlock& block, CValidationState& state, const CDiskBlockPos& pos) |
|
|
|
{ |
|
|
|
{ |
|
|
|
// Check for duplicate
|
|
|
|
// Check for duplicate
|
|
|
|
uint256 hash = GetHash(); |
|
|
|
uint256 hash = block.GetHash(); |
|
|
|
if (mapBlockIndex.count(hash)) |
|
|
|
if (mapBlockIndex.count(hash)) |
|
|
|
return state.Invalid(error("AddToBlockIndex() : %s already exists", hash.ToString().c_str())); |
|
|
|
return state.Invalid(error("AddToBlockIndex() : %s already exists", hash.ToString().c_str())); |
|
|
|
|
|
|
|
|
|
|
|
// Construct new block index object
|
|
|
|
// Construct new block index object
|
|
|
|
CBlockIndex* pindexNew = new CBlockIndex(*this); |
|
|
|
CBlockIndex* pindexNew = new CBlockIndex(block); |
|
|
|
assert(pindexNew); |
|
|
|
assert(pindexNew); |
|
|
|
map<uint256, CBlockIndex*>::iterator mi = mapBlockIndex.insert(make_pair(hash, pindexNew)).first; |
|
|
|
map<uint256, CBlockIndex*>::iterator mi = mapBlockIndex.insert(make_pair(hash, pindexNew)).first; |
|
|
|
pindexNew->phashBlock = &((*mi).first); |
|
|
|
pindexNew->phashBlock = &((*mi).first); |
|
|
|
map<uint256, CBlockIndex*>::iterator miPrev = mapBlockIndex.find(hashPrevBlock); |
|
|
|
map<uint256, CBlockIndex*>::iterator miPrev = mapBlockIndex.find(block.hashPrevBlock); |
|
|
|
if (miPrev != mapBlockIndex.end()) |
|
|
|
if (miPrev != mapBlockIndex.end()) |
|
|
|
{ |
|
|
|
{ |
|
|
|
pindexNew->pprev = (*miPrev).second; |
|
|
|
pindexNew->pprev = (*miPrev).second; |
|
|
|
pindexNew->nHeight = pindexNew->pprev->nHeight + 1; |
|
|
|
pindexNew->nHeight = pindexNew->pprev->nHeight + 1; |
|
|
|
} |
|
|
|
} |
|
|
|
pindexNew->nTx = vtx.size(); |
|
|
|
pindexNew->nTx = block.vtx.size(); |
|
|
|
pindexNew->nChainWork = (pindexNew->pprev ? pindexNew->pprev->nChainWork : 0) + pindexNew->GetBlockWork().getuint256(); |
|
|
|
pindexNew->nChainWork = (pindexNew->pprev ? pindexNew->pprev->nChainWork : 0) + pindexNew->GetBlockWork().getuint256(); |
|
|
|
pindexNew->nChainTx = (pindexNew->pprev ? pindexNew->pprev->nChainTx : 0) + pindexNew->nTx; |
|
|
|
pindexNew->nChainTx = (pindexNew->pprev ? pindexNew->pprev->nChainTx : 0) + pindexNew->nTx; |
|
|
|
pindexNew->nFile = pos.nFile; |
|
|
|
pindexNew->nFile = pos.nFile; |
|
|
@ -2082,7 +2082,7 @@ bool CBlock::AddToBlockIndex(CValidationState &state, const CDiskBlockPos &pos) |
|
|
|
// Notify UI to display prev block's coinbase if it was ours
|
|
|
|
// Notify UI to display prev block's coinbase if it was ours
|
|
|
|
static uint256 hashPrevBestCoinBase; |
|
|
|
static uint256 hashPrevBestCoinBase; |
|
|
|
UpdatedTransaction(hashPrevBestCoinBase); |
|
|
|
UpdatedTransaction(hashPrevBestCoinBase); |
|
|
|
hashPrevBestCoinBase = GetTxHash(0); |
|
|
|
hashPrevBestCoinBase = block.GetTxHash(0); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if (!pblocktree->Flush()) |
|
|
|
if (!pblocktree->Flush()) |
|
|
@ -2314,7 +2314,7 @@ bool CBlock::AcceptBlock(CValidationState &state, CDiskBlockPos *dbp) |
|
|
|
if (dbp == NULL) |
|
|
|
if (dbp == NULL) |
|
|
|
if (!WriteBlockToDisk(*this, blockPos)) |
|
|
|
if (!WriteBlockToDisk(*this, blockPos)) |
|
|
|
return state.Abort(_("Failed to write block")); |
|
|
|
return state.Abort(_("Failed to write block")); |
|
|
|
if (!AddToBlockIndex(state, blockPos)) |
|
|
|
if (!AddToBlockIndex(*this, state, blockPos)) |
|
|
|
return error("AcceptBlock() : AddToBlockIndex failed"); |
|
|
|
return error("AcceptBlock() : AddToBlockIndex failed"); |
|
|
|
} catch(std::runtime_error &e) { |
|
|
|
} catch(std::runtime_error &e) { |
|
|
|
return state.Abort(_("System error: ") + e.what()); |
|
|
|
return state.Abort(_("System error: ") + e.what()); |
|
|
@ -2852,7 +2852,7 @@ bool InitBlockIndex() { |
|
|
|
return error("LoadBlockIndex() : FindBlockPos failed"); |
|
|
|
return error("LoadBlockIndex() : FindBlockPos failed"); |
|
|
|
if (!WriteBlockToDisk(block, blockPos)) |
|
|
|
if (!WriteBlockToDisk(block, blockPos)) |
|
|
|
return error("LoadBlockIndex() : writing genesis block to disk failed"); |
|
|
|
return error("LoadBlockIndex() : writing genesis block to disk failed"); |
|
|
|
if (!block.AddToBlockIndex(state, blockPos)) |
|
|
|
if (!AddToBlockIndex(block, state, blockPos)) |
|
|
|
return error("LoadBlockIndex() : genesis block not accepted"); |
|
|
|
return error("LoadBlockIndex() : genesis block not accepted"); |
|
|
|
} catch(std::runtime_error &e) { |
|
|
|
} catch(std::runtime_error &e) { |
|
|
|
return error("LoadBlockIndex() : failed to initialize block database: %s", e.what()); |
|
|
|
return error("LoadBlockIndex() : failed to initialize block database: %s", e.what()); |
|
|
|