Skip to content
This repository was archived by the owner on Nov 20, 2023. It is now read-only.

Commit 2e98121

Browse files
authored
Parse enr contents as rlp objects (#6)
* Decode as sequence of rlp objects * Add test * Change test enr value
1 parent 17432cb commit 2e98121

File tree

1 file changed

+27
-10
lines changed

1 file changed

+27
-10
lines changed

src/lib.rs

Lines changed: 27 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -800,18 +800,15 @@ impl<K: EnrKey> rlp::Decodable for Enr<K> {
800800
return Err(DecoderError::RlpExpectedToBeList);
801801
}
802802

803-
let mut decoded_list = rlp.as_list::<Vec<u8>>().map_err(|_| {
804-
debug!("Could not decode content: {}", rlp);
805-
DecoderError::Custom("List decode fail")
806-
})?;
803+
let mut decoded_list: Vec<Rlp> = rlp.iter().collect();
807804

808805
if decoded_list.is_empty() || decoded_list.len() % 2 != 0 {
809806
debug!("Failed to decode ENR. List size is not a multiple of 2.");
810807
return Err(DecoderError::Custom("List not a multiple of two"));
811808
}
812809

813-
let signature = decoded_list.remove(0);
814-
let seq_bytes = decoded_list.remove(0);
810+
let signature = decoded_list.remove(0).data()?;
811+
let seq_bytes = decoded_list.remove(0).data()?;
815812

816813
if seq_bytes.len() > 8 {
817814
debug!("Failed to decode ENR. Sequence number is not a u64.");
@@ -826,16 +823,16 @@ impl<K: EnrKey> rlp::Decodable for Enr<K> {
826823
let mut content = BTreeMap::new();
827824
let mut prev: Option<String> = None;
828825
for _ in 0..decoded_list.len() / 2 {
829-
let key = decoded_list.remove(0);
830-
let value = decoded_list.remove(0);
826+
let key = decoded_list.remove(0).data()?;
827+
let value = decoded_list.remove(0).data()?;
831828

832829
let key = String::from_utf8_lossy(&key);
833830
// TODO: add tests for this error case
834831
if prev.is_some() && prev >= Some(key.to_string()) {
835832
return Err(DecoderError::Custom("Unsorted keys"));
836833
}
837834
prev = Some(key.to_string());
838-
content.insert(key.to_string(), value);
835+
content.insert(key.to_string(), value.into());
839836
}
840837

841838
// verify we know the signature type
@@ -847,7 +844,7 @@ impl<K: EnrKey> rlp::Decodable for Enr<K> {
847844
let enr = Self {
848845
seq,
849846
node_id,
850-
signature,
847+
signature: signature.into(),
851848
content,
852849
phantom: PhantomData,
853850
};
@@ -941,6 +938,26 @@ mod tests {
941938
assert!(enr.verify());
942939
}
943940

941+
// the values in the content are rlp lists
942+
#[test]
943+
fn test_rlp_list_value() {
944+
let text = "enr:-Je4QH0uN2HkMRmscUp6yvyTOPGtOg9U6lCxBFvCGynyystnDNRJbfz5GhXXY2lcu9tsghMxRiYHoznBwG46GQ7dfm0og2V0aMfGhMvbiDiAgmlkgnY0gmlwhA6hJmuJc2VjcDI1NmsxoQJBP4kg9GNBurV3uVXgR72u1n-XIABibUZLT1WvJLKwvIN0Y3CCdyeDdWRwgncn";
945+
let signature = hex::decode("7d2e3761e43119ac714a7acafc9338f1ad3a0f54ea50b1045bc21b29f2cacb670cd4496dfcf91a15d763695cbbdb6c821331462607a339c1c06e3a190edd7e6d").unwrap();
946+
let expected_pubkey =
947+
hex::decode("02413f8920f46341bab577b955e047bdaed67f972000626d464b4f55af24b2b0bc")
948+
.unwrap();
949+
let enr = text.parse::<DefaultEnr>().unwrap();
950+
951+
assert_eq!(enr.ip(), Some(Ipv4Addr::new(14, 161, 38, 107)));
952+
assert_eq!(enr.id(), Some(String::from("v4")));
953+
assert_eq!(enr.udp(), Some(30503));
954+
assert_eq!(enr.tcp(), Some(30503));
955+
assert_eq!(enr.seq(), 40);
956+
assert_eq!(enr.signature(), &signature[..]);
957+
assert_eq!(enr.public_key().encode(), expected_pubkey);
958+
assert!(enr.verify());
959+
}
960+
944961
#[cfg(feature = "libsecp256k1")]
945962
#[test]
946963
fn test_read_enr_no_prefix() {

0 commit comments

Comments
 (0)