chia_protocol/
sub_epoch_summary.rs1use 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, num_blocks_overflow: u8, new_difficulty: Option<u64>, new_sub_slot_iters: Option<u64>, 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}