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 }