ソースを参照

core: force block process & fixed chain manager test

obscuren 10 年 前
コミット
72d065d491
3 ファイル変更24 行追加4 行削除
  1. 14 0
      core/block_processor.go
  2. 6 1
      core/chain_manager.go
  3. 4 3
      core/chain_manager_test.go

+ 14 - 0
core/block_processor.go

@@ -149,6 +149,20 @@ func (self *BlockProcessor) ApplyTransactions(coinbase *state.StateObject, state
 	return receipts, err
 }
 
+func (sm *BlockProcessor) RetryProcess(block *types.Block) (logs state.Logs, err error) {
+	// Processing a blocks may never happen simultaneously
+	sm.mutex.Lock()
+	defer sm.mutex.Unlock()
+
+	header := block.Header()
+	if !sm.bc.HasBlock(header.ParentHash) {
+		return nil, ParentError(header.ParentHash)
+	}
+	parent := sm.bc.GetBlock(header.ParentHash)
+
+	return sm.processWithParent(block, parent)
+}
+
 // Process block will attempt to process the given block's transactions and applies them
 // on top of the block's parent state (given it exists) and will return wether it was
 // successful or not.

+ 6 - 1
core/chain_manager.go

@@ -322,7 +322,12 @@ func (self *ChainManager) Export(w io.Writer) error {
 	last := self.currentBlock.NumberU64()
 
 	for nr := uint64(0); nr <= last; nr++ {
-		if err := self.GetBlockByNumber(nr).EncodeRLP(w); err != nil {
+		block := self.GetBlockByNumber(nr)
+		if block == nil {
+			return fmt.Errorf("export failed on #%d: not found", nr)
+		}
+
+		if err := block.EncodeRLP(w); err != nil {
 			return err
 		}
 	}

+ 4 - 3
core/chain_manager_test.go

@@ -69,15 +69,16 @@ func printChain(bc *ChainManager) {
 func testChain(chainB types.Blocks, bman *BlockProcessor) (*big.Int, error) {
 	td := new(big.Int)
 	for _, block := range chainB {
-		td2, _, err := bman.bc.processor.Process(block)
+		_, err := bman.bc.processor.Process(block)
 		if err != nil {
 			if IsKnownBlockErr(err) {
 				continue
 			}
 			return nil, err
 		}
-		block.Td = td2
-		td = td2
+		parent := bman.bc.GetBlock(block.ParentHash())
+		block.Td = CalculateTD(block, parent)
+		td = block.Td
 
 		bman.bc.mu.Lock()
 		{