)
const (
- maxTxChanSize = 10000
+ maxTxChanSize = 10000
+ maxFilterAddressSize = 50
+ maxFilterAddressCount = 1000
)
// Chain is the interface for Bytom core
GetBlockByHeight(uint64) (*types.Block, error)
GetHeaderByHash(*bc.Hash) (*types.BlockHeader, error)
GetHeaderByHeight(uint64) (*types.BlockHeader, error)
+ GetTransactionStatus(*bc.Hash) (*bc.TransactionStatus, error)
InMainChain(bc.Hash) bool
ProcessBlock(*types.Block) (bool, error)
ValidateTx(*types.Tx) (bool, error)
}
func (sm *SyncManager) handleBlockMsg(peer *peer, msg *BlockMessage) {
- sm.blockKeeper.processBlock(peer.ID(), msg.GetBlock())
+ block, err := msg.GetBlock()
+ if err != nil {
+ return
+ }
+ sm.blockKeeper.processBlock(peer.ID(), block)
}
func (sm *SyncManager) handleBlocksMsg(peer *peer, msg *BlocksMessage) {
sm.blockKeeper.processBlocks(peer.ID(), blocks)
}
+func (sm *SyncManager) handleFilterAddMsg(peer *peer, msg *FilterAddMessage) {
+ peer.addFilterAddress(msg.Address)
+}
+
+func (sm *SyncManager) handleFilterClearMsg(peer *peer) {
+ peer.filterAdds.Clear()
+}
+
+func (sm *SyncManager) handleFilterLoadMsg(peer *peer, msg *FilterLoadMessage) {
+ peer.addFilterAddresses(msg.Addresses)
+}
+
func (sm *SyncManager) handleGetBlockMsg(peer *peer, msg *GetBlockMessage) {
var block *types.Block
var err error
}
}
+func (sm *SyncManager) handleGetMerkleBlockMsg(peer *peer, msg *GetMerkleBlockMessage) {
+ var err error
+ var block *types.Block
+ if msg.Height != 0 {
+ block, err = sm.chain.GetBlockByHeight(msg.Height)
+ } else {
+ block, err = sm.chain.GetBlockByHash(msg.GetHash())
+ }
+ if err != nil {
+ log.WithField("err", err).Warning("fail on handleGetMerkleBlockMsg get block from chain")
+ return
+ }
+
+ blockHash := block.Hash()
+ txStatus, err := sm.chain.GetTransactionStatus(&blockHash)
+ if err != nil {
+ log.WithField("err", err).Warning("fail on handleGetMerkleBlockMsg get transaction status")
+ return
+ }
+
+ ok, err := peer.sendMerkleBlock(block, txStatus)
+ if err != nil {
+ log.WithField("err", err).Error("fail on handleGetMerkleBlockMsg sentMerkleBlock")
+ return
+ }
+
+ if !ok {
+ sm.peers.removePeer(peer.ID())
+ }
+}
+
func (sm *SyncManager) handleHeadersMsg(peer *peer, msg *HeadersMessage) {
headers, err := msg.GetHeaders()
if err != nil {
case *BlocksMessage:
sm.handleBlocksMsg(peer, msg)
+ case *FilterLoadMessage:
+ sm.handleFilterLoadMsg(peer, msg)
+
+ case *FilterAddMessage:
+ sm.handleFilterAddMsg(peer, msg)
+
+ case *FilterClearMessage:
+ sm.handleFilterClearMsg(peer)
+
+ case *GetMerkleBlockMessage:
+ sm.handleGetMerkleBlockMsg(peer, msg)
+
default:
log.Errorf("unknown message type %v", reflect.TypeOf(msg))
}
}
nodes := []*discover.Node{}
for _, seed := range strings.Split(config.P2P.Seeds, ",") {
+ version.Status.AddSeed(seed)
url := "enode://" + hex.EncodeToString(crypto.Sha256([]byte(seed))) + "@" + seed
nodes = append(nodes, discover.MustParseNode(url))
}