diff options
author | Wei-Ning Huang <w@dexon.org> | 2018-07-16 00:12:17 +0800 |
---|---|---|
committer | Wei-Ning Huang <w@cobinhood.com> | 2018-07-16 11:06:14 +0800 |
commit | aed24cf020bd11c3b20a7011b96c02e41894fa32 (patch) | |
tree | 720bc1542dd1edb7308c124a5265e21b3c01d08b /simulation/network.go | |
download | dexon-consensus-aed24cf020bd11c3b20a7011b96c02e41894fa32.tar dexon-consensus-aed24cf020bd11c3b20a7011b96c02e41894fa32.tar.gz dexon-consensus-aed24cf020bd11c3b20a7011b96c02e41894fa32.tar.bz2 dexon-consensus-aed24cf020bd11c3b20a7011b96c02e41894fa32.tar.lz dexon-consensus-aed24cf020bd11c3b20a7011b96c02e41894fa32.tar.xz dexon-consensus-aed24cf020bd11c3b20a7011b96c02e41894fa32.tar.zst dexon-consensus-aed24cf020bd11c3b20a7011b96c02e41894fa32.zip |
Initial implementation of DEXON consensus algorithm
Diffstat (limited to 'simulation/network.go')
-rw-r--r-- | simulation/network.go | 86 |
1 files changed, 86 insertions, 0 deletions
diff --git a/simulation/network.go b/simulation/network.go new file mode 100644 index 0000000..51eb868 --- /dev/null +++ b/simulation/network.go @@ -0,0 +1,86 @@ +// 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 ( + "math/rand" + "sync" + "time" + + "github.com/dexon-foundation/dexon-consensus-core/core" + "github.com/dexon-foundation/dexon-consensus-core/core/types" +) + +const msgBufferSize = 128 + +// Network implements the consensus.Network interface. +type Network struct { + model Model + + endpointMutex sync.RWMutex + endpoints map[types.ValidatorID]chan interface{} +} + +// NewNetwork returns pointer to a new Network instance. +func NewNetwork(model Model) *Network { + return &Network{ + model: model, + endpoints: make(map[types.ValidatorID]chan interface{}), + } +} + +// Join allow a client to join the network. It reutnrs a interface{} channel for +// the client to recieve information. +func (n *Network) Join(endpoint core.Endpoint) chan interface{} { + n.endpointMutex.Lock() + defer n.endpointMutex.Unlock() + + if x, exists := n.endpoints[endpoint.GetID()]; exists { + return x + } + + recivingChannel := make(chan interface{}, msgBufferSize) + n.endpoints[endpoint.GetID()] = recivingChannel + return recivingChannel +} + +// Send sends a msg to another client. +func (n *Network) Send(destID types.ValidatorID, msg interface{}) { + n.endpointMutex.RLock() + defer n.endpointMutex.RUnlock() + + clientChannel, exists := n.endpoints[destID] + if !exists { + return + } + + go func() { + if rand.Float64() > n.model.LossRate() { + time.Sleep(n.model.Delay()) + + clientChannel <- msg + } + }() +} + +// BroadcastBlock broadcast blocks into the network. +func (n *Network) BroadcastBlock(block *types.Block) { + for endpoint := range n.endpoints { + n.Send(endpoint, block.Clone()) + } +} |