snarkvm_ledger_block/header/metadata/
bytes.rs

1// Copyright (c) 2019-2025 Provable Inc.
2// This file is part of the snarkVM 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
16use super::*;
17
18impl<N: Network> FromBytes for Metadata<N> {
19    /// Reads the metadata 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 metadata version"));
27        }
28
29        // Read from the buffer.
30        let network = u16::read_le(&mut reader)?;
31        let round = u64::read_le(&mut reader)?;
32        let height = u32::read_le(&mut reader)?;
33        let cumulative_weight = u128::read_le(&mut reader)?;
34        let cumulative_proof_target = u128::read_le(&mut reader)?;
35        let coinbase_target = u64::read_le(&mut reader)?;
36        let proof_target = u64::read_le(&mut reader)?;
37        let last_coinbase_target = u64::read_le(&mut reader)?;
38        let last_coinbase_timestamp = i64::read_le(&mut reader)?;
39        let timestamp = i64::read_le(&mut reader)?;
40
41        // Construct the metadata.
42        Self::new(
43            network,
44            round,
45            height,
46            cumulative_weight,
47            cumulative_proof_target,
48            coinbase_target,
49            proof_target,
50            last_coinbase_target,
51            last_coinbase_timestamp,
52            timestamp,
53        )
54        .map_err(|e| error(e.to_string()))
55    }
56}
57
58impl<N: Network> ToBytes for Metadata<N> {
59    /// Writes the metadata to the buffer.
60    #[inline]
61    fn write_le<W: Write>(&self, mut writer: W) -> IoResult<()> {
62        // Write the version.
63        1u8.write_le(&mut writer)?;
64
65        // Write to the buffer.
66        self.network.write_le(&mut writer)?;
67        self.round.write_le(&mut writer)?;
68        self.height.write_le(&mut writer)?;
69        self.cumulative_weight.write_le(&mut writer)?;
70        self.cumulative_proof_target.write_le(&mut writer)?;
71        self.coinbase_target.write_le(&mut writer)?;
72        self.proof_target.write_le(&mut writer)?;
73        self.last_coinbase_target.write_le(&mut writer)?;
74        self.last_coinbase_timestamp.write_le(&mut writer)?;
75        self.timestamp.write_le(&mut writer)
76    }
77}
78
79#[cfg(test)]
80mod tests {
81    use super::*;
82    use console::network::MainnetV0;
83
84    type CurrentNetwork = MainnetV0;
85
86    #[test]
87    fn test_bytes() -> Result<()> {
88        let rng = &mut TestRng::default();
89
90        for expected in [crate::header::metadata::test_helpers::sample_block_metadata(rng)].into_iter() {
91            // Check the byte representation.
92            let expected_bytes = expected.to_bytes_le()?;
93            assert_eq!(expected, Metadata::read_le(&expected_bytes[..])?);
94            assert!(Metadata::<CurrentNetwork>::read_le(&expected_bytes[1..]).is_err());
95        }
96        Ok(())
97    }
98}