@@ -851,15 +851,21 @@ impl<K: EnrKey> rlp::Decodable for Enr<K> {
851
851
return Err ( DecoderError :: RlpExpectedToBeList ) ;
852
852
}
853
853
854
- let mut decoded_list : Vec < Rlp > = rlp. iter ( ) . collect ( ) ;
854
+ let mut rlp_iter = rlp. iter ( ) ;
855
855
856
- if decoded_list . is_empty ( ) || decoded_list . len ( ) % 2 != 0 {
856
+ if rlp_iter . len ( ) == 0 || rlp_iter . len ( ) % 2 != 0 {
857
857
debug ! ( "Failed to decode ENR. List size is not a multiple of 2." ) ;
858
858
return Err ( DecoderError :: Custom ( "List not a multiple of two" ) ) ;
859
859
}
860
860
861
- let signature = decoded_list. remove ( 0 ) . data ( ) ?;
862
- let seq_bytes = decoded_list. remove ( 0 ) . data ( ) ?;
861
+ let signature = rlp_iter
862
+ . next ( )
863
+ . ok_or ( DecoderError :: Custom ( "List is empty" ) ) ?
864
+ . data ( ) ?;
865
+ let seq_bytes = rlp_iter
866
+ . next ( )
867
+ . ok_or ( DecoderError :: Custom ( "List has only one item" ) ) ?
868
+ . data ( ) ?;
863
869
864
870
if seq_bytes. len ( ) > 8 {
865
871
debug ! ( "Failed to decode ENR. Sequence number is not a u64." ) ;
@@ -872,20 +878,22 @@ impl<K: EnrKey> rlp::Decodable for Enr<K> {
872
878
let seq = u64:: from_be_bytes ( seq) ;
873
879
874
880
let mut content = BTreeMap :: new ( ) ;
875
- let mut prev: Option < Key > = None ;
876
- for _ in 0 ..decoded_list. len ( ) / 2 {
877
- let key = decoded_list. remove ( 0 ) . data ( ) ?. to_vec ( ) ;
878
- let item = decoded_list. remove ( 0 ) ;
881
+ let mut prev: Option < & [ u8 ] > = None ;
882
+ while let Some ( key) = rlp_iter. next ( ) {
883
+ let key = key. data ( ) ?;
884
+ let item = rlp_iter
885
+ . next ( )
886
+ . ok_or ( DecoderError :: Custom ( "List not a multiple of 2" ) ) ?;
879
887
880
888
// Sanitize the data
881
889
let _ = item. data ( ) ?;
882
890
let value = item. as_raw ( ) ;
883
891
884
- if prev. is_some ( ) && prev. as_ref ( ) >= Some ( & key) {
892
+ if prev. is_some ( ) && prev >= Some ( key) {
885
893
return Err ( DecoderError :: Custom ( "Unsorted keys" ) ) ;
886
894
}
887
- prev = Some ( key. clone ( ) ) ;
888
- content. insert ( key, Bytes :: copy_from_slice ( value) ) ;
895
+ prev = Some ( key) ;
896
+ content. insert ( key. to_vec ( ) , Bytes :: copy_from_slice ( value) ) ;
889
897
}
890
898
891
899
// verify we know the signature type
0 commit comments