mirror of
https://github.com/tendermint/tendermint.git
synced 2026-01-08 14:21:14 +00:00
The `NodeInfo` interface does not appear to serve any purpose at all, so I removed it and renamed the `DefaultNodeInfo` struct to `NodeInfo` (including the Protobuf representations). Let me know if this is actually needed for anything. Only the Protobuf rename is listed in the changelog, since we do not officially support API stability of the `p2p` package (according to `README.md`). The on-wire protocol remains compatible.
85 lines
2.5 KiB
Go
85 lines
2.5 KiB
Go
package core
|
|
|
|
import (
|
|
"time"
|
|
|
|
tmbytes "github.com/tendermint/tendermint/libs/bytes"
|
|
ctypes "github.com/tendermint/tendermint/rpc/core/types"
|
|
rpctypes "github.com/tendermint/tendermint/rpc/jsonrpc/types"
|
|
"github.com/tendermint/tendermint/types"
|
|
)
|
|
|
|
// Status returns Tendermint status including node info, pubkey, latest block
|
|
// hash, app hash, block height and time.
|
|
// More: https://docs.tendermint.com/master/rpc/#/Info/status
|
|
func Status(ctx *rpctypes.Context) (*ctypes.ResultStatus, error) {
|
|
var (
|
|
earliestBlockHeight int64
|
|
earliestBlockHash tmbytes.HexBytes
|
|
earliestAppHash tmbytes.HexBytes
|
|
earliestBlockTimeNano int64
|
|
)
|
|
|
|
if earliestBlockMeta := env.BlockStore.LoadBaseMeta(); earliestBlockMeta != nil {
|
|
earliestBlockHeight = earliestBlockMeta.Header.Height
|
|
earliestAppHash = earliestBlockMeta.Header.AppHash
|
|
earliestBlockHash = earliestBlockMeta.BlockID.Hash
|
|
earliestBlockTimeNano = earliestBlockMeta.Header.Time.UnixNano()
|
|
}
|
|
|
|
var (
|
|
latestBlockHash tmbytes.HexBytes
|
|
latestAppHash tmbytes.HexBytes
|
|
latestBlockTimeNano int64
|
|
|
|
latestHeight = env.BlockStore.Height()
|
|
)
|
|
|
|
if latestHeight != 0 {
|
|
if latestBlockMeta := env.BlockStore.LoadBlockMeta(latestHeight); latestBlockMeta != nil {
|
|
latestBlockHash = latestBlockMeta.BlockID.Hash
|
|
latestAppHash = latestBlockMeta.Header.AppHash
|
|
latestBlockTimeNano = latestBlockMeta.Header.Time.UnixNano()
|
|
}
|
|
}
|
|
|
|
// Return the very last voting power, not the voting power of this validator
|
|
// during the last block.
|
|
var votingPower int64
|
|
if val := validatorAtHeight(latestUncommittedHeight()); val != nil {
|
|
votingPower = val.VotingPower
|
|
}
|
|
|
|
result := &ctypes.ResultStatus{
|
|
NodeInfo: env.P2PTransport.NodeInfo(),
|
|
SyncInfo: ctypes.SyncInfo{
|
|
LatestBlockHash: latestBlockHash,
|
|
LatestAppHash: latestAppHash,
|
|
LatestBlockHeight: latestHeight,
|
|
LatestBlockTime: time.Unix(0, latestBlockTimeNano),
|
|
EarliestBlockHash: earliestBlockHash,
|
|
EarliestAppHash: earliestAppHash,
|
|
EarliestBlockHeight: earliestBlockHeight,
|
|
EarliestBlockTime: time.Unix(0, earliestBlockTimeNano),
|
|
CatchingUp: env.ConsensusReactor.WaitSync(),
|
|
},
|
|
ValidatorInfo: ctypes.ValidatorInfo{
|
|
Address: env.PubKey.Address(),
|
|
PubKey: env.PubKey,
|
|
VotingPower: votingPower,
|
|
},
|
|
}
|
|
|
|
return result, nil
|
|
}
|
|
|
|
func validatorAtHeight(h int64) *types.Validator {
|
|
vals, err := env.StateStore.LoadValidators(h)
|
|
if err != nil {
|
|
return nil
|
|
}
|
|
privValAddress := env.PubKey.Address()
|
|
_, val := vals.GetByAddress(privValAddress)
|
|
return val
|
|
}
|