Skip to content

Commit 452c713

Browse files
authored
Retain some key network settings when switching to other networks (#44)
* Fix the peers.dat path to match the chia defaults * Update path in test * Store key settings about networks before switching, to we can restore them later * Also keep track of bootstrap/static peers for seeder, and any full ndoe static peers
1 parent cf1d8b5 commit 452c713

File tree

2 files changed

+111
-11
lines changed

2 files changed

+111
-11
lines changed

cmd/network/switch.go

+70-10
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package network
22

33
import (
4+
"encoding/json"
45
"errors"
56
"fmt"
67
"net"
@@ -40,6 +41,14 @@ func init() {
4041
networkCmd.AddCommand(switchCmd)
4142
}
4243

44+
// retainedSettings are the settings we want to keep track of when switching networks so we can swap back to them in the future
45+
type retainedSettings struct {
46+
DNSServers []string `json:"dns_servers"`
47+
BootstrapPeers []string `json:"bootstrap_peers"`
48+
StaticPeers []string `json:"static_peers"`
49+
FullNodePeers []config.Peer `json:"full_node_peers"`
50+
}
51+
4352
// SwitchNetwork implements the logic to swap networks
4453
func SwitchNetwork(networkName string, checkForRunningNode bool) {
4554
slogs.Logr.Info("Swapping to network", "network", networkName)
@@ -91,6 +100,35 @@ func SwitchNetwork(networkName string, checkForRunningNode bool) {
91100
slogs.Logr.Fatal("error creating cache file directory for new network", "error", err, "directory", cacheFileDirNewNetwork)
92101
}
93102

103+
previousSettings := retainedSettings{
104+
DNSServers: cfg.FullNode.DNSServers,
105+
BootstrapPeers: cfg.Seeder.BootstrapPeers,
106+
StaticPeers: cfg.Seeder.StaticPeers,
107+
FullNodePeers: cfg.FullNode.FullNodePeers,
108+
}
109+
marshalled, err := json.Marshal(previousSettings)
110+
if err != nil {
111+
slogs.Logr.Fatal("error marshalling retained settings to json", "error", err)
112+
}
113+
err = os.WriteFile(path.Join(cacheFileDirOldNetwork, "settings.json"), marshalled, 0644)
114+
if err != nil {
115+
slogs.Logr.Fatal("error writing settings for old network", "error", err)
116+
}
117+
118+
var settingsToRestore *retainedSettings
119+
newSettingsPath := path.Join(cacheFileDirNewNetwork, "settings.json")
120+
if _, err := os.Stat(newSettingsPath); err == nil {
121+
settings, err := os.ReadFile(newSettingsPath)
122+
if err != nil {
123+
slogs.Logr.Fatal("error reading stored settings for the new network", "error", err)
124+
}
125+
settingsToRestore = &retainedSettings{}
126+
err = json.Unmarshal(settings, settingsToRestore)
127+
if err != nil {
128+
slogs.Logr.Fatal("error unmarshalling stored settings for the new network", "error", err)
129+
}
130+
}
131+
94132
// Check if Full Node is running
95133
if checkForRunningNode {
96134
slogs.Logr.Debug("initializing websocket client to ensure chia is stopped")
@@ -133,24 +171,44 @@ func SwitchNetwork(networkName string, checkForRunningNode bool) {
133171
}
134172

135173
introducerHost := "introducer.chia.net"
136-
dnsIntroducerHost := "dns-introducer.chia.net"
174+
dnsIntroducerHosts := []string{"dns-introducer.chia.net"}
137175
fullNodePort := uint16(8444)
138-
peersFilePath := "peers.dat"
176+
var fullnodePeers []config.Peer
177+
peersFilePath := "db/peers.dat"
139178
walletPeersFilePath := "wallet/db/wallet_peers.dat"
140179
bootstrapPeers := []string{"node.chia.net"}
180+
var staticPeers []string
141181
if networkName != "mainnet" {
142182
introducerHost = fmt.Sprintf("introducer-%s.chia.net", networkName)
143-
dnsIntroducerHost = fmt.Sprintf("dns-introducer-%s.chia.net", networkName)
183+
dnsIntroducerHosts = []string{fmt.Sprintf("dns-introducer-%s.chia.net", networkName)}
144184
fullNodePort = uint16(58444)
145-
peersFilePath = fmt.Sprintf("peers-%s.dat", networkName)
185+
peersFilePath = fmt.Sprintf("db/peers-%s.dat", networkName)
146186
walletPeersFilePath = fmt.Sprintf("wallet/db/wallet_peers-%s.dat", networkName)
147187
bootstrapPeers = []string{fmt.Sprintf("node-%s.chia.net", networkName)}
148188
}
189+
190+
// Any stored settings for the new network should be applied here, before any flags override them
191+
if settingsToRestore != nil {
192+
slogs.Logr.Info("restoring stored settings for this network")
193+
if len(settingsToRestore.DNSServers) > 0 {
194+
dnsIntroducerHosts = settingsToRestore.DNSServers
195+
}
196+
if len(settingsToRestore.BootstrapPeers) > 0 {
197+
bootstrapPeers = settingsToRestore.BootstrapPeers
198+
}
199+
if len(settingsToRestore.StaticPeers) > 0 {
200+
staticPeers = settingsToRestore.StaticPeers
201+
}
202+
if len(settingsToRestore.FullNodePeers) > 0 {
203+
fullnodePeers = settingsToRestore.FullNodePeers
204+
}
205+
}
206+
149207
if introFlag := viper.GetString("switch-introducer"); introFlag != "" {
150208
introducerHost = introFlag
151209
}
152210
if dnsIntroFlag := viper.GetString("switch-dns-introducer"); dnsIntroFlag != "" {
153-
dnsIntroducerHost = dnsIntroFlag
211+
dnsIntroducerHosts = []string{dnsIntroFlag}
154212
}
155213
if bootPeer := viper.GetString("switch-bootstrap-peer"); bootPeer != "" {
156214
bootstrapPeers = []string{bootPeer}
@@ -172,22 +230,24 @@ func SwitchNetwork(networkName string, checkForRunningNode bool) {
172230
},
173231
},
174232
"full_node.database_path": fmt.Sprintf("db/blockchain_v2_%s.sqlite", networkName),
175-
"full_node.dns_servers": []string{dnsIntroducerHost},
233+
"full_node.dns_servers": dnsIntroducerHosts,
176234
"full_node.peers_file_path": peersFilePath,
177235
"full_node.port": fullNodePort,
236+
"full_node.full_node_peers": fullnodePeers,
178237
"full_node.introducer_peer.host": introducerHost,
179238
"full_node.introducer_peer.port": fullNodePort,
180239
"introducer.port": fullNodePort,
181240
"seeder.port": fullNodePort,
182241
"seeder.other_peers_port": fullNodePort,
183242
"seeder.bootstrap_peers": bootstrapPeers,
243+
"seeder.static_peers": staticPeers,
184244
"timelord.full_node_peers": []config.Peer{
185245
{
186246
Host: "localhost",
187247
Port: fullNodePort,
188248
},
189249
},
190-
"wallet.dns_servers": []string{dnsIntroducerHost},
250+
"wallet.dns_servers": dnsIntroducerHosts,
191251
"wallet.full_node_peers": []config.Peer{
192252
{
193253
Host: "localhost",
@@ -198,14 +258,14 @@ func SwitchNetwork(networkName string, checkForRunningNode bool) {
198258
"wallet.introducer_peer.port": fullNodePort,
199259
"wallet.wallet_peers_file_path": walletPeersFilePath,
200260
}
201-
for path, value := range pathUpdates {
202-
pathMap := config.ParsePathsFromStrings([]string{path}, false)
261+
for configPath, value := range pathUpdates {
262+
pathMap := config.ParsePathsFromStrings([]string{configPath}, false)
203263
var key string
204264
var pathSlice []string
205265
for key, pathSlice = range pathMap {
206266
break
207267
}
208-
slogs.Logr.Debug("setting config path", "path", path, "value", value)
268+
slogs.Logr.Debug("setting config path", "path", configPath, "value", value)
209269
err = cfg.SetFieldByPath(pathSlice, value)
210270
if err != nil {
211271
slogs.Logr.Fatal("error setting path in config", "key", key, "value", value, "error", err)

cmd/network/switch_test.go

+41-1
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ func TestNetworkSwitch(t *testing.T) {
7676
assert.Equal(t, []config.Peer{localpeer}, cfg.Farmer.FullNodePeers)
7777
assert.Equal(t, "db/blockchain_v2_unittestnet.sqlite", cfg.FullNode.DatabasePath)
7878
assert.Equal(t, []string{"dns-introducer-unittestnet.chia.net"}, cfg.FullNode.DNSServers)
79-
assert.Equal(t, "peers-unittestnet.dat", cfg.FullNode.PeersFilePath)
79+
assert.Equal(t, "db/peers-unittestnet.dat", cfg.FullNode.PeersFilePath)
8080
assert.Equal(t, port, cfg.FullNode.Port)
8181
assert.Equal(t, config.Peer{Host: "introducer-unittestnet.chia.net", Port: port}, cfg.FullNode.IntroducerPeer)
8282
assert.Equal(t, port, cfg.Introducer.Port)
@@ -88,3 +88,43 @@ func TestNetworkSwitch(t *testing.T) {
8888
assert.Equal(t, config.Peer{Host: "introducer-unittestnet.chia.net", Port: port}, cfg.Wallet.IntroducerPeer)
8989
assert.Equal(t, "wallet/db/wallet_peers-unittestnet.dat", cfg.Wallet.WalletPeersFilePath)
9090
}
91+
92+
func TestNetworkSwitch_SettingRetention(t *testing.T) {
93+
cmd.InitLogs()
94+
setupDefaultConfig(t)
95+
cfg, err := config.GetChiaConfig()
96+
assert.NoError(t, err)
97+
assert.Equal(t, "mainnet", *cfg.SelectedNetwork)
98+
99+
// Set some custom dns introducers, and ensure they are back when swapping away and back to mainnet
100+
cfg.FullNode.DNSServers = []string{"dns-mainnet-1.example.com", "dns-mainnet-2.example.com"}
101+
cfg.Seeder.BootstrapPeers = []string{"bootstrap-mainnet-1.example.com"}
102+
cfg.Seeder.StaticPeers = []string{"static-peer-1.example.com"}
103+
cfg.FullNode.FullNodePeers = []config.Peer{{Host: "fn-peer-1.example.com", Port: 1234}}
104+
err = cfg.Save()
105+
assert.NoError(t, err)
106+
107+
// reload config from disk to ensure the dns servers were persisted
108+
cfg, err = config.GetChiaConfig()
109+
assert.NoError(t, err)
110+
assert.Equal(t, []string{"dns-mainnet-1.example.com", "dns-mainnet-2.example.com"}, cfg.FullNode.DNSServers)
111+
112+
network.SwitchNetwork("unittestnet", false)
113+
// reload config from disk to ensure defaults are in the config now
114+
cfg, err = config.GetChiaConfig()
115+
assert.NoError(t, err)
116+
assert.Equal(t, []string{"dns-introducer-unittestnet.chia.net"}, cfg.FullNode.DNSServers)
117+
assert.Equal(t, []string{"node-unittestnet.chia.net"}, cfg.Seeder.BootstrapPeers)
118+
assert.Equal(t, []string{}, cfg.Seeder.StaticPeers)
119+
assert.Equal(t, []config.Peer{}, cfg.FullNode.FullNodePeers)
120+
121+
network.SwitchNetwork("mainnet", false)
122+
123+
// reload config from disk
124+
cfg, err = config.GetChiaConfig()
125+
assert.NoError(t, err)
126+
assert.Equal(t, []string{"dns-mainnet-1.example.com", "dns-mainnet-2.example.com"}, cfg.FullNode.DNSServers)
127+
assert.Equal(t, []string{"bootstrap-mainnet-1.example.com"}, cfg.Seeder.BootstrapPeers)
128+
assert.Equal(t, []string{"static-peer-1.example.com"}, cfg.Seeder.StaticPeers)
129+
assert.Equal(t, []config.Peer{{Host: "fn-peer-1.example.com", Port: 1234}}, cfg.FullNode.FullNodePeers)
130+
}

0 commit comments

Comments
 (0)