espresso_types/v0/v0_4/
header.rs

1use crate::{v0_1::RewardMerkleCommitment, NsTable, TimestampMillis};
2
3use super::{
4    BlockMerkleCommitment, BuilderSignature, FeeInfo, FeeMerkleCommitment, L1BlockInfo,
5    ResolvableChainConfig,
6};
7use ark_serialize::CanonicalSerialize;
8use committable::{Commitment, Committable, RawCommitmentBuilder};
9use hotshot_types::{data::VidCommitment, utils::BuilderCommitment};
10use serde::{Deserialize, Serialize};
11
12/// A header is like a [`Block`] with the body replaced by a digest.
13#[derive(Clone, Debug, Deserialize, Serialize, Hash, PartialEq, Eq)]
14pub struct Header {
15    /// A commitment to a ChainConfig or a full ChainConfig.
16    pub(crate) chain_config: ResolvableChainConfig,
17    pub(crate) height: u64,
18    pub(crate) timestamp: u64,
19    pub(crate) timestamp_millis: TimestampMillis,
20    pub(crate) l1_head: u64,
21    pub(crate) l1_finalized: Option<L1BlockInfo>,
22    pub(crate) payload_commitment: VidCommitment,
23    pub(crate) builder_commitment: BuilderCommitment,
24    pub(crate) ns_table: NsTable,
25    pub(crate) block_merkle_tree_root: BlockMerkleCommitment,
26    pub(crate) fee_merkle_tree_root: FeeMerkleCommitment,
27    pub(crate) fee_info: FeeInfo,
28    pub(crate) builder_signature: Option<BuilderSignature>,
29    pub(crate) reward_merkle_tree_root: RewardMerkleCommitment,
30}
31
32impl Committable for Header {
33    fn commit(&self) -> Commitment<Self> {
34        let mut bmt_bytes = vec![];
35        self.block_merkle_tree_root
36            .serialize_with_mode(&mut bmt_bytes, ark_serialize::Compress::Yes)
37            .unwrap();
38        let mut fmt_bytes = vec![];
39        self.fee_merkle_tree_root
40            .serialize_with_mode(&mut fmt_bytes, ark_serialize::Compress::Yes)
41            .unwrap();
42
43        let mut rwd_bytes = vec![];
44        self.reward_merkle_tree_root
45            .serialize_with_mode(&mut rwd_bytes, ark_serialize::Compress::Yes)
46            .unwrap();
47
48        RawCommitmentBuilder::new(&Self::tag())
49            .field("chain_config", self.chain_config.commit())
50            .u64_field("height", self.height)
51            .u64_field("timestamp", self.timestamp)
52            .u64_field("timestamp_millis", self.timestamp_millis.u64())
53            .u64_field("l1_head", self.l1_head)
54            .optional("l1_finalized", &self.l1_finalized)
55            .constant_str("payload_commitment")
56            .fixed_size_bytes(self.payload_commitment.as_ref())
57            .constant_str("builder_commitment")
58            .fixed_size_bytes(self.builder_commitment.as_ref())
59            .field("ns_table", self.ns_table.commit())
60            .var_size_field("block_merkle_tree_root", &bmt_bytes)
61            .var_size_field("fee_merkle_tree_root", &fmt_bytes)
62            .field("fee_info", self.fee_info.commit())
63            .var_size_field("reward_merkle_tree_root", &rwd_bytes)
64            .finalize()
65    }
66
67    fn tag() -> String {
68        crate::v0_1::Header::tag()
69    }
70}