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  }