Skip to content

Commit

Permalink
Merge PR cosmos#5359: Params Validation
Browse files Browse the repository at this point in the history
  • Loading branch information
alexanderbez authored and xiangjianmeng committed Dec 18, 2019
1 parent 859d278 commit 78abfd0
Show file tree
Hide file tree
Showing 46 changed files with 1,141 additions and 510 deletions.
12 changes: 7 additions & 5 deletions types/coin.go
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ func (coin Coin) String() string {
// validate returns an error if the Coin has a negative amount or if
// the denom is invalid.
func validate(denom string, amount Int) error {
if err := validateDenom(denom); err != nil {
if err := ValidateDenom(denom); err != nil {
return err
}

Expand Down Expand Up @@ -203,7 +203,7 @@ func (coins Coins) IsValid() bool {
case 0:
return true
case 1:
if err := validateDenom(coins[0].Denom); err != nil {
if err := ValidateDenom(coins[0].Denom); err != nil {
return false
}
return coins[0].IsPositive()
Expand Down Expand Up @@ -599,15 +599,17 @@ var (
reDecCoin = regexp.MustCompile(fmt.Sprintf(`^(%s)%s(%s)$`, reDecAmt, reSpc, reDnmString))
)

func validateDenom(denom string) error {
// ValidateDenom validates a denomination string returning an error if it is
// invalid.
func ValidateDenom(denom string) error {
if !reDnm.MatchString(denom) {
return fmt.Errorf("invalid denom: %s", denom)
}
return nil
}

func mustValidateDenom(denom string) {
if err := validateDenom(denom); err != nil {
if err := ValidateDenom(denom); err != nil {
panic(err)
}
}
Expand All @@ -629,7 +631,7 @@ func ParseCoin(coinStr string) (coin Coin, err error) {
return Coin{}, fmt.Errorf("failed to parse coin amount: %s", amountStr)
}

if err := validateDenom(denomStr); err != nil {
if err := ValidateDenom(denomStr); err != nil {
return Coin{}, fmt.Errorf("invalid denom cannot contain upper case characters or spaces: %s", err)
}

Expand Down
4 changes: 2 additions & 2 deletions types/dec_coin.go
Original file line number Diff line number Diff line change
Expand Up @@ -470,7 +470,7 @@ func (coins DecCoins) IsValid() bool {
return true

case 1:
if err := validateDenom(coins[0].Denom); err != nil {
if err := ValidateDenom(coins[0].Denom); err != nil {
return false
}
return coins[0].IsPositive()
Expand Down Expand Up @@ -570,7 +570,7 @@ func ParseDecCoin(coinStr string) (coin DecCoin, err error) {
return DecCoin{}, errors.Wrap(err, fmt.Sprintf("failed to parse decimal coin amount: %s", amountStr))
}

if err := validateDenom(denomStr); err != nil {
if err := ValidateDenom(denomStr); err != nil {
return DecCoin{}, fmt.Errorf("invalid denom cannot contain upper case characters or spaces: %s", err)
}

Expand Down
6 changes: 3 additions & 3 deletions types/denom.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ var denomUnits = map[string]Dec{}
// RegisterDenom registers a denomination with a corresponding unit. If the
// denomination is already registered, an error will be returned.
func RegisterDenom(denom string, unit Dec) error {
if err := validateDenom(denom); err != nil {
if err := ValidateDenom(denom); err != nil {
return err
}

Expand All @@ -26,7 +26,7 @@ func RegisterDenom(denom string, unit Dec) error {
// GetDenomUnit returns a unit for a given denomination if it exists. A boolean
// is returned if the denomination is registered.
func GetDenomUnit(denom string) (Dec, bool) {
if err := validateDenom(denom); err != nil {
if err := ValidateDenom(denom); err != nil {
return ZeroDec(), false
}

Expand All @@ -42,7 +42,7 @@ func GetDenomUnit(denom string) (Dec, bool) {
// denomination is invalid or if neither denomination is registered, an error
// is returned.
func ConvertCoin(coin Coin, denom string) (Coin, error) {
if err := validateDenom(denom); err != nil {
if err := ValidateDenom(denom); err != nil {
return Coin{}, err
}

Expand Down
3 changes: 1 addition & 2 deletions x/auth/ante/ante_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -781,8 +781,7 @@ func TestAnteHandlerReCheck(t *testing.T) {
name string
params types.Params
}{
{"memo size check", types.NewParams(0, types.DefaultTxSigLimit, types.DefaultTxSizeCostPerByte, types.DefaultSigVerifyCostED25519, types.DefaultSigVerifyCostSecp256k1)},
{"tx sig limit check", types.NewParams(types.DefaultMaxMemoCharacters, 0, types.DefaultTxSizeCostPerByte, types.DefaultSigVerifyCostED25519, types.DefaultSigVerifyCostSecp256k1)},
{"memo size check", types.NewParams(1, types.DefaultTxSigLimit, types.DefaultTxSizeCostPerByte, types.DefaultSigVerifyCostED25519, types.DefaultSigVerifyCostSecp256k1)},
{"txsize check", types.NewParams(types.DefaultMaxMemoCharacters, types.DefaultTxSigLimit, 10000000, types.DefaultSigVerifyCostED25519, types.DefaultSigVerifyCostSecp256k1)},
{"sig verify cost check", types.NewParams(types.DefaultMaxMemoCharacters, types.DefaultTxSigLimit, types.DefaultTxSizeCostPerByte, types.DefaultSigVerifyCostED25519, 100000000)},
}
Expand Down
2 changes: 1 addition & 1 deletion x/auth/simulation/genesis.go
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ func RandomizedGenState(simState *module.SimulationState) {
var sigVerifyCostSECP256K1 uint64
simState.AppParams.GetOrGenerate(
simState.Cdc, SigVerifyCostSECP256K1, &sigVerifyCostSECP256K1, simState.Rand,
func(r *rand.Rand) { sigVerifyCostED25519 = GenSigVerifyCostSECP256K1(r) },
func(r *rand.Rand) { sigVerifyCostSECP256K1 = GenSigVerifyCostSECP256K1(r) },
)

params := types.NewParams(maxMemoChars, txSigLimit, txSizeCostPerByte,
Expand Down
6 changes: 3 additions & 3 deletions x/auth/simulation/params.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,17 +20,17 @@ const (
// on the simulation
func ParamChanges(r *rand.Rand) []simulation.ParamChange {
return []simulation.ParamChange{
simulation.NewSimParamChange(types.ModuleName, keyMaxMemoCharacters, "",
simulation.NewSimParamChange(types.ModuleName, keyMaxMemoCharacters,
func(r *rand.Rand) string {
return fmt.Sprintf("\"%d\"", GenMaxMemoChars(r))
},
),
simulation.NewSimParamChange(types.ModuleName, keyTxSigLimit, "",
simulation.NewSimParamChange(types.ModuleName, keyTxSigLimit,
func(r *rand.Rand) string {
return fmt.Sprintf("\"%d\"", GenTxSigLimit(r))
},
),
simulation.NewSimParamChange(types.ModuleName, keyTxSizeCostPerByte, "",
simulation.NewSimParamChange(types.ModuleName, keyTxSizeCostPerByte,
func(r *rand.Rand) string {
return fmt.Sprintf("\"%d\"", GenTxSizeCostPerByte(r))
},
Expand Down
97 changes: 82 additions & 15 deletions x/auth/types/params.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import (
"fmt"
"strings"

"github.com/cosmos/cosmos-sdk/x/params"
"github.com/cosmos/cosmos-sdk/x/params/subspace"
)

Expand Down Expand Up @@ -63,11 +64,11 @@ func ParamKeyTable() subspace.KeyTable {
// nolint
func (p *Params) ParamSetPairs() subspace.ParamSetPairs {
return subspace.ParamSetPairs{
{KeyMaxMemoCharacters, &p.MaxMemoCharacters},
{KeyTxSigLimit, &p.TxSigLimit},
{KeyTxSizeCostPerByte, &p.TxSizeCostPerByte},
{KeySigVerifyCostED25519, &p.SigVerifyCostED25519},
{KeySigVerifyCostSecp256k1, &p.SigVerifyCostSecp256k1},
params.NewParamSetPair(KeyMaxMemoCharacters, &p.MaxMemoCharacters, validateMaxMemoCharacters),
params.NewParamSetPair(KeyTxSigLimit, &p.TxSigLimit, validateTxSigLimit),
params.NewParamSetPair(KeyTxSizeCostPerByte, &p.TxSizeCostPerByte, validateTxSizeCostPerByte),
params.NewParamSetPair(KeySigVerifyCostED25519, &p.SigVerifyCostED25519, validateSigVerifyCostED25519),
params.NewParamSetPair(KeySigVerifyCostSecp256k1, &p.SigVerifyCostSecp256k1, validateSigVerifyCostSecp256k1),
}
}

Expand Down Expand Up @@ -101,22 +102,88 @@ func (p Params) String() string {
return sb.String()
}

func validateTxSigLimit(i interface{}) error {
v, ok := i.(uint64)
if !ok {
return fmt.Errorf("invalid parameter type: %T", i)
}

if v == 0 {
return fmt.Errorf("invalid tx signature limit: %d", v)
}

return nil
}

func validateSigVerifyCostED25519(i interface{}) error {
v, ok := i.(uint64)
if !ok {
return fmt.Errorf("invalid parameter type: %T", i)
}

if v == 0 {
return fmt.Errorf("invalid ED25519 signature verification cost: %d", v)
}

return nil
}

func validateSigVerifyCostSecp256k1(i interface{}) error {
v, ok := i.(uint64)
if !ok {
return fmt.Errorf("invalid parameter type: %T", i)
}

if v == 0 {
return fmt.Errorf("invalid SECK256k1 signature verification cost: %d", v)
}

return nil
}

func validateMaxMemoCharacters(i interface{}) error {
v, ok := i.(uint64)
if !ok {
return fmt.Errorf("invalid parameter type: %T", i)
}

if v == 0 {
return fmt.Errorf("invalid max memo characters: %d", v)
}

return nil
}

func validateTxSizeCostPerByte(i interface{}) error {
v, ok := i.(uint64)
if !ok {
return fmt.Errorf("invalid parameter type: %T", i)
}

if v == 0 {
return fmt.Errorf("invalid tx size cost per byte: %d", v)
}

return nil
}

// Validate checks that the parameters have valid values.
func (p Params) Validate() error {
if p.TxSigLimit == 0 {
return fmt.Errorf("invalid tx signature limit: %d", p.TxSigLimit)
if err := validateTxSigLimit(p.TxSigLimit); err != nil {
return err
}
if p.SigVerifyCostED25519 == 0 {
return fmt.Errorf("invalid ED25519 signature verification cost: %d", p.SigVerifyCostED25519)
if err := validateSigVerifyCostED25519(p.SigVerifyCostED25519); err != nil {
return err
}
if p.SigVerifyCostSecp256k1 == 0 {
return fmt.Errorf("invalid SECK256k1 signature verification cost: %d", p.SigVerifyCostSecp256k1)
if err := validateSigVerifyCostSecp256k1(p.SigVerifyCostSecp256k1); err != nil {
return err
}
if p.MaxMemoCharacters == 0 {
return fmt.Errorf("invalid max memo characters: %d", p.MaxMemoCharacters)
if err := validateSigVerifyCostSecp256k1(p.MaxMemoCharacters); err != nil {
return err
}
if p.TxSizeCostPerByte == 0 {
return fmt.Errorf("invalid tx size cost per byte: %d", p.TxSizeCostPerByte)
if err := validateTxSizeCostPerByte(p.TxSizeCostPerByte); err != nil {
return err
}

return nil
}
13 changes: 12 additions & 1 deletion x/bank/internal/types/params.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package types

import (
"fmt"

"github.com/cosmos/cosmos-sdk/x/params"
)

Expand All @@ -17,6 +19,15 @@ var ParamStoreKeySendEnabled = []byte("sendenabled")
// ParamKeyTable type declaration for parameters
func ParamKeyTable() params.KeyTable {
return params.NewKeyTable(
ParamStoreKeySendEnabled, false,
params.NewParamSetPair(ParamStoreKeySendEnabled, false, validateSendEnabled),
)
}

func validateSendEnabled(i interface{}) error {
_, ok := i.(bool)
if !ok {
return fmt.Errorf("invalid parameter type: %T", i)
}

return nil
}
2 changes: 1 addition & 1 deletion x/bank/simulation/params.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ const keySendEnabled = "sendenabled"
// on the simulation
func ParamChanges(r *rand.Rand) []simulation.ParamChange {
return []simulation.ParamChange{
simulation.NewSimParamChange(types.ModuleName, keySendEnabled, "",
simulation.NewSimParamChange(types.ModuleName, keySendEnabled,
func(r *rand.Rand) string {
return fmt.Sprintf("%v", GenSendEnabled(r))
},
Expand Down
17 changes: 16 additions & 1 deletion x/crisis/internal/types/params.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package types

import (
"fmt"

sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/cosmos/cosmos-sdk/x/params"
)
Expand All @@ -18,6 +20,19 @@ var (
// type declaration for parameters
func ParamKeyTable() params.KeyTable {
return params.NewKeyTable(
ParamStoreKeyConstantFee, sdk.Coin{},
params.NewParamSetPair(ParamStoreKeyConstantFee, sdk.Coin{}, validateConstantFee),
)
}

func validateConstantFee(i interface{}) error {
v, ok := i.(sdk.Coin)
if !ok {
return fmt.Errorf("invalid parameter type: %T", i)
}

if !v.IsValid() {
return fmt.Errorf("invalid constant fee: %s", v)
}

return nil
}
Loading

0 comments on commit 78abfd0

Please sign in to comment.