github.com/bytom/bytom@v1.1.2-0.20221014091027-bbcba3df6075/test/mock/chain.go (about)

     1  package mock
     2  
     3  import (
     4  	"errors"
     5  	"github.com/bytom/bytom/protocol/bc"
     6  	"github.com/bytom/bytom/protocol/bc/types"
     7  )
     8  
     9  var (
    10  	ErrFoundHeaderByHash   = errors.New("can't find header by hash")
    11  	ErrFoundHeaderByHeight = errors.New("can't find header by height")
    12  )
    13  
    14  type Chain struct {
    15  	bestBlockHeader *types.BlockHeader
    16  	heightMap       map[uint64]*types.Block
    17  	blockMap        map[bc.Hash]*types.Block
    18  
    19  	prevOrphans map[bc.Hash]*types.Block
    20  }
    21  
    22  func NewChain() *Chain {
    23  	return &Chain{
    24  		heightMap:   map[uint64]*types.Block{},
    25  		blockMap:    map[bc.Hash]*types.Block{},
    26  		prevOrphans: make(map[bc.Hash]*types.Block),
    27  	}
    28  }
    29  
    30  func (c *Chain) LastJustifiedHeader() (*types.BlockHeader, error) {
    31  	return nil, nil
    32  }
    33  
    34  func (c *Chain) BestBlockHeader() *types.BlockHeader {
    35  	return c.bestBlockHeader
    36  }
    37  
    38  func (c *Chain) BestBlockHeight() uint64 {
    39  	return c.bestBlockHeader.Height
    40  }
    41  
    42  func (c *Chain) CalcNextSeed(hash *bc.Hash) (*bc.Hash, error) {
    43  	return &bc.Hash{V0: hash.V1, V1: hash.V2, V2: hash.V3, V3: hash.V0}, nil
    44  }
    45  
    46  func (c *Chain) GetBlockByHash(hash *bc.Hash) (*types.Block, error) {
    47  	block, ok := c.blockMap[*hash]
    48  	if !ok {
    49  		return nil, errors.New("can't find block")
    50  	}
    51  	return block, nil
    52  }
    53  
    54  func (c *Chain) GetBlockByHeight(height uint64) (*types.Block, error) {
    55  	block, ok := c.heightMap[height]
    56  	if !ok {
    57  		return nil, errors.New("can't find block")
    58  	}
    59  	return block, nil
    60  }
    61  
    62  func (c *Chain) GetHeaderByHash(hash *bc.Hash) (*types.BlockHeader, error) {
    63  	block, ok := c.blockMap[*hash]
    64  	if !ok {
    65  		return nil, errors.New("can't find block")
    66  	}
    67  	return &block.BlockHeader, nil
    68  }
    69  
    70  func (c *Chain) GetHeaderByHeight(height uint64) (*types.BlockHeader, error) {
    71  	block, ok := c.heightMap[height]
    72  	if !ok {
    73  		return nil, errors.New("can't find block")
    74  	}
    75  	return &block.BlockHeader, nil
    76  }
    77  
    78  func (c *Chain) InMainChain(hash bc.Hash) bool {
    79  	block, ok := c.blockMap[hash]
    80  	if !ok {
    81  		return false
    82  	}
    83  	return c.heightMap[block.Height] == block
    84  }
    85  
    86  func (c *Chain) ProcessBlock(block *types.Block) (bool, error) {
    87  	if c.bestBlockHeader.Hash() == block.PreviousBlockHash {
    88  		c.heightMap[block.Height] = block
    89  		c.blockMap[block.Hash()] = block
    90  		c.bestBlockHeader = &block.BlockHeader
    91  		return false, nil
    92  	}
    93  
    94  	if _, ok := c.blockMap[block.PreviousBlockHash]; !ok {
    95  		c.prevOrphans[block.PreviousBlockHash] = block
    96  		return true, nil
    97  	}
    98  
    99  	c.blockMap[block.Hash()] = block
   100  	for c.prevOrphans[block.Hash()] != nil {
   101  		block = c.prevOrphans[block.Hash()]
   102  		c.blockMap[block.Hash()] = block
   103  	}
   104  
   105  	if block.Height < c.bestBlockHeader.Height {
   106  		return false, nil
   107  	}
   108  
   109  	c.bestBlockHeader = &block.BlockHeader
   110  	for !c.InMainChain(block.Hash()) {
   111  		c.heightMap[block.Height] = block
   112  		block = c.blockMap[block.PreviousBlockHash]
   113  	}
   114  	return false, nil
   115  }
   116  
   117  func (c *Chain) SetBestBlockHeader(header *types.BlockHeader) {
   118  	c.bestBlockHeader = header
   119  }
   120  
   121  func (c *Chain) SetBlockByHeight(height uint64, block *types.Block) {
   122  	c.heightMap[height] = block
   123  	c.blockMap[block.Hash()] = block
   124  }
   125  
   126  func (c *Chain) ValidateTx(*types.Tx) (bool, error) {
   127  	return false, nil
   128  }