github.com/okex/exchain@v1.8.0/libs/tendermint/lite/proxy/block.go (about)

     1  package proxy
     2  
     3  import (
     4  	"bytes"
     5  	"errors"
     6  
     7  	"github.com/okex/exchain/libs/tendermint/types"
     8  )
     9  
    10  func ValidateBlockMeta(meta *types.BlockMeta, sh types.SignedHeader) error {
    11  	if meta == nil {
    12  		return errors.New("expecting a non-nil BlockMeta")
    13  	}
    14  	// TODO: check the BlockID??
    15  	return ValidateHeader(&meta.Header, sh)
    16  }
    17  
    18  func ValidateBlock(meta *types.Block, sh types.SignedHeader) error {
    19  	if meta == nil {
    20  		return errors.New("expecting a non-nil Block")
    21  	}
    22  	err := ValidateHeader(&meta.Header, sh)
    23  	if err != nil {
    24  		return err
    25  	}
    26  	if !bytes.Equal(meta.Data.Hash(meta.Height), meta.Header.DataHash) {
    27  		return errors.New("data hash doesn't match header")
    28  	}
    29  	return nil
    30  }
    31  
    32  func ValidateHeader(head *types.Header, sh types.SignedHeader) error {
    33  	if head == nil {
    34  		return errors.New("expecting a non-nil Header")
    35  	}
    36  	if sh.Header == nil {
    37  		return errors.New("unexpected empty SignedHeader")
    38  	}
    39  	// Make sure they are for the same height (obvious fail).
    40  	if head.Height != sh.Height {
    41  		return errors.New("header heights mismatched")
    42  	}
    43  	// Check if they are equal by using hashes.
    44  	if !bytes.Equal(head.Hash(), sh.Hash()) {
    45  		return errors.New("headers don't match")
    46  	}
    47  	return nil
    48  }