openvm_native_recursion/fri/
witness.rs1use openvm_native_compiler::{
2 ir::{Builder, Witness, WitnessRef},
3 prelude::*,
4};
5
6use super::types::BatchOpeningVariable;
7use crate::{
8 config::outer::{
9 OuterBatchOpening, OuterCommitPhaseStep, OuterConfig, OuterDigest, OuterFriProof,
10 OuterQueryProof,
11 },
12 fri::types::{FriCommitPhaseProofStepVariable, FriProofVariable, FriQueryProofVariable},
13 vars::HintSlice,
14 witness::{VectorWitnessable, Witnessable},
15};
16
17type C = OuterConfig;
18
19impl Witnessable<C> for OuterCommitPhaseStep {
20 type WitnessVariable = FriCommitPhaseProofStepVariable<C>;
21
22 fn read(&self, builder: &mut Builder<C>) -> Self::WitnessVariable {
23 let sibling_value = self.sibling_value.read(builder);
24 let opening_proof = read_opening_proof(builder, &self.opening_proof);
25 Self::WitnessVariable {
26 sibling_value,
27 opening_proof,
28 }
29 }
30
31 fn write(&self, witness: &mut Witness<OuterConfig>) {
32 self.sibling_value.write(witness);
33 write_opening_proof(witness, &self.opening_proof);
34 }
35}
36
37impl VectorWitnessable<C> for OuterCommitPhaseStep {}
38
39impl Witnessable<C> for OuterQueryProof {
40 type WitnessVariable = FriQueryProofVariable<C>;
41
42 fn read(&self, builder: &mut Builder<C>) -> Self::WitnessVariable {
43 let input_proof = self.input_proof.read(builder);
44 let commit_phase_openings = self.commit_phase_openings.read(builder);
45 Self::WitnessVariable {
46 input_proof,
47 commit_phase_openings,
48 }
49 }
50
51 fn write(&self, witness: &mut Witness<OuterConfig>) {
52 self.input_proof.write(witness);
53 self.commit_phase_openings.write(witness);
54 }
55}
56
57impl VectorWitnessable<C> for OuterQueryProof {}
58
59impl Witnessable<C> for OuterFriProof {
60 type WitnessVariable = FriProofVariable<C>;
61
62 fn read(&self, builder: &mut Builder<C>) -> Self::WitnessVariable {
63 let commit_phase_commits = self.commit_phase_commits.read(builder);
64 let commit_pow_witnesses = self.commit_pow_witnesses.read(builder);
65 let query_proofs = self.query_proofs.read(builder);
66 let final_poly = self.final_poly.read(builder);
67 let query_pow_witness = self.query_pow_witness.read(builder);
68 Self::WitnessVariable {
69 commit_phase_commits,
70 commit_pow_witnesses,
71 query_proofs,
72 final_poly,
73 query_pow_witness,
74 }
75 }
76
77 fn write(&self, witness: &mut Witness<OuterConfig>) {
78 self.commit_phase_commits.write(witness);
79 self.commit_pow_witnesses.write(witness);
80 <Vec<_> as Witnessable<C>>::write(&self.query_proofs, witness);
81 self.final_poly.write(witness);
82 self.query_pow_witness.write(witness);
83 }
84}
85
86impl Witnessable<C> for OuterBatchOpening {
87 type WitnessVariable = BatchOpeningVariable<C>;
88
89 fn read(&self, builder: &mut Builder<C>) -> Self::WitnessVariable {
90 let opened_values_refs: Vec<WitnessRef> = self
91 .opened_values
92 .iter()
93 .flatten()
94 .map(|x| x.read(builder).into())
95 .collect();
96 let length = Usize::from(opened_values_refs.len());
97 let id = builder.witness_load(opened_values_refs);
98 let opened_values = HintSlice { length, id };
99
100 let opening_proof = read_opening_proof(builder, &self.opening_proof);
101 Self::WitnessVariable {
102 opened_values,
103 opening_proof,
104 }
105 }
106
107 fn write(&self, witness: &mut Witness<OuterConfig>) {
108 let opened_values: Vec<_> = self
109 .opened_values
110 .iter()
111 .flat_map(|op| op.to_vec())
112 .collect();
113 opened_values.write(witness);
114 write_opening_proof(witness, &self.opening_proof);
115 }
116}
117
118impl VectorWitnessable<C> for OuterBatchOpening {}
119impl VectorWitnessable<C> for Vec<OuterBatchOpening> {}
120
121fn read_opening_proof(builder: &mut Builder<C>, opening_proof: &[OuterDigest]) -> HintSlice<C> {
122 let opening_proof: Vec<WitnessRef> = opening_proof
123 .iter()
124 .flatten()
125 .map(|x| x.read(builder).into())
126 .collect();
127 let length = Usize::from(opening_proof.len());
128 let id = builder.witness_load(opening_proof);
129 HintSlice { length, id }
130}
131fn write_opening_proof(witness: &mut Witness<OuterConfig>, opening_proof: &[OuterDigest]) {
132 let opening_proof: Vec<_> = opening_proof.iter().flat_map(|op| op.to_vec()).collect();
133 opening_proof.write(witness);
134}