Skip to content

Commit 6339d1d

Browse files
committed
Minimal fix to config parser
The go-shutter-settings config parser choked on two string array fields, which previously were marked as only string.
1 parent bdfda0a commit 6339d1d

File tree

9 files changed

+243
-3
lines changed

9 files changed

+243
-3
lines changed

shutter/go-shutter-settings/go.mod

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,3 +5,8 @@ go 1.21.0
55
require github.com/joho/godotenv v1.5.1
66

77
require github.com/pelletier/go-toml/v2 v2.2.3
8+
9+
require (
10+
github.com/google/go-cmp v0.5.9 // indirect
11+
gotest.tools/v3 v3.5.1 // indirect
12+
)

shutter/go-shutter-settings/go.sum

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
22
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
3+
github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=
4+
github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
35
github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0=
46
github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=
57
github.com/pelletier/go-toml/v2 v2.2.3 h1:YmeHyLY8mFWbdkNWwpr+qIL2bEqT0o95WSdkNHvL12M=
@@ -10,3 +12,5 @@ github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsT
1012
github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
1113
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
1214
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
15+
gotest.tools/v3 v3.5.1 h1:EENdUnS3pdur5nybKYIh2Vfgc8IUNBjxDPSjtiJcOzU=
16+
gotest.tools/v3 v3.5.1/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU=
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
./test-assets/out.toml

shutter/go-shutter-settings/settings/keyper.go

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ type KeyperConfig struct {
1010
InstanceID int `env:"_ASSETS_INSTANCE_ID"`
1111
DatabaseURL string `env:"SHUTTER_DATABASE_URL"`
1212
BeaconAPIURL string `env:"SHUTTER_BEACONAPIURL"`
13+
HTTPEnabled bool `env:"SHUTTER_HTTP_ENABLED"`
14+
HTTPListenAddress string `env:"SHUTTER_HTTP_LISTEN_ADDRESS"`
1315
MaxNumKeysPerMessage int `env:"_ASSETS_MAX_NUM_KEYS_PER_MESSAGE"`
1416
Gnosis struct {
1517
EncryptedGasLimit int `env:"_ASSETS_ENCRYPTED_GAS_LIMIT"`
@@ -31,10 +33,15 @@ type KeyperConfig struct {
3133
}
3234
P2P struct {
3335
P2PKey string `env:"SHUTTER_P2P_KEY"`
34-
ListenAddresses string `env:"SHUTTER_P2P_LISTENADDRESSES"`
35-
AdvertiseAddresses string `env:"SHUTTER_P2P_ADVERTISEADDRESSES"`
36+
ListenAddresses []string `env:"SHUTTER_P2P_LISTENADDRESSES"`
37+
AdvertiseAddresses []string `env:"SHUTTER_P2P_ADVERTISEADDRESSES"`
3638
CustomBootstrapAddresses []string `env:"_ASSETS_CUSTOM_BOOTSTRAP_ADDRESSES"`
3739
DiscoveryNamespace string `env:"_ASSETS_DISCOVERY_NAME_PREFIX"`
40+
FloodSubDiscovery struct {
41+
Enabled bool `env:"SHUTTER_P2P_FLOODSUBDISCOVERY_ENABLED"`
42+
Interval int `env:"SHUTTER_P2P_FLOODSUBDISCOVERY_INTERVAL"`
43+
Topics []string `env:"SHUTTER_P2P_FLOODSUBDISCOVERY_TOPICS"`
44+
}
3845
}
3946
Shuttermint struct {
4047
ShuttermintURL string `env:"SHUTTER_SHUTTERMINT_SHUTTERMINTURL"`
@@ -82,4 +89,4 @@ func AddSettingsToKeyper(generatedFilePath, configFilePath, outputFilePath strin
8289
fmt.Println("Keyper TOML file modified successfully and saved to", outputFilePath)
8390

8491
return nil
85-
}
92+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package settings
2+
3+
import (
4+
"testing"
5+
6+
"github.com/joho/godotenv"
7+
"gotest.tools/v3/assert"
8+
)
9+
10+
func TestUnmarshal(t *testing.T) {
11+
err := godotenv.Load("./test-assets/variables.env")
12+
assert.NilError(t, err, "assets variables error")
13+
var generatedConfig map[string]interface{}
14+
err = UnmarshallFromFile("./test-assets/keyper.toml", &generatedConfig)
15+
assert.NilError(t, err, "error unmarshalling")
16+
}
17+
18+
func TestAddSettings(t *testing.T) {
19+
err := godotenv.Load("./test-assets/variables.env")
20+
assert.NilError(t, err, "assets variables error")
21+
err = AddSettingsToKeyper("./test-assets/generated.toml", "./test-assets/keyper.toml", "./test-assets/out.toml")
22+
assert.NilError(t, err, "error")
23+
}
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
# Ethereum address: 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
2+
# Peer identity: /p2p/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
3+
4+
5+
InstanceID = 42
6+
# If it's empty, we use the standard PG_ environment variables
7+
DatabaseURL = 'postgres://pguser:pgpassword@localhost:5432/shutter'
8+
BeaconAPIURL = 'http://localhost:5052'
9+
HTTPEnabled = false
10+
HTTPListenAddress = ':3000'
11+
MaxNumKeysPerMessage = 500
12+
13+
[Gnosis]
14+
EncryptedGasLimit = 1000000
15+
MinGasPerTransaction = 21000
16+
MaxTxPointerAge = 5
17+
SecondsPerSlot = 5
18+
SlotsPerEpoch = 16
19+
GenesisSlotTimestamp = 1665410700
20+
SyncStartBlockNumber = 0
21+
22+
[Gnosis.Node]
23+
PrivateKey = '0000000000000000000000000000000000000000000000000000000000000000'
24+
# Contract source directory
25+
DeploymentDir = './deployments/localhost/'
26+
# The layer 1 JSON RPC endpoint
27+
EthereumURL = 'http://127.0.0.1:8545/'
28+
29+
[Gnosis.Contracts]
30+
KeyperSetManager = '0x0000000000000000000000000000000000000000'
31+
KeyBroadcastContract = '0x0000000000000000000000000000000000000000'
32+
Sequencer = '0x0000000000000000000000000000000000000000'
33+
ValidatorRegistry = '0x0000000000000000000000000000000000000000'
34+
35+
[P2P]
36+
P2PKey = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'
37+
ListenAddresses = ['/ip4/0.0.0.0/tcp/0', '/ip4/0.0.0.0/udp/0/quic-v1', '/ip4/0.0.0.0/udp/0/quic-v1/webtransport', '/ip6/::/tcp/0', '/ip6/::/udp/0/quic-v1', '/ip6/::/udp/0/quic-v1/webtransport']
38+
# Optional, addresses to be advertised to other peers instead of auto-detected ones.
39+
AdvertiseAddresses = []
40+
# Overwrite p2p boostrap nodes
41+
CustomBootstrapAddresses = ['/ip4/127.0.0.1/tcp/2001/p2p/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa', '/ip4/127.0.0.1/tcp/2002/p2p/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb']
42+
Environment = 'production'
43+
# Must be unique for each instance id.
44+
DiscoveryNamespace = 'shutter-42'
45+
# Optional, to be set to true if running an access node
46+
IsAccessNode = false
47+
48+
[P2P.FloodSubDiscovery]
49+
Enabled = false
50+
Interval = 10
51+
Topics = []
52+
53+
[Shuttermint]
54+
ShuttermintURL = 'http://localhost:26657'
55+
ValidatorPublicKey = '8888888888888888888888888888888888888888888888888888888888888888'
56+
EncryptionKey = '0000000000000000000000000000000000000000000000000000000000000000'
57+
DKGPhaseLength = 30
58+
DKGStartBlockDelta = 200
59+
60+
[Metrics]
61+
Enabled = false
62+
Host = '[::]'
63+
Port = 9100
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
# Ethereum address: 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
2+
# Peer identity: /p2p/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
3+
4+
5+
InstanceID = 42
6+
# If it's empty, we use the standard PG_ environment variables
7+
DatabaseURL = 'postgres://pguser:pgpassword@localhost:5432/shutter'
8+
BeaconAPIURL = 'http://localhost:5052'
9+
HTTPEnabled = false
10+
HTTPListenAddress = ':3000'
11+
MaxNumKeysPerMessage = 500
12+
13+
[Gnosis]
14+
EncryptedGasLimit = 1000000
15+
MinGasPerTransaction = 21000
16+
MaxTxPointerAge = 5
17+
SecondsPerSlot = 5
18+
SlotsPerEpoch = 16
19+
GenesisSlotTimestamp = 1665410700
20+
SyncStartBlockNumber = 0
21+
22+
[Gnosis.Node]
23+
PrivateKey = '0000000000000000000000000000000000000000000000000000000000000000'
24+
# Contract source directory
25+
DeploymentDir = './deployments/localhost/'
26+
# The layer 1 JSON RPC endpoint
27+
EthereumURL = 'http://127.0.0.1:8545/'
28+
29+
[Gnosis.Contracts]
30+
KeyperSetManager = '0x0000000000000000000000000000000000000000'
31+
KeyBroadcastContract = '0x0000000000000000000000000000000000000000'
32+
Sequencer = '0x0000000000000000000000000000000000000000'
33+
ValidatorRegistry = '0x0000000000000000000000000000000000000000'
34+
35+
[P2P]
36+
P2PKey = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'
37+
ListenAddresses = ['/ip4/0.0.0.0/tcp/0', '/ip4/0.0.0.0/udp/0/quic-v1', '/ip4/0.0.0.0/udp/0/quic-v1/webtransport', '/ip6/::/tcp/0', '/ip6/::/udp/0/quic-v1', '/ip6/::/udp/0/quic-v1/webtransport']
38+
# Optional, addresses to be advertised to other peers instead of auto-detected ones.
39+
AdvertiseAddresses = []
40+
# Overwrite p2p boostrap nodes
41+
CustomBootstrapAddresses = ['/ip4/127.0.0.1/tcp/2001/p2p/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa', '/ip4/127.0.0.1/tcp/2002/p2p/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb']
42+
Environment = 'production'
43+
# Must be unique for each instance id.
44+
DiscoveryNamespace = 'shutter-42'
45+
# Optional, to be set to true if running an access node
46+
IsAccessNode = false
47+
48+
[P2P.FloodSubDiscovery]
49+
Enabled = false
50+
Interval = 10
51+
Topics = []
52+
53+
[Shuttermint]
54+
ShuttermintURL = 'http://localhost:26657'
55+
ValidatorPublicKey = '8888888888888888888888888888888888888888888888888888888888888888'
56+
EncryptionKey = '0000000000000000000000000000000000000000000000000000000000000000'
57+
DKGPhaseLength = 30
58+
DKGStartBlockDelta = 200
59+
60+
[Metrics]
61+
Enabled = false
62+
Host = '[::]'
63+
Port = 9100
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
BeaconAPIURL = 'http://localhost:5052'
2+
DatabaseURL = 'postgres://pguser:pgpassword@localhost:5432/shutter'
3+
HTTPEnabled = false
4+
HTTPListenAddress = ':3000'
5+
InstanceID = 1000
6+
MaxNumKeysPerMessage = 500
7+
8+
[Gnosis]
9+
EncryptedGasLimit = 1000000
10+
GenesisSlotTimestamp = 1638993340
11+
MaxTxPointerAge = 5
12+
MinGasPerTransaction = 21000
13+
SecondsPerSlot = 5
14+
SlotsPerEpoch = 16
15+
SyncStartBlockNumber = 34627113
16+
17+
[Gnosis.Contracts]
18+
KeyBroadcastContract = '0x0000000000000000000000000000000000000000'
19+
KeyperSetManager = '0x0000000000000000000000000000000000000000'
20+
Sequencer = '0x0000000000000000000000000000000000000000'
21+
ValidatorRegistry = '0x0000000000000000000000000000000000000000'
22+
23+
[Gnosis.Node]
24+
DeploymentDir = './deployments/localhost/'
25+
EthereumURL = 'http://127.0.0.1:8545/'
26+
PrivateKey = '0000000000000000000000000000000000000000000000000000000000000000'
27+
28+
[Metrics]
29+
Enabled = false
30+
Host = '[::]'
31+
Port = 9100
32+
33+
[P2P]
34+
AdvertiseAddresses = []
35+
CustomBootstrapAddresses = ['/ip4/111.11.111.111/tcp/23003/p2p/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa', '/ip4/222.22.22.222/tcp/23003/p2p/BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB']
36+
DiscoveryNamespace = 'shutter-gnosis'
37+
Environment = 'production'
38+
IsAccessNode = false
39+
ListenAddresses = ['/ip4/0.0.0.0/tcp/0', '/ip4/0.0.0.0/udp/0/quic-v1', '/ip4/0.0.0.0/udp/0/quic-v1/webtransport', '/ip6/::/tcp/0', '/ip6/::/udp/0/quic-v1', '/ip6/::/udp/0/quic-v1/webtransport']
40+
P2PKey = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'
41+
42+
[P2P.FloodSubDiscovery]
43+
Enabled = false
44+
Interval = 10
45+
Topics = []
46+
47+
[Shuttermint]
48+
DKGPhaseLength = 30
49+
DKGStartBlockDelta = 1440
50+
EncryptionKey = '0000000000000000000000000000000000000000000000000000000000000000'
51+
ShuttermintURL = 'http://localhost:26657'
52+
ValidatorPublicKey = '8888888888888888888888888888888888888888888888888888888888888888'
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
# Enter variables that should be included in the assets container here, one per line, (ba)sh syntax.
2+
# convention is to start the names with `_ASSETS_` to prevent accidental naming conflicts
3+
4+
_ASSETS_DISCOVERY_NAME_PREFIX=shutter-gnosis
5+
6+
_ASSETS_INSTANCE_ID=1000
7+
_ASSETS_MAX_NUM_KEYS_PER_MESSAGE=500
8+
_ASSETS_ENCRYPTED_GAS_LIMIT=1000000
9+
_ASSETS_GENESIS_SLOT_TIMESTAMP=1638993340
10+
_ASSETS_SYNC_START_BLOCK_NUMBER=34627113
11+
_ASSETS_KEYPER_SET_MANAGER=0x0000000000000000000000000000000000000000
12+
_ASSETS_KEY_BROADCAST_CONTRACT=0x0000000000000000000000000000000000000000
13+
_ASSETS_SEQUENCER=0x0000000000000000000000000000000000000000
14+
_ASSETS_VALIDATOR_REGISTRY=0x0000000000000000000000000000000000000000
15+
_ASSETS_CUSTOM_BOOTSTRAP_ADDRESSES='["/ip4/111.11.111.111/tcp/23003/p2p/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "/ip4/222.22.22.222/tcp/23003/p2p/BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"]'
16+
_ASSETS_DKG_PHASE_LENGTH=30
17+
_ASSETS_DKG_START_BLOCK_DELTA=1440
18+
19+
_ASSETS_SHUTTERMINT_SEED_NODES="[email protected]:26656,[email protected]:26656"
20+
21+
_ASSETS_NETWORK=mainnet
22+
_ASSETS_VERSION=shutter-gnosis-1000-set1.3

0 commit comments

Comments
 (0)