1#![forbid(clippy::little_endian_bytes)]
11
12use std::{
13 fmt::{Debug, Display},
14 hash::Hash,
15};
16
17use alloy::primitives::U256;
18use ark_serialize::SerializationError;
19use bitvec::prelude::*;
20use committable::Committable;
21use jf_signature::SignatureError;
22use serde::{de::DeserializeOwned, Deserialize, Serialize};
23use tagged_base64::{TaggedBase64, Tb64Error};
24
25use super::EncodeBytes;
26use crate::{
27 bundle::Bundle,
28 data::VidCommitment,
29 light_client::{LightClientState, StakeTableState, ToFieldsLightClientCompat},
30 traits::node_implementation::NodeType,
31 utils::BuilderCommitment,
32};
33
34pub trait StakeTableEntryType<K> {
36 fn stake(&self) -> U256;
38 fn public_key(&self) -> K;
40}
41
42pub trait PrivateSignatureKey:
44 Send + Sync + Sized + Clone + Debug + Eq + Hash + for<'a> TryFrom<&'a TaggedBase64>
45{
46 fn to_bytes(&self) -> Vec<u8>;
48
49 fn from_bytes(bytes: &[u8]) -> anyhow::Result<Self>;
53
54 fn to_tagged_base64(&self) -> Result<TaggedBase64, Tb64Error>;
58}
59
60pub trait SignatureKey:
63 Send
64 + Sync
65 + Clone
66 + Sized
67 + Debug
68 + Hash
69 + Serialize
70 + for<'a> Deserialize<'a>
71 + PartialEq
72 + Eq
73 + PartialOrd
74 + Ord
75 + Display
76 + ToFieldsLightClientCompat
77 + for<'a> TryFrom<&'a TaggedBase64>
78 + Into<TaggedBase64>
79{
80 type PrivateKey: PrivateSignatureKey;
82 type StakeTableEntry: StakeTableEntryType<Self>
84 + Send
85 + Sync
86 + Sized
87 + Clone
88 + Debug
89 + Hash
90 + Eq
91 + Serialize
92 + for<'a> Deserialize<'a>;
93 type QcParams<'a>: Send + Sync + Sized + Clone + Debug + Hash;
95 type PureAssembledSignatureType: Send
97 + Sync
98 + Sized
99 + Clone
100 + Debug
101 + Hash
102 + PartialEq
103 + Eq
104 + Serialize
105 + for<'a> Deserialize<'a>
106 + Into<TaggedBase64>
107 + for<'a> TryFrom<&'a TaggedBase64>;
108 type QcType: Send
110 + Sync
111 + Sized
112 + Clone
113 + Debug
114 + Hash
115 + PartialEq
116 + Eq
117 + Serialize
118 + for<'a> Deserialize<'a>;
119
120 type SignError: std::error::Error + Send + Sync;
122
123 fn validate(&self, signature: &Self::PureAssembledSignatureType, data: &[u8]) -> bool;
127
128 fn sign(
132 private_key: &Self::PrivateKey,
133 data: &[u8],
134 ) -> Result<Self::PureAssembledSignatureType, Self::SignError>;
135
136 fn from_private(private_key: &Self::PrivateKey) -> Self;
138 fn to_bytes(&self) -> Vec<u8>;
140 fn from_bytes(bytes: &[u8]) -> Result<Self, SerializationError>;
145
146 fn generated_from_seed_indexed(seed: [u8; 32], index: u64) -> (Self, Self::PrivateKey);
148
149 fn stake_table_entry(&self, stake: U256) -> Self::StakeTableEntry;
151
152 fn public_key(entry: &Self::StakeTableEntry) -> Self;
154
155 fn public_parameter(
157 stake_entries: &[Self::StakeTableEntry],
158 threshold: U256,
159 ) -> Self::QcParams<'_>;
160
161 fn check(
166 real_qc_pp: &Self::QcParams<'_>,
167 data: &[u8],
168 qc: &Self::QcType,
169 ) -> Result<(), SignatureError>;
170
171 fn sig_proof(signature: &Self::QcType) -> (Self::PureAssembledSignatureType, BitVec);
173
174 fn assemble(
176 real_qc_pp: &Self::QcParams<'_>,
177 signers: &BitSlice,
178 sigs: &[Self::PureAssembledSignatureType],
179 ) -> Self::QcType;
180
181 #[must_use]
183 fn genesis_proposer_pk() -> Self;
184}
185
186pub trait BuilderSignatureKey:
188 Send
189 + Sync
190 + Clone
191 + Sized
192 + Debug
193 + Hash
194 + Serialize
195 + DeserializeOwned
196 + PartialEq
197 + Eq
198 + PartialOrd
199 + Ord
200 + Display
201{
202 type BuilderPrivateKey: PrivateSignatureKey;
204
205 type BuilderSignature: Send
207 + Sync
208 + Sized
209 + Clone
210 + Debug
211 + Eq
212 + Serialize
213 + for<'a> Deserialize<'a>
214 + Hash;
215
216 type SignError: std::error::Error + Send + Sync;
218
219 fn validate_builder_signature(&self, signature: &Self::BuilderSignature, data: &[u8]) -> bool;
221
222 fn validate_fee_signature<Metadata: EncodeBytes>(
225 &self,
226 signature: &Self::BuilderSignature,
227 fee_amount: u64,
228 metadata: &Metadata,
229 ) -> bool {
230 self.validate_builder_signature(signature, &aggregate_fee_data(fee_amount, metadata))
231 }
232
233 fn validate_fee_signature_with_vid_commitment<Metadata: EncodeBytes>(
236 &self,
237 signature: &Self::BuilderSignature,
238 fee_amount: u64,
239 metadata: &Metadata,
240 vid_commitment: &VidCommitment,
241 ) -> bool {
242 self.validate_builder_signature(
243 signature,
244 &aggregate_fee_data_with_vid_commitment(fee_amount, metadata, vid_commitment),
245 )
246 }
247
248 fn validate_sequencing_fee_signature_marketplace(
251 &self,
252 signature: &Self::BuilderSignature,
253 fee_amount: u64,
254 view_number: u64,
255 ) -> bool {
256 self.validate_builder_signature(
257 signature,
258 &aggregate_fee_data_marketplace(fee_amount, view_number),
259 )
260 }
261
262 fn validate_bundle_signature<TYPES: NodeType<BuilderSignatureKey = Self>>(
264 &self,
265 bundle: Bundle<TYPES>,
266 ) -> bool where {
267 let commitments = bundle
268 .transactions
269 .iter()
270 .flat_map(|txn| <[u8; 32]>::from(txn.commit()))
271 .collect::<Vec<u8>>();
272
273 self.validate_builder_signature(&bundle.signature, &commitments)
274 }
275
276 fn validate_block_info_signature(
278 &self,
279 signature: &Self::BuilderSignature,
280 block_size: u64,
281 fee_amount: u64,
282 payload_commitment: &BuilderCommitment,
283 ) -> bool {
284 self.validate_builder_signature(
285 signature,
286 &aggregate_block_info_data(block_size, fee_amount, payload_commitment),
287 )
288 }
289
290 fn sign_builder_message(
294 private_key: &Self::BuilderPrivateKey,
295 data: &[u8],
296 ) -> Result<Self::BuilderSignature, Self::SignError>;
297
298 fn sign_fee<Metadata: EncodeBytes>(
302 private_key: &Self::BuilderPrivateKey,
303 fee_amount: u64,
304 metadata: &Metadata,
305 ) -> Result<Self::BuilderSignature, Self::SignError> {
306 Self::sign_builder_message(private_key, &aggregate_fee_data(fee_amount, metadata))
307 }
308
309 fn sign_fee_with_vid_commitment<Metadata: EncodeBytes>(
313 private_key: &Self::BuilderPrivateKey,
314 fee_amount: u64,
315 metadata: &Metadata,
316 vid_commitment: &VidCommitment,
317 ) -> Result<Self::BuilderSignature, Self::SignError> {
318 Self::sign_builder_message(
319 private_key,
320 &aggregate_fee_data_with_vid_commitment(fee_amount, metadata, vid_commitment),
321 )
322 }
323
324 fn sign_sequencing_fee_marketplace(
328 private_key: &Self::BuilderPrivateKey,
329 fee_amount: u64,
330 view_number: u64,
331 ) -> Result<Self::BuilderSignature, Self::SignError> {
332 Self::sign_builder_message(
333 private_key,
334 &aggregate_fee_data_marketplace(fee_amount, view_number),
335 )
336 }
337
338 fn sign_bundle<TYPES: NodeType>(
342 private_key: &Self::BuilderPrivateKey,
343 transactions: &[TYPES::Transaction],
344 ) -> Result<Self::BuilderSignature, Self::SignError> {
345 let commitments = transactions
346 .iter()
347 .flat_map(|txn| <[u8; 32]>::from(txn.commit()))
348 .collect::<Vec<u8>>();
349
350 Self::sign_builder_message(private_key, &commitments)
351 }
352
353 fn sign_block_info(
357 private_key: &Self::BuilderPrivateKey,
358 block_size: u64,
359 fee_amount: u64,
360 payload_commitment: &BuilderCommitment,
361 ) -> Result<Self::BuilderSignature, Self::SignError> {
362 Self::sign_builder_message(
363 private_key,
364 &aggregate_block_info_data(block_size, fee_amount, payload_commitment),
365 )
366 }
367
368 fn generated_from_seed_indexed(seed: [u8; 32], index: u64) -> (Self, Self::BuilderPrivateKey);
370}
371
372fn aggregate_fee_data<Metadata: EncodeBytes>(fee_amount: u64, metadata: &Metadata) -> Vec<u8> {
374 let mut fee_info = Vec::new();
375
376 fee_info.extend_from_slice(fee_amount.to_be_bytes().as_ref());
377 fee_info.extend_from_slice(metadata.encode().as_ref());
378
379 fee_info
380}
381
382fn aggregate_fee_data_with_vid_commitment<Metadata: EncodeBytes>(
384 fee_amount: u64,
385 metadata: &Metadata,
386 vid_commitment: &VidCommitment,
387) -> Vec<u8> {
388 let mut fee_info = Vec::new();
389
390 fee_info.extend_from_slice(fee_amount.to_be_bytes().as_ref());
391 fee_info.extend_from_slice(metadata.encode().as_ref());
392 fee_info.extend_from_slice(vid_commitment.as_ref());
393
394 fee_info
395}
396
397fn aggregate_fee_data_marketplace(fee_amount: u64, view_number: u64) -> Vec<u8> {
399 let mut fee_info = Vec::new();
400 fee_info.extend_from_slice(fee_amount.to_be_bytes().as_ref());
401 fee_info.extend_from_slice(view_number.to_be_bytes().as_ref());
402 fee_info
403}
404
405fn aggregate_block_info_data(
407 block_size: u64,
408 fee_amount: u64,
409 payload_commitment: &BuilderCommitment,
410) -> Vec<u8> {
411 let mut block_info = Vec::new();
412 block_info.extend_from_slice(block_size.to_be_bytes().as_ref());
413 block_info.extend_from_slice(fee_amount.to_be_bytes().as_ref());
414 block_info.extend_from_slice(payload_commitment.as_ref());
415 block_info
416}
417
418pub trait StateSignatureKey:
420 Send
421 + Sync
422 + Clone
423 + Sized
424 + Debug
425 + Hash
426 + Serialize
427 + for<'a> Deserialize<'a>
428 + PartialEq
429 + Eq
430 + Display
431 + Default
432 + ToFieldsLightClientCompat
433 + for<'a> TryFrom<&'a TaggedBase64>
434 + Into<TaggedBase64>
435{
436 type StatePrivateKey: PrivateSignatureKey;
438
439 type StateSignature: Send
441 + Sync
442 + Sized
443 + Clone
444 + Debug
445 + Eq
446 + Serialize
447 + for<'a> Deserialize<'a>
448 + Hash;
449
450 type SignError: std::error::Error + Send + Sync;
452
453 fn sign_state(
455 private_key: &Self::StatePrivateKey,
456 light_client_state: &LightClientState,
457 next_stake_table_state: &StakeTableState,
458 ) -> Result<Self::StateSignature, Self::SignError>;
459
460 fn verify_state_sig(
462 &self,
463 signature: &Self::StateSignature,
464 light_client_state: &LightClientState,
465 next_stake_table_state: &StakeTableState,
466 ) -> bool;
467
468 fn generated_from_seed_indexed(seed: [u8; 32], index: u64) -> (Self, Self::StatePrivateKey);
470}