Update boolean bitfield to new SSZ

This commit is contained in:
Paul Hauner 2019-05-06 13:25:11 +10:00
parent 1f098ecbde
commit ebbeb03349
No known key found for this signature in database
GPG Key ID: D362883A9218FCC6

View File

@ -195,28 +195,22 @@ impl std::ops::BitOr for BooleanBitfield {
} }
impl Encodable for BooleanBitfield { impl Encodable for BooleanBitfield {
// ssz_append encodes Self according to the `ssz` spec. fn is_ssz_fixed_len() -> bool {
fn ssz_append(&self, s: &mut ssz::SszStream) { false
s.append_vec(&self.to_bytes()) }
fn ssz_append(&self, buf: &mut Vec<u8>) {
buf.append(&mut self.to_bytes())
} }
} }
impl Decodable for BooleanBitfield { impl Decodable for BooleanBitfield {
fn ssz_decode(bytes: &[u8], index: usize) -> Result<(Self, usize), ssz::DecodeError> { fn is_ssz_fixed_len() -> bool {
let len = ssz::decode::decode_length(bytes, index, ssz::LENGTH_BYTES)?; false
if (ssz::LENGTH_BYTES + len) > bytes.len() { }
return Err(ssz::DecodeError::TooShort);
}
if len == 0 { fn from_ssz_bytes(bytes: &[u8]) -> Result<Self, ssz::DecodeError> {
Ok((BooleanBitfield::new(), index + ssz::LENGTH_BYTES)) Ok(BooleanBitfield::from_bytes(bytes))
} else {
let bytes = &bytes[(index + 4)..(index + len + 4)];
let field = BooleanBitfield::from_bytes(bytes);
let index = index + ssz::LENGTH_BYTES + len;
Ok((field, index))
}
} }
} }
@ -277,7 +271,7 @@ cached_tree_hash_bytes_as_list!(BooleanBitfield);
mod tests { mod tests {
use super::*; use super::*;
use serde_yaml; use serde_yaml;
use ssz::{decode, ssz_encode, SszStream}; use ssz::ssz_encode;
use tree_hash::TreeHash; use tree_hash::TreeHash;
#[test] #[test]
@ -452,30 +446,17 @@ mod tests {
#[test] #[test]
fn test_ssz_encode() { fn test_ssz_encode() {
let field = create_test_bitfield(); let field = create_test_bitfield();
let mut stream = SszStream::new(); assert_eq!(field.as_ssz_bytes(), vec![0b0000_0011, 0b1000_0111]);
stream.append(&field);
assert_eq!(stream.drain(), vec![2, 0, 0, 0, 0b0000_0011, 0b1000_0111]);
let field = BooleanBitfield::from_elem(18, true); let field = BooleanBitfield::from_elem(18, true);
let mut stream = SszStream::new();
stream.append(&field);
assert_eq!( assert_eq!(
stream.drain(), field.as_ssz_bytes(),
vec![3, 0, 0, 0, 0b0000_0011, 0b1111_1111, 0b1111_1111] vec![0b0000_0011, 0b1111_1111, 0b1111_1111]
); );
let mut b = BooleanBitfield::new(); let mut b = BooleanBitfield::new();
b.set(1, true); b.set(1, true);
assert_eq!( assert_eq!(ssz_encode(&b), vec![0b0000_0010]);
ssz_encode(&b),
vec![
0b0000_0001,
0b0000_0000,
0b0000_0000,
0b0000_0000,
0b0000_0010
]
);
} }
fn create_test_bitfield() -> BooleanBitfield { fn create_test_bitfield() -> BooleanBitfield {
@ -491,13 +472,13 @@ mod tests {
#[test] #[test]
fn test_ssz_decode() { fn test_ssz_decode() {
let encoded = vec![2, 0, 0, 0, 0b0000_0011, 0b1000_0111]; let encoded = vec![0b0000_0011, 0b1000_0111];
let field = decode::<BooleanBitfield>(&encoded).unwrap(); let field = BooleanBitfield::from_ssz_bytes(&encoded).unwrap();
let expected = create_test_bitfield(); let expected = create_test_bitfield();
assert_eq!(field, expected); assert_eq!(field, expected);
let encoded = vec![3, 0, 0, 0, 255, 255, 3]; let encoded = vec![255, 255, 3];
let field = decode::<BooleanBitfield>(&encoded).unwrap(); let field = BooleanBitfield::from_ssz_bytes(&encoded).unwrap();
let expected = BooleanBitfield::from_bytes(&[255, 255, 3]); let expected = BooleanBitfield::from_bytes(&[255, 255, 3]);
assert_eq!(field, expected); assert_eq!(field, expected);
} }
@ -527,7 +508,7 @@ mod tests {
fn test_ssz_round_trip() { fn test_ssz_round_trip() {
let original = BooleanBitfield::from_bytes(&vec![18; 12][..]); let original = BooleanBitfield::from_bytes(&vec![18; 12][..]);
let ssz = ssz_encode(&original); let ssz = ssz_encode(&original);
let decoded = decode::<BooleanBitfield>(&ssz).unwrap(); let decoded = BooleanBitfield::from_ssz_bytes(&ssz).unwrap();
assert_eq!(original, decoded); assert_eq!(original, decoded);
} }