diff options
author | Wei-Ning Huang <w@dexon.org> | 2019-03-19 16:22:55 +0800 |
---|---|---|
committer | Wei-Ning Huang <w@dexon.org> | 2019-04-09 21:32:58 +0800 |
commit | 625bdb6b3ecdd5bed3adb4cd1f8fc0e56ae1f49f (patch) | |
tree | e376057c9fc6d5f5355ccc5d6976c529bb69fde7 | |
parent | 4ae37d25a2bd79fa98a5e7845342b98133d2cc6f (diff) | |
download | dexon-625bdb6b3ecdd5bed3adb4cd1f8fc0e56ae1f49f.tar.gz dexon-625bdb6b3ecdd5bed3adb4cd1f8fc0e56ae1f49f.tar.zst dexon-625bdb6b3ecdd5bed3adb4cd1f8fc0e56ae1f49f.zip |
core: vm: automatically calculate notary set size (#276)
-rw-r--r-- | core/vm/oracle_contract_abi.go | 32 | ||||
-rw-r--r-- | core/vm/oracle_contracts.go | 65 | ||||
-rw-r--r-- | core/vm/oracle_contracts_test.go | 8 | ||||
-rw-r--r-- | params/config.go | 32 | ||||
-rw-r--r-- | params/gen_dexcon_config.go | 12 | ||||
-rw-r--r-- | test/genesis.json | 4 |
6 files changed, 126 insertions, 27 deletions
diff --git a/core/vm/oracle_contract_abi.go b/core/vm/oracle_contract_abi.go index 369c9ec17..af0affece 100644 --- a/core/vm/oracle_contract_abi.go +++ b/core/vm/oracle_contract_abi.go @@ -141,6 +141,20 @@ const GovernanceABIJSON = ` { "constant": true, "inputs": [], + "name": "notaryParamBeta", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], "name": "miningVelocity", "outputs": [ { @@ -196,6 +210,20 @@ const GovernanceABIJSON = ` }, { "constant": true, + "inputs": [], + "name": "notaryParamAlpha", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, "inputs": [ { "name": "", @@ -817,11 +845,11 @@ const GovernanceABIJSON = ` "type": "uint256" }, { - "name": "NotarySetSize", + "name": "NotaryParamAlpha", "type": "uint256" }, { - "name": "DKGSetSize", + "name": "NotaryParamBeta", "type": "uint256" }, { diff --git a/core/vm/oracle_contracts.go b/core/vm/oracle_contracts.go index b8eb4fedc..62261a36b 100644 --- a/core/vm/oracle_contracts.go +++ b/core/vm/oracle_contracts.go @@ -21,6 +21,7 @@ import ( "bytes" "errors" "fmt" + "math" "math/big" "sort" @@ -84,6 +85,8 @@ const ( lambdaBALoc lambdaDKGLoc notarySetSizeLoc + notaryParamAlphaLoc + notaryParamBetaLoc dkgSetSizeLoc roundLengthLoc minBlockIntervalLoc @@ -816,11 +819,43 @@ func (s *GovernanceState) LambdaDKG() *big.Int { func (s *GovernanceState) NotarySetSize() *big.Int { return s.getStateBigInt(big.NewInt(notarySetSizeLoc)) } +func (s *GovernanceState) CalNotarySetSize() { + nodeSetSize := float64(len(s.QualifiedNodes())) + setSize := math.Ceil((nodeSetSize*0.6-1)/3)*3 + 1 + + if nodeSetSize >= 80 { + alpha := float64(s.NotaryParamAlpha().Uint64()) / decimalMultiplier + beta := float64(s.NotaryParamBeta().Uint64()) / decimalMultiplier + setSize = math.Ceil(alpha*math.Log(nodeSetSize) - beta) + } + s.setStateBigInt(big.NewInt(notarySetSizeLoc), big.NewInt(int64(setSize))) +} + +// uint256 public notaryParamAlpha; +func (s *GovernanceState) NotaryParamAlpha() *big.Int { + return s.getStateBigInt(big.NewInt(notaryParamAlphaLoc)) +} + +// uint256 public notaryParamBeta; +func (s *GovernanceState) NotaryParamBeta() *big.Int { + return s.getStateBigInt(big.NewInt(notaryParamBetaLoc)) +} // uint256 public dkgSetSize; func (s *GovernanceState) DKGSetSize() *big.Int { return s.getStateBigInt(big.NewInt(dkgSetSizeLoc)) } +func (s *GovernanceState) CalDKGSetSize() { + nodeSetSize := float64(len(s.QualifiedNodes())) + setSize := math.Ceil((nodeSetSize*0.6-1)/3)*3 + 1 + + if nodeSetSize >= 100 { + alpha := float64(s.NotaryParamAlpha().Uint64()) / decimalMultiplier + beta := float64(s.NotaryParamBeta().Uint64()) / decimalMultiplier + setSize = math.Ceil(alpha*math.Log(nodeSetSize) - beta) + } + s.setStateBigInt(big.NewInt(dkgSetSizeLoc), big.NewInt(int64(setSize))) +} // uint256 public roundLength; func (s *GovernanceState) RoundLength() *big.Int { @@ -941,6 +976,8 @@ func (s *GovernanceState) Configuration() *params.DexconConfig { LambdaDKG: s.getStateBigInt(big.NewInt(lambdaDKGLoc)).Uint64(), NotarySetSize: uint32(s.getStateBigInt(big.NewInt(notarySetSizeLoc)).Uint64()), DKGSetSize: uint32(s.getStateBigInt(big.NewInt(dkgSetSizeLoc)).Uint64()), + NotaryParamAlpha: float32(s.getStateBigInt(big.NewInt(notaryParamAlphaLoc)).Uint64()) / decimalMultiplier, + NotaryParamBeta: float32(s.getStateBigInt(big.NewInt(notaryParamBetaLoc)).Uint64()) / decimalMultiplier, RoundLength: s.getStateBigInt(big.NewInt(roundLengthLoc)).Uint64(), MinBlockInterval: s.getStateBigInt(big.NewInt(minBlockIntervalLoc)).Uint64(), FineValues: s.FineValues(), @@ -959,10 +996,16 @@ func (s *GovernanceState) UpdateConfiguration(cfg *params.DexconConfig) { s.setStateBigInt(big.NewInt(lambdaBALoc), big.NewInt(int64(cfg.LambdaBA))) s.setStateBigInt(big.NewInt(lambdaDKGLoc), big.NewInt(int64(cfg.LambdaDKG))) s.setStateBigInt(big.NewInt(notarySetSizeLoc), big.NewInt(int64(cfg.NotarySetSize))) + s.setStateBigInt(big.NewInt(notaryParamAlphaLoc), big.NewInt(int64(cfg.NotaryParamAlpha*decimalMultiplier))) + s.setStateBigInt(big.NewInt(notaryParamBetaLoc), big.NewInt(int64(cfg.NotaryParamBeta*decimalMultiplier))) s.setStateBigInt(big.NewInt(dkgSetSizeLoc), big.NewInt(int64(cfg.DKGSetSize))) s.setStateBigInt(big.NewInt(roundLengthLoc), big.NewInt(int64(cfg.RoundLength))) s.setStateBigInt(big.NewInt(minBlockIntervalLoc), big.NewInt(int64(cfg.MinBlockInterval))) s.SetFineValues(cfg.FineValues) + + // Calculate set size. + s.CalNotarySetSize() + s.CalDKGSetSize() } type rawConfigStruct struct { @@ -972,8 +1015,8 @@ type rawConfigStruct struct { MinGasPrice *big.Int LambdaBA *big.Int LambdaDKG *big.Int - NotarySetSize *big.Int - DKGSetSize *big.Int + NotaryParamAlpha *big.Int + NotaryParamBeta *big.Int RoundLength *big.Int MinBlockInterval *big.Int FineValues []*big.Int @@ -987,11 +1030,14 @@ func (s *GovernanceState) UpdateConfigurationRaw(cfg *rawConfigStruct) { s.setStateBigInt(big.NewInt(blockGasLimitLoc), cfg.BlockGasLimit) s.setStateBigInt(big.NewInt(lambdaBALoc), cfg.LambdaBA) s.setStateBigInt(big.NewInt(lambdaDKGLoc), cfg.LambdaDKG) - s.setStateBigInt(big.NewInt(notarySetSizeLoc), cfg.NotarySetSize) - s.setStateBigInt(big.NewInt(dkgSetSizeLoc), cfg.DKGSetSize) + s.setStateBigInt(big.NewInt(notaryParamAlphaLoc), cfg.NotaryParamAlpha) + s.setStateBigInt(big.NewInt(notaryParamBetaLoc), cfg.NotaryParamBeta) s.setStateBigInt(big.NewInt(roundLengthLoc), cfg.RoundLength) s.setStateBigInt(big.NewInt(minBlockIntervalLoc), cfg.MinBlockInterval) s.SetFineValues(cfg.FineValues) + + s.CalNotarySetSize() + s.CalDKGSetSize() } // event ConfigurationChanged(); @@ -1488,6 +1534,7 @@ func (g *GovernanceContract) updateConfiguration(cfg *rawConfigStruct) ([]byte, g.state.UpdateConfigurationRaw(cfg) g.state.emitConfigurationChangedEvent() + return nil, nil } @@ -1530,6 +1577,9 @@ func (g *GovernanceContract) register( if value.Cmp(big.NewInt(0)) > 0 { g.state.IncTotalStaked(value) g.state.emitStaked(caller, value) + + g.state.CalNotarySetSize() + g.state.CalDKGSetSize() } return g.useGas(GovernanceActionGasCost) } @@ -1557,6 +1607,10 @@ func (g *GovernanceContract) stake() ([]byte, error) { g.state.IncTotalStaked(value) g.state.emitStaked(caller, value) + + g.state.CalNotarySetSize() + g.state.CalDKGSetSize() + return g.useGas(GovernanceActionGasCost) } @@ -1591,6 +1645,9 @@ func (g *GovernanceContract) unstake(amount *big.Int) ([]byte, error) { g.state.DecTotalStaked(amount) g.state.emitUnstaked(caller, amount) + g.state.CalNotarySetSize() + g.state.CalDKGSetSize() + return g.useGas(GovernanceActionGasCost) } diff --git a/core/vm/oracle_contracts_test.go b/core/vm/oracle_contracts_test.go index 868ea533c..69e13e1a1 100644 --- a/core/vm/oracle_contracts_test.go +++ b/core/vm/oracle_contracts_test.go @@ -492,8 +492,8 @@ func (g *OracleContractsTestSuite) TestUpdateConfiguration() { big.NewInt(8000000), big.NewInt(250), big.NewInt(2500), - big.NewInt(4), - big.NewInt(4), + big.NewInt(int64(70.5*decimalMultiplier)), + big.NewInt(264*decimalMultiplier), big.NewInt(600), big.NewInt(900), []*big.Int{big.NewInt(1), big.NewInt(1), big.NewInt(1)}) @@ -591,7 +591,7 @@ func (g *OracleContractsTestSuite) TestConfigurationReading() { g.Require().NoError(err) err = GovernanceABI.ABI.Unpack(&value, "notarySetSize", res) g.Require().NoError(err) - g.Require().Equal(g.config.NotarySetSize, uint32(value.Uint64())) + g.Require().True(uint32(value.Uint64()) > 0) // DKGRound. input, err = GovernanceABI.ABI.Pack("dkgRound") @@ -612,7 +612,7 @@ func (g *OracleContractsTestSuite) TestConfigurationReading() { g.Require().NoError(err) err = GovernanceABI.ABI.Unpack(&value, "dkgSetSize", res) g.Require().NoError(err) - g.Require().Equal(g.config.DKGSetSize, uint32(value.Uint64())) + g.Require().True(uint32(value.Uint64()) > 0) // RoundLength. input, err = GovernanceABI.ABI.Pack("roundLength") diff --git a/params/config.go b/params/config.go index 76ca84cf5..27db83b37 100644 --- a/params/config.go +++ b/params/config.go @@ -26,10 +26,10 @@ import ( // Genesis hashes to enforce below configs on. var ( - MainnetGenesisHash = common.HexToHash("0xcde2f22a8ccad92a6839880e445bccf3949aae712056a9d139a318f9f4b18fe8") - TestnetGenesisHash = common.HexToHash("0x7463c980be61ae7e32e8a7611c9532989dfc4463c264b9ef3d31bfe490780425") - TaipeiGenesisHash = common.HexToHash("0x953540c8dc6155c506b85be9944b97c636948e2cb47b698e4bdf7d58563a6e01") - YilanGenesisHash = common.HexToHash("0x70654e2b863f01f00f843e6c4b0ecf2af39f7e27493f577ca4526b40eb1773c7") + MainnetGenesisHash = common.HexToHash("0x8ac8e240790046eb72225eb2a2381f3ef5a7a88291fffc702ba08503cc2a1341") + TestnetGenesisHash = common.HexToHash("0x3caf9a977e579b4de001956508b57563a4b61742c66f49323a1294ad214da29d") + TaipeiGenesisHash = common.HexToHash("0x13e85a0207f2888ac9c1746c94d5d7fd87ff637cbd080b42d5db1252341f4428") + YilanGenesisHash = common.HexToHash("0x6b1a94b5e4c24665942a3b768bd98b39d61771a5eaba97c0466644d78d8a2f11") ) var ( @@ -59,8 +59,8 @@ var ( BlockGasLimit: 40000000, LambdaBA: 250, LambdaDKG: 2500, - NotarySetSize: 4, - DKGSetSize: 4, + NotaryParamAlpha: 70.5, + NotaryParamBeta: 264, RoundLength: 600, MinBlockInterval: 1000, FineValues: []*big.Int{ @@ -110,8 +110,8 @@ var ( BlockGasLimit: 80000000, LambdaBA: 250, LambdaDKG: 10000, - NotarySetSize: 24, - DKGSetSize: 24, + NotaryParamAlpha: 70.5, + NotaryParamBeta: 264, RoundLength: 1200, MinBlockInterval: 1000, FineValues: []*big.Int{ @@ -152,8 +152,8 @@ var ( BlockGasLimit: 21000 * 5000, LambdaBA: 250, LambdaDKG: 10000, - NotarySetSize: 24, - DKGSetSize: 24, + NotaryParamAlpha: 70.5, + NotaryParamBeta: 264, RoundLength: 1200, MinBlockInterval: 500, FineValues: []*big.Int{ @@ -202,8 +202,8 @@ var ( BlockGasLimit: 21000 * 5000, LambdaBA: 250, LambdaDKG: 10000, - NotarySetSize: 4, - DKGSetSize: 4, + NotaryParamAlpha: 70.5, + NotaryParamBeta: 264, RoundLength: 1200, MinBlockInterval: 500, FineValues: []*big.Int{ @@ -353,6 +353,8 @@ type DexconConfig struct { LambdaBA uint64 `json:"lambdaBA"` LambdaDKG uint64 `json:"lambdaDKG"` NotarySetSize uint32 `json:"notarySetSize"` + NotaryParamAlpha float32 `json:"notaryParamAlpha"` + NotaryParamBeta float32 `json:"notaryParamBeta"` DKGSetSize uint32 `json:"dkgSetSize"` RoundLength uint64 `json:"roundLength"` MinBlockInterval uint64 `json:"minBlockInterval"` @@ -369,7 +371,7 @@ type dexconConfigSpecMarshaling struct { // String implements the stringer interface, returning the consensus engine details. func (d *DexconConfig) String() string { - return fmt.Sprintf("{GenesisCRSText: %v Owner: %v MinStake: %v LockupPeriod: %v MiningVelocity: %v NextHalvingSupply: %v LastHalvedAmount: %v MinGasPrice: %v BlockGasLimit: %v LambdaBA: %v LambdaDKG: %v NotarySetSize: %v DKGSetSize: %v RoundLength: %v MinBlockInterval: %v FineValues: %v}", + return fmt.Sprintf("{GenesisCRSText: %v Owner: %v MinStake: %v LockupPeriod: %v MiningVelocity: %v NextHalvingSupply: %v LastHalvedAmount: %v MinGasPrice: %v BlockGasLimit: %v LambdaBA: %v LambdaDKG: %v NotaryParamAlpha: %v NotaryParamBeta: %v RoundLength: %v MinBlockInterval: %v FineValues: %v}", d.GenesisCRSText, d.Owner, d.MinStake, @@ -381,8 +383,8 @@ func (d *DexconConfig) String() string { d.BlockGasLimit, d.LambdaBA, d.LambdaDKG, - d.NotarySetSize, - d.DKGSetSize, + d.NotaryParamAlpha, + d.NotaryParamBeta, d.RoundLength, d.MinBlockInterval, d.FineValues, diff --git a/params/gen_dexcon_config.go b/params/gen_dexcon_config.go index 38753916a..bbbf8e910 100644 --- a/params/gen_dexcon_config.go +++ b/params/gen_dexcon_config.go @@ -27,6 +27,8 @@ func (d DexconConfig) MarshalJSON() ([]byte, error) { LambdaBA uint64 `json:"lambdaBA"` LambdaDKG uint64 `json:"lambdaDKG"` NotarySetSize uint32 `json:"notarySetSize"` + NotaryParamAlpha float32 `json:"notaryParamAlpha"` + NotaryParamBeta float32 `json:"notaryParamBeta"` DKGSetSize uint32 `json:"dkgSetSize"` RoundLength uint64 `json:"roundLength"` MinBlockInterval uint64 `json:"minBlockInterval"` @@ -45,6 +47,8 @@ func (d DexconConfig) MarshalJSON() ([]byte, error) { enc.LambdaBA = d.LambdaBA enc.LambdaDKG = d.LambdaDKG enc.NotarySetSize = d.NotarySetSize + enc.NotaryParamAlpha = d.NotaryParamAlpha + enc.NotaryParamBeta = d.NotaryParamBeta enc.DKGSetSize = d.DKGSetSize enc.RoundLength = d.RoundLength enc.MinBlockInterval = d.MinBlockInterval @@ -72,6 +76,8 @@ func (d *DexconConfig) UnmarshalJSON(input []byte) error { LambdaBA *uint64 `json:"lambdaBA"` LambdaDKG *uint64 `json:"lambdaDKG"` NotarySetSize *uint32 `json:"notarySetSize"` + NotaryParamAlpha *float32 `json:"notaryParamAlpha"` + NotaryParamBeta *float32 `json:"notaryParamBeta"` DKGSetSize *uint32 `json:"dkgSetSize"` RoundLength *uint64 `json:"roundLength"` MinBlockInterval *uint64 `json:"minBlockInterval"` @@ -117,6 +123,12 @@ func (d *DexconConfig) UnmarshalJSON(input []byte) error { if dec.NotarySetSize != nil { d.NotarySetSize = *dec.NotarySetSize } + if dec.NotaryParamAlpha != nil { + d.NotaryParamAlpha = *dec.NotaryParamAlpha + } + if dec.NotaryParamBeta != nil { + d.NotaryParamBeta = *dec.NotaryParamBeta + } if dec.DKGSetSize != nil { d.DKGSetSize = *dec.DKGSetSize } diff --git a/test/genesis.json b/test/genesis.json index 8be5a844d..5a2891dcd 100644 --- a/test/genesis.json +++ b/test/genesis.json @@ -23,8 +23,8 @@ "blockGasLimit": 40000000, "lambdaBA": 250, "lambdaDKG": 1500, - "notarySetSize": 4, - "dkgSetSize": 4, + "notaryParamAlpha": 70.5, + "notaryParamBeta": 264, "roundLength": 100, "minBlockInterval": 500, "fineValues": [ |