eth/protocols/eth, les: avoid Raw() when decoding HashOrNumber (#22841)

Getting the raw value is not necessary to decode this type, and
decoding it directly from the stream is faster.
pull/22851/head
Felix Lange 4 years ago committed by GitHub
parent ae5fcdc67f
commit c0e201b690
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 24
      eth/protocols/eth/protocol.go
  2. 24
      les/protocol.go

@ -155,19 +155,19 @@ func (hn *HashOrNumber) EncodeRLP(w io.Writer) error {
// DecodeRLP is a specialized decoder for HashOrNumber to decode the contents // DecodeRLP is a specialized decoder for HashOrNumber to decode the contents
// into either a block hash or a block number. // into either a block hash or a block number.
func (hn *HashOrNumber) DecodeRLP(s *rlp.Stream) error { func (hn *HashOrNumber) DecodeRLP(s *rlp.Stream) error {
_, size, _ := s.Kind() _, size, err := s.Kind()
origin, err := s.Raw() switch {
if err == nil { case err != nil:
switch { return err
case size == 32: case size == 32:
err = rlp.DecodeBytes(origin, &hn.Hash) hn.Number = 0
case size <= 8: return s.Decode(&hn.Hash)
err = rlp.DecodeBytes(origin, &hn.Number) case size <= 8:
default: hn.Hash = common.Hash{}
err = fmt.Errorf("invalid input size %d for origin", size) return s.Decode(&hn.Number)
} default:
return fmt.Errorf("invalid input size %d for origin", size)
} }
return err
} }
// BlockHeadersPacket represents a block header response. // BlockHeadersPacket represents a block header response.

@ -307,19 +307,19 @@ func (hn *hashOrNumber) EncodeRLP(w io.Writer) error {
// DecodeRLP is a specialized decoder for hashOrNumber to decode the contents // DecodeRLP is a specialized decoder for hashOrNumber to decode the contents
// into either a block hash or a block number. // into either a block hash or a block number.
func (hn *hashOrNumber) DecodeRLP(s *rlp.Stream) error { func (hn *hashOrNumber) DecodeRLP(s *rlp.Stream) error {
_, size, _ := s.Kind() _, size, err := s.Kind()
origin, err := s.Raw() switch {
if err == nil { case err != nil:
switch { return err
case size == 32: case size == 32:
err = rlp.DecodeBytes(origin, &hn.Hash) hn.Number = 0
case size <= 8: return s.Decode(&hn.Hash)
err = rlp.DecodeBytes(origin, &hn.Number) case size <= 8:
default: hn.Hash = common.Hash{}
err = fmt.Errorf("invalid input size %d for origin", size) return s.Decode(&hn.Number)
} default:
return fmt.Errorf("invalid input size %d for origin", size)
} }
return err
} }
// CodeData is the network response packet for a node data retrieval. // CodeData is the network response packet for a node data retrieval.

Loading…
Cancel
Save