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