-
Notifications
You must be signed in to change notification settings - Fork 10
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
test: oracle slash e2e #244
test: oracle slash e2e #244
Conversation
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
Important Review skippedDraft detected. Please check the settings in the CodeRabbit UI or the You can disable this status message by setting the Thank you for using CodeRabbit. We offer it for free to the OSS community and would appreciate your support in helping us grow. If you find it useful, would you consider giving us a shout-out on your favorite social media? 🪧 TipsChatThere are 3 ways to chat with CodeRabbit:
Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments. CodeRabbit Commands (Invoked using PR comments)
Other keywords and placeholders
CodeRabbit Configuration File (
|
if err != nil { | ||
return err | ||
} | ||
gasAdjusted := uint64(txf.GasAdjustment() * float64(simRes.GasInfo.GasUsed)) |
Check notice
Code scanning / CodeQL
Floating point arithmetic Note test
validatorUpdates := am.keeper.GetValidatorUpdates(ctx) | ||
forceSeal := false | ||
agc := keeper.GetAggregatorContext(ctx, am.keeper) | ||
agc := am.keeper.GetAggregatorContext(ctx) |
Check warning
Code scanning / CodeQL
Panic in BeginBock or EndBlock consensus methods Warning
x/oracle/module.go
Outdated
am.keeper.JailUntil(ctx, consAddr, jailUntil) | ||
reportedInfo.MissedRoundsCounter = 0 | ||
reportedInfo.IndexOffset = 0 | ||
am.keeper.ClearValidatorMissedRoundBitArray(ctx, validator) | ||
} | ||
continue | ||
} | ||
|
||
index := uint64(reportedInfo.IndexOffset % am.keeper.GetReportedRoundsWindow(ctx)) | ||
reportedInfo.IndexOffset++ | ||
// Update reported round bit array & counter | ||
// This counter just tracks the sum of the bit array | ||
// That way we avoid needing to read/write the whole array each time | ||
previous := am.keeper.GetValidatorMissedRoundBitArray(ctx, validator, index) | ||
missed := !exist | ||
switch { | ||
case !previous && missed: | ||
// Array value has changed from not missed to missed, increment counter | ||
am.keeper.SetValidatorMissedRoundBitArray(ctx, validator, index, true) | ||
reportedInfo.MissedRoundsCounter++ | ||
case previous && !missed: | ||
// Array value has changed from missed to not missed, decrement counter | ||
am.keeper.SetValidatorMissedRoundBitArray(ctx, validator, index, false) | ||
reportedInfo.MissedRoundsCounter-- | ||
default: | ||
// Array value at this index has not changed, no need to update counter | ||
} | ||
minReportedPerWindow := am.keeper.GetMinReportedPerWindow(ctx) | ||
|
||
if missed { | ||
ctx.EventManager().EmitEvent( | ||
sdk.NewEvent( | ||
types.EventTypeOracleLiveness, | ||
sdk.NewAttribute(types.AttributeKeyValidatorKey, validator), | ||
sdk.NewAttribute(types.AttributeKeyMissedRounds, fmt.Sprintf("%d", reportedInfo.MissedRoundsCounter)), | ||
sdk.NewAttribute(types.AttributeKeyHeight, fmt.Sprintf("%d", height)), | ||
), | ||
) | ||
|
||
logger.Debug( | ||
"absent validator", | ||
"height", ctx.BlockHeight(), | ||
"validator", validator, | ||
"missed", reportedInfo.MissedRoundsCounter, | ||
"threshold", minReportedPerWindow, | ||
) | ||
} | ||
|
||
minHeight := reportedInfo.StartHeight + am.keeper.GetReportedRoundsWindow(ctx) | ||
maxMissed := am.keeper.GetReportedRoundsWindow(ctx) - minReportedPerWindow | ||
// if we are past the minimum height and the validator has missed too many rounds reporting prices, punish them | ||
if height > minHeight && reportedInfo.MissedRoundsCounter > maxMissed { | ||
consAddr, err := sdk.ConsAddressFromBech32(validator) | ||
if err != nil { | ||
panic("invalid consAddr string") | ||
} | ||
operator := am.keeper.ValidatorByConsAddr(ctx, consAddr) | ||
if operator != nil && !operator.IsJailed() { | ||
// missing rounds confirmed: slash and jail the validator | ||
coinsBurned := am.keeper.SlashWithInfractionReason(ctx, consAddr, height, power.Int64(), am.keeper.GetSlashFractionMiss(ctx), stakingtypes.Infraction_INFRACTION_UNSPECIFIED) | ||
ctx.EventManager().EmitEvent( | ||
sdk.NewEvent( | ||
types.EventTypeOracleSlash, | ||
sdk.NewAttribute(types.AttributeKeyValidatorKey, validator), | ||
sdk.NewAttribute(types.AttributeKeyPower, fmt.Sprintf("%d", power)), | ||
sdk.NewAttribute(types.AttributeKeyReason, types.AttributeValueMissingReportPrice), | ||
sdk.NewAttribute(types.AttributeKeyJailed, validator), | ||
sdk.NewAttribute(types.AttributeKeyBurnedCoins, coinsBurned.String()), | ||
), | ||
) | ||
am.keeper.Jail(ctx, consAddr) | ||
jailUntil := ctx.BlockHeader().Time.Add(am.keeper.GetMissJailDuration(ctx)) | ||
am.keeper.JailUntil(ctx, consAddr, jailUntil) | ||
|
||
// We need to reset the counter & array so that the validator won't be immediately slashed for miss report info upon rebonding. | ||
reportedInfo.MissedRoundsCounter = 0 | ||
reportedInfo.IndexOffset = 0 | ||
am.keeper.ClearValidatorMissedRoundBitArray(ctx, validator) | ||
|
||
logger.Info( | ||
"slashing and jailing validator due to liveness fault", | ||
"height", height, | ||
"validator", consAddr.String(), | ||
"min_height", minHeight, | ||
"threshold", minReportedPerWindow, | ||
"slashed", am.keeper.GetSlashFractionMiss(ctx).String(), | ||
"jailed_until", jailUntil, | ||
) | ||
} else { | ||
// validator was (a) not found or (b) already jailed so we do not slash | ||
logger.Info( | ||
"validator would have been slashed for too many missed repoerting price, but was either not found in store or already jailed", | ||
"validator", validator, | ||
) | ||
} | ||
} | ||
// Set the updated reportInfo | ||
am.keeper.SetValidatorReportInfo(ctx, validator, reportedInfo) | ||
} | ||
} |
Check warning
Code scanning / CodeQL
Iteration over map Warning
) | ||
consAddr, err := sdk.ConsAddressFromBech32(validator) | ||
if err != nil { | ||
panic("invalid consAddr string") |
Check warning
Code scanning / CodeQL
Panic in BeginBock or EndBlock consensus methods Warning
if height > minHeight && reportedInfo.MissedRoundsCounter > maxMissed { | ||
consAddr, err := sdk.ConsAddressFromBech32(validator) | ||
if err != nil { | ||
panic("invalid consAddr string") |
Check warning
Code scanning / CodeQL
Panic in BeginBock or EndBlock consensus methods Warning
Description
Add e2e test case for oracle slashing/jail
This PR is able to be merged after #224 and #233 are both merged.
This is left as drat, use patch instead of PR after #224 and #233 should be more clear
Closes #XXX