hotshot_types/traits/
block_contents.rs1use std::{
13 error::Error,
14 fmt::{Debug, Display},
15 future::Future,
16 hash::Hash,
17 sync::Arc,
18};
19
20use async_trait::async_trait;
21use committable::{Commitment, Committable};
22use serde::{de::DeserializeOwned, Deserialize, Serialize};
23use vbs::version::Version;
24
25use super::signature_key::BuilderSignatureKey;
26use crate::{
27 data::{Leaf2, VidCommitment},
28 light_client::LightClientState,
29 traits::{node_implementation::NodeType, states::InstanceState, ValidatedState},
30 utils::BuilderCommitment,
31};
32
33pub trait EncodeBytes {
35 fn encode(&self) -> Arc<[u8]>;
37}
38
39pub trait Transaction:
41 Clone + Serialize + DeserializeOwned + Debug + PartialEq + Eq + Sync + Send + Committable + Hash
42{
43 fn minimum_block_size(&self) -> u64;
48}
49
50#[async_trait]
59pub trait BlockPayload<TYPES: NodeType>:
60 Serialize
61 + Clone
62 + Debug
63 + Display
64 + Hash
65 + PartialEq
66 + Eq
67 + Send
68 + Sync
69 + DeserializeOwned
70 + EncodeBytes
71{
72 type Error: Error + Debug + Send + Sync + Serialize + DeserializeOwned;
74
75 type Instance: InstanceState;
77 type Transaction: Transaction + Serialize + DeserializeOwned;
79 type ValidatedState: ValidatedState<TYPES>;
81 type Metadata: Clone
83 + Debug
84 + DeserializeOwned
85 + Eq
86 + Hash
87 + Send
88 + Sync
89 + Serialize
90 + EncodeBytes;
91
92 async fn from_transactions(
97 transactions: impl IntoIterator<Item = Self::Transaction> + Send,
98 validated_state: &Self::ValidatedState,
99 instance_state: &Self::Instance,
100 ) -> Result<(Self, Self::Metadata), Self::Error>;
101
102 fn from_bytes(encoded_transactions: &[u8], metadata: &Self::Metadata) -> Self;
105
106 fn empty() -> (Self, Self::Metadata);
108
109 fn transaction_commitments(
111 &self,
112 metadata: &Self::Metadata,
113 ) -> Vec<Commitment<Self::Transaction>> {
114 self.transactions(metadata).map(|tx| tx.commit()).collect()
115 }
116
117 fn num_transactions(&self, metadata: &Self::Metadata) -> usize {
119 self.transactions(metadata).count()
120 }
121
122 fn builder_commitment(&self, metadata: &Self::Metadata) -> BuilderCommitment;
124
125 fn transactions<'a>(
127 &'a self,
128 metadata: &'a Self::Metadata,
129 ) -> impl 'a + Iterator<Item = Self::Transaction>;
130}
131
132pub trait TestableBlock<TYPES: NodeType>: BlockPayload<TYPES> + Debug {
134 fn genesis() -> Self;
136
137 fn txn_count(&self) -> u64;
139}
140
141pub const GENESIS_VID_NUM_STORAGE_NODES: usize = 1;
146
147#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
148pub struct BuilderFee<TYPES: NodeType> {
150 pub fee_amount: u64,
152 pub fee_account: TYPES::BuilderSignatureKey,
154 pub fee_signature: <TYPES::BuilderSignatureKey as BuilderSignatureKey>::BuilderSignature,
156}
157
158pub trait BlockHeader<TYPES: NodeType>:
160 Serialize + Clone + Debug + Hash + PartialEq + Eq + Send + Sync + DeserializeOwned + Committable
161{
162 type Error: Error + Debug + Send + Sync;
164
165 #[allow(clippy::too_many_arguments)]
168 fn new_legacy(
169 parent_state: &TYPES::ValidatedState,
170 instance_state: &<TYPES::ValidatedState as ValidatedState<TYPES>>::Instance,
171 parent_leaf: &Leaf2<TYPES>,
172 payload_commitment: VidCommitment,
173 builder_commitment: BuilderCommitment,
174 metadata: <TYPES::BlockPayload as BlockPayload<TYPES>>::Metadata,
175 builder_fee: BuilderFee<TYPES>,
176 version: Version,
177 view_number: u64,
178 ) -> impl Future<Output = Result<Self, Self::Error>> + Send;
179
180 #[allow(clippy::too_many_arguments)]
184 fn new_marketplace(
185 parent_state: &TYPES::ValidatedState,
186 instance_state: &<TYPES::ValidatedState as ValidatedState<TYPES>>::Instance,
187 parent_leaf: &Leaf2<TYPES>,
188 payload_commitment: VidCommitment,
189 builder_commitment: BuilderCommitment,
190 metadata: <TYPES::BlockPayload as BlockPayload<TYPES>>::Metadata,
191 builder_fee: Vec<BuilderFee<TYPES>>,
192 view_number: u64,
193 auction_results: Option<TYPES::AuctionResult>,
194 version: Version,
195 ) -> impl Future<Output = Result<Self, Self::Error>> + Send;
196
197 fn genesis(
199 instance_state: &<TYPES::ValidatedState as ValidatedState<TYPES>>::Instance,
200 payload_commitment: VidCommitment,
201 builder_commitment: BuilderCommitment,
202 metadata: <TYPES::BlockPayload as BlockPayload<TYPES>>::Metadata,
203 ) -> Self;
204
205 fn block_number(&self) -> u64;
207
208 fn payload_commitment(&self) -> VidCommitment;
210
211 fn metadata(&self) -> &<TYPES::BlockPayload as BlockPayload<TYPES>>::Metadata;
213
214 fn builder_commitment(&self) -> BuilderCommitment;
216
217 fn get_auction_results(&self) -> Option<TYPES::AuctionResult>;
219
220 fn get_light_client_state(&self, view: TYPES::View) -> anyhow::Result<LightClientState>;
222}