perf(x/staking/keeper): make Slash return early iff zero tokens to burn (#18049)

This commit is contained in:
Emmanuel T Odeke 2023-10-16 17:50:08 +03:00 committed by GitHub
parent bb34c42f06
commit 13afd9389b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 17 additions and 2 deletions

View File

@ -52,6 +52,7 @@ Ref: https://keepachangelog.com/en/1.0.0/
### Improvements
* (x/staking/keeper) [#]18049(https://github.com/cosmos/cosmos-sdk/pull/18049) return early if Slash encounters zero tokens to burn.
* (x/staking/keeper) [#18035](https://github.com/cosmos/cosmos-sdk/pull/18035) Hoisted out of the redelegation loop, the non-changing validator and delegator addresses parsing.
* (keyring) [#17913](https://github.com/cosmos/cosmos-sdk/pull/17913) Add `NewAutoCLIKeyring` for creating an AutoCLI keyring from a SDK keyring.
* (codec) [#17913](https://github.com/cosmos/cosmos-sdk/pull/17913) `codectypes.NewAnyWithValue` supports proto v2 messages.

View File

@ -147,12 +147,26 @@ func (k Keeper) Slash(ctx context.Context, consAddr sdk.ConsAddress, infractionH
tokensToBurn := math.MinInt(remainingSlashAmount, validator.Tokens)
tokensToBurn = math.MaxInt(tokensToBurn, math.ZeroInt()) // defensive.
if tokensToBurn.IsZero() {
// Nothing to burn, we can end this route immediately! We also don't
// need to call the k.Hooks().BeforeValidatorSlashed hook as we won't
// be slashing at all.
logger.Info(
"no validator slashing because slash amount is zero",
"validator", validator.GetOperator(),
"slash_factor", slashFactor.String(),
"burned", tokensToBurn,
"validatorTokens", validator.Tokens,
)
return math.NewInt(0), nil
}
// we need to calculate the *effective* slash fraction for distribution
if validator.Tokens.IsPositive() {
effectiveFraction := math.LegacyNewDecFromInt(tokensToBurn).QuoRoundUp(math.LegacyNewDecFromInt(validator.Tokens))
// possible if power has changed
if effectiveFraction.GT(math.LegacyOneDec()) {
effectiveFraction = math.LegacyOneDec()
if oneDec := math.LegacyOneDec(); effectiveFraction.GT(oneDec) {
effectiveFraction = oneDec
}
// call the before-slashed hook
if err := k.Hooks().BeforeValidatorSlashed(ctx, operatorAddress, effectiveFraction); err != nil {