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_bundle<TYPES: NodeType>(
328 private_key: &Self::BuilderPrivateKey,
329 transactions: &[TYPES::Transaction],
330 ) -> Result<Self::BuilderSignature, Self::SignError> {
331 let commitments = transactions
332 .iter()
333 .flat_map(|txn| <[u8; 32]>::from(txn.commit()))
334 .collect::<Vec<u8>>();
335
336 Self::sign_builder_message(private_key, &commitments)
337 }
338
339 fn sign_block_info(
343 private_key: &Self::BuilderPrivateKey,
344 block_size: u64,
345 fee_amount: u64,
346 payload_commitment: &BuilderCommitment,
347 ) -> Result<Self::BuilderSignature, Self::SignError> {
348 Self::sign_builder_message(
349 private_key,
350 &aggregate_block_info_data(block_size, fee_amount, payload_commitment),
351 )
352 }
353
354 fn generated_from_seed_indexed(seed: [u8; 32], index: u64) -> (Self, Self::BuilderPrivateKey);
356}
357
358fn aggregate_fee_data<Metadata: EncodeBytes>(fee_amount: u64, metadata: &Metadata) -> Vec<u8> {
360 let mut fee_info = Vec::new();
361
362 fee_info.extend_from_slice(fee_amount.to_be_bytes().as_ref());
363 fee_info.extend_from_slice(metadata.encode().as_ref());
364
365 fee_info
366}
367
368fn aggregate_fee_data_with_vid_commitment<Metadata: EncodeBytes>(
370 fee_amount: u64,
371 metadata: &Metadata,
372 vid_commitment: &VidCommitment,
373) -> 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 fee_info.extend_from_slice(vid_commitment.as_ref());
379
380 fee_info
381}
382
383fn aggregate_fee_data_marketplace(fee_amount: u64, view_number: u64) -> Vec<u8> {
385 let mut fee_info = Vec::new();
386 fee_info.extend_from_slice(fee_amount.to_be_bytes().as_ref());
387 fee_info.extend_from_slice(view_number.to_be_bytes().as_ref());
388 fee_info
389}
390
391fn aggregate_block_info_data(
393 block_size: u64,
394 fee_amount: u64,
395 payload_commitment: &BuilderCommitment,
396) -> Vec<u8> {
397 let mut block_info = Vec::new();
398 block_info.extend_from_slice(block_size.to_be_bytes().as_ref());
399 block_info.extend_from_slice(fee_amount.to_be_bytes().as_ref());
400 block_info.extend_from_slice(payload_commitment.as_ref());
401 block_info
402}
403
404pub trait StateSignatureKey:
406 Send
407 + Sync
408 + Clone
409 + Sized
410 + Debug
411 + Hash
412 + Serialize
413 + for<'a> Deserialize<'a>
414 + PartialEq
415 + Eq
416 + Display
417 + Default
418 + ToFieldsLightClientCompat
419 + for<'a> TryFrom<&'a TaggedBase64>
420 + Into<TaggedBase64>
421{
422 type StatePrivateKey: PrivateSignatureKey;
424
425 type StateSignature: Send
427 + Sync
428 + Sized
429 + Clone
430 + Debug
431 + Eq
432 + Serialize
433 + for<'a> Deserialize<'a>
434 + Hash;
435
436 type SignError: std::error::Error + Send + Sync;
438
439 fn sign_state(
441 private_key: &Self::StatePrivateKey,
442 light_client_state: &LightClientState,
443 next_stake_table_state: &StakeTableState,
444 ) -> Result<Self::StateSignature, Self::SignError>;
445
446 fn verify_state_sig(
448 &self,
449 signature: &Self::StateSignature,
450 light_client_state: &LightClientState,
451 next_stake_table_state: &StakeTableState,
452 ) -> bool;
453
454 fn legacy_sign_state(
456 private_key: &Self::StatePrivateKey,
457 light_client_state: &LightClientState,
458 ) -> Result<Self::StateSignature, Self::SignError>;
459
460 fn legacy_verify_state_sig(
462 &self,
463 signature: &Self::StateSignature,
464 light_client_state: &LightClientState,
465 ) -> bool;
466
467 fn generated_from_seed_indexed(seed: [u8; 32], index: u64) -> (Self, Self::StatePrivateKey);
469}