import (
"errors"
"reflect"
+ "time"
log "github.com/sirupsen/logrus"
ValidateTx(*types.Tx) (bool, error)
}
+// Switch is the interface for network layer
type Switch interface {
AddReactor(name string, reactor p2p.Reactor) p2p.Reactor
Start() (bool, error)
// Mempool is the interface for Bytom mempool
type Mempool interface {
GetTransactions() []*core.TxDesc
+ IsDust(tx *types.Tx) bool
}
//Manager is responsible for the business layer information synchronization
return manager, nil
}
+// AddPeer add the network layer peer to logic layer
func (m *Manager) AddPeer(peer peers.BasePeer) {
m.peers.AddPeer(peer)
}
}
func (m *Manager) handleGetBlocksMsg(peer *peers.Peer, msg *msgs.GetBlocksMessage) {
- blocks, err := m.blockKeeper.locateBlocks(msg.GetBlockLocator(), msg.GetStopHash())
+ endTime := time.Now().Add(requireBlocksTimeout / 2)
+ isTimeout := func() bool {
+ return time.Now().After(endTime)
+ }
+
+ blocks, err := m.blockKeeper.locateBlocks(msg.GetBlockLocator(), msg.GetStopHash(), isTimeout)
if err != nil || len(blocks) == 0 {
return
}
return
}
+ if m.mempool.IsDust(tx) {
+ m.peers.ProcessIllegal(peer.ID(), security.LevelMsgIllegal, "receive dust tx msg")
+ return
+ }
+
m.peers.MarkTx(peer.ID(), tx.ID)
if isOrphan, err := m.chain.ValidateTx(tx); err != nil && err != core.ErrDustTx && !isOrphan {
m.peers.ProcessIllegal(peer.ID(), security.LevelMsgIllegal, "fail on validate tx transaction")
}
for _, tx := range txs {
+ if m.mempool.IsDust(tx) {
+ m.peers.ProcessIllegal(peer.ID(), security.LevelMsgIllegal, "receive dust txs msg")
+ continue
+ }
+
m.peers.MarkTx(peer.ID(), tx.ID)
if isOrphan, err := m.chain.ValidateTx(tx); err != nil && !isOrphan {
m.peers.ProcessIllegal(peer.ID(), security.LevelMsgIllegal, "fail on validate tx transaction")
}
}
+// RemovePeer delete peer for peer set
func (m *Manager) RemovePeer(peerID string) {
m.peers.RemovePeer(peerID)
}
+// SendStatus sent the current self status to remote peer
func (m *Manager) SendStatus(peer peers.BasePeer) error {
p := m.peers.GetPeer(peer.ID())
if p == nil {
return nil
}
+// Start the network logic layer
func (m *Manager) Start() error {
var err error
m.txMsgSub, err = m.eventDispatcher.Subscribe(core.TxMsgEvent{})