risc0_zkp/verify/
read_iop.rs1use alloc::boxed::Box;
16
17use risc0_core::field::{Elem, Field};
18
19use crate::core::{
20 digest::Digest,
21 hash::{Rng, RngFactory},
22};
23
24pub struct ReadIOP<'a, F: Field> {
25 proof: &'a [u32],
26 rng: Box<dyn Rng<F>>,
27}
28
29impl<'a, F: Field> ReadIOP<'a, F> {
30 pub fn new(proof: &'a [u32], rng: &dyn RngFactory<F>) -> Self {
31 ReadIOP {
32 proof,
33 rng: rng.new_rng(),
34 }
35 }
36
37 pub fn read_u32s(&mut self, n: usize) -> &'a [u32] {
38 let u32s;
39 (u32s, self.proof) = self.proof.split_at(n);
40 u32s
41 }
42
43 pub fn read_field_elem_slice<T: Elem>(&mut self, n: usize) -> &'a [T] {
46 let u32s = self.read_u32s(n * T::WORDS);
47 T::from_u32_slice(u32s)
48 }
49
50 pub fn read_pod_slice<T: bytemuck::Pod>(&mut self, n: usize) -> &'a [T] {
54 let u32s;
55 (u32s, self.proof) = self
56 .proof
57 .split_at(n * core::mem::size_of::<T>() / core::mem::size_of::<u32>());
58 bytemuck::cast_slice(u32s)
59 }
60
61 pub fn commit(&mut self, digest: &Digest) {
62 self.rng.mix(digest);
63 }
64
65 pub fn verify_complete(&self) {
67 assert_eq!(self.proof.len(), 0);
68 }
69
70 pub fn random_bits(&mut self, bits: usize) -> u32 {
72 self.rng.random_bits(bits)
73 }
74
75 pub fn random_elem(&mut self) -> F::Elem {
77 self.rng.random_elem()
78 }
79
80 pub fn random_ext_elem(&mut self) -> F::ExtElem {
82 self.rng.random_ext_elem()
83 }
84}