diff --git a/core/types/block.go b/core/types/block.go index de4ed128506a..071666a801fa 100644 --- a/core/types/block.go +++ b/core/types/block.go @@ -154,25 +154,6 @@ func (h *Header) Size() common.StorageSize { return common.StorageSize(unsafe.Sizeof(*h)) + common.StorageSize(len(h.Extra)+(h.Difficulty.BitLen()+h.Number.BitLen()+h.Time.BitLen())/8) } -// SanityCheck checks a few basic things -- these checks are way beyond what -// any 'sane' production values should hold, and can mainly be used to prevent -// that the unbounded fields are stuffed with junk data to add processing -// overhead -func (h *Header) SanityCheck() error { - if h.Number != nil && !h.Number.IsUint64() { - return fmt.Errorf("too large block number: bitlen %d", h.Number.BitLen()) - } - if h.Difficulty != nil { - if diffLen := h.Difficulty.BitLen(); diffLen > 80 { - return fmt.Errorf("too large block difficulty: bitlen %d", diffLen) - } - } - if eLen := len(h.Extra); eLen > 100*1024 { - return fmt.Errorf("too large block extradata: size %d", eLen) - } - return nil -} - // Body is a simple (mutable, non-safe) data container for storing and moving // a block's data contents (transactions and uncles) together. type Body struct { @@ -388,12 +369,6 @@ func (b *Block) Size() common.StorageSize { return common.StorageSize(c) } -// SanityCheck can be used to prevent that unbounded fields are -// stuffed with junk data to add processing overhead -func (b *Block) SanityCheck() error { - return b.header.SanityCheck() -} - type writeCounter common.StorageSize func (c *writeCounter) Write(b []byte) (int, error) { diff --git a/eth/fetcher/block_fetcher.go b/eth/fetcher/block_fetcher.go index 856c5cfd06e7..642ce6e48fb5 100644 --- a/eth/fetcher/block_fetcher.go +++ b/eth/fetcher/block_fetcher.go @@ -804,7 +804,7 @@ func (f *BlockFetcher) forgetHash(hash common.Hash) { // Remove all pending announces and decrement DOS counters for _, announce := range f.announced[hash] { f.announces[announce.origin]-- - if f.announces[announce.origin] <= 0 { + if f.announces[announce.origin] == 0 { delete(f.announces, announce.origin) } } @@ -815,7 +815,7 @@ func (f *BlockFetcher) forgetHash(hash common.Hash) { // Remove any pending fetches and decrement the DOS counters if announce := f.fetching[hash]; announce != nil { f.announces[announce.origin]-- - if f.announces[announce.origin] <= 0 { + if f.announces[announce.origin] == 0 { delete(f.announces, announce.origin) } delete(f.fetching, hash) @@ -824,7 +824,7 @@ func (f *BlockFetcher) forgetHash(hash common.Hash) { // Remove any pending completion requests and decrement the DOS counters for _, announce := range f.fetched[hash] { f.announces[announce.origin]-- - if f.announces[announce.origin] <= 0 { + if f.announces[announce.origin] == 0 { delete(f.announces, announce.origin) } } @@ -833,7 +833,7 @@ func (f *BlockFetcher) forgetHash(hash common.Hash) { // Remove any pending completions and decrement the DOS counters if announce := f.completing[hash]; announce != nil { f.announces[announce.origin]-- - if f.announces[announce.origin] <= 0 { + if f.announces[announce.origin] == 0 { delete(f.announces, announce.origin) } delete(f.completing, hash) diff --git a/eth/handler.go b/eth/handler.go index b2f0b39a9cd4..786a28fb7e26 100644 --- a/eth/handler.go +++ b/eth/handler.go @@ -810,9 +810,6 @@ func (pm *ProtocolManager) handleMsg(p *peer) error { if err := msg.Decode(&request); err != nil { return errResp(ErrDecode, "%v: %v", msg, err) } - if err := request.sanityCheck(); err != nil { - return err - } request.Block.ReceivedAt = msg.ReceivedAt request.Block.ReceivedFrom = p diff --git a/eth/protocol.go b/eth/protocol.go index d037d6afe11a..819db3c857a9 100644 --- a/eth/protocol.go +++ b/eth/protocol.go @@ -233,19 +233,6 @@ type newBlockData struct { TD *big.Int } -// sanityCheck verifies that the values are reasonable, as a DoS protection -func (request *newBlockData) sanityCheck() error { - if err := request.Block.SanityCheck(); err != nil { - return err - } - //TD at mainnet block #7753254 is 76 bits. If it becomes 100 million times - // larger, it will still fit within 100 bits - if tdlen := request.TD.BitLen(); tdlen > 100 { - return fmt.Errorf("too large block TD: bitlen %d", tdlen) - } - return nil -} - // blockBody represents the data content of a single block. type blockBody struct { Transactions []*types.Transaction // Transactions contained within a block diff --git a/les/handler.go b/les/handler.go index d7c3e84302be..37cb0b4290c7 100644 --- a/les/handler.go +++ b/les/handler.go @@ -385,9 +385,7 @@ func (pm *ProtocolManager) handleMsg(p *peer) error { if err := msg.Decode(&req); err != nil { return errResp(ErrDecode, "%v: %v", msg, err) } - if err := req.sanityCheck(); err != nil { - return err - } + if p.requestAnnounceType == announceTypeSigned { if err := req.checkSignature(p.ID()); err != nil { p.Log().Trace("Invalid announcement signature", "err", err) diff --git a/les/protocol.go b/les/protocol.go index c3ef953051fc..036064ec21eb 100644 --- a/les/protocol.go +++ b/les/protocol.go @@ -137,14 +137,6 @@ type announceData struct { Update keyValueList } -// sanityCheck verifies that the values are reasonable, as a DoS protection -func (a *announceData) sanityCheck() error { - if tdlen := a.Td.BitLen(); tdlen > 100 { - return fmt.Errorf("too large block TD: bitlen %d", tdlen) - } - return nil -} - // sign adds a signature to the block announcement by the given privKey func (a *announceData) sign(privKey *ecdsa.PrivateKey) { rlp, _ := rlp.EncodeToBytes(announceBlock{a.Hash, a.Number, a.Td})