package slashing import ( "time" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/x/params" ) // Default parameter namespace const ( DefaultParamspace = "slashing" ) // The Double Sign Jail period ends at Max Time supported by Amino (Dec 31, 9999 - 23:59:59 GMT) var ( DoubleSignJailEndTime = time.Unix(253402300799, 0) ) // Parameter store key var ( KeyMaxEvidenceAge = []byte("MaxEvidenceAge") KeySignedBlocksWindow = []byte("SignedBlocksWindow") KeyMinSignedPerWindow = []byte("MinSignedPerWindow") KeyDowntimeJailDuration = []byte("DowntimeJailDuration") KeySlashFractionDoubleSign = []byte("SlashFractionDoubleSign") KeySlashFractionDowntime = []byte("SlashFractionDowntime") ) // ParamTypeTable for slashing module func ParamTypeTable() params.TypeTable { return params.NewTypeTable().RegisterParamSet(&Params{}) } // Params - used for initializing default parameter for slashing at genesis type Params struct { MaxEvidenceAge time.Duration `json:"max-evidence-age"` SignedBlocksWindow int64 `json:"signed-blocks-window"` MinSignedPerWindow sdk.Dec `json:"min-signed-per-window"` DowntimeJailDuration time.Duration `json:"downtime-jail-duration"` SlashFractionDoubleSign sdk.Dec `json:"slash-fraction-double-sign"` SlashFractionDowntime sdk.Dec `json:"slash-fraction-downtime"` } // Implements params.ParamStruct func (p *Params) KeyValuePairs() params.KeyValuePairs { return params.KeyValuePairs{ {KeyMaxEvidenceAge, &p.MaxEvidenceAge}, {KeySignedBlocksWindow, &p.SignedBlocksWindow}, {KeyMinSignedPerWindow, &p.MinSignedPerWindow}, {KeyDowntimeJailDuration, &p.DowntimeJailDuration}, {KeySlashFractionDoubleSign, &p.SlashFractionDoubleSign}, {KeySlashFractionDowntime, &p.SlashFractionDowntime}, } } // Default parameters used by Cosmos Hub func DefaultParams() Params { return Params{ // defaultMaxEvidenceAge = 60 * 60 * 24 * 7 * 3 // TODO Temporarily set to 2 minutes for testnets. MaxEvidenceAge: 60 * 2 * time.Second, // TODO Temporarily set to 100 blocks for testnets SignedBlocksWindow: 100, // TODO Temporarily set to 10 minutes for testnets DowntimeJailDuration: 60 * 10 * time.Second, MinSignedPerWindow: sdk.NewDecWithPrec(5, 1), SlashFractionDoubleSign: sdk.NewDec(1).Quo(sdk.NewDec(20)), SlashFractionDowntime: sdk.NewDec(1).Quo(sdk.NewDec(100)), } } // MaxEvidenceAge - Max age for evidence - 21 days (3 weeks) // MaxEvidenceAge = 60 * 60 * 24 * 7 * 3 func (k Keeper) MaxEvidenceAge(ctx sdk.Context) (res time.Duration) { k.paramspace.Get(ctx, KeyMaxEvidenceAge, &res) return } // SignedBlocksWindow - sliding window for downtime slashing func (k Keeper) SignedBlocksWindow(ctx sdk.Context) (res int64) { k.paramspace.Get(ctx, KeySignedBlocksWindow, &res) return } // Downtime slashing threshold - default 50% of the SignedBlocksWindow func (k Keeper) MinSignedPerWindow(ctx sdk.Context) int64 { var minSignedPerWindow sdk.Dec k.paramspace.Get(ctx, KeyMinSignedPerWindow, &minSignedPerWindow) signedBlocksWindow := k.SignedBlocksWindow(ctx) return sdk.NewDec(signedBlocksWindow).Mul(minSignedPerWindow).RoundInt64() } // Downtime unbond duration func (k Keeper) DowntimeJailDuration(ctx sdk.Context) (res time.Duration) { k.paramspace.Get(ctx, KeyDowntimeJailDuration, &res) return } // SlashFractionDoubleSign - currently default 5% func (k Keeper) SlashFractionDoubleSign(ctx sdk.Context) (res sdk.Dec) { k.paramspace.Get(ctx, KeySlashFractionDoubleSign, &res) return } // SlashFractionDowntime - currently default 1% func (k Keeper) SlashFractionDowntime(ctx sdk.Context) (res sdk.Dec) { k.paramspace.Get(ctx, KeySlashFractionDowntime, &res) return } // GetParams returns the total set of slashing parameters. func (k Keeper) GetParams(ctx sdk.Context) (params Params) { k.paramspace.GetParamSet(ctx, ¶ms) return params }