chia_protocol/
sub_epoch_summary.rs

1use chia_sha2::Sha256;
2use chia_streamable_macro::streamable;
3use chia_traits::{Result, Streamable};
4use std::io::Cursor;
5
6use crate::Bytes32;
7use crate::utils::{parse, stream, update_digest};
8
9#[streamable(no_streamable)]
10pub struct SubEpochSummary {
11    prev_subepoch_summary_hash: Bytes32,
12    reward_chain_hash: Bytes32, // hash of reward chain at end of last segment
13    num_blocks_overflow: u8,    // How many more blocks than 384*(N-1)
14    new_difficulty: Option<u64>, // Only once per epoch (diff adjustment)
15    new_sub_slot_iters: Option<u64>, // Only once per epoch (diff adjustment)
16    // MMR root of all challenge chain hashes in this sub-epoch (None for pre-fork)
17    challenge_merkle_root: Option<Bytes32>,
18}
19
20impl Streamable for SubEpochSummary {
21    fn update_digest(&self, digest: &mut Sha256) {
22        self.prev_subepoch_summary_hash.update_digest(digest);
23        self.reward_chain_hash.update_digest(digest);
24        self.num_blocks_overflow.update_digest(digest);
25        self.new_difficulty.update_digest(digest);
26        update_digest(
27            self.new_sub_slot_iters.as_ref(),
28            self.challenge_merkle_root.as_ref(),
29            digest,
30        );
31    }
32
33    fn stream(&self, out: &mut Vec<u8>) -> Result<()> {
34        self.prev_subepoch_summary_hash.stream(out)?;
35        self.reward_chain_hash.stream(out)?;
36        self.num_blocks_overflow.stream(out)?;
37        self.new_difficulty.stream(out)?;
38        stream(
39            self.new_sub_slot_iters.as_ref(),
40            self.challenge_merkle_root.as_ref(),
41            out,
42        )
43    }
44
45    fn parse<const TRUSTED: bool>(input: &mut Cursor<&[u8]>) -> Result<Self> {
46        let psesh = <Bytes32 as Streamable>::parse::<TRUSTED>(input)?;
47        let rch = <Bytes32 as Streamable>::parse::<TRUSTED>(input)?;
48        let nbo = <u8 as Streamable>::parse::<TRUSTED>(input)?;
49        let nd = <Option<u64> as Streamable>::parse::<TRUSTED>(input)?;
50        let (nssi, challenge_merkle_root) = parse::<TRUSTED, u64, Bytes32>(input)?;
51        Ok(Self {
52            prev_subepoch_summary_hash: psesh,
53            reward_chain_hash: rch,
54            num_blocks_overflow: nbo,
55            new_difficulty: nd,
56            new_sub_slot_iters: nssi,
57            challenge_merkle_root,
58        })
59    }
60}