6 "github.com/sirupsen/logrus"
8 "github.com/vapor/config"
9 "github.com/vapor/consensus"
10 "github.com/vapor/event"
11 "github.com/vapor/netsync/chainmgr"
12 "github.com/vapor/netsync/consensusmgr"
13 "github.com/vapor/netsync/peers"
14 "github.com/vapor/p2p"
15 "github.com/vapor/protocol"
23 errVaultModeDialPeer = errors.New("can't dial peer in vault mode")
26 // ChainMgr is the interface for p2p chain message sync manager.
27 type ChainMgr interface {
33 // ConsensusMgr is the interface for consensus message sync manager.
34 type ConsensusMgr interface {
39 // Switch is the interface for p2p switch.
40 type Switch interface {
44 DialPeerWithAddress(addr *p2p.NetAddress) error
48 //SyncManager Sync Manager is responsible for the business layer information synchronization
49 type SyncManager struct {
53 consensusMgr ConsensusMgr
57 // NewSyncManager create sync manager and set switch.
58 func NewSyncManager(config *config.Config, chain *protocol.Chain, txPool *protocol.TxPool, dispatcher *event.Dispatcher) (*SyncManager, error) {
59 sw, err := p2p.NewSwitch(config)
63 peers := peers.NewPeerSet(sw)
65 chainManger, err := chainmgr.NewManager(config, sw, chain, txPool, dispatcher, peers)
69 consensusMgr := consensusmgr.NewManager(sw, chain, dispatcher, peers)
73 chainMgr: chainManger,
74 consensusMgr: consensusMgr,
79 // Start message sync manager service.
80 func (sm *SyncManager) Start() error {
81 if _, err := sm.sw.Start(); err != nil {
82 logrus.WithFields(logrus.Fields{"module": logModule, "err": err}).Error("failed start switch")
86 if err := sm.chainMgr.Start(); err != nil {
90 return sm.consensusMgr.Start()
93 // Stop message sync manager service.
94 func (sm *SyncManager) Stop() {
96 sm.consensusMgr.Stop()
97 if !sm.config.VaultMode {
103 // IsListening check if the bytomd service port is open?
104 func (sm *SyncManager) IsListening() bool {
105 if sm.config.VaultMode {
108 return sm.sw.IsListening()
112 //IsCaughtUp check wheather the peer finish the sync
113 func (sm *SyncManager) IsCaughtUp() bool {
114 return sm.chainMgr.IsCaughtUp()
117 // PeerCount count the number of connected peers.
118 func (sm *SyncManager) PeerCount() int {
119 if sm.config.VaultMode {
122 return len(sm.sw.Peers().List())
125 // GetNetwork get the type of network.
126 func (sm *SyncManager) GetNetwork() string {
127 return sm.config.ChainID
130 // BestPeer fine the peer with the highest height from the connected peers.
131 func (sm *SyncManager) BestPeer() *peers.PeerInfo {
132 bestPeer := sm.peers.BestPeer(consensus.SFFullNode)
134 return bestPeer.GetPeerInfo()
139 // DialPeerWithAddress dial the peer and establish a connection.
140 func (sm *SyncManager) DialPeerWithAddress(addr *p2p.NetAddress) error {
141 if sm.config.VaultMode {
142 return errVaultModeDialPeer
145 return sm.sw.DialPeerWithAddress(addr)
148 //GetPeerInfos return peer info of all connected peers.
149 func (sm *SyncManager) GetPeerInfos() []*peers.PeerInfo {
150 return sm.peers.GetPeerInfos()
153 //StopPeer try to stop peer by given ID
154 func (sm *SyncManager) StopPeer(peerID string) error {
155 if peer := sm.peers.GetPeer(peerID); peer == nil {
156 return errors.New("peerId not exist")
158 sm.peers.RemovePeer(peerID)