espresso_types/v0/v0_99/
header.rs

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