aboutsummaryrefslogtreecommitdiffstats
path: root/core/blockchain.go
diff options
context:
space:
mode:
Diffstat (limited to 'core/blockchain.go')
-rw-r--r--core/blockchain.go40
1 files changed, 33 insertions, 7 deletions
diff --git a/core/blockchain.go b/core/blockchain.go
index 5e1fc9424..9d526e352 100644
--- a/core/blockchain.go
+++ b/core/blockchain.go
@@ -149,11 +149,7 @@ func NewBlockChain(chainDb ethdb.Database, pow pow.PoW, mux *event.TypeMux) (*Bl
bc.genesisBlock = bc.GetBlockByNumber(0)
if bc.genesisBlock == nil {
- reader, err := NewDefaultGenesisReader()
- if err != nil {
- return nil, err
- }
- bc.genesisBlock, err = WriteGenesisBlock(chainDb, reader)
+ bc.genesisBlock, err = WriteDefaultGenesisBlock(chainDb)
if err != nil {
return nil, err
}
@@ -984,6 +980,18 @@ func (self *BlockChain) InsertReceiptChain(blockChain types.Blocks, receiptChain
glog.Fatal(errs[index])
return
}
+ if err := WriteTransactions(self.chainDb, block); err != nil {
+ errs[index] = fmt.Errorf("failed to write individual transactions: %v", err)
+ atomic.AddInt32(&failed, 1)
+ glog.Fatal(errs[index])
+ return
+ }
+ if err := WriteReceipts(self.chainDb, receipts); err != nil {
+ errs[index] = fmt.Errorf("failed to write individual receipts: %v", err)
+ atomic.AddInt32(&failed, 1)
+ glog.Fatal(errs[index])
+ return
+ }
atomic.AddInt32(&stats.processed, 1)
}
}
@@ -1244,6 +1252,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
@@ -1251,6 +1270,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
@@ -1273,6 +1294,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 {
@@ -1306,7 +1328,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()...)
}
@@ -1320,7 +1341,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
}