|
|
|
@ -1240,6 +1240,17 @@ func (self *BlockChain) reorg(oldBlock, newBlock *types.Block) error { |
|
|
|
|
oldStart = oldBlock |
|
|
|
|
newStart = newBlock |
|
|
|
|
deletedTxs types.Transactions |
|
|
|
|
deletedLogs vm.Logs |
|
|
|
|
// collectLogs collects the logs that were generated during the
|
|
|
|
|
// processing of the block that corresponds with the given hash.
|
|
|
|
|
// These logs are later announced as deleted.
|
|
|
|
|
collectLogs = func(h common.Hash) { |
|
|
|
|
// Coalesce logs
|
|
|
|
|
receipts := GetBlockReceipts(self.chainDb, h) |
|
|
|
|
for _, receipt := range receipts { |
|
|
|
|
deletedLogs = append(deletedLogs, receipt.Logs...) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
) |
|
|
|
|
|
|
|
|
|
// first reduce whoever is higher bound
|
|
|
|
@ -1247,6 +1258,8 @@ func (self *BlockChain) reorg(oldBlock, newBlock *types.Block) error { |
|
|
|
|
// reduce old chain
|
|
|
|
|
for oldBlock = oldBlock; oldBlock != nil && oldBlock.NumberU64() != newBlock.NumberU64(); oldBlock = self.GetBlock(oldBlock.ParentHash()) { |
|
|
|
|
deletedTxs = append(deletedTxs, oldBlock.Transactions()...) |
|
|
|
|
|
|
|
|
|
collectLogs(oldBlock.Hash()) |
|
|
|
|
} |
|
|
|
|
} else { |
|
|
|
|
// reduce new chain and append new chain blocks for inserting later on
|
|
|
|
@ -1269,6 +1282,7 @@ func (self *BlockChain) reorg(oldBlock, newBlock *types.Block) error { |
|
|
|
|
} |
|
|
|
|
newChain = append(newChain, newBlock) |
|
|
|
|
deletedTxs = append(deletedTxs, oldBlock.Transactions()...) |
|
|
|
|
collectLogs(oldBlock.Hash()) |
|
|
|
|
|
|
|
|
|
oldBlock, newBlock = self.GetBlock(oldBlock.ParentHash()), self.GetBlock(newBlock.ParentHash()) |
|
|
|
|
if oldBlock == nil { |
|
|
|
@ -1302,7 +1316,6 @@ func (self *BlockChain) reorg(oldBlock, newBlock *types.Block) error { |
|
|
|
|
if err := WriteMipmapBloom(self.chainDb, block.NumberU64(), receipts); err != nil { |
|
|
|
|
return err |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
addedTxs = append(addedTxs, block.Transactions()...) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -1316,7 +1329,12 @@ func (self *BlockChain) reorg(oldBlock, newBlock *types.Block) error { |
|
|
|
|
} |
|
|
|
|
// Must be posted in a goroutine because of the transaction pool trying
|
|
|
|
|
// to acquire the chain manager lock
|
|
|
|
|
go self.eventMux.Post(RemovedTransactionEvent{diff}) |
|
|
|
|
if len(diff) > 0 { |
|
|
|
|
go self.eventMux.Post(RemovedTransactionEvent{diff}) |
|
|
|
|
} |
|
|
|
|
if len(deletedLogs) > 0 { |
|
|
|
|
go self.eventMux.Post(RemovedLogEvent{deletedLogs}) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return nil |
|
|
|
|
} |
|
|
|
|