From 8484cbf6ec73863d44eaed16b6a044d9d93c643c Mon Sep 17 00:00:00 2001 From: Paul Hauner Date: Wed, 15 May 2019 13:11:47 +1000 Subject: [PATCH] Add custom serde deser to block_body.graffiti --- eth2/types/src/beacon_block_body.rs | 3 ++- eth2/types/src/test_utils/mod.rs | 2 +- eth2/types/src/test_utils/serde_utils.rs | 22 ++++++++++++++++++++++ 3 files changed, 25 insertions(+), 2 deletions(-) diff --git a/eth2/types/src/beacon_block_body.rs b/eth2/types/src/beacon_block_body.rs index 8bbdbec15..e3609d889 100644 --- a/eth2/types/src/beacon_block_body.rs +++ b/eth2/types/src/beacon_block_body.rs @@ -1,4 +1,4 @@ -use crate::test_utils::TestRandom; +use crate::test_utils::{graffiti_from_hex_str, TestRandom}; use crate::*; use serde_derive::{Deserialize, Serialize}; @@ -24,6 +24,7 @@ use tree_hash_derive::{CachedTreeHash, TreeHash}; pub struct BeaconBlockBody { pub randao_reveal: Signature, pub eth1_data: Eth1Data, + #[serde(deserialize_with = "graffiti_from_hex_str")] pub graffiti: [u8; 32], pub proposer_slashings: Vec, pub attester_slashings: Vec, diff --git a/eth2/types/src/test_utils/mod.rs b/eth2/types/src/test_utils/mod.rs index 20d53e72e..e02527451 100644 --- a/eth2/types/src/test_utils/mod.rs +++ b/eth2/types/src/test_utils/mod.rs @@ -22,7 +22,7 @@ pub use rand::{ RngCore, {prng::XorShiftRng, SeedableRng}, }; -pub use serde_utils::{fork_from_hex_str, u8_from_hex_str}; +pub use serde_utils::{fork_from_hex_str, graffiti_from_hex_str, u8_from_hex_str}; pub use test_random::TestRandom; pub use testing_attestation_builder::TestingAttestationBuilder; pub use testing_attestation_data_builder::TestingAttestationDataBuilder; diff --git a/eth2/types/src/test_utils/serde_utils.rs b/eth2/types/src/test_utils/serde_utils.rs index 761aee523..5c0238c0b 100644 --- a/eth2/types/src/test_utils/serde_utils.rs +++ b/eth2/types/src/test_utils/serde_utils.rs @@ -2,6 +2,7 @@ use serde::de::Error; use serde::{Deserialize, Deserializer}; pub const FORK_BYTES_LEN: usize = 4; +pub const GRAFFITI_BYTES_LEN: usize = 32; pub fn u8_from_hex_str<'de, D>(deserializer: D) -> Result where @@ -32,3 +33,24 @@ where } Ok(array) } + +pub fn graffiti_from_hex_str<'de, D>(deserializer: D) -> Result<[u8; GRAFFITI_BYTES_LEN], D::Error> +where + D: Deserializer<'de>, +{ + let s: String = Deserialize::deserialize(deserializer)?; + let mut array = [0 as u8; GRAFFITI_BYTES_LEN]; + let decoded: Vec = hex::decode(&s.as_str()[2..]).map_err(D::Error::custom)?; + + if decoded.len() > GRAFFITI_BYTES_LEN { + return Err(D::Error::custom("Fork length too long")); + } + + for (i, item) in array.iter_mut().enumerate() { + if i > decoded.len() { + break; + } + *item = decoded[i]; + } + Ok(array) +}