OSDN Git Service

re design reorganizeChain (#495)
authoripqhjjybj <250657661@qq.com>
Thu, 20 Feb 2020 02:38:00 +0000 (10:38 +0800)
committerGitHub <noreply@github.com>
Thu, 20 Feb 2020 02:38:00 +0000 (10:38 +0800)
protocol/block.go

index 907dc07..6710fb5 100644 (file)
@@ -137,6 +137,41 @@ func (c *Chain) connectBlock(block *types.Block) (err error) {
        return nil
 }
 
+func (c *Chain) detachBlock(detachBlockHeader *types.BlockHeader, consensusResult *state.ConsensusResult, utxoView *state.UtxoViewpoint) (*types.Block, error) {
+       detachHash := detachBlockHeader.Hash()
+       block, err := c.store.GetBlock(&detachHash)
+       if err != nil {
+               return block, err
+       }
+
+       detachBlock := types.MapBlock(block)
+       if err := consensusResult.DetachBlock(block); err != nil {
+               return block, err
+       }
+
+       if err := c.store.GetTransactionsUtxo(utxoView, detachBlock.Transactions); err != nil {
+               return block, err
+       }
+
+       txStatus, err := c.GetTransactionStatus(&detachBlock.ID)
+       if err != nil {
+               return block, err
+       }
+
+       if err := utxoView.DetachBlock(detachBlock, txStatus); err != nil {
+               return block, err
+       }
+
+       for _, p := range c.subProtocols {
+               if err := p.DetachBlock(block); err != nil {
+                       return block, errors.Wrap(err, p.Name(), "sub protocol detach block")
+               }
+       }
+
+       log.WithFields(log.Fields{"module": logModule, "height": detachBlockHeader.Height, "hash": detachHash.String()}).Debug("detach from mainchain")
+       return block, nil
+}
+
 func (c *Chain) reorganizeChain(blockHeader *types.BlockHeader) error {
        attachBlockHeaders, detachBlockHeaders, err := c.calcReorganizeChain(blockHeader, c.bestBlockHeader)
        if err != nil {
@@ -158,42 +193,14 @@ func (c *Chain) reorganizeChain(blockHeader *types.BlockHeader) error {
 
        txsToRestore := map[bc.Hash]*types.Tx{}
        for _, detachBlockHeader := range detachBlockHeaders {
-               detachHash := detachBlockHeader.Hash()
-               b, err := c.store.GetBlock(&detachHash)
+               b, err := c.detachBlock(detachBlockHeader, consensusResult, utxoView)
                if err != nil {
                        return err
                }
 
-               detachBlock := types.MapBlock(b)
-               if err := c.store.GetTransactionsUtxo(utxoView, detachBlock.Transactions); err != nil {
-                       return err
-               }
-
-               txStatus, err := c.GetTransactionStatus(&detachBlock.ID)
-               if err != nil {
-                       return err
-               }
-
-               if err := utxoView.DetachBlock(detachBlock, txStatus); err != nil {
-                       return err
-               }
-
-               if err := consensusResult.DetachBlock(b); err != nil {
-                       return err
-               }
-
-               for _, p := range c.subProtocols {
-                       if err := p.DetachBlock(b); err != nil {
-                               return errors.Wrap(err, p.Name(), "sub protocol detach block")
-                       }
-               }
-
                for _, tx := range b.Transactions {
                        txsToRestore[tx.ID] = tx
                }
-
-               blockHash := blockHeader.Hash()
-               log.WithFields(log.Fields{"module": logModule, "height": blockHeader.Height, "hash": blockHash.String()}).Debug("detach from mainchain")
        }
 
        txsToRemove := map[bc.Hash]*types.Tx{}