package lite
|
|
|
|
import (
|
|
"bytes"
|
|
|
|
"github.com/pkg/errors"
|
|
|
|
"github.com/tendermint/tendermint/types"
|
|
|
|
liteErr "github.com/tendermint/tendermint/lite/errors"
|
|
)
|
|
|
|
var _ Certifier = (*StaticCertifier)(nil)
|
|
|
|
// StaticCertifier assumes a static set of validators, set on
|
|
// initilization and checks against them.
|
|
// The signatures on every header is checked for > 2/3 votes
|
|
// against the known validator set upon Certify
|
|
//
|
|
// Good for testing or really simple chains. Building block
|
|
// to support real-world functionality.
|
|
type StaticCertifier struct {
|
|
chainID string
|
|
vSet *types.ValidatorSet
|
|
vhash []byte
|
|
}
|
|
|
|
// NewStaticCertifier returns a new certifier with a static validator set.
|
|
func NewStaticCertifier(chainID string, vals *types.ValidatorSet) *StaticCertifier {
|
|
return &StaticCertifier{
|
|
chainID: chainID,
|
|
vSet: vals,
|
|
}
|
|
}
|
|
|
|
// ChainID returns the chain id.
|
|
// Implements Certifier.
|
|
func (sc *StaticCertifier) ChainID() string {
|
|
return sc.chainID
|
|
}
|
|
|
|
// Validators returns the validator set.
|
|
func (sc *StaticCertifier) Validators() *types.ValidatorSet {
|
|
return sc.vSet
|
|
}
|
|
|
|
// Hash returns the hash of the validator set.
|
|
func (sc *StaticCertifier) Hash() []byte {
|
|
if len(sc.vhash) == 0 {
|
|
sc.vhash = sc.vSet.Hash()
|
|
}
|
|
return sc.vhash
|
|
}
|
|
|
|
// Certify makes sure that the commit is valid.
|
|
// Implements Certifier.
|
|
func (sc *StaticCertifier) Certify(commit Commit) error {
|
|
// do basic sanity checks
|
|
err := commit.ValidateBasic(sc.chainID)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
// make sure it has the same validator set we have (static means static)
|
|
if !bytes.Equal(sc.Hash(), commit.Header.ValidatorsHash) {
|
|
return liteErr.ErrValidatorsChanged()
|
|
}
|
|
|
|
// then make sure we have the proper signatures for this
|
|
err = sc.vSet.VerifyCommit(sc.chainID, commit.Commit.BlockID,
|
|
commit.Header.Height, commit.Commit)
|
|
return errors.WithStack(err)
|
|
}
|