|
|
- package state
-
- import (
- "fmt"
- "io"
-
- . "github.com/tendermint/tendermint/binary"
- )
-
- // Holds state for a Validator at a given height+round.
- // Meant to be discarded every round of the consensus protocol.
- // TODO consider moving this to another common types package.
- type Validator struct {
- Account
- BondHeight uint32
- UnbondHeight uint32
- LastCommitHeight uint32
- VotingPower uint64
- Accum int64
- }
-
- // Used to persist the state of ConsensusStateControl.
- func ReadValidator(r io.Reader, n *int64, err *error) *Validator {
- return &Validator{
- Account: ReadAccount(r, n, err),
- BondHeight: ReadUInt32(r, n, err),
- UnbondHeight: ReadUInt32(r, n, err),
- LastCommitHeight: ReadUInt32(r, n, err),
- VotingPower: ReadUInt64(r, n, err),
- Accum: ReadInt64(r, n, err),
- }
- }
-
- // Creates a new copy of the validator so we can mutate accum.
- func (v *Validator) Copy() *Validator {
- return &Validator{
- Account: v.Account,
- BondHeight: v.BondHeight,
- UnbondHeight: v.UnbondHeight,
- LastCommitHeight: v.LastCommitHeight,
- VotingPower: v.VotingPower,
- Accum: v.Accum,
- }
- }
-
- // Used to persist the state of ConsensusStateControl.
- func (v *Validator) WriteTo(w io.Writer) (n int64, err error) {
- WriteBinary(w, v.Account, &n, &err)
- WriteUInt32(w, v.BondHeight, &n, &err)
- WriteUInt32(w, v.UnbondHeight, &n, &err)
- WriteUInt32(w, v.LastCommitHeight, &n, &err)
- WriteUInt64(w, v.VotingPower, &n, &err)
- WriteInt64(w, v.Accum, &n, &err)
- return
- }
-
- // Returns the one with higher Accum.
- func (v *Validator) CompareAccum(other *Validator) *Validator {
- if v == nil {
- return other
- }
- if v.Accum > other.Accum {
- return v
- } else if v.Accum < other.Accum {
- return other
- } else {
- if v.Id < other.Id {
- return v
- } else if v.Id > other.Id {
- return other
- } else {
- panic("Cannot compare identical validators")
- }
- }
- }
-
- func (v *Validator) String() string {
- return fmt.Sprintf("Validator{%v VP:%v A:%v}", v.Account, v.VotingPower, v.Accum)
- }
-
- //-------------------------------------
-
- var ValidatorCodec = validatorCodec{}
-
- type validatorCodec struct{}
-
- func (vc validatorCodec) Encode(o interface{}, w io.Writer, n *int64, err *error) {
- WriteBinary(w, o.(*Validator), n, err)
- }
-
- func (vc validatorCodec) Decode(r io.Reader, n *int64, err *error) interface{} {
- return ReadValidator(r, n, err)
- }
-
- func (vc validatorCodec) Compare(o1 interface{}, o2 interface{}) int {
- panic("ValidatorCodec.Compare not implemented")
- }
|