65 lines
2.0 KiB
Go
65 lines
2.0 KiB
Go
package types
|
|
|
|
import (
|
|
"bytes"
|
|
|
|
abci "github.com/tendermint/tendermint/abci/types"
|
|
tmtypes "github.com/tendermint/tendermint/types"
|
|
|
|
sdkerrors "github.com/cosmos/cosmos-sdk/types/errors"
|
|
clientexported "github.com/cosmos/cosmos-sdk/x/ibc/02-client/exported"
|
|
clienttypes "github.com/cosmos/cosmos-sdk/x/ibc/02-client/types"
|
|
commitmenttypes "github.com/cosmos/cosmos-sdk/x/ibc/23-commitment/types"
|
|
)
|
|
|
|
var _ clientexported.Header = Header{}
|
|
|
|
// Header defines the Tendermint consensus Header
|
|
type Header struct {
|
|
tmtypes.SignedHeader // contains the commitment root
|
|
ValidatorSet *tmtypes.ValidatorSet `json:"validator_set" yaml:"validator_set"`
|
|
}
|
|
|
|
// ClientType defines that the Header is a Tendermint consensus algorithm
|
|
func (h Header) ClientType() clientexported.ClientType {
|
|
return clientexported.Tendermint
|
|
}
|
|
|
|
// ConsensusState returns the consensus state associated with the header
|
|
func (h Header) ConsensusState() ConsensusState {
|
|
return ConsensusState{
|
|
Height: uint64(h.Height),
|
|
Timestamp: h.Time,
|
|
Root: commitmenttypes.NewMerkleRoot(h.AppHash),
|
|
ValidatorSet: h.ValidatorSet,
|
|
}
|
|
}
|
|
|
|
// GetHeight returns the current height
|
|
//
|
|
// NOTE: also referred as `sequence`
|
|
func (h Header) GetHeight() uint64 {
|
|
return uint64(h.Height)
|
|
}
|
|
|
|
// ValidateBasic calls the SignedHeader ValidateBasic function
|
|
// and checks that validatorsets are not nil
|
|
func (h Header) ValidateBasic(chainID string) error {
|
|
if err := h.SignedHeader.ValidateBasic(chainID); err != nil {
|
|
return sdkerrors.Wrap(clienttypes.ErrInvalidHeader, err.Error())
|
|
}
|
|
if h.ValidatorSet == nil {
|
|
return sdkerrors.Wrap(clienttypes.ErrInvalidHeader, "validator set is nil")
|
|
}
|
|
if !bytes.Equal(h.ValidatorsHash, h.ValidatorSet.Hash()) {
|
|
return sdkerrors.Wrap(clienttypes.ErrInvalidHeader, "validator set does not match hash")
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// ToABCIHeader parses the header to an ABCI header type.
|
|
// NOTE: only for testing use.
|
|
func (h Header) ToABCIHeader() abci.Header {
|
|
return tmtypes.TM2PB.Header(h.SignedHeader.Header)
|
|
}
|