nova_snark/traits/
commitment.rs1use crate::errors::NovaError;
4#[cfg(feature = "io")]
5use crate::provider::ptau::PtauFileError;
6use crate::traits::{AbsorbInRO2Trait, AbsorbInROTrait, Engine, TranscriptReprTrait};
7use core::{
8 fmt::Debug,
9 ops::{Add, Mul, MulAssign, Range},
10};
11use num_integer::Integer;
12use num_traits::ToPrimitive;
13use rayon::iter::{IndexedParallelIterator, IntoParallelRefIterator, ParallelIterator};
14use serde::{Deserialize, Serialize};
15
16pub trait ScalarMul<Rhs, Output = Self>: Mul<Rhs, Output = Output> + MulAssign<Rhs> {}
18
19impl<T, Rhs, Output> ScalarMul<Rhs, Output> for T where T: Mul<Rhs, Output = Output> + MulAssign<Rhs>
20{}
21
22pub trait CommitmentTrait<E: Engine>:
24 Clone
25 + Copy
26 + Debug
27 + Default
28 + PartialEq
29 + Eq
30 + Send
31 + Sync
32 + TranscriptReprTrait<E::GE>
33 + Serialize
34 + for<'de> Deserialize<'de>
35 + AbsorbInROTrait<E>
36 + AbsorbInRO2Trait<E>
37 + Add<Self, Output = Self>
38 + ScalarMul<E::Scalar>
39{
40 fn to_coordinates(&self) -> (E::Base, E::Base, bool);
42}
43
44pub trait Len {
47 fn length(&self) -> usize;
49}
50
51pub trait CommitmentEngineTrait<E: Engine>: Clone + Send + Sync {
53 type CommitmentKey: Len + Clone + Debug + Send + Sync + Serialize + for<'de> Deserialize<'de>;
56
57 type DerandKey: Clone + Debug + Send + Sync + Serialize + for<'de> Deserialize<'de>;
59
60 type Commitment: CommitmentTrait<E>;
62
63 #[cfg(feature = "io")]
65 fn load_setup(
66 reader: &mut (impl std::io::Read + std::io::Seek),
67 label: &'static [u8],
68 n: usize,
69 ) -> Result<Self::CommitmentKey, PtauFileError>;
70
71 #[cfg(feature = "io")]
73 fn save_setup(
74 ck: &Self::CommitmentKey,
75 writer: &mut (impl std::io::Write + std::io::Seek),
76 ) -> Result<(), PtauFileError>;
77
78 fn setup(label: &'static [u8], n: usize)
85 -> Result<Self::CommitmentKey, crate::errors::NovaError>;
86
87 fn derand_key(ck: &Self::CommitmentKey) -> Self::DerandKey;
89
90 fn commit(ck: &Self::CommitmentKey, v: &[E::Scalar], r: &E::Scalar) -> Self::Commitment;
92
93 fn batch_commit(
95 ck: &Self::CommitmentKey,
96 v: &[Vec<E::Scalar>],
97 r: &[E::Scalar],
98 ) -> Vec<Self::Commitment> {
99 assert!(v.len() == r.len());
100 v.par_iter()
101 .zip(r.par_iter())
102 .map(|(v_i, r_i)| Self::commit(ck, v_i, r_i))
103 .collect()
104 }
105
106 fn commit_sparse_binary(
108 ck: &Self::CommitmentKey,
109 non_zero_indices: &[usize],
110 r: &E::Scalar,
111 ) -> Self::Commitment;
112
113 fn commit_small<T: Integer + Into<u64> + Copy + Sync + ToPrimitive>(
115 ck: &Self::CommitmentKey,
116 v: &[T],
117 r: &E::Scalar,
118 ) -> Self::Commitment;
119
120 fn commit_small_range<T: Integer + Into<u64> + Copy + Sync + ToPrimitive>(
122 ck: &Self::CommitmentKey,
123 v: &[T],
124 r: &E::Scalar,
125 range: Range<usize>,
126 max_num_bits: usize,
127 ) -> Self::Commitment;
128
129 fn batch_commit_small<T: Integer + Into<u64> + Copy + Sync + ToPrimitive>(
131 ck: &Self::CommitmentKey,
132 v: &[Vec<T>],
133 r: &[E::Scalar],
134 ) -> Vec<Self::Commitment> {
135 assert!(v.len() == r.len());
136 v.par_iter()
137 .zip(r.par_iter())
138 .map(|(v_i, r_i)| Self::commit_small(ck, v_i, r_i))
139 .collect()
140 }
141
142 fn derandomize(
144 dk: &Self::DerandKey,
145 commit: &Self::Commitment,
146 r: &E::Scalar,
147 ) -> Self::Commitment;
148
149 fn ck_to_coordinates(ck: &Self::CommitmentKey) -> Vec<(E::Base, E::Base)>;
160
161 fn ck_to_group_elements(ck: &Self::CommitmentKey) -> Vec<E::GE>;
167
168 fn ck_derive_by_address(
182 ck: &Self::CommitmentKey,
183 addresses: &[usize],
184 table_size: usize,
185 ) -> Result<Self::CommitmentKey, NovaError>;
186}