github.com/Finschia/finschia-sdk@v0.49.1/x/auth/types/params.go (about)

     1  package types
     2  
     3  import (
     4  	"fmt"
     5  
     6  	yaml "gopkg.in/yaml.v2"
     7  
     8  	paramtypes "github.com/Finschia/finschia-sdk/x/params/types"
     9  )
    10  
    11  // Default parameter values
    12  const (
    13  	DefaultMaxMemoCharacters      uint64 = 256
    14  	DefaultTxSigLimit             uint64 = 7
    15  	DefaultTxSizeCostPerByte      uint64 = 10
    16  	DefaultSigVerifyCostED25519   uint64 = 590
    17  	DefaultSigVerifyCostSecp256k1 uint64 = 1000
    18  )
    19  
    20  // Parameter keys
    21  var (
    22  	KeyMaxMemoCharacters      = []byte("MaxMemoCharacters")
    23  	KeyTxSigLimit             = []byte("TxSigLimit")
    24  	KeyTxSizeCostPerByte      = []byte("TxSizeCostPerByte")
    25  	KeySigVerifyCostED25519   = []byte("SigVerifyCostED25519")
    26  	KeySigVerifyCostSecp256k1 = []byte("SigVerifyCostSecp256k1")
    27  )
    28  
    29  var _ paramtypes.ParamSet = &Params{}
    30  
    31  // NewParams creates a new Params object
    32  func NewParams(
    33  	maxMemoCharacters, txSigLimit, txSizeCostPerByte, sigVerifyCostED25519, sigVerifyCostSecp256k1 uint64,
    34  ) Params {
    35  	return Params{
    36  		MaxMemoCharacters:      maxMemoCharacters,
    37  		TxSigLimit:             txSigLimit,
    38  		TxSizeCostPerByte:      txSizeCostPerByte,
    39  		SigVerifyCostED25519:   sigVerifyCostED25519,
    40  		SigVerifyCostSecp256k1: sigVerifyCostSecp256k1,
    41  	}
    42  }
    43  
    44  // ParamKeyTable for auth module
    45  func ParamKeyTable() paramtypes.KeyTable {
    46  	return paramtypes.NewKeyTable().RegisterParamSet(&Params{})
    47  }
    48  
    49  // ParamSetPairs implements the ParamSet interface and returns all the key/value pairs
    50  // pairs of auth module's parameters.
    51  func (p *Params) ParamSetPairs() paramtypes.ParamSetPairs {
    52  	return paramtypes.ParamSetPairs{
    53  		paramtypes.NewParamSetPair(KeyMaxMemoCharacters, &p.MaxMemoCharacters, validateMaxMemoCharacters),
    54  		paramtypes.NewParamSetPair(KeyTxSigLimit, &p.TxSigLimit, validateTxSigLimit),
    55  		paramtypes.NewParamSetPair(KeyTxSizeCostPerByte, &p.TxSizeCostPerByte, validateTxSizeCostPerByte),
    56  		paramtypes.NewParamSetPair(KeySigVerifyCostED25519, &p.SigVerifyCostED25519, validateSigVerifyCostED25519),
    57  		paramtypes.NewParamSetPair(KeySigVerifyCostSecp256k1, &p.SigVerifyCostSecp256k1, validateSigVerifyCostSecp256k1),
    58  	}
    59  }
    60  
    61  // DefaultParams returns a default set of parameters.
    62  func DefaultParams() Params {
    63  	return Params{
    64  		MaxMemoCharacters:      DefaultMaxMemoCharacters,
    65  		TxSigLimit:             DefaultTxSigLimit,
    66  		TxSizeCostPerByte:      DefaultTxSizeCostPerByte,
    67  		SigVerifyCostED25519:   DefaultSigVerifyCostED25519,
    68  		SigVerifyCostSecp256k1: DefaultSigVerifyCostSecp256k1,
    69  	}
    70  }
    71  
    72  // SigVerifyCostSecp256r1 returns gas fee of secp256r1 signature verification.
    73  // Set by benchmarking current implementation:
    74  //
    75  //	BenchmarkSig/secp256k1     4334   277167 ns/op   4128 B/op   79 allocs/op
    76  //	BenchmarkSig/secp256r1    10000   108769 ns/op   1672 B/op   33 allocs/op
    77  //
    78  // Based on the results above secp256k1 is 2.7x is slwer. However we propose to discount it
    79  // because we are we don't compare the cgo implementation of secp256k1, which is faster.
    80  func (p Params) SigVerifyCostSecp256r1() uint64 {
    81  	return p.SigVerifyCostSecp256k1 / 2
    82  }
    83  
    84  // String implements the stringer interface.
    85  func (p Params) String() string {
    86  	out, _ := yaml.Marshal(p)
    87  	return string(out)
    88  }
    89  
    90  func validateTxSigLimit(i interface{}) error {
    91  	v, ok := i.(uint64)
    92  	if !ok {
    93  		return fmt.Errorf("invalid parameter type: %T", i)
    94  	}
    95  
    96  	if v == 0 {
    97  		return fmt.Errorf("invalid tx signature limit: %d", v)
    98  	}
    99  
   100  	return nil
   101  }
   102  
   103  func validateSigVerifyCostED25519(i interface{}) error {
   104  	v, ok := i.(uint64)
   105  	if !ok {
   106  		return fmt.Errorf("invalid parameter type: %T", i)
   107  	}
   108  
   109  	if v == 0 {
   110  		return fmt.Errorf("invalid ED25519 signature verification cost: %d", v)
   111  	}
   112  
   113  	return nil
   114  }
   115  
   116  func validateSigVerifyCostSecp256k1(i interface{}) error {
   117  	v, ok := i.(uint64)
   118  	if !ok {
   119  		return fmt.Errorf("invalid parameter type: %T", i)
   120  	}
   121  
   122  	if v == 0 {
   123  		return fmt.Errorf("invalid SECK256k1 signature verification cost: %d", v)
   124  	}
   125  
   126  	return nil
   127  }
   128  
   129  func validateMaxMemoCharacters(i interface{}) error {
   130  	v, ok := i.(uint64)
   131  	if !ok {
   132  		return fmt.Errorf("invalid parameter type: %T", i)
   133  	}
   134  
   135  	if v == 0 {
   136  		return fmt.Errorf("invalid max memo characters: %d", v)
   137  	}
   138  
   139  	return nil
   140  }
   141  
   142  func validateTxSizeCostPerByte(i interface{}) error {
   143  	v, ok := i.(uint64)
   144  	if !ok {
   145  		return fmt.Errorf("invalid parameter type: %T", i)
   146  	}
   147  
   148  	if v == 0 {
   149  		return fmt.Errorf("invalid tx size cost per byte: %d", v)
   150  	}
   151  
   152  	return nil
   153  }
   154  
   155  // Validate checks that the parameters have valid values.
   156  func (p Params) Validate() error {
   157  	if err := validateTxSigLimit(p.TxSigLimit); err != nil {
   158  		return err
   159  	}
   160  	if err := validateSigVerifyCostED25519(p.SigVerifyCostED25519); err != nil {
   161  		return err
   162  	}
   163  	if err := validateSigVerifyCostSecp256k1(p.SigVerifyCostSecp256k1); err != nil {
   164  		return err
   165  	}
   166  	if err := validateMaxMemoCharacters(p.MaxMemoCharacters); err != nil {
   167  		return err
   168  	}
   169  	if err := validateTxSizeCostPerByte(p.TxSizeCostPerByte); err != nil {
   170  		return err
   171  	}
   172  
   173  	return nil
   174  }