github.com/cosmos/cosmos-sdk@v0.50.10/x/auth/types/params.go (about) 1 package types 2 3 import ( 4 "fmt" 5 ) 6 7 // Default parameter values 8 const ( 9 DefaultMaxMemoCharacters uint64 = 256 10 DefaultTxSigLimit uint64 = 7 11 DefaultTxSizeCostPerByte uint64 = 10 12 DefaultSigVerifyCostED25519 uint64 = 590 13 DefaultSigVerifyCostSecp256k1 uint64 = 1000 14 ) 15 16 // NewParams creates a new Params object 17 func NewParams(maxMemoCharacters, txSigLimit, txSizeCostPerByte, sigVerifyCostED25519, sigVerifyCostSecp256k1 uint64) Params { 18 return Params{ 19 MaxMemoCharacters: maxMemoCharacters, 20 TxSigLimit: txSigLimit, 21 TxSizeCostPerByte: txSizeCostPerByte, 22 SigVerifyCostED25519: sigVerifyCostED25519, 23 SigVerifyCostSecp256k1: sigVerifyCostSecp256k1, 24 } 25 } 26 27 // DefaultParams returns a default set of parameters. 28 func DefaultParams() Params { 29 return Params{ 30 MaxMemoCharacters: DefaultMaxMemoCharacters, 31 TxSigLimit: DefaultTxSigLimit, 32 TxSizeCostPerByte: DefaultTxSizeCostPerByte, 33 SigVerifyCostED25519: DefaultSigVerifyCostED25519, 34 SigVerifyCostSecp256k1: DefaultSigVerifyCostSecp256k1, 35 } 36 } 37 38 // SigVerifyCostSecp256r1 returns gas fee of secp256r1 signature verification. 39 // Set by benchmarking current implementation: 40 // 41 // BenchmarkSig/secp256k1 4334 277167 ns/op 4128 B/op 79 allocs/op 42 // BenchmarkSig/secp256r1 10000 108769 ns/op 1672 B/op 33 allocs/op 43 // 44 // Based on the results above secp256k1 is 2.7x is slwer. However we propose to discount it 45 // because we are we don't compare the cgo implementation of secp256k1, which is faster. 46 func (p Params) SigVerifyCostSecp256r1() uint64 { 47 return p.SigVerifyCostSecp256k1 / 2 48 } 49 50 func validateTxSigLimit(i interface{}) error { 51 v, ok := i.(uint64) 52 if !ok { 53 return fmt.Errorf("invalid parameter type: %T", i) 54 } 55 56 if v == 0 { 57 return fmt.Errorf("invalid tx signature limit: %d", v) 58 } 59 60 return nil 61 } 62 63 func validateSigVerifyCostED25519(i interface{}) error { 64 v, ok := i.(uint64) 65 if !ok { 66 return fmt.Errorf("invalid parameter type: %T", i) 67 } 68 69 if v == 0 { 70 return fmt.Errorf("invalid ED25519 signature verification cost: %d", v) 71 } 72 73 return nil 74 } 75 76 func validateSigVerifyCostSecp256k1(i interface{}) error { 77 v, ok := i.(uint64) 78 if !ok { 79 return fmt.Errorf("invalid parameter type: %T", i) 80 } 81 82 if v == 0 { 83 return fmt.Errorf("invalid SECK256k1 signature verification cost: %d", v) 84 } 85 86 return nil 87 } 88 89 func validateMaxMemoCharacters(i interface{}) error { 90 v, ok := i.(uint64) 91 if !ok { 92 return fmt.Errorf("invalid parameter type: %T", i) 93 } 94 95 if v == 0 { 96 return fmt.Errorf("invalid max memo characters: %d", v) 97 } 98 99 return nil 100 } 101 102 func validateTxSizeCostPerByte(i interface{}) error { 103 v, ok := i.(uint64) 104 if !ok { 105 return fmt.Errorf("invalid parameter type: %T", i) 106 } 107 108 if v == 0 { 109 return fmt.Errorf("invalid tx size cost per byte: %d", v) 110 } 111 112 return nil 113 } 114 115 // Validate checks that the parameters have valid values. 116 func (p Params) Validate() error { 117 if err := validateTxSigLimit(p.TxSigLimit); err != nil { 118 return err 119 } 120 if err := validateSigVerifyCostED25519(p.SigVerifyCostED25519); err != nil { 121 return err 122 } 123 if err := validateSigVerifyCostSecp256k1(p.SigVerifyCostSecp256k1); err != nil { 124 return err 125 } 126 if err := validateMaxMemoCharacters(p.MaxMemoCharacters); err != nil { 127 return err 128 } 129 if err := validateTxSizeCostPerByte(p.TxSizeCostPerByte); err != nil { 130 return err 131 } 132 133 return nil 134 }