Skip to content

Commit

Permalink
feat: use tendermint validator set for validator.Active (#65)
Browse files Browse the repository at this point in the history
* feat: use tendermint validator set for validator.Active

* chore: removed GetActive usage for reporters

* chore: removed some .Active() usage

* chore: fixed tests

* chore: removed .Active from metrics

* chore: use snapshot in telegram status command

* chore: use snapshot in discord status command

* chore: use snapshot in telegram params command

* chore: use snapshot in discord params command

* chore: removed validators.SetSoftOptOutThreshold and NeedsToSign

* chore: final

* chore: add tests for State

* chore: add tests for Entry
  • Loading branch information
freak12techno committed Jun 14, 2024
1 parent 914c058 commit 3e8cbf4
Show file tree
Hide file tree
Showing 28 changed files with 676 additions and 419 deletions.
12 changes: 1 addition & 11 deletions .golangci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -18,16 +18,11 @@ linters:
enable-all: true
disable:
- funlen
- scopelint
- interfacer
- exhaustivestruct
- maligned
- golint
- nlreturn
- wrapcheck
- gomnd
- cyclop
- goerr113
- err113
- exhaustruct
- wsl
- lll
Expand All @@ -46,11 +41,6 @@ linters:
- gofmt
- ireturn
- depguard
- nosnakecase
- ifshort
- structcheck
- deadcode
- varcheck
- durationcheck
- gocyclo
- exhaustive
Expand Down
2 changes: 0 additions & 2 deletions pkg/converter/converter.go
Original file line number Diff line number Diff line change
Expand Up @@ -79,11 +79,9 @@ func (c *Converter) ValidatorFromCosmosValidator(
ConsensusAddressHex: fmt.Sprintf("%x", addr),
ConsensusAddressValcons: addr.String(),
OperatorAddress: validator.OperatorAddress,
Status: int32(validator.Status),
Jailed: validator.Jailed,
SigningInfo: valSigningInfo,
VotingPower: big.NewFloat(0).SetInt(validator.DelegatorShares.BigInt()),
NeedsToSign: true,
}
}

Expand Down
12 changes: 0 additions & 12 deletions pkg/data/manager.go
Original file line number Diff line number Diff line change
Expand Up @@ -106,8 +106,6 @@ func (manager *Manager) GetValidators(height int64) (types.Validators, []error)
validators[index] = validator
}

validators.SetVotingPowerPercent()

return validators, nil
}

Expand Down Expand Up @@ -224,16 +222,6 @@ func (manager *Manager) GetValidatorsAndSigningInfoForConsumerChain(height int64
mutex.Unlock()
}

threshold, _ := validators.GetSoftOutOutThreshold(manager.config.ConsumerSoftOptOut)

for _, validator := range validators {
if validator.VotingPower.Cmp(threshold) < 0 {
validator.NeedsToSign = false
}
}

validators.SetVotingPowerPercent()

return validators, errs
}

Expand Down
67 changes: 33 additions & 34 deletions pkg/metrics/metrics.go
Original file line number Diff line number Diff line change
Expand Up @@ -374,93 +374,92 @@ func (m *Manager) LogNodeReconnect(chain string, node string) {

func (m *Manager) LogValidatorStats(
chain *configPkg.ChainConfig,
validator *types.Validator,
signatureInfo types.SignatureInto,
entry *types.Entry,
) {
m.missingBlocksGauge.
With(prometheus.Labels{
"chain": chain.Name,
"moniker": validator.Moniker,
"address": validator.OperatorAddress,
"moniker": entry.Validator.Moniker,
"address": entry.Validator.OperatorAddress,
}).
Set(float64(signatureInfo.GetNotSigned()))
Set(float64(entry.SignatureInfo.GetNotSigned()))

m.activeBlocksGauge.
With(prometheus.Labels{
"chain": chain.Name,
"moniker": validator.Moniker,
"address": validator.OperatorAddress,
"moniker": entry.Validator.Moniker,
"address": entry.Validator.OperatorAddress,
}).
Set(float64(signatureInfo.Active))
Set(float64(entry.SignatureInfo.Active))

m.isActiveGauge.
With(prometheus.Labels{
"chain": chain.Name,
"moniker": validator.Moniker,
"address": validator.OperatorAddress,
"moniker": entry.Validator.Moniker,
"address": entry.Validator.OperatorAddress,
}).
Set(utils.BoolToFloat64(validator.Active()))
Set(utils.BoolToFloat64(entry.IsActive))

m.isJailedGauge.
With(prometheus.Labels{
"chain": chain.Name,
"moniker": validator.Moniker,
"address": validator.OperatorAddress,
"moniker": entry.Validator.Moniker,
"address": entry.Validator.OperatorAddress,
}).
Set(utils.BoolToFloat64(validator.Jailed))
Set(utils.BoolToFloat64(entry.Validator.Jailed))

m.missingBlocksGauge.
With(prometheus.Labels{
"chain": chain.Name,
"moniker": validator.Moniker,
"address": validator.OperatorAddress,
"moniker": entry.Validator.Moniker,
"address": entry.Validator.OperatorAddress,
}).
Set(float64(signatureInfo.GetNotSigned()))
Set(float64(entry.SignatureInfo.GetNotSigned()))

if validator.SigningInfo != nil {
if entry.Validator.SigningInfo != nil {
m.isTombstonedGauge.
With(prometheus.Labels{
"chain": chain.Name,
"moniker": validator.Moniker,
"address": validator.OperatorAddress,
"moniker": entry.Validator.Moniker,
"address": entry.Validator.OperatorAddress,
}).
Set(utils.BoolToFloat64(validator.SigningInfo.Tombstoned))
Set(utils.BoolToFloat64(entry.Validator.SigningInfo.Tombstoned))
}

if validator.Active() {
if entry.IsActive {
if chain.IsConsumer.Bool {
m.needsToSignGauge.
With(prometheus.Labels{
"chain": chain.Name,
"moniker": validator.Moniker,
"address": validator.OperatorAddress,
"moniker": entry.Validator.Moniker,
"address": entry.Validator.OperatorAddress,
}).
Set(utils.BoolToFloat64(validator.NeedsToSign))
Set(utils.BoolToFloat64(entry.NeedsToSign))
}

m.votingPowerGauge.
With(prometheus.Labels{
"chain": chain.Name,
"moniker": validator.Moniker,
"address": validator.OperatorAddress,
"moniker": entry.Validator.Moniker,
"address": entry.Validator.OperatorAddress,
}).
Set(validator.VotingPowerPercent)
Set(entry.Validator.VotingPowerPercent)

m.cumulativeVotingPowerGauge.
With(prometheus.Labels{
"chain": chain.Name,
"moniker": validator.Moniker,
"address": validator.OperatorAddress,
"moniker": entry.Validator.Moniker,
"address": entry.Validator.OperatorAddress,
}).
Set(validator.CumulativeVotingPowerPercent)
Set(entry.Validator.CumulativeVotingPowerPercent)

m.validatorRankGauge.
With(prometheus.Labels{
"chain": chain.Name,
"moniker": validator.Moniker,
"address": validator.OperatorAddress,
"moniker": entry.Validator.Moniker,
"address": entry.Validator.OperatorAddress,
}).
Set(float64(validator.Rank))
Set(float64(entry.Validator.Rank))
}
}

Expand Down
8 changes: 4 additions & 4 deletions pkg/reporters/discord/missing.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ package discord
import (
"fmt"
"main/pkg/constants"
snapshotPkg "main/pkg/snapshot"
"main/pkg/types"
"main/pkg/utils"
"sort"

Expand All @@ -28,8 +28,8 @@ func (reporter *Reporter) GetMissingCommand() *Command {
}

validatorEntries := snapshot.Entries.ToSlice()
activeValidatorsEntries := utils.Filter(validatorEntries, func(v snapshotPkg.Entry) bool {
if !v.Validator.Active() {
activeValidatorsEntries := utils.Filter(validatorEntries, func(v *types.Entry) bool {
if !v.IsActive {
return false
}

Expand All @@ -46,7 +46,7 @@ func (reporter *Reporter) GetMissingCommand() *Command {

render := missingValidatorsRender{
Config: reporter.Config,
Validators: utils.Map(activeValidatorsEntries, func(v snapshotPkg.Entry) missingValidatorsEntry {
Validators: utils.Map(activeValidatorsEntries, func(v *types.Entry) missingValidatorsEntry {
link := reporter.Config.ExplorerConfig.GetValidatorLink(v.Validator)
group, _, _ := reporter.Config.MissedBlocksGroups.GetGroup(v.SignatureInfo.GetNotSigned())
link.Text = fmt.Sprintf("%s %s", group.EmojiEnd, v.Validator.Moniker)
Expand Down
13 changes: 10 additions & 3 deletions pkg/reporters/discord/params.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,18 +18,25 @@ func (reporter *Reporter) GetParamsCommand() *Command {
blockTime := reporter.Manager.GetBlockTime()
maxTimeToJail := reporter.Manager.GetTimeTillJail(0)

validators := reporter.Manager.GetValidators().ToSlice().GetActive()
snapshot, found := reporter.SnapshotManager.GetNewerSnapshot()
if !found {
reporter.Logger.Info().Msg("No older snapshot on telegram params query!")
reporter.BotRespond(s, i, "Error getting params")
return
}

activeValidators := snapshot.Entries.GetActive()
var amount int
if reporter.Config.IsConsumer.Bool {
_, amount = validators.GetSoftOutOutThreshold(reporter.Config.ConsumerSoftOptOut)
_, amount = snapshot.Entries.GetSoftOutOutThreshold(reporter.Config.ConsumerSoftOptOut)
}

template, err := reporter.TemplatesManager.Render("Params", paramsRender{
Config: reporter.Config,
BlockTime: blockTime,
MaxTimeToJail: maxTimeToJail,
ConsumerOptOutValidators: amount,
Validators: validators,
ValidatorsCount: len(activeValidators),
})
if err != nil {
reporter.Logger.Error().Err(err).Msg("Error rendering params template")
Expand Down
36 changes: 19 additions & 17 deletions pkg/reporters/discord/status.go
Original file line number Diff line number Diff line change
Expand Up @@ -36,26 +36,28 @@ func (reporter *Reporter) GetStatusCommand() *Command {
return
}

entries := make([]statusEntry, len(operatorAddresses))
snapshot, found := reporter.SnapshotManager.GetNewerSnapshot()
if !found {
reporter.Logger.Info().
Msg("No older snapshot on discord status query!")
reporter.BotRespond(s, i, "Could not fetch user!")
return
}

for index, operatorAddress := range operatorAddresses {
validator, found := reporter.Manager.GetValidator(operatorAddress)
if !found {
reporter.BotRespond(s, i, fmt.Sprintf(
"Could not find a validator with address <code>%s</code> on %s",
operatorAddress,
reporter.Config.GetName(),
))
return
}
userEntries := snapshot.Entries.ByValidatorAddresses(operatorAddresses)

entries := make([]statusEntry, len(userEntries))

for index, entry := range userEntries {
entries[index] = statusEntry{
Validator: validator,
Link: reporter.Config.ExplorerConfig.GetValidatorLink(validator),
IsActive: entry.IsActive,
NeedsToSign: entry.NeedsToSign,
Validator: entry.Validator,
Link: reporter.Config.ExplorerConfig.GetValidatorLink(entry.Validator),
}

if validator.Active() && !validator.Jailed {
signatureInfo, err := reporter.Manager.GetValidatorMissedBlocks(validator)
if entry.IsActive && !entry.Validator.Jailed {
signatureInfo, err := reporter.Manager.GetValidatorMissedBlocks(entry.Validator)
entries[index].Error = err
entries[index].SigningInfo = signatureInfo
}
Expand All @@ -69,8 +71,8 @@ func (reporter *Reporter) GetStatusCommand() *Command {
return utils.BoolToFloat64(second.Validator.Jailed)-utils.BoolToFloat64(first.Validator.Jailed) > 0
}

if first.Validator.Active() != second.Validator.Active() {
return utils.BoolToFloat64(second.Validator.Active())-utils.BoolToFloat64(first.Validator.Active()) > 0
if first.IsActive != second.IsActive {
return utils.BoolToFloat64(second.IsActive)-utils.BoolToFloat64(first.IsActive) > 0
}

return second.Validator.VotingPowerPercent < first.Validator.VotingPowerPercent
Expand Down
8 changes: 5 additions & 3 deletions pkg/reporters/discord/types.go
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ type paramsRender struct {
BlockTime time.Duration
MaxTimeToJail time.Duration
ConsumerOptOutValidators int
Validators types.Validators
ValidatorsCount int
}

func (r paramsRender) FormatMinSignedPerWindow() string {
Expand Down Expand Up @@ -67,7 +67,7 @@ func (r paramsRender) FormatSoftOptOut() string {
}

func (r paramsRender) GetConsumerRequiredValidators() int {
return len(r.Validators) - r.ConsumerOptOutValidators
return r.ValidatorsCount - r.ConsumerOptOutValidators
}

func (r paramsRender) FormatSnapshotInterval() string {
Expand All @@ -89,6 +89,8 @@ type notifierRender struct {
}

type statusEntry struct {
IsActive bool
NeedsToSign bool
Validator *types.Validator
Error error
SigningInfo types.SignatureInto
Expand All @@ -108,7 +110,7 @@ func (s statusRender) FormatVotingPower(entry statusEntry) string {
text := fmt.Sprintf("%.2f%% VP", entry.Validator.VotingPowerPercent*100)

if s.ChainConfig.IsConsumer.Bool {
if entry.Validator.NeedsToSign {
if entry.NeedsToSign {
text += ", needs to sign blocks"
} else {
text += ", does not need to sign blocks"
Expand Down
8 changes: 4 additions & 4 deletions pkg/reporters/discord/validators.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ package discord
import (
"fmt"
"main/pkg/constants"
snapshotPkg "main/pkg/snapshot"
"main/pkg/types"
"main/pkg/utils"
"sort"

Expand All @@ -28,8 +28,8 @@ func (reporter *Reporter) GetValidatorsCommand() *Command {
}

validatorEntries := snapshot.Entries.ToSlice()
activeValidatorsEntries := utils.Filter(validatorEntries, func(v snapshotPkg.Entry) bool {
return v.Validator.Active()
activeValidatorsEntries := utils.Filter(validatorEntries, func(v *types.Entry) bool {
return v.IsActive
})

sort.Slice(activeValidatorsEntries, func(firstIndex, secondIndex int) bool {
Expand All @@ -41,7 +41,7 @@ func (reporter *Reporter) GetValidatorsCommand() *Command {

render := missingValidatorsRender{
Config: reporter.Config,
Validators: utils.Map(activeValidatorsEntries, func(v snapshotPkg.Entry) missingValidatorsEntry {
Validators: utils.Map(activeValidatorsEntries, func(v *types.Entry) missingValidatorsEntry {
link := reporter.Config.ExplorerConfig.GetValidatorLink(v.Validator)
group, _, _ := reporter.Config.MissedBlocksGroups.GetGroup(v.SignatureInfo.GetNotSigned())
link.Text = fmt.Sprintf("%s %s", group.EmojiEnd, v.Validator.Moniker)
Expand Down
Loading

0 comments on commit 3e8cbf4

Please sign in to comment.