github.com/project-88388/tendermint-v0.34.14-terra.2@v1.0.0/types/block_meta.go (about)

     1  package types
     2  
     3  import (
     4  	"bytes"
     5  	"errors"
     6  	"fmt"
     7  
     8  	tmproto "github.com/tendermint/tendermint/proto/tendermint/types"
     9  )
    10  
    11  // BlockMeta contains meta information.
    12  type BlockMeta struct {
    13  	BlockID   BlockID `json:"block_id"`
    14  	BlockSize int     `json:"block_size"`
    15  	Header    Header  `json:"header"`
    16  	NumTxs    int     `json:"num_txs"`
    17  }
    18  
    19  // NewBlockMeta returns a new BlockMeta.
    20  func NewBlockMeta(block *Block, blockParts *PartSet) *BlockMeta {
    21  	return &BlockMeta{
    22  		BlockID:   BlockID{block.Hash(), blockParts.Header()},
    23  		BlockSize: block.Size(),
    24  		Header:    block.Header,
    25  		NumTxs:    len(block.Data.Txs),
    26  	}
    27  }
    28  
    29  func (bm *BlockMeta) ToProto() *tmproto.BlockMeta {
    30  	if bm == nil {
    31  		return nil
    32  	}
    33  
    34  	pb := &tmproto.BlockMeta{
    35  		BlockID:   bm.BlockID.ToProto(),
    36  		BlockSize: int64(bm.BlockSize),
    37  		Header:    *bm.Header.ToProto(),
    38  		NumTxs:    int64(bm.NumTxs),
    39  	}
    40  	return pb
    41  }
    42  
    43  func BlockMetaFromProto(pb *tmproto.BlockMeta) (*BlockMeta, error) {
    44  	if pb == nil {
    45  		return nil, errors.New("blockmeta is empty")
    46  	}
    47  
    48  	bm := new(BlockMeta)
    49  
    50  	bi, err := BlockIDFromProto(&pb.BlockID)
    51  	if err != nil {
    52  		return nil, err
    53  	}
    54  
    55  	h, err := HeaderFromProto(&pb.Header)
    56  	if err != nil {
    57  		return nil, err
    58  	}
    59  
    60  	bm.BlockID = *bi
    61  	bm.BlockSize = int(pb.BlockSize)
    62  	bm.Header = h
    63  	bm.NumTxs = int(pb.NumTxs)
    64  
    65  	return bm, bm.ValidateBasic()
    66  }
    67  
    68  // ValidateBasic performs basic validation.
    69  func (bm *BlockMeta) ValidateBasic() error {
    70  	if err := bm.BlockID.ValidateBasic(); err != nil {
    71  		return err
    72  	}
    73  	if !bytes.Equal(bm.BlockID.Hash, bm.Header.Hash()) {
    74  		return fmt.Errorf("expected BlockID#Hash and Header#Hash to be the same, got %X != %X",
    75  			bm.BlockID.Hash, bm.Header.Hash())
    76  	}
    77  	return nil
    78  }