aboutsummaryrefslogtreecommitdiffstats
path: root/core
diff options
context:
space:
mode:
authorWei-Ning Huang <w@dexon.org>2019-03-19 16:22:55 +0800
committerWei-Ning Huang <w@byzantine-lab.io>2019-06-13 18:11:42 +0800
commit52abd7878fc59776550c73b0e1c6746448c83c17 (patch)
tree5824ad4b21fd51b2bfb496914791d71de99dfceb /core
parent55e22571a1cd5ef5d27a29ab1b0ecfb1b78cb264 (diff)
downloadgo-tangerine-52abd7878fc59776550c73b0e1c6746448c83c17.tar.gz
go-tangerine-52abd7878fc59776550c73b0e1c6746448c83c17.tar.zst
go-tangerine-52abd7878fc59776550c73b0e1c6746448c83c17.zip
core: vm: automatically calculate notary set size (#276)
Diffstat (limited to 'core')
-rw-r--r--core/governance.go2
-rw-r--r--core/vm/oracle_contract_abi.go32
-rw-r--r--core/vm/oracle_contracts.go69
-rw-r--r--core/vm/oracle_contracts_test.go8
4 files changed, 96 insertions, 15 deletions
diff --git a/core/governance.go b/core/governance.go
index db0e60b6c..da310a1cd 100644
--- a/core/governance.go
+++ b/core/governance.go
@@ -99,7 +99,7 @@ func (g *Governance) Configuration(round uint64) *coreTypes.Config {
return &coreTypes.Config{
LambdaBA: time.Duration(c.LambdaBA) * time.Millisecond,
LambdaDKG: time.Duration(c.LambdaDKG) * time.Millisecond,
- NotarySetSize: c.NotarySetSize,
+ NotarySetSize: uint32(configHelper.NotarySetSize().Uint64()),
DKGSetSize: c.DKGSetSize,
RoundLength: c.RoundLength,
MinBlockInterval: time.Duration(c.MinBlockInterval) * time.Millisecond,
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..e30d0382a 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 {
@@ -939,8 +974,8 @@ func (s *GovernanceState) Configuration() *params.DexconConfig {
BlockGasLimit: s.getStateBigInt(big.NewInt(blockGasLimitLoc)).Uint64(),
LambdaBA: s.getStateBigInt(big.NewInt(lambdaBALoc)).Uint64(),
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(),
@@ -958,11 +993,15 @@ func (s *GovernanceState) UpdateConfiguration(cfg *params.DexconConfig) {
s.setStateBigInt(big.NewInt(blockGasLimitLoc), big.NewInt(int64(cfg.BlockGasLimit)))
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(dkgSetSizeLoc), big.NewInt(int64(cfg.DKGSetSize)))
+ 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(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 +1011,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 +1026,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 +1530,7 @@ func (g *GovernanceContract) updateConfiguration(cfg *rawConfigStruct) ([]byte,
g.state.UpdateConfigurationRaw(cfg)
g.state.emitConfigurationChangedEvent()
+
return nil, nil
}
@@ -1530,6 +1573,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 +1603,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 +1641,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")