2024-11-10 02:10:20 +01:00
|
|
|
use risc0_zkvm::{default_prover, sha::Digest, ExecutorEnv, Receipt};
|
|
|
|
|
|
|
|
|
|
pub fn prove<T: serde::ser::Serialize>(input_vec: Vec<T>, elf: &[u8]) -> (u64, Receipt) {
|
|
|
|
|
let mut builder = ExecutorEnv::builder();
|
|
|
|
|
|
|
|
|
|
for input in input_vec {
|
|
|
|
|
builder
|
|
|
|
|
.write(&input)
|
|
|
|
|
.unwrap();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
let env = builder
|
|
|
|
|
.build()
|
|
|
|
|
.unwrap();
|
|
|
|
|
|
|
|
|
|
let prover = default_prover();
|
|
|
|
|
|
|
|
|
|
let receipt = prover.prove(env, elf).unwrap().receipt;
|
|
|
|
|
|
|
|
|
|
let digest = receipt.journal.decode().unwrap();
|
|
|
|
|
(digest, receipt)
|
|
|
|
|
}
|
2024-11-10 02:10:37 +01:00
|
|
|
|
|
|
|
|
pub fn verify(receipt: Receipt, image_id: impl Into<Digest>) {
|
|
|
|
|
receipt
|
|
|
|
|
.verify(image_id)
|
|
|
|
|
.expect("receipt verification failed");
|
|
|
|
|
}
|
2024-11-10 02:12:20 +01:00
|
|
|
|
|
|
|
|
#[cfg(test)]
|
|
|
|
|
mod tests {
|
|
|
|
|
use test_methods::{SUMMATION_ELF, SUMMATION_ID};
|
|
|
|
|
use test_methods::{MULTIPLICATION_ELF, MULTIPLICATION_ID};
|
|
|
|
|
use super::*;
|
|
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
|
fn simple_sum() {
|
|
|
|
|
let message = 1;
|
|
|
|
|
let message_2 = 2;
|
|
|
|
|
|
|
|
|
|
let (digest, receipt) = prove(vec![message, message_2], SUMMATION_ELF);
|
|
|
|
|
|
|
|
|
|
verify(receipt, SUMMATION_ID);
|
|
|
|
|
assert_eq!(
|
|
|
|
|
digest,
|
|
|
|
|
message + message_2
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
}
|