Skip to main content

espresso_types/v0/v0_4/
header.rs

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