aboutsummaryrefslogtreecommitdiffstats
path: root/simulation/node.go
diff options
context:
space:
mode:
authorMission Liao <mission.liao@dexon.org>2018-11-08 15:58:51 +0800
committerGitHub <noreply@github.com>2018-11-08 15:58:51 +0800
commit1ee5863fd4a295d34c3a2d602d5603e8746e3f7b (patch)
tree044308b22000bb0c9f5a8c3c21f465159418db24 /simulation/node.go
parentdbe83ea4a324941417d6ff09230e5874d5ba5df5 (diff)
downloaddexon-consensus-1ee5863fd4a295d34c3a2d602d5603e8746e3f7b.tar
dexon-consensus-1ee5863fd4a295d34c3a2d602d5603e8746e3f7b.tar.gz
dexon-consensus-1ee5863fd4a295d34c3a2d602d5603e8746e3f7b.tar.bz2
dexon-consensus-1ee5863fd4a295d34c3a2d602d5603e8746e3f7b.tar.lz
dexon-consensus-1ee5863fd4a295d34c3a2d602d5603e8746e3f7b.tar.xz
dexon-consensus-1ee5863fd4a295d34c3a2d602d5603e8746e3f7b.tar.zst
dexon-consensus-1ee5863fd4a295d34c3a2d602d5603e8746e3f7b.zip
simulation: use test.Governacne in simulation (#311)
* Move simulation.Network to test package * Use test.Governance in simulation * Pack/Apply state request in blocks payload * Add Governance.SwitchToRemoteMode This would trigger governance to broadcast pending state change requests when changes. * Allow to marshal/unmarshal packedStateChanges * Attach test.Network and test.State
Diffstat (limited to 'simulation/node.go')
-rw-r--r--simulation/node.go62
1 files changed, 30 insertions, 32 deletions
diff --git a/simulation/node.go b/simulation/node.go
index 56c5832..1127f5a 100644
--- a/simulation/node.go
+++ b/simulation/node.go
@@ -20,7 +20,6 @@ package simulation
import (
"encoding/json"
"fmt"
- "sort"
"time"
"github.com/dexon-foundation/dexon-consensus/common"
@@ -29,7 +28,6 @@ import (
"github.com/dexon-foundation/dexon-consensus/core/crypto"
"github.com/dexon-foundation/dexon-consensus/core/test"
"github.com/dexon-foundation/dexon-consensus/core/types"
- typesDKG "github.com/dexon-foundation/dexon-consensus/core/types/dkg"
"github.com/dexon-foundation/dexon-consensus/simulation/config"
)
@@ -56,15 +54,11 @@ type message struct {
// node represents a node in DexCon.
type node struct {
- app core.Application
- gov *simGovernance
- db blockdb.BlockDatabase
-
- config config.Node
+ app core.Application
+ db blockdb.BlockDatabase
+ gov *test.Governance
netModule *test.Network
-
ID types.NodeID
- chainID uint64
prvKey crypto.PrivateKey
consensus *core.Consensus
}
@@ -91,17 +85,32 @@ func newNode(
if err != nil {
panic(err)
}
- gov := newSimGovernance(
- id,
- config.Node.Num,
- config.Node.Consensus.NotarySetSize,
- config.Node.Consensus.DKGSetSize,
- config.Node.Consensus)
+ // Sync config to state in governance.
+ cConfig := config.Node.Consensus
+ gov, err := test.NewGovernance([]crypto.PublicKey{pubKey}, time.Millisecond)
+ if err != nil {
+ panic(err)
+ }
+ gov.State().RequestChange(test.StateChangeK, cConfig.K)
+ gov.State().RequestChange(test.StateChangePhiRatio, cConfig.PhiRatio)
+ gov.State().RequestChange(test.StateChangeNumChains, cConfig.ChainNum)
+ gov.State().RequestChange(
+ test.StateChangeNotarySetSize, cConfig.NotarySetSize)
+ gov.State().RequestChange(test.StateChangeDKGSetSize, cConfig.DKGSetSize)
+ gov.State().RequestChange(test.StateChangeLambdaBA, time.Duration(
+ cConfig.LambdaBA)*time.Millisecond)
+ gov.State().RequestChange(test.StateChangeLambdaDKG, time.Duration(
+ cConfig.LambdaDKG)*time.Millisecond)
+ gov.State().RequestChange(test.StateChangeRoundInterval, time.Duration(
+ cConfig.RoundInterval)*time.Millisecond)
+ gov.State().RequestChange(
+ test.StateChangeMinBlockInterval,
+ 3*time.Duration(cConfig.LambdaBA)*time.Millisecond)
+ gov.State().ProposeCRS(0, crypto.Keccak256Hash([]byte(cConfig.GenesisCRS)))
return &node{
ID: id,
prvKey: prvKey,
- config: config.Node,
- app: newSimApp(id, netModule),
+ app: newSimApp(id, netModule, gov.State()),
gov: gov,
db: db,
netModule: netModule,
@@ -122,21 +131,16 @@ func (n *node) run(serverEndpoint interface{}, dMoment time.Time) {
msgChannel := n.netModule.ReceiveChanForNode()
peers := n.netModule.Peers()
go n.netModule.Run()
- n.gov.setNetwork(n.netModule)
// Run consensus.
hashes := make(common.Hashes, 0, len(peers))
for _, pubKey := range peers {
nID := types.NewNodeID(pubKey)
- n.gov.addNode(pubKey)
+ n.gov.State().RequestChange(test.StateAddNode, pubKey)
hashes = append(hashes, nID.Hash)
}
- sort.Sort(hashes)
- for i, hash := range hashes {
- if hash == n.ID.Hash {
- n.chainID = uint64(i)
- break
- }
- }
+ // Setup of governance is ready, can be switched to remote mode.
+ n.gov.SwitchToRemoteMode(n.netModule)
+ // Setup Consensus.
n.consensus = core.NewConsensus(
dMoment,
n.app,
@@ -156,12 +160,6 @@ MainLoop:
if val == statusShutdown {
break MainLoop
}
- case *typesDKG.Complaint:
- n.gov.AddDKGComplaint(val.Round, val)
- case *typesDKG.MasterPublicKey:
- n.gov.AddDKGMasterPublicKey(val.Round, val)
- case *typesDKG.Finalize:
- n.gov.AddDKGFinalize(val.Round, val)
default:
panic(fmt.Errorf("unexpected message from server: %v", val))
}