@ -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
}