cfg.EnsureRoot(config.RootDir, "solonet")
}
+ fedFile := config.FederationFile()
+ if _, err := os.Stat(fedFile); !os.IsNotExist(err) {
+ log.WithFields(log.Fields{"module": logModule, "config": fedFile}).Info("Already exists federation file.")
+ return
+ }
+
+ if err := cfg.ExportFederationFile(fedFile, config); err != nil {
+ log.WithFields(log.Fields{"module": logModule, "config": fedFile, "error": err}).Info("exportFederationFile failed.")
+ return
+ }
+
log.WithFields(log.Fields{"module": logModule, "config": configFilePath}).Info("Initialized bytom")
}
// Cipher Service Provider
// CipherServiceProvider string `mapstructure:"csp"`
+
+ // Federation file name
+ FederationFileName string `mapstructure:"federation_file"`
}
// Default configurable base parameters.
func DefaultBaseConfig() BaseConfig {
return BaseConfig{
- Moniker: "anonymous",
- ProfListenAddress: "",
- Mining: false,
- DBBackend: "leveldb",
- DBPath: "data",
- KeysPath: "keystore",
+ Moniker: "anonymous",
+ ProfListenAddress: "",
+ Mining: false,
+ DBBackend: "leveldb",
+ DBPath: "data",
+ KeysPath: "keystore",
+ FederationFileName: "federation.json",
}
}
return rootify(b.KeysPath, b.RootDir)
}
+func (b BaseConfig) FederationFile() string {
+ return rootify(b.FederationFileName, b.RootDir)
+}
+
// P2PConfig
type P2PConfig struct {
ListenAddress string `mapstructure:"laddr"`
--- /dev/null
+package config
+
+import (
+ "bytes"
+ "encoding/json"
+ "io/ioutil"
+ "os"
+)
+
+func ExportFederationFile(fedFile string, config *Config) error {
+ buf := new(bytes.Buffer)
+
+ encoder := json.NewEncoder(buf)
+ encoder.SetIndent("", " ")
+ if err := encoder.Encode(config.Federation); err != nil {
+ return err
+ }
+
+ return ioutil.WriteFile(fedFile, buf.Bytes(), 0644)
+}
+
+func LoadFederationFile(fedFile string, config *Config) error {
+ file, err := os.Open(fedFile)
+ if err != nil {
+ return err
+ }
+ defer file.Close()
+
+ return json.NewDecoder(file).Decode(config.Federation)
+}
--- /dev/null
+package config
+
+import (
+ "io/ioutil"
+ "os"
+ "testing"
+
+ "github.com/vapor/testutil"
+)
+
+func TestFederation(t *testing.T) {
+
+ tmpDir, err := ioutil.TempDir(".", "")
+ if err != nil {
+ t.Fatalf("failed to create temporary data folder: %v", err)
+ }
+ defer os.RemoveAll(tmpDir)
+
+ config := DefaultConfig()
+ config.BaseConfig.RootDir = tmpDir
+
+ if err := ExportFederationFile(config.FederationFile(), config); err != nil {
+ t.Fatal(err)
+ }
+
+ loadConfig := &Config{
+ Federation: &FederationConfig{},
+ }
+
+ if err := LoadFederationFile(config.FederationFile(), loadConfig); err != nil {
+ t.Fatal(err)
+ }
+
+ if !testutil.DeepEqual(config.Federation, loadConfig.Federation) {
+ t.Fatalf("export: %v, load: %v", config.Federation, loadConfig.Federation)
+ }
+}
if err := lockDataDirectory(config); err != nil {
cmn.Exit("Error: " + err.Error())
}
+ if err := cfg.LoadFederationFile(config.FederationFile(), config); err != nil {
+ cmn.Exit(cmn.Fmt("Failed to load federated information:[%s]", err.Error()))
+ }
initLogFile(config)
initActiveNetParams(config)
initCommonConfig(config)