9862b40f2c
https://github.com/nspcc-dev/neo-go/pull/2435 breaks compatibility between newer RPC clients and older RPC servers with the following error: ``` failed to get network magic: json: cannot unmarshal string into Go struct field Protocol.protocol.initialgasdistribution of type int64 ``` This behaviour is expected, but we can't allow this radical change. Thus, the following solution is implemented: 1. RPC server responds with proper non-stringified InitialGasDistribution value. The value represents an integral of fixed8 multiplied by the decimals. 2. RPC client is able to distinguish older and newer responses. For older one the stringified value without decimals part is expected. For newer responses the int64 value with decimal part is expected. The cludge will be present in the code for a while until nodes of version <=0.98.3 become completely absolete.
77 lines
2.1 KiB
Go
77 lines
2.1 KiB
Go
package config
|
|
|
|
import (
|
|
"fmt"
|
|
"os"
|
|
|
|
"github.com/nspcc-dev/neo-go/pkg/config/netmode"
|
|
"github.com/nspcc-dev/neo-go/pkg/rpc"
|
|
"gopkg.in/yaml.v2"
|
|
)
|
|
|
|
const (
|
|
// UserAgentWrapper is a string that user agent string should be wrapped into.
|
|
UserAgentWrapper = "/"
|
|
// UserAgentPrefix is a prefix used to generate user agent string.
|
|
UserAgentPrefix = "NEO-GO:"
|
|
// UserAgentFormat is a formatted string used to generate user agent string.
|
|
UserAgentFormat = UserAgentWrapper + UserAgentPrefix + "%s" + UserAgentWrapper
|
|
)
|
|
|
|
// Version the version of the node, set at build time.
|
|
var Version string
|
|
|
|
// Config top level struct representing the config
|
|
// for the node.
|
|
type Config struct {
|
|
ProtocolConfiguration ProtocolConfiguration `yaml:"ProtocolConfiguration"`
|
|
ApplicationConfiguration ApplicationConfiguration `yaml:"ApplicationConfiguration"`
|
|
}
|
|
|
|
// GenerateUserAgent creates user agent string based on build time environment.
|
|
func (c Config) GenerateUserAgent() string {
|
|
return fmt.Sprintf(UserAgentFormat, Version)
|
|
}
|
|
|
|
// Load attempts to load the config from the given
|
|
// path for the given netMode.
|
|
func Load(path string, netMode netmode.Magic) (Config, error) {
|
|
configPath := fmt.Sprintf("%s/protocol.%s.yml", path, netMode)
|
|
return LoadFile(configPath)
|
|
}
|
|
|
|
// LoadFile loads config from the provided path.
|
|
func LoadFile(configPath string) (Config, error) {
|
|
if _, err := os.Stat(configPath); os.IsNotExist(err) {
|
|
return Config{}, fmt.Errorf("config '%s' doesn't exist", configPath)
|
|
}
|
|
|
|
configData, err := os.ReadFile(configPath)
|
|
if err != nil {
|
|
return Config{}, fmt.Errorf("unable to read config: %w", err)
|
|
}
|
|
|
|
config := Config{
|
|
ApplicationConfiguration: ApplicationConfiguration{
|
|
PingInterval: 30,
|
|
PingTimeout: 90,
|
|
RPC: rpc.Config{
|
|
MaxIteratorResultItems: 100,
|
|
MaxFindResultItems: 100,
|
|
MaxNEP11Tokens: 100,
|
|
},
|
|
},
|
|
}
|
|
|
|
err = yaml.Unmarshal(configData, &config)
|
|
if err != nil {
|
|
return Config{}, fmt.Errorf("failed to unmarshal config YAML: %w", err)
|
|
}
|
|
|
|
err = config.ProtocolConfiguration.Validate()
|
|
if err != nil {
|
|
return Config{}, err
|
|
}
|
|
|
|
return config, nil
|
|
}
|