|
|
|
@ -2188,6 +2188,12 @@ func (bc *BlockChain) reorg(oldHead *types.Header, newHead *types.Block) error { |
|
|
|
|
// rewind the canonical chain to a lower point.
|
|
|
|
|
log.Error("Impossible reorg, please file an issue", "oldnum", oldBlock.Number(), "oldhash", oldBlock.Hash(), "oldblocks", len(oldChain), "newnum", newBlock.Number(), "newhash", newBlock.Hash(), "newblocks", len(newChain)) |
|
|
|
|
} |
|
|
|
|
// Reset the tx lookup cache in case to clear stale txlookups.
|
|
|
|
|
// This is done before writing any new chain data to avoid the
|
|
|
|
|
// weird scenario that canonical chain is changed while the
|
|
|
|
|
// stale lookups are still cached.
|
|
|
|
|
bc.txLookupCache.Purge() |
|
|
|
|
|
|
|
|
|
// Insert the new chain(except the head block(reverse order)),
|
|
|
|
|
// taking care of the proper incremental order.
|
|
|
|
|
for i := len(newChain) - 1; i >= 1; i-- { |
|
|
|
@ -2202,11 +2208,13 @@ func (bc *BlockChain) reorg(oldHead *types.Header, newHead *types.Block) error { |
|
|
|
|
|
|
|
|
|
// Delete useless indexes right now which includes the non-canonical
|
|
|
|
|
// transaction indexes, canonical chain indexes which above the head.
|
|
|
|
|
indexesBatch := bc.db.NewBatch() |
|
|
|
|
for _, tx := range types.HashDifference(deletedTxs, addedTxs) { |
|
|
|
|
var ( |
|
|
|
|
indexesBatch = bc.db.NewBatch() |
|
|
|
|
diffs = types.HashDifference(deletedTxs, addedTxs) |
|
|
|
|
) |
|
|
|
|
for _, tx := range diffs { |
|
|
|
|
rawdb.DeleteTxLookupEntry(indexesBatch, tx) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Delete all hash markers that are not part of the new canonical chain.
|
|
|
|
|
// Because the reorg function does not handle new chain head, all hash
|
|
|
|
|
// markers greater than or equal to new chain head should be deleted.
|
|
|
|
|