From 6e9d725a29e89bcb342af3a00d5d75dce7a0457d Mon Sep 17 00:00:00 2001 From: Roman Khimov Date: Thu, 20 Jan 2022 02:59:40 +0300 Subject: [PATCH] config: consolidate ProtocolConfiguration consistency checks --- pkg/config/config.go | 8 +++----- pkg/config/protocol_config.go | 19 +++++++++++++++++++ pkg/config/protocol_config_test.go | 20 ++++++++++++++++++++ pkg/core/util.go | 4 ---- 4 files changed, 42 insertions(+), 9 deletions(-) create mode 100644 pkg/config/protocol_config_test.go diff --git a/pkg/config/config.go b/pkg/config/config.go index 2b9445ecc..0186b4dc4 100644 --- a/pkg/config/config.go +++ b/pkg/config/config.go @@ -6,7 +6,6 @@ import ( "os" "github.com/nspcc-dev/neo-go/pkg/config/netmode" - "github.com/nspcc-dev/neo-go/pkg/core/native/nativenames" "github.com/nspcc-dev/neo-go/pkg/rpc" "gopkg.in/yaml.v2" ) @@ -63,10 +62,9 @@ func LoadFile(configPath string) (Config, error) { return Config{}, fmt.Errorf("failed to unmarshal config YAML: %w", err) } - for name := range config.ProtocolConfiguration.NativeUpdateHistories { - if !nativenames.IsValid(name) { - return Config{}, fmt.Errorf("NativeActivations configuration section contains unexpected native contract name: %s", name) - } + err = config.ProtocolConfiguration.Validate() + if err != nil { + return Config{}, err } return config, nil diff --git a/pkg/config/protocol_config.go b/pkg/config/protocol_config.go index 656af153f..4b63a4b51 100644 --- a/pkg/config/protocol_config.go +++ b/pkg/config/protocol_config.go @@ -1,7 +1,11 @@ package config import ( + "errors" + "fmt" + "github.com/nspcc-dev/neo-go/pkg/config/netmode" + "github.com/nspcc-dev/neo-go/pkg/core/native/nativenames" "github.com/nspcc-dev/neo-go/pkg/encoding/fixedn" ) @@ -59,3 +63,18 @@ type ( VerifyTransactions bool `yaml:"VerifyTransactions"` } ) + +// Validate checks ProtocolConfiguration for internal consistency and returns +// error if anything inappropriate found. Other methods can rely on protocol +// validity after this. +func (p *ProtocolConfiguration) Validate() error { + if len(p.StandbyCommittee) < p.ValidatorsCount { + return errors.New("validators count can't exceed the size of StandbyCommittee") + } + for name := range p.NativeUpdateHistories { + if !nativenames.IsValid(name) { + return fmt.Errorf("NativeActivations configuration section contains unexpected native contract name: %s", name) + } + } + return nil +} diff --git a/pkg/config/protocol_config_test.go b/pkg/config/protocol_config_test.go new file mode 100644 index 000000000..402c0b6b2 --- /dev/null +++ b/pkg/config/protocol_config_test.go @@ -0,0 +1,20 @@ +package config + +import ( + "testing" + + "github.com/stretchr/testify/require" +) + +func TestProtocolConfigurationValidation(t *testing.T) { + p := &ProtocolConfiguration{ + ValidatorsCount: 1, + } + require.Error(t, p.Validate()) + p = &ProtocolConfiguration{ + NativeUpdateHistories: map[string][]uint32{ + "someContract": []uint32{0, 10}, + }, + } + require.Error(t, p.Validate()) +} diff --git a/pkg/core/util.go b/pkg/core/util.go index b5cfa8a6a..aaa8decbe 100644 --- a/pkg/core/util.go +++ b/pkg/core/util.go @@ -1,7 +1,6 @@ package core import ( - "errors" "time" "github.com/nspcc-dev/neo-go/pkg/config" @@ -58,9 +57,6 @@ func validatorsFromConfig(cfg config.ProtocolConfiguration) ([]*keys.PublicKey, } func committeeFromConfig(cfg config.ProtocolConfiguration) ([]*keys.PublicKey, error) { - if len(cfg.StandbyCommittee) < cfg.ValidatorsCount { - return nil, errors.New("validators count can be less than the size of StandbyCommittee") - } validators := make([]*keys.PublicKey, len(cfg.StandbyCommittee)) for i := range validators { pubKey, err := keys.NewPublicKeyFromString(cfg.StandbyCommittee[i])