"github.com/sirupsen/logrus"
- "github.com/vapor/event"
- "github.com/vapor/netsync/peers"
- "github.com/vapor/p2p"
- "github.com/vapor/p2p/security"
- "github.com/vapor/protocol/bc"
- "github.com/vapor/protocol/bc/types"
+ "github.com/bytom/vapor/errors"
+ "github.com/bytom/vapor/event"
+ "github.com/bytom/vapor/netsync/peers"
+ "github.com/bytom/vapor/p2p"
+ "github.com/bytom/vapor/p2p/security"
+ "github.com/bytom/vapor/protocol"
+ "github.com/bytom/vapor/protocol/bc"
+ "github.com/bytom/vapor/protocol/bc/types"
)
// Switch is the interface for p2p switch.
ProcessBlockSignature(signature, pubkey []byte, blockHash *bc.Hash) error
}
+type Peers interface {
+ AddPeer(peer peers.BasePeer)
+ BroadcastMsg(bm peers.BroadcastMsg) error
+ GetPeer(id string) *peers.Peer
+ MarkBlock(peerID string, hash *bc.Hash)
+ MarkBlockSignature(peerID string, signature []byte)
+ ProcessIllegal(peerID string, level byte, reason string)
+ RemovePeer(peerID string)
+ SetStatus(peerID string, height uint64, hash *bc.Hash)
+}
+
type blockMsg struct {
block *types.Block
peerID string
type Manager struct {
sw Switch
chain Chain
- peers *peers.PeerSet
+ peers Peers
blockFetcher *blockFetcher
eventDispatcher *event.Dispatcher
}
// NewManager create new manager.
-func NewManager(sw Switch, chain Chain, dispatcher *event.Dispatcher, peers *peers.PeerSet) *Manager {
+func NewManager(sw Switch, chain Chain, peers Peers, dispatcher *event.Dispatcher) *Manager {
manager := &Manager{
sw: sw,
chain: chain,
return
}
- logrus.WithFields(logrus.Fields{"module": logModule, "peer": peer.Addr(), "type": reflect.TypeOf(msg), "message": msg.String()}).Info("receive message from peer")
+ logrus.WithFields(logrus.Fields{"module": logModule, "peer": peer.Addr(), "type": reflect.TypeOf(msg), "message": msg.String()}).Debug("receive message from peer")
switch msg := msg.(type) {
case *BlockProposeMsg:
m.peers.MarkBlockSignature(peerID, msg.Signature)
blockHash := bc.NewHash(msg.BlockHash)
if err := m.chain.ProcessBlockSignature(msg.Signature, msg.PubKey, &blockHash); err != nil {
- m.peers.ProcessIllegal(peerID, security.LevelMsgIllegal, err.Error())
- return
+ if errors.Root(err) != protocol.ErrDoubleSignBlock {
+ m.peers.ProcessIllegal(peerID, security.LevelMsgIllegal, err.Error())
+ }
}
}
//Start consensus manager service.
func (m *Manager) Start() error {
+ go m.blockFetcher.blockProcessorLoop()
go m.blockProposeMsgBroadcastLoop()
go m.blockSignatureMsgBroadcastLoop()
return nil