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::{Deserialize, Serialize, de::DeserializeOwned};
23use tagged_base64::{TaggedBase64, Tb64Error};
24
25use super::EncodeBytes;
26use crate::{
27 bundle::Bundle,
28 data::VidCommitment,
29 light_client::{CircuitField, 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 VerificationKeyType: Debug
95 + Hash
96 + Clone
97 + Send
98 + Sync
99 + for<'a> Deserialize<'a>
100 + Serialize
101 + PartialEq
102 + Eq;
103 type QcParams<'a>: Send + Sync + Sized + Clone + Debug + Hash;
105 type PureAssembledSignatureType: Send
107 + Sync
108 + Sized
109 + Clone
110 + Debug
111 + Hash
112 + PartialEq
113 + Eq
114 + Serialize
115 + for<'a> Deserialize<'a>
116 + Into<TaggedBase64>
117 + for<'a> TryFrom<&'a TaggedBase64>;
118 type QcType: Send
120 + Sync
121 + Sized
122 + Clone
123 + Debug
124 + Hash
125 + PartialEq
126 + Eq
127 + Serialize
128 + for<'a> Deserialize<'a>;
129
130 type SignError: std::error::Error + Send + Sync;
132
133 fn validate(&self, signature: &Self::PureAssembledSignatureType, data: &[u8]) -> bool;
137
138 fn sign(
142 private_key: &Self::PrivateKey,
143 data: &[u8],
144 ) -> Result<Self::PureAssembledSignatureType, Self::SignError>;
145
146 fn from_private(private_key: &Self::PrivateKey) -> Self;
148 fn to_bytes(&self) -> Vec<u8>;
150 fn from_bytes(bytes: &[u8]) -> Result<Self, SerializationError>;
155
156 fn generated_from_seed_indexed(seed: [u8; 32], index: u64) -> (Self, Self::PrivateKey);
158
159 fn stake_table_entry(&self, stake: U256) -> Self::StakeTableEntry;
161
162 fn public_key(entry: &Self::StakeTableEntry) -> Self;
164
165 fn public_parameter(
167 stake_entries: &[Self::StakeTableEntry],
168 threshold: U256,
169 ) -> Self::QcParams<'_>;
170
171 fn check(
176 real_qc_pp: &Self::QcParams<'_>,
177 data: &[u8],
178 qc: &Self::QcType,
179 ) -> Result<(), SignatureError>;
180
181 fn signers(
186 real_qc_pp: &Self::QcParams<'_>,
187 qc: &Self::QcType,
188 ) -> Result<Vec<Self::VerificationKeyType>, SignatureError>;
189
190 fn sig_proof(signature: &Self::QcType) -> (Self::PureAssembledSignatureType, BitVec);
192
193 fn assemble(
195 real_qc_pp: &Self::QcParams<'_>,
196 signers: &BitSlice,
197 sigs: &[Self::PureAssembledSignatureType],
198 ) -> Self::QcType;
199
200 #[must_use]
202 fn genesis_proposer_pk() -> Self;
203
204 fn to_verification_key(&self) -> Self::VerificationKeyType;
206}
207
208pub trait BuilderSignatureKey:
210 Send
211 + Sync
212 + Clone
213 + Sized
214 + Debug
215 + Hash
216 + Serialize
217 + DeserializeOwned
218 + PartialEq
219 + Eq
220 + PartialOrd
221 + Ord
222 + Display
223{
224 type BuilderPrivateKey: PrivateSignatureKey;
226
227 type BuilderSignature: Send
229 + Sync
230 + Sized
231 + Clone
232 + Debug
233 + Eq
234 + Serialize
235 + for<'a> Deserialize<'a>
236 + Hash;
237
238 type SignError: std::error::Error + Send + Sync;
240
241 fn validate_builder_signature(&self, signature: &Self::BuilderSignature, data: &[u8]) -> bool;
243
244 fn validate_fee_signature<Metadata: EncodeBytes>(
247 &self,
248 signature: &Self::BuilderSignature,
249 fee_amount: u64,
250 metadata: &Metadata,
251 ) -> bool {
252 self.validate_builder_signature(signature, &aggregate_fee_data(fee_amount, metadata))
253 }
254
255 fn validate_fee_signature_with_vid_commitment<Metadata: EncodeBytes>(
258 &self,
259 signature: &Self::BuilderSignature,
260 fee_amount: u64,
261 metadata: &Metadata,
262 vid_commitment: &VidCommitment,
263 ) -> bool {
264 self.validate_builder_signature(
265 signature,
266 &aggregate_fee_data_with_vid_commitment(fee_amount, metadata, vid_commitment),
267 )
268 }
269
270 fn validate_sequencing_fee_signature_marketplace(
273 &self,
274 signature: &Self::BuilderSignature,
275 fee_amount: u64,
276 view_number: u64,
277 ) -> bool {
278 self.validate_builder_signature(
279 signature,
280 &aggregate_fee_data_marketplace(fee_amount, view_number),
281 )
282 }
283
284 fn validate_bundle_signature<TYPES: NodeType<BuilderSignatureKey = Self>>(
286 &self,
287 bundle: Bundle<TYPES>,
288 ) -> bool where {
289 let commitments = bundle
290 .transactions
291 .iter()
292 .flat_map(|txn| <[u8; 32]>::from(txn.commit()))
293 .collect::<Vec<u8>>();
294
295 self.validate_builder_signature(&bundle.signature, &commitments)
296 }
297
298 fn validate_block_info_signature(
300 &self,
301 signature: &Self::BuilderSignature,
302 block_size: u64,
303 fee_amount: u64,
304 payload_commitment: &BuilderCommitment,
305 ) -> bool {
306 self.validate_builder_signature(
307 signature,
308 &aggregate_block_info_data(block_size, fee_amount, payload_commitment),
309 )
310 }
311
312 fn sign_builder_message(
316 private_key: &Self::BuilderPrivateKey,
317 data: &[u8],
318 ) -> Result<Self::BuilderSignature, Self::SignError>;
319
320 fn sign_fee<Metadata: EncodeBytes>(
324 private_key: &Self::BuilderPrivateKey,
325 fee_amount: u64,
326 metadata: &Metadata,
327 ) -> Result<Self::BuilderSignature, Self::SignError> {
328 Self::sign_builder_message(private_key, &aggregate_fee_data(fee_amount, metadata))
329 }
330
331 fn sign_fee_with_vid_commitment<Metadata: EncodeBytes>(
335 private_key: &Self::BuilderPrivateKey,
336 fee_amount: u64,
337 metadata: &Metadata,
338 vid_commitment: &VidCommitment,
339 ) -> Result<Self::BuilderSignature, Self::SignError> {
340 Self::sign_builder_message(
341 private_key,
342 &aggregate_fee_data_with_vid_commitment(fee_amount, metadata, vid_commitment),
343 )
344 }
345
346 fn sign_bundle<TYPES: NodeType>(
350 private_key: &Self::BuilderPrivateKey,
351 transactions: &[TYPES::Transaction],
352 ) -> Result<Self::BuilderSignature, Self::SignError> {
353 let commitments = transactions
354 .iter()
355 .flat_map(|txn| <[u8; 32]>::from(txn.commit()))
356 .collect::<Vec<u8>>();
357
358 Self::sign_builder_message(private_key, &commitments)
359 }
360
361 fn sign_block_info(
365 private_key: &Self::BuilderPrivateKey,
366 block_size: u64,
367 fee_amount: u64,
368 payload_commitment: &BuilderCommitment,
369 ) -> Result<Self::BuilderSignature, Self::SignError> {
370 Self::sign_builder_message(
371 private_key,
372 &aggregate_block_info_data(block_size, fee_amount, payload_commitment),
373 )
374 }
375
376 fn generated_from_seed_indexed(seed: [u8; 32], index: u64) -> (Self, Self::BuilderPrivateKey);
378}
379
380fn aggregate_fee_data<Metadata: EncodeBytes>(fee_amount: u64, metadata: &Metadata) -> Vec<u8> {
382 let mut fee_info = Vec::new();
383
384 fee_info.extend_from_slice(fee_amount.to_be_bytes().as_ref());
385 fee_info.extend_from_slice(metadata.encode().as_ref());
386
387 fee_info
388}
389
390fn aggregate_fee_data_with_vid_commitment<Metadata: EncodeBytes>(
392 fee_amount: u64,
393 metadata: &Metadata,
394 vid_commitment: &VidCommitment,
395) -> Vec<u8> {
396 let mut fee_info = Vec::new();
397
398 fee_info.extend_from_slice(fee_amount.to_be_bytes().as_ref());
399 fee_info.extend_from_slice(metadata.encode().as_ref());
400 fee_info.extend_from_slice(vid_commitment.as_ref());
401
402 fee_info
403}
404
405fn aggregate_fee_data_marketplace(fee_amount: u64, view_number: u64) -> Vec<u8> {
407 let mut fee_info = Vec::new();
408 fee_info.extend_from_slice(fee_amount.to_be_bytes().as_ref());
409 fee_info.extend_from_slice(view_number.to_be_bytes().as_ref());
410 fee_info
411}
412
413fn aggregate_block_info_data(
415 block_size: u64,
416 fee_amount: u64,
417 payload_commitment: &BuilderCommitment,
418) -> Vec<u8> {
419 let mut block_info = Vec::new();
420 block_info.extend_from_slice(block_size.to_be_bytes().as_ref());
421 block_info.extend_from_slice(fee_amount.to_be_bytes().as_ref());
422 block_info.extend_from_slice(payload_commitment.as_ref());
423 block_info
424}
425
426pub trait StateSignatureKey:
428 Send
429 + Sync
430 + Clone
431 + Sized
432 + Debug
433 + Hash
434 + Serialize
435 + for<'a> Deserialize<'a>
436 + PartialEq
437 + Eq
438 + Display
439 + Default
440 + ToFieldsLightClientCompat
441 + for<'a> TryFrom<&'a TaggedBase64>
442 + Into<TaggedBase64>
443{
444 type StatePrivateKey: PrivateSignatureKey;
446
447 type StateSignature: Send
449 + Sync
450 + Sized
451 + Clone
452 + Debug
453 + Eq
454 + Serialize
455 + for<'a> Deserialize<'a>
456 + Hash;
457
458 type SignError: std::error::Error + Send + Sync;
460
461 fn generated_from_seed_indexed(seed: [u8; 32], index: u64) -> (Self, Self::StatePrivateKey);
463}
464
465pub trait LCV1StateSignatureKey: StateSignatureKey {
467 fn sign_state(
469 private_key: &Self::StatePrivateKey,
470 light_client_state: &LightClientState,
471 ) -> Result<Self::StateSignature, Self::SignError>;
472
473 fn verify_state_sig(
475 &self,
476 signature: &Self::StateSignature,
477 light_client_state: &LightClientState,
478 ) -> bool;
479}
480
481pub trait LCV2StateSignatureKey: StateSignatureKey {
483 fn sign_state(
485 private_key: &Self::StatePrivateKey,
486 light_client_state: &LightClientState,
487 next_stake_table_state: &StakeTableState,
488 ) -> Result<Self::StateSignature, Self::SignError>;
489
490 fn verify_state_sig(
492 &self,
493 signature: &Self::StateSignature,
494 light_client_state: &LightClientState,
495 next_stake_table_state: &StakeTableState,
496 ) -> bool;
497}
498
499pub trait LCV3StateSignatureKey: StateSignatureKey {
502 fn sign_state(
506 private_key: &Self::StatePrivateKey,
507 msg: CircuitField,
508 ) -> Result<Self::StateSignature, Self::SignError>;
509
510 fn verify_state_sig(&self, signature: &Self::StateSignature, msg: CircuitField) -> bool;
514}