github.com/evdatsion/aphelion-dpos-bft@v0.32.1/lite/base_verifier.go (about)

     1  package lite
     2  
     3  import (
     4  	"bytes"
     5  
     6  	cmn "github.com/evdatsion/aphelion-dpos-bft/libs/common"
     7  	lerr "github.com/evdatsion/aphelion-dpos-bft/lite/errors"
     8  	"github.com/evdatsion/aphelion-dpos-bft/types"
     9  )
    10  
    11  var _ Verifier = (*BaseVerifier)(nil)
    12  
    13  // BaseVerifier lets us check the validity of SignedHeaders at height or
    14  // later, requiring sufficient votes (> 2/3) from the given valset.
    15  // To verify blocks produced by a blockchain with mutable validator sets,
    16  // use the DynamicVerifier.
    17  // TODO: Handle unbonding time.
    18  type BaseVerifier struct {
    19  	chainID string
    20  	height  int64
    21  	valset  *types.ValidatorSet
    22  }
    23  
    24  // NewBaseVerifier returns a new Verifier initialized with a validator set at
    25  // some height.
    26  func NewBaseVerifier(chainID string, height int64, valset *types.ValidatorSet) *BaseVerifier {
    27  	if valset.IsNilOrEmpty() {
    28  		panic("NewBaseVerifier requires a valid valset")
    29  	}
    30  	return &BaseVerifier{
    31  		chainID: chainID,
    32  		height:  height,
    33  		valset:  valset,
    34  	}
    35  }
    36  
    37  // Implements Verifier.
    38  func (bv *BaseVerifier) ChainID() string {
    39  	return bv.chainID
    40  }
    41  
    42  // Implements Verifier.
    43  func (bv *BaseVerifier) Verify(signedHeader types.SignedHeader) error {
    44  
    45  	// We can't verify commits for a different chain.
    46  	if signedHeader.ChainID != bv.chainID {
    47  		return cmn.NewError("BaseVerifier chainID is %v, cannot verify chainID %v",
    48  			bv.chainID, signedHeader.ChainID)
    49  	}
    50  
    51  	// We can't verify commits older than bv.height.
    52  	if signedHeader.Height < bv.height {
    53  		return cmn.NewError("BaseVerifier height is %v, cannot verify height %v",
    54  			bv.height, signedHeader.Height)
    55  	}
    56  
    57  	// We can't verify with the wrong validator set.
    58  	if !bytes.Equal(signedHeader.ValidatorsHash,
    59  		bv.valset.Hash()) {
    60  		return lerr.ErrUnexpectedValidators(signedHeader.ValidatorsHash, bv.valset.Hash())
    61  	}
    62  
    63  	// Do basic sanity checks.
    64  	err := signedHeader.ValidateBasic(bv.chainID)
    65  	if err != nil {
    66  		return cmn.ErrorWrap(err, "in verify")
    67  	}
    68  
    69  	// Check commit signatures.
    70  	err = bv.valset.VerifyCommit(
    71  		bv.chainID, signedHeader.Commit.BlockID,
    72  		signedHeader.Height, signedHeader.Commit)
    73  	if err != nil {
    74  		return cmn.ErrorWrap(err, "in verify")
    75  	}
    76  
    77  	return nil
    78  }