github.com/fibonacci-chain/fbc@v0.0.0-20231124064014-c7636198c1e9/x/slashing/internal/types/params.go (about) 1 package types 2 3 import ( 4 "fmt" 5 "time" 6 7 sdk "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/types" 8 "github.com/fibonacci-chain/fbc/x/params" 9 ) 10 11 // Default parameter namespace 12 const ( 13 DefaultParamspace = ModuleName 14 DefaultSignedBlocksWindow = int64(10000) 15 DefaultDowntimeJailDuration = 60 * 10 * time.Second 16 ) 17 18 var ( 19 DefaultMinSignedPerWindow = sdk.NewDecWithPrec(5, 2) 20 DefaultSlashFractionDoubleSign = sdk.ZeroDec() 21 DefaultSlashFractionDowntime = sdk.ZeroDec() 22 //DefaultSlashFractionDoubleSign = sdk.NewDec(1).Quo(sdk.NewDec(20)) 23 //DefaultSlashFractionDowntime = sdk.NewDec(1).Quo(sdk.NewDec(100)) 24 ) 25 26 // Parameter store keys 27 var ( 28 KeySignedBlocksWindow = []byte("SignedBlocksWindow") 29 KeyMinSignedPerWindow = []byte("MinSignedPerWindow") 30 KeyDowntimeJailDuration = []byte("DowntimeJailDuration") 31 KeySlashFractionDoubleSign = []byte("SlashFractionDoubleSign") 32 KeySlashFractionDowntime = []byte("SlashFractionDowntime") 33 ) 34 35 // ParamKeyTable for slashing module 36 func ParamKeyTable() params.KeyTable { 37 return params.NewKeyTable().RegisterParamSet(&Params{}) 38 } 39 40 // Params - used for initializing default parameter for slashing at genesis 41 type Params struct { 42 SignedBlocksWindow int64 `json:"signed_blocks_window" yaml:"signed_blocks_window"` 43 MinSignedPerWindow sdk.Dec `json:"min_signed_per_window" yaml:"min_signed_per_window"` 44 DowntimeJailDuration time.Duration `json:"downtime_jail_duration" yaml:"downtime_jail_duration"` 45 SlashFractionDoubleSign sdk.Dec `json:"slash_fraction_double_sign" yaml:"slash_fraction_double_sign"` 46 SlashFractionDowntime sdk.Dec `json:"slash_fraction_downtime" yaml:"slash_fraction_downtime"` 47 } 48 49 // NewParams creates a new Params object 50 func NewParams( 51 signedBlocksWindow int64, minSignedPerWindow sdk.Dec, downtimeJailDuration time.Duration, 52 slashFractionDoubleSign, slashFractionDowntime sdk.Dec, 53 ) Params { 54 55 return Params{ 56 SignedBlocksWindow: signedBlocksWindow, 57 MinSignedPerWindow: minSignedPerWindow, 58 DowntimeJailDuration: downtimeJailDuration, 59 SlashFractionDoubleSign: slashFractionDoubleSign, 60 SlashFractionDowntime: slashFractionDowntime, 61 } 62 } 63 64 // String implements the stringer interface for Params 65 func (p Params) String() string { 66 return fmt.Sprintf(`Slashing Params: 67 SignedBlocksWindow: %d 68 MinSignedPerWindow: %s 69 DowntimeJailDuration: %s 70 SlashFractionDoubleSign: %s 71 SlashFractionDowntime: %s`, 72 p.SignedBlocksWindow, p.MinSignedPerWindow, 73 p.DowntimeJailDuration, p.SlashFractionDoubleSign, 74 p.SlashFractionDowntime) 75 } 76 77 // ParamSetPairs - Implements params.ParamSet 78 func (p *Params) ParamSetPairs() params.ParamSetPairs { 79 return params.ParamSetPairs{ 80 params.NewParamSetPair(KeySignedBlocksWindow, &p.SignedBlocksWindow, validateSignedBlocksWindow), 81 params.NewParamSetPair(KeyMinSignedPerWindow, &p.MinSignedPerWindow, validateMinSignedPerWindow), 82 params.NewParamSetPair(KeyDowntimeJailDuration, &p.DowntimeJailDuration, validateDowntimeJailDuration), 83 params.NewParamSetPair(KeySlashFractionDoubleSign, &p.SlashFractionDoubleSign, validateSlashFractionDoubleSign), 84 params.NewParamSetPair(KeySlashFractionDowntime, &p.SlashFractionDowntime, validateSlashFractionDowntime), 85 } 86 } 87 88 // DefaultParams defines the parameters for this module 89 func DefaultParams() Params { 90 return NewParams( 91 DefaultSignedBlocksWindow, DefaultMinSignedPerWindow, DefaultDowntimeJailDuration, 92 DefaultSlashFractionDoubleSign, DefaultSlashFractionDowntime, 93 ) 94 } 95 96 func validateSignedBlocksWindow(i interface{}) error { 97 v, ok := i.(int64) 98 if !ok { 99 return fmt.Errorf("invalid parameter type: %T", i) 100 } 101 102 if v <= 0 { 103 return fmt.Errorf("signed blocks window must be positive: %d", v) 104 } 105 106 return nil 107 } 108 109 func validateMinSignedPerWindow(i interface{}) error { 110 v, ok := i.(sdk.Dec) 111 if !ok { 112 return fmt.Errorf("invalid parameter type: %T", i) 113 } 114 115 if v.IsNegative() { 116 return fmt.Errorf("min signed per window cannot be negative: %s", v) 117 } 118 if v.GT(sdk.OneDec()) { 119 return fmt.Errorf("min signed per window too large: %s", v) 120 } 121 122 return nil 123 } 124 125 func validateDowntimeJailDuration(i interface{}) error { 126 v, ok := i.(time.Duration) 127 if !ok { 128 return fmt.Errorf("invalid parameter type: %T", i) 129 } 130 131 if v <= 0 { 132 return fmt.Errorf("downtime jail duration must be positive: %s", v) 133 } 134 135 return nil 136 } 137 138 func validateSlashFractionDoubleSign(i interface{}) error { 139 v, ok := i.(sdk.Dec) 140 if !ok { 141 return fmt.Errorf("invalid parameter type: %T", i) 142 } 143 144 if v.IsNegative() { 145 return fmt.Errorf("double sign slash fraction cannot be negative: %s", v) 146 } 147 if v.GT(sdk.OneDec()) { 148 return fmt.Errorf("double sign slash fraction too large: %s", v) 149 } 150 151 return nil 152 } 153 154 func validateSlashFractionDowntime(i interface{}) error { 155 v, ok := i.(sdk.Dec) 156 if !ok { 157 return fmt.Errorf("invalid parameter type: %T", i) 158 } 159 160 if v.IsNegative() { 161 return fmt.Errorf("downtime slash fraction cannot be negative: %s", v) 162 } 163 if v.GT(sdk.OneDec()) { 164 return fmt.Errorf("downtime slash fraction too large: %s", v) 165 } 166 167 return nil 168 }