1use std::collections::BTreeMap;
2
3use serde::{Deserialize, Serialize};
4use slop_challenger::{GrindingChallenger, IopCtx};
5use slop_jagged::JaggedPcsProof;
6use slop_matrix::dense::RowMajorMatrixView;
7use slop_multilinear::{MultilinearPcsVerifier, Point};
8use slop_sumcheck::PartialSumcheckProof;
9use slop_symmetric::PseudoCompressionFunction;
10use sp1_primitives::{utils::reverse_bits_len, SP1GlobalContext};
11
12use crate::{LogupGkrProof, MachineVerifyingKey, ShardContext};
13
14pub const PROOF_MAX_NUM_PVS: usize = 187;
18
19#[derive(Clone, Serialize, Deserialize)]
21#[serde(bound(
22 serialize = "GC: IopCtx, GC::Challenger: Serialize",
23 deserialize = "GC: IopCtx, GC::Challenger: Deserialize<'de>"
24))]
25pub struct TestingData<GC: IopCtx> {
27 pub gkr_points: Vec<Point<GC::EF>>,
29 pub challenger_state: GC::Challenger,
31}
32
33#[derive(Clone, Serialize, Deserialize)]
35#[serde(bound(
36 serialize = "GC: IopCtx, GC::Challenger: Serialize, Proof: Serialize",
37 deserialize = "GC: IopCtx, GC::Challenger: Deserialize<'de>, Proof: Deserialize<'de>"
38))]
39pub struct ShardProof<GC: IopCtx, Proof> {
40 pub public_values: Vec<GC::F>,
42 pub main_commitment: GC::Digest,
44 pub logup_gkr_proof: LogupGkrProof<<GC::Challenger as GrindingChallenger>::Witness, GC::EF>,
46 pub zerocheck_proof: PartialSumcheckProof<GC::EF>,
48 pub opened_values: ShardOpenedValues<GC::F, GC::EF>,
50 pub evaluation_proof: JaggedPcsProof<GC, Proof>,
52}
53
54pub type ShardContextProof<GC, SC> =
56 ShardProof<GC, <<SC as ShardContext<GC>>::Config as MultilinearPcsVerifier<GC>>::Proof>;
57
58#[derive(Debug, Clone, Serialize, Deserialize)]
60pub struct ShardOpenedValues<F, EF> {
61 pub chips: BTreeMap<String, ChipOpenedValues<F, EF>>,
64}
65
66#[derive(Debug, Clone, Serialize, Deserialize)]
68#[serde(bound(serialize = "F: Serialize, EF: Serialize"))]
69#[serde(bound(deserialize = "F: Deserialize<'de>, EF: Deserialize<'de>"))]
70pub struct ChipOpenedValues<F, EF> {
71 pub preprocessed: AirOpenedValues<EF>,
73 pub main: AirOpenedValues<EF>,
75 pub degree: Point<F>,
77}
78
79#[derive(Debug, Clone, Serialize, Deserialize)]
81#[serde(bound(serialize = "T: Serialize"))]
82#[serde(bound(deserialize = "T: Deserialize<'de>"))]
83pub struct AirOpenedValues<T> {
84 pub local: Vec<T>,
86}
87
88impl<T> AirOpenedValues<T> {
89 #[must_use]
91 pub fn view(&self) -> RowMajorMatrixView<'_, T>
92 where
93 T: Clone + Send + Sync,
94 {
95 RowMajorMatrixView::new_row(&self.local)
96 }
97}
98
99#[derive(Debug, Clone, Serialize, Deserialize)]
101pub struct MerkleProof<GC: IopCtx> {
102 pub index: usize,
104 pub path: Vec<GC::Digest>,
106}
107
108#[derive(Debug)]
109pub struct VcsError;
111
112pub fn verify_merkle_proof<GC: IopCtx>(
114 proof: &MerkleProof<GC>,
115 value: GC::Digest,
116 commitment: GC::Digest,
117) -> Result<(), VcsError> {
118 let MerkleProof { index, path } = proof;
119
120 let mut value = value;
121
122 let mut index = reverse_bits_len(*index, path.len());
123
124 for sibling in path {
125 let new_pair = if index.is_multiple_of(2) { [value, *sibling] } else { [*sibling, value] };
127 let (_, compressor) = GC::default_hasher_and_compressor();
128 value = compressor.compress(new_pair);
129 index >>= 1;
130 }
131 if value != commitment {
132 Err(VcsError)
133 } else {
134 Ok(())
135 }
136}
137
138#[derive(Serialize, Deserialize, Clone)]
140#[serde(bound(
141 serialize = "GC: IopCtx, GC::Challenger: Serialize, Proof: Serialize",
142 deserialize = "GC: IopCtx, GC::Challenger: Deserialize<'de>, Proof: Deserialize<'de>"
143))]
144pub struct SP1RecursionProof<GC: IopCtx, Proof> {
145 pub vk: MachineVerifyingKey<GC>,
147 pub proof: ShardProof<GC, Proof>,
149 pub vk_merkle_proof: MerkleProof<SP1GlobalContext>,
151}
152
153impl<GC: IopCtx, Proof> std::fmt::Debug for SP1RecursionProof<GC, Proof> {
154 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
155 let mut debug_struct = f.debug_struct("SP1ReduceProof");
156 debug_struct.finish()
160 }
161}
162
163#[derive(Serialize, Deserialize, Clone)]
165#[serde(bound(
166 serialize = "GC: IopCtx, GC::Challenger: Serialize, Proof: Serialize",
167 deserialize = "GC: IopCtx, GC::Challenger: Deserialize<'de>, Proof: Deserialize<'de>"
168))]
169pub struct SP1WrapProof<GC: IopCtx, Proof> {
170 pub vk: MachineVerifyingKey<GC>,
172 pub proof: ShardProof<GC, Proof>,
174}