chia_protocol/
unfinished_block.rs

1use chia_streamable_macro::streamable;
2
3use crate::Bytes32;
4use crate::EndOfSubSlotBundle;
5use crate::Program;
6use crate::RewardChainBlockUnfinished;
7use crate::VDFProof;
8use crate::{Foliage, FoliageTransactionBlock, TransactionsInfo};
9use chia_traits::Streamable;
10
11#[streamable]
12pub struct UnfinishedBlock {
13    // Full block, without the final VDFs
14    finished_sub_slots: Vec<EndOfSubSlotBundle>, // If first sb
15    reward_chain_block: RewardChainBlockUnfinished, // Reward chain trunk data
16    challenge_chain_sp_proof: Option<VDFProof>,  // If not first sp in sub-slot
17    reward_chain_sp_proof: Option<VDFProof>,     // If not first sp in sub-slot
18    foliage: Foliage,                            // Reward chain foliage data
19    foliage_transaction_block: Option<FoliageTransactionBlock>, // Reward chain foliage data (tx block)
20    transactions_info: Option<TransactionsInfo>, // Reward chain foliage data (tx block additional)
21    transactions_generator: Option<Program>,     // Program that generates transactions
22    transactions_generator_ref_list: Vec<u32>, // List of block heights of previous generators referenced in this block
23}
24
25impl UnfinishedBlock {
26    pub fn prev_header_hash(&self) -> Bytes32 {
27        self.foliage.prev_block_hash
28    }
29
30    pub fn partial_hash(&self) -> Bytes32 {
31        self.reward_chain_block.hash().into()
32    }
33
34    pub fn is_transaction_block(&self) -> bool {
35        self.foliage.foliage_transaction_block_hash.is_some()
36    }
37
38    pub fn total_iters(&self) -> u128 {
39        self.reward_chain_block.total_iters
40    }
41}
42
43#[cfg(feature = "py-bindings")]
44use chia_traits::ChiaToPython;
45#[cfg(feature = "py-bindings")]
46use pyo3::prelude::*;
47
48#[cfg(feature = "py-bindings")]
49#[pymethods]
50impl UnfinishedBlock {
51    #[getter]
52    #[pyo3(name = "prev_header_hash")]
53    fn py_prev_header_hash(&self) -> Bytes32 {
54        self.prev_header_hash()
55    }
56
57    #[getter]
58    #[pyo3(name = "partial_hash")]
59    fn py_partial_hash(&self) -> Bytes32 {
60        self.partial_hash()
61    }
62
63    #[pyo3(name = "is_transaction_block")]
64    fn py_is_transaction_block(&self) -> bool {
65        self.is_transaction_block()
66    }
67
68    #[getter]
69    #[pyo3(name = "total_iters")]
70    fn py_total_iters<'a>(&self, py: Python<'a>) -> PyResult<Bound<'a, PyAny>> {
71        ChiaToPython::to_python(&self.total_iters(), py)
72    }
73}