Skip to content

Commit c76c9e5

Browse files
mattsseAgeManning
andauthored
fix: decode rlp header on Enr::build (#72)
Co-authored-by: Age Manning <[email protected]>
1 parent 1143e4b commit c76c9e5

File tree

3 files changed

+32
-4
lines changed

3 files changed

+32
-4
lines changed

Cargo.toml

+1
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ secp256k1 = { version = "0.28", optional = true, default-features = false, featu
2828
] }
2929

3030
[dev-dependencies]
31+
alloy-rlp = { version = "0.3.4", features = ["derive"] }
3132
secp256k1 = { features = ["rand-std"], version = "0.28" }
3233
serde_json = { version = "1.0.114" }
3334

src/builder.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
use crate::{Enr, EnrKey, EnrPublicKey, Error, Key, NodeId, MAX_ENR_SIZE};
2-
use alloy_rlp::{Decodable, Encodable, Header};
2+
use alloy_rlp::{Encodable, Header};
33
use bytes::{Bytes, BytesMut};
44
use std::{
55
collections::BTreeMap,
@@ -158,7 +158,7 @@ impl<K: EnrKey> Builder<K> {
158158

159159
// Sanitize all data, ensuring all RLP data is correctly formatted.
160160
for value in self.content.values() {
161-
Bytes::decode(&mut value.as_ref())?;
161+
Header::decode(&mut value.as_ref())?;
162162
}
163163

164164
let mut id_bytes = BytesMut::with_capacity(3);

src/lib.rs

+29-2
Original file line numberDiff line numberDiff line change
@@ -269,8 +269,11 @@ impl<K: EnrKey> Enr<K> {
269269
#[allow(clippy::missing_panics_doc)]
270270
pub fn get(&self, key: impl AsRef<[u8]>) -> Option<Bytes> {
271271
// It's ok to decode any valid RLP value as data
272-
self.get_raw_rlp(key)
273-
.map(|mut rlp_data| Bytes::decode(&mut rlp_data).expect("All data is sanitized"))
272+
self.get_raw_rlp(key).map(|mut rlp_data| {
273+
let raw_data = &mut rlp_data;
274+
let header = Header::decode(raw_data).expect("All data is sanitized");
275+
raw_data[..header.payload_length].to_vec().into()
276+
})
274277
}
275278

276279
/// Reads a custom key from the record if it exists, decoded as `T`.
@@ -1492,6 +1495,30 @@ mod tests {
14921495
assert!(decoded_enr.verify());
14931496
}
14941497

1498+
#[test]
1499+
fn test_add_content_value() {
1500+
#[derive(PartialEq, Eq, Debug, alloy_rlp::RlpEncodable, alloy_rlp::RlpDecodable)]
1501+
struct Proto {
1502+
name: String,
1503+
version: u64,
1504+
}
1505+
1506+
let mut rng = rand::thread_rng();
1507+
let key = k256::ecdsa::SigningKey::random(&mut rng);
1508+
let proto = Proto {
1509+
name: "test".to_string(),
1510+
version: 1,
1511+
};
1512+
1513+
let enr = Enr::builder()
1514+
.add_value("proto", &proto)
1515+
.build(&key)
1516+
.unwrap();
1517+
1518+
let decoded_proto = enr.get_decodable::<Proto>("proto").unwrap().unwrap();
1519+
assert_eq!(decoded_proto, proto);
1520+
}
1521+
14951522
#[test]
14961523
fn test_add_key() {
14971524
let mut rng = rand::thread_rng();

0 commit comments

Comments
 (0)