mirror of
https://github.com/tendermint/tendermint.git
synced 2026-01-08 14:21:14 +00:00
* Added BlockStore.DeleteBlock() * Added initial block pruner prototype * wip * Added BlockStore.PruneBlocks() * Added consensus setting for block pruning * Added BlockStore base * Error on replay if base does not have blocks * Handle missing blocks when sending VoteSetMaj23Message * Error message tweak * Properly update blockstore state * Error message fix again * blockchain: ignore peer missing blocks * Added FIXME * Added test for block replay with truncated history * Handle peer base in blockchain reactor * Improved replay error handling * Added tests for Store.PruneBlocks() * Fix non-RPC handling of truncated block history * Panic on missing block meta in needProofBlock() * Updated changelog * Handle truncated block history in RPC layer * Added info about earliest block in /status RPC * Reorder height and base in blockchain reactor messages * Updated changelog * Fix tests * Appease linter * Minor review fixes * Non-empty BlockStores should always have base > 0 * Update code to assume base > 0 invariant * Added blockstore tests for pruning to 0 * Make sure we don't prune below the current base * Added BlockStore.Size() * config: added retain_blocks recommendations * Update v1 blockchain reactor to handle blockstore base * Added state database pruning * Propagate errors on missing validator sets * Comment tweaks * Improved error message Co-Authored-By: Anton Kaliaev <anton.kalyaev@gmail.com> * use ABCI field ResponseCommit.retain_height instead of retain-blocks config option * remove State.RetainHeight, return value instead * fix minor issues * rename pruneHeights() to pruneBlocks() * noop to fix GitHub borkage Co-authored-by: Anton Kaliaev <anton.kalyaev@gmail.com>
107 lines
3.5 KiB
Go
107 lines
3.5 KiB
Go
package core
|
|
|
|
import (
|
|
cm "github.com/tendermint/tendermint/consensus"
|
|
tmmath "github.com/tendermint/tendermint/libs/math"
|
|
ctypes "github.com/tendermint/tendermint/rpc/core/types"
|
|
rpctypes "github.com/tendermint/tendermint/rpc/lib/types"
|
|
sm "github.com/tendermint/tendermint/state"
|
|
"github.com/tendermint/tendermint/types"
|
|
)
|
|
|
|
// Validators gets the validator set at the given block height.
|
|
// If no height is provided, it will fetch the current validator set.
|
|
// Note the validators are sorted by their address - 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 Validators(ctx *rpctypes.Context, heightPtr *int64, page, perPage int) (*ctypes.ResultValidators, error) {
|
|
// The latest validator that we know is the
|
|
// NextValidator of the last block.
|
|
height := consensusState.GetState().LastBlockHeight + 1
|
|
height, err := getHeight(blockStore.Base(), height, heightPtr)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
validators, err := sm.LoadValidators(stateDB, height)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
totalCount := len(validators.Validators)
|
|
perPage = validatePerPage(perPage)
|
|
page, err = validatePage(page, 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}, nil
|
|
}
|
|
|
|
// DumpConsensusState dumps consensus state.
|
|
// UNSTABLE
|
|
// More: https://docs.tendermint.com/master/rpc/#/Info/dump_consensus_state
|
|
func DumpConsensusState(ctx *rpctypes.Context) (*ctypes.ResultDumpConsensusState, error) {
|
|
// Get Peer consensus states.
|
|
peers := p2pPeers.Peers().List()
|
|
peerStates := make([]ctypes.PeerStateInfo, len(peers))
|
|
for i, 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[i] = ctypes.PeerStateInfo{
|
|
// Peer basic info.
|
|
NodeAddress: peer.SocketAddr().String(),
|
|
// Peer consensus state.
|
|
PeerState: peerStateJSON,
|
|
}
|
|
}
|
|
// Get self round state.
|
|
roundState, err := 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 ConsensusState(ctx *rpctypes.Context) (*ctypes.ResultConsensusState, error) {
|
|
// Get self round state.
|
|
bz, err := 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 current consensus params.
|
|
// More: https://docs.tendermint.com/master/rpc/#/Info/consensus_params
|
|
func ConsensusParams(ctx *rpctypes.Context, heightPtr *int64) (*ctypes.ResultConsensusParams, error) {
|
|
height := consensusState.GetState().LastBlockHeight + 1
|
|
height, err := getHeight(blockStore.Base(), height, heightPtr)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
consensusparams, err := sm.LoadConsensusParams(stateDB, height)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return &ctypes.ResultConsensusParams{
|
|
BlockHeight: height,
|
|
ConsensusParams: consensusparams}, nil
|
|
}
|