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 }