|
|
|
@ -1277,6 +1277,7 @@ func (bc *BlockChain) InsertReceiptChain(blockChain types.Blocks, receiptChain [ |
|
|
|
|
} |
|
|
|
|
// writeLive writes blockchain and corresponding receipt chain into active store.
|
|
|
|
|
writeLive := func(blockChain types.Blocks, receiptChain []types.Receipts) (int, error) { |
|
|
|
|
skipPresenceCheck := false |
|
|
|
|
batch := bc.db.NewBatch() |
|
|
|
|
for i, block := range blockChain { |
|
|
|
|
// Short circuit insertion if shutting down or processing failed
|
|
|
|
@ -1287,9 +1288,17 @@ func (bc *BlockChain) InsertReceiptChain(blockChain types.Blocks, receiptChain [ |
|
|
|
|
if !bc.HasHeader(block.Hash(), block.NumberU64()) { |
|
|
|
|
return i, fmt.Errorf("containing header #%d [%x…] unknown", block.Number(), block.Hash().Bytes()[:4]) |
|
|
|
|
} |
|
|
|
|
if bc.HasBlock(block.Hash(), block.NumberU64()) { |
|
|
|
|
stats.ignored++ |
|
|
|
|
continue |
|
|
|
|
if !skipPresenceCheck { |
|
|
|
|
// Ignore if the entire data is already known
|
|
|
|
|
if bc.HasBlock(block.Hash(), block.NumberU64()) { |
|
|
|
|
stats.ignored++ |
|
|
|
|
continue |
|
|
|
|
} else { |
|
|
|
|
// If block N is not present, neither are the later blocks.
|
|
|
|
|
// This should be true, but if we are mistaken, the shortcut
|
|
|
|
|
// here will only cause overwriting of some existing data
|
|
|
|
|
skipPresenceCheck = true |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
// Write all the data out into the database
|
|
|
|
|
rawdb.WriteBody(batch, block.Hash(), block.NumberU64(), block.Body()) |
|
|
|
|