diff options
author | Mission Liao <mission.liao@dexon.org> | 2018-12-26 10:15:51 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-12-26 10:15:51 +0800 |
commit | d333dc1a24df26ae8e8e3ffa2d700c1116a93ba2 (patch) | |
tree | f615cfa34cca680dd3e4a5930e06a6ff03ac1664 /simulation/config | |
parent | dce509a13ef5873b9cae3c1cabdb97e219b6fb7d (diff) | |
download | dexon-consensus-d333dc1a24df26ae8e8e3ffa2d700c1116a93ba2.tar dexon-consensus-d333dc1a24df26ae8e8e3ffa2d700c1116a93ba2.tar.gz dexon-consensus-d333dc1a24df26ae8e8e3ffa2d700c1116a93ba2.tar.bz2 dexon-consensus-d333dc1a24df26ae8e8e3ffa2d700c1116a93ba2.tar.lz dexon-consensus-d333dc1a24df26ae8e8e3ffa2d700c1116a93ba2.tar.xz dexon-consensus-d333dc1a24df26ae8e8e3ffa2d700c1116a93ba2.tar.zst dexon-consensus-d333dc1a24df26ae8e8e3ffa2d700c1116a93ba2.zip |
simulation: support config change (#381)
Diffstat (limited to 'simulation/config')
-rw-r--r-- | simulation/config/config.go | 60 | ||||
-rw-r--r-- | simulation/config/utils.go | 80 |
2 files changed, 122 insertions, 18 deletions
diff --git a/simulation/config/config.go b/simulation/config/config.go index 023c4df..797145c 100644 --- a/simulation/config/config.go +++ b/simulation/config/config.go @@ -18,24 +18,27 @@ package config import ( + "fmt" "math" "os" + "github.com/dexon-foundation/dexon-consensus/core" "github.com/dexon-foundation/dexon-consensus/core/test" "github.com/naoina/toml" ) // Consensus settings. type Consensus struct { - PhiRatio float32 - K int - ChainNum uint32 - GenesisCRS string `toml:"genesis_crs"` - LambdaBA int `toml:"lambda_ba"` - LambdaDKG int `toml:"lambda_dkg"` - RoundInterval int - NotarySetSize uint32 - DKGSetSize uint32 `toml:"dkg_set_size"` + PhiRatio float32 + K int + NumChains uint32 + GenesisCRS string `toml:"genesis_crs"` + LambdaBA int `toml:"lambda_ba"` + LambdaDKG int `toml:"lambda_dkg"` + RoundInterval int + NotarySetSize uint32 + DKGSetSize uint32 `toml:"dkg_set_size"` + MinBlockInterval int } // Legacy config. @@ -50,6 +53,7 @@ type Node struct { Legacy Legacy Num uint32 MaxBlock uint64 + Changes []Change } // Networking config. @@ -67,6 +71,25 @@ type Scheduler struct { WorkerNum int } +// Change represent future configuration changes. +type Change struct { + Round uint64 + Type string + Value string +} + +// RegisterChange reigster this change to a test.Governance instance. +func (c Change) RegisterChange(gov *test.Governance) error { + if c.Round < core.ConfigRoundShift { + panic(fmt.Errorf( + "attempt to register config change that never be executed: %v", + c.Round)) + } + t := StateChangeTypeFromString(c.Type) + return gov.RegisterConfigChange( + c.Round, t, StateChangeValueFromString(t, c.Value)) +} + // Config represents the configuration for simulation. type Config struct { Title string @@ -87,15 +110,16 @@ func GenerateDefault(path string) error { Title: "DEXON Consensus Simulation Config", Node: Node{ Consensus: Consensus{ - PhiRatio: float32(2) / 3, - K: 1, - ChainNum: 7, - GenesisCRS: "In DEXON we trust.", - LambdaBA: 250, - LambdaDKG: 1000, - RoundInterval: 30 * 1000, - NotarySetSize: 7, - DKGSetSize: 7, + PhiRatio: float32(2) / 3, + K: 1, + NumChains: 7, + GenesisCRS: "In DEXON we trust.", + LambdaBA: 250, + LambdaDKG: 1000, + RoundInterval: 30 * 1000, + NotarySetSize: 7, + DKGSetSize: 7, + MinBlockInterval: 750, }, Legacy: Legacy{ ProposeIntervalMean: 500, diff --git a/simulation/config/utils.go b/simulation/config/utils.go new file mode 100644 index 0000000..9d97fbd --- /dev/null +++ b/simulation/config/utils.go @@ -0,0 +1,80 @@ +// Copyright 2018 The dexon-consensus Authors +// This file is part of the dexon-consensus library. +// +// The dexon-consensus library is free software: you can redistribute it +// and/or modify it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// The dexon-consensus library is distributed in the hope that it will be +// useful, but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser +// General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the dexon-consensus library. If not, see +// <http://www.gnu.org/licenses/>. + +package config + +import ( + "fmt" + "strconv" + + "github.com/dexon-foundation/dexon-consensus/core/test" +) + +// StateChangeTypeFromString convert a string to test.StateChangeType. +func StateChangeTypeFromString(s string) test.StateChangeType { + switch s { + case "num_chains": + return test.StateChangeNumChains + case "lambda_ba": + return test.StateChangeLambdaBA + case "lambda_dkg": + return test.StateChangeLambdaDKG + case "round_interval": + return test.StateChangeRoundInterval + case "min_block_interval": + return test.StateChangeMinBlockInterval + case "k": + return test.StateChangeK + case "phi_ratio": + return test.StateChangePhiRatio + case "notary_set_size": + return test.StateChangeNotarySetSize + case "dkg_set_size": + return test.StateChangeDKGSetSize + } + panic(fmt.Errorf("unsupported state change type %s", s)) +} + +// StateChangeValueFromString converts a string to a value for state change +// request. +func StateChangeValueFromString( + t test.StateChangeType, v string) interface{} { + switch t { + case test.StateChangeNumChains, test.StateChangeNotarySetSize, + test.StateChangeDKGSetSize: + ret, err := strconv.ParseUint(v, 10, 32) + if err != nil { + panic(err) + } + return uint32(ret) + case test.StateChangeLambdaBA, test.StateChangeLambdaDKG, + test.StateChangeRoundInterval, test.StateChangeMinBlockInterval, + test.StateChangeK: + ret, err := strconv.ParseInt(v, 10, 32) + if err != nil { + panic(err) + } + return int(ret) + case test.StateChangePhiRatio: + ret, err := strconv.ParseFloat(v, 32) + if err != nil { + panic(err) + } + return float32(ret) + } + panic(fmt.Errorf("unsupported state change type %s", t)) +} |