package core import ( "errors" cm "github.com/tendermint/tendermint/internal/consensus" tmmath "github.com/tendermint/tendermint/libs/math" ctypes "github.com/tendermint/tendermint/rpc/core/types" rpctypes "github.com/tendermint/tendermint/rpc/jsonrpc/types" "github.com/tendermint/tendermint/types" ) // Validators gets the validator set at the given block height. // // If no height is provided, it will fetch the latest validator set. Note the // validators are sorted by their voting power - this is the canonical order // for the validators in the set as used in computing their Merkle root. // // More: https://docs.tendermint.com/master/rpc/#/Info/validators func (env *Environment) Validators( ctx *rpctypes.Context, heightPtr *int64, pagePtr, perPagePtr *int) (*ctypes.ResultValidators, error) { // The latest validator that we know is the NextValidator of the last block. height, err := env.getHeight(env.latestUncommittedHeight(), heightPtr) if err != nil { return nil, err } validators, err := env.StateStore.LoadValidators(height) if err != nil { return nil, err } totalCount := len(validators.Validators) perPage := env.validatePerPage(perPagePtr) page, err := validatePage(pagePtr, perPage, totalCount) if err != nil { return nil, err } skipCount := validateSkipCount(page, perPage) v := validators.Validators[skipCount : skipCount+tmmath.MinInt(perPage, totalCount-skipCount)] return &ctypes.ResultValidators{ BlockHeight: height, Validators: v, Count: len(v), Total: totalCount}, nil } // DumpConsensusState dumps consensus state. // UNSTABLE // More: https://docs.tendermint.com/master/rpc/#/Info/dump_consensus_state func (env *Environment) DumpConsensusState(ctx *rpctypes.Context) (*ctypes.ResultDumpConsensusState, error) { // Get Peer consensus states. var peerStates []ctypes.PeerStateInfo switch { case env.P2PPeers != nil: peers := env.P2PPeers.Peers().List() peerStates = make([]ctypes.PeerStateInfo, 0, len(peers)) for _, peer := range peers { peerState, ok := peer.Get(types.PeerStateKey).(*cm.PeerState) if !ok { // peer does not have a state yet continue } peerStateJSON, err := peerState.ToJSON() if err != nil { return nil, err } peerStates = append(peerStates, ctypes.PeerStateInfo{ // Peer basic info. NodeAddress: peer.SocketAddr().String(), // Peer consensus state. PeerState: peerStateJSON, }) } case env.PeerManager != nil: peers := env.PeerManager.Peers() peerStates = make([]ctypes.PeerStateInfo, 0, len(peers)) for _, pid := range peers { peerState, ok := env.ConsensusReactor.GetPeerState(pid) if !ok { continue } peerStateJSON, err := peerState.ToJSON() if err != nil { return nil, err } addr := env.PeerManager.Addresses(pid) if len(addr) >= 1 { peerStates = append(peerStates, ctypes.PeerStateInfo{ // Peer basic info. NodeAddress: addr[0].String(), // Peer consensus state. PeerState: peerStateJSON, }) } } default: return nil, errors.New("no peer system configured") } // Get self round state. roundState, err := env.ConsensusState.GetRoundStateJSON() if err != nil { return nil, err } return &ctypes.ResultDumpConsensusState{ RoundState: roundState, Peers: peerStates}, nil } // ConsensusState returns a concise summary of the consensus state. // UNSTABLE // More: https://docs.tendermint.com/master/rpc/#/Info/consensus_state func (env *Environment) GetConsensusState(ctx *rpctypes.Context) (*ctypes.ResultConsensusState, error) { // Get self round state. bz, err := env.ConsensusState.GetRoundStateSimpleJSON() return &ctypes.ResultConsensusState{RoundState: bz}, err } // ConsensusParams gets the consensus parameters at the given block height. // If no height is provided, it will fetch the latest consensus params. // More: https://docs.tendermint.com/master/rpc/#/Info/consensus_params func (env *Environment) ConsensusParams( ctx *rpctypes.Context, heightPtr *int64) (*ctypes.ResultConsensusParams, error) { // The latest consensus params that we know is the consensus params after the // last block. height, err := env.getHeight(env.latestUncommittedHeight(), heightPtr) if err != nil { return nil, err } consensusParams, err := env.StateStore.LoadConsensusParams(height) if err != nil { return nil, err } return &ctypes.ResultConsensusParams{ BlockHeight: height, ConsensusParams: consensusParams}, nil }