aboutsummaryrefslogtreecommitdiffstats
path: root/simulation/validator.go
diff options
context:
space:
mode:
authorWei-Ning Huang <w@dexon.org>2018-07-16 00:12:17 +0800
committerWei-Ning Huang <w@cobinhood.com>2018-07-16 11:06:14 +0800
commitaed24cf020bd11c3b20a7011b96c02e41894fa32 (patch)
tree720bc1542dd1edb7308c124a5265e21b3c01d08b /simulation/validator.go
downloadtangerine-consensus-aed24cf020bd11c3b20a7011b96c02e41894fa32.tar
tangerine-consensus-aed24cf020bd11c3b20a7011b96c02e41894fa32.tar.gz
tangerine-consensus-aed24cf020bd11c3b20a7011b96c02e41894fa32.tar.bz2
tangerine-consensus-aed24cf020bd11c3b20a7011b96c02e41894fa32.tar.lz
tangerine-consensus-aed24cf020bd11c3b20a7011b96c02e41894fa32.tar.xz
tangerine-consensus-aed24cf020bd11c3b20a7011b96c02e41894fa32.tar.zst
tangerine-consensus-aed24cf020bd11c3b20a7011b96c02e41894fa32.zip
Initial implementation of DEXON consensus algorithm
Diffstat (limited to 'simulation/validator.go')
-rw-r--r--simulation/validator.go139
1 files changed, 139 insertions, 0 deletions
diff --git a/simulation/validator.go b/simulation/validator.go
new file mode 100644
index 0000000..84e5e52
--- /dev/null
+++ b/simulation/validator.go
@@ -0,0 +1,139 @@
+// Copyright 2018 The dexon-consensus-core Authors
+// This file is part of the dexon-consensus-core library.
+//
+// The dexon-consensus-core 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-core 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-core library. If not, see
+// <http://www.gnu.org/licenses/>.
+
+package simulation
+
+import (
+ "time"
+
+ "github.com/syndtr/goleveldb/leveldb"
+
+ "github.com/dexon-foundation/dexon-consensus-core/blockdb"
+ "github.com/dexon-foundation/dexon-consensus-core/common"
+ "github.com/dexon-foundation/dexon-consensus-core/core"
+ "github.com/dexon-foundation/dexon-consensus-core/core/types"
+ "github.com/dexon-foundation/dexon-consensus-core/simulation/config"
+)
+
+// Validator represents a validator in DexCon.
+type Validator struct {
+ network core.Network
+ app *SimApp
+
+ config config.Validator
+ db *leveldb.DB
+ msgChannel chan interface{}
+
+ ID types.ValidatorID
+ lattice *core.BlockLattice
+ compactionChain *core.BlockChain
+
+ genesis *types.Block
+ current *types.Block
+}
+
+// NewValidator returns a new empty validator.
+func NewValidator(
+ id types.ValidatorID,
+ config config.Validator,
+ network core.Network,
+ db *leveldb.DB) *Validator {
+
+ hash := common.NewRandomHash()
+ genesis := &types.Block{
+ ProposerID: id,
+ ParentHash: hash,
+ Hash: hash,
+ Height: 0,
+ Acks: map[common.Hash]struct{}{},
+ }
+
+ app := NewSimApp(id)
+ lattice := core.NewBlockLattice(blockdb.NewMemBackedBlockDB(), network, app)
+
+ return &Validator{
+ ID: id,
+ config: config,
+ network: network,
+ app: app,
+ db: db,
+ lattice: lattice,
+ genesis: genesis,
+ current: genesis,
+ }
+}
+
+// GetID returns the ID of validator.
+func (v *Validator) GetID() types.ValidatorID {
+ return v.ID
+}
+
+// Bootstrap bootstraps a validator.
+func (v *Validator) Bootstrap(vs []*Validator) {
+ for _, x := range vs {
+ v.lattice.AddValidator(x.ID, x.genesis)
+ }
+ v.lattice.SetOwner(v.ID)
+}
+
+// Run starts the validator.
+func (v *Validator) Run() {
+ v.msgChannel = v.network.Join(v)
+
+ go v.MsgServer()
+ go v.BlockProposer()
+
+ // Blocks forever.
+ select {}
+}
+
+// MsgServer listen to the network channel for message and handle it.
+func (v *Validator) MsgServer() {
+ for {
+ msg := <-v.msgChannel
+
+ switch val := msg.(type) {
+ case *types.Block:
+ //if val.ProposerID.Equal(v.ID) {
+ // continue
+ //}
+ v.lattice.ProcessBlock(val, true)
+ }
+ }
+}
+
+// BlockProposer propose blocks to be send to the DEXON network.
+func (v *Validator) BlockProposer() {
+ model := &NormalNetwork{
+ Sigma: v.config.ProposeIntervalSigma,
+ Mean: v.config.ProposeIntervalMean,
+ }
+
+ for {
+ time.Sleep(model.Delay())
+
+ block := &types.Block{
+ ProposerID: v.ID,
+ ParentHash: v.current.Hash,
+ Hash: common.NewRandomHash(),
+ Height: 0,
+ Acks: map[common.Hash]struct{}{},
+ }
+ v.current = block
+ v.lattice.ProposeBlock(block)
+ }
+}