bytes.rs
1 // Copyright (c) 2025 ADnet Contributors 2 // This file is part of the AlphaVM library. 3 4 // Licensed under the Apache License, Version 2.0 (the "License"); 5 // you may not use this file except in compliance with the License. 6 // You may obtain a copy of the License at: 7 8 // http://www.apache.org/licenses/LICENSE-2.0 9 10 // Unless required by applicable law or agreed to in writing, software 11 // distributed under the License is distributed on an "AS IS" BASIS, 12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 // See the License for the specific language governing permissions and 14 // limitations under the License. 15 16 use super::*; 17 18 impl<N: Network> FromBytes for Header<N> { 19 /// Reads the block header from the buffer. 20 #[inline] 21 fn read_le<R: Read>(mut reader: R) -> IoResult<Self> { 22 // Read the version. 23 let version = u8::read_le(&mut reader)?; 24 // Ensure the version is valid. 25 if version != 1 { 26 return Err(error("Invalid header version")); 27 } 28 29 // Read from the buffer. 30 let previous_state_root = N::StateRoot::read_le(&mut reader)?; 31 let transactions_root = Field::<N>::read_le(&mut reader)?; 32 let finalize_root = Field::<N>::read_le(&mut reader)?; 33 let ratifications_root = Field::<N>::read_le(&mut reader)?; 34 let solutions_root = Field::<N>::read_le(&mut reader)?; 35 let subdag_root = Field::<N>::read_le(&mut reader)?; 36 let metadata = Metadata::read_le(&mut reader)?; 37 38 // Construct the block header. 39 Self::from( 40 previous_state_root, 41 transactions_root, 42 finalize_root, 43 ratifications_root, 44 solutions_root, 45 subdag_root, 46 metadata, 47 ) 48 .map_err(|e| error(format!("{e:#?}"))) 49 } 50 } 51 52 impl<N: Network> ToBytes for Header<N> { 53 /// Writes the block header to the buffer. 54 #[inline] 55 fn write_le<W: Write>(&self, mut writer: W) -> IoResult<()> { 56 // Write the version. 57 1u8.write_le(&mut writer)?; 58 59 // Write to the buffer. 60 self.previous_state_root.write_le(&mut writer)?; 61 self.transactions_root.write_le(&mut writer)?; 62 self.finalize_root.write_le(&mut writer)?; 63 self.ratifications_root.write_le(&mut writer)?; 64 self.solutions_root.write_le(&mut writer)?; 65 self.subdag_root.write_le(&mut writer)?; 66 self.metadata.write_le(&mut writer) 67 } 68 } 69 70 #[cfg(test)] 71 mod tests { 72 use super::*; 73 use console::network::MainnetV0; 74 75 type CurrentNetwork = MainnetV0; 76 77 #[test] 78 fn test_bytes() -> Result<()> { 79 let rng = &mut TestRng::default(); 80 81 for expected in [crate::header::test_helpers::sample_block_header(rng)].into_iter() { 82 // Check the byte representation. 83 let expected_bytes = expected.to_bytes_le()?; 84 assert_eq!(expected, Header::read_le(&expected_bytes[..])?); 85 assert!(Header::<CurrentNetwork>::read_le(&expected_bytes[1..]).is_err()); 86 } 87 Ok(()) 88 } 89 }