diff --git a/pkg/network/message.go b/pkg/network/message.go index c61600ac4..1fee8e24f 100644 --- a/pkg/network/message.go +++ b/pkg/network/message.go @@ -12,7 +12,7 @@ import ( "github.com/nspcc-dev/neo-go/pkg/network/payload" ) -//go:generate stringer -type=CommandType +//go:generate stringer -type=CommandType -output=message_string.go // CompressionMinSize is the lower bound to apply compression. const CompressionMinSize = 1024 @@ -68,7 +68,7 @@ const ( CMDInv CommandType = 0x27 CMDGetData CommandType = 0x28 CMDGetBlockData CommandType = 0x29 - CMDUnknown CommandType = 0x2a + CMDNotFound CommandType = 0x2a CMDTX = CommandType(payload.TXType) CMDBlock = CommandType(payload.BlockType) CMDConsensus = CommandType(payload.ConsensusType) diff --git a/pkg/network/message_string.go b/pkg/network/message_string.go index 174bdfb53..d505f9696 100644 --- a/pkg/network/message_string.go +++ b/pkg/network/message_string.go @@ -1,4 +1,4 @@ -// Code generated by "stringer -type=CommandType"; DO NOT EDIT. +// Code generated by "stringer -type=CommandType -output=message_string.go"; DO NOT EDIT. package network @@ -21,7 +21,7 @@ func _() { _ = x[CMDInv-39] _ = x[CMDGetData-40] _ = x[CMDGetBlockData-41] - _ = x[CMDUnknown-42] + _ = x[CMDNotFound-42] _ = x[CMDTX-43] _ = x[CMDBlock-44] _ = x[CMDConsensus-45] @@ -39,7 +39,7 @@ const ( _CommandType_name_2 = "CMDPingCMDPong" _CommandType_name_3 = "CMDGetHeadersCMDHeaders" _CommandType_name_4 = "CMDGetBlocksCMDMempool" - _CommandType_name_5 = "CMDInvCMDGetDataCMDGetBlockDataCMDUnknownCMDTXCMDBlockCMDConsensus" + _CommandType_name_5 = "CMDInvCMDGetDataCMDGetBlockDataCMDNotFoundCMDTXCMDBlockCMDConsensus" _CommandType_name_6 = "CMDRejectCMDFilterLoadCMDFilterAddCMDFilterClear" _CommandType_name_7 = "CMDMerkleBlock" _CommandType_name_8 = "CMDAlert" @@ -51,7 +51,7 @@ var ( _CommandType_index_2 = [...]uint8{0, 7, 14} _CommandType_index_3 = [...]uint8{0, 13, 23} _CommandType_index_4 = [...]uint8{0, 12, 22} - _CommandType_index_5 = [...]uint8{0, 6, 16, 31, 41, 46, 54, 66} + _CommandType_index_5 = [...]uint8{0, 6, 16, 31, 42, 47, 55, 67} _CommandType_index_6 = [...]uint8{0, 9, 22, 34, 48} ) diff --git a/pkg/network/payload/inventory.go b/pkg/network/payload/inventory.go index 00e211df6..988c40eb0 100644 --- a/pkg/network/payload/inventory.go +++ b/pkg/network/payload/inventory.go @@ -57,7 +57,7 @@ func NewInventory(typ InventoryType, hashes []util.Uint256) *Inventory { // DecodeBinary implements Serializable interface. func (p *Inventory) DecodeBinary(br *io.BinReader) { p.Type = InventoryType(br.ReadB()) - br.ReadArray(&p.Hashes) + br.ReadArray(&p.Hashes, MaxHashesCount) } // EncodeBinary implements Serializable interface. diff --git a/pkg/network/server.go b/pkg/network/server.go index eba1be5cd..90d6858a4 100644 --- a/pkg/network/server.go +++ b/pkg/network/server.go @@ -538,6 +538,7 @@ func (s *Server) handleMempoolCmd(p Peer) error { // handleInvCmd processes the received inventory. func (s *Server) handleGetDataCmd(p Peer, inv *payload.Inventory) error { + var notFound []util.Uint256 for _, hash := range inv.Hashes { var msg *Message @@ -546,11 +547,15 @@ func (s *Server) handleGetDataCmd(p Peer, inv *payload.Inventory) error { tx, _, err := s.chain.GetTransaction(hash) if err == nil { msg = NewMessage(CMDTX, tx) + } else { + notFound = append(notFound, hash) } case payload.BlockType: b, err := s.chain.GetBlock(hash) if err == nil { msg = NewMessage(CMDBlock, b) + } else { + notFound = append(notFound, hash) } case payload.ConsensusType: if cp := s.consensus.GetPayload(hash); cp != nil { @@ -571,6 +576,9 @@ func (s *Server) handleGetDataCmd(p Peer, inv *payload.Inventory) error { } } } + if len(notFound) != 0 { + return p.EnqueueP2PMessage(NewMessage(CMDNotFound, payload.NewInventory(inv.Type, notFound))) + } return nil }