Skip to content
Snippets Groups Projects
consensus.go 1.82 KiB
Newer Older
Androlo's avatar
Androlo committed
package pipe

import (
Casey Kuhlman's avatar
Casey Kuhlman committed
	cm "github.com/eris-ltd/eris-db/Godeps/_workspace/src/github.com/tendermint/tendermint/consensus"
	"github.com/eris-ltd/eris-db/Godeps/_workspace/src/github.com/tendermint/tendermint/p2p"
Ethan Buchman's avatar
Ethan Buchman committed
	"github.com/eris-ltd/eris-db/Godeps/_workspace/src/github.com/tendermint/tendermint/types"
androlo's avatar
androlo committed
	"github.com/eris-ltd/eris-db/Godeps/_workspace/src/github.com/tendermint/tendermint/wire"
Androlo's avatar
Androlo committed
)

// The consensus struct.
type consensus struct {
	consensusState *cm.ConsensusState
	p2pSwitch      *p2p.Switch
}

func newConsensus(consensusState *cm.ConsensusState, p2pSwitch *p2p.Switch) *consensus {
	return &consensus{consensusState, p2pSwitch}
}

// Get the current consensus state.
func (this *consensus) State() (*ConsensusState, error) {
	roundState := this.consensusState.GetRoundState()
	peerRoundStates := []string{}
	for _, peer := range this.p2pSwitch.Peers().List() {
		// TODO: clean this up?
		peerState := peer.Data.Get(types.PeerStateKey).(*cm.PeerState)
Androlo's avatar
Androlo committed
		peerRoundState := peerState.GetRoundState()
androlo's avatar
androlo committed
		peerRoundStateStr := peer.Key + ":" + string(wire.JSONBytes(peerRoundState))
Androlo's avatar
Androlo committed
		peerRoundStates = append(peerRoundStates, peerRoundStateStr)
	}
	return FromRoundState(roundState), nil
}

// Get all validators.
func (this *consensus) Validators() (*ValidatorList, error) {
	var blockHeight int
Ethan Buchman's avatar
Ethan Buchman committed
	bondedValidators := make([]*types.Validator, 0)
	unbondingValidators := make([]*types.Validator, 0)
Androlo's avatar
Androlo committed

	s := this.consensusState.GetState()
	blockHeight = s.LastBlockHeight
Ethan Buchman's avatar
Ethan Buchman committed
	s.BondedValidators.Iterate(func(index int, val *types.Validator) bool {
Androlo's avatar
Androlo committed
		bondedValidators = append(bondedValidators, val)
		return false
	})
Ethan Buchman's avatar
Ethan Buchman committed
	s.UnbondingValidators.Iterate(func(index int, val *types.Validator) bool {
Androlo's avatar
Androlo committed
		unbondingValidators = append(unbondingValidators, val)
		return false
	})

	return &ValidatorList{blockHeight, bondedValidators, unbondingValidators}, nil
}