zkVK methods return public values (#106)

This commit is contained in:
Han
2025-08-27 14:27:56 +08:00
committed by GitHub
parent 63107268a1
commit 44044a1858
28 changed files with 655 additions and 337 deletions

View File

@@ -6,5 +6,6 @@ edition = "2021"
[workspace]
[dependencies]
bincode = "1.3.3"
openvm = { git = "https://github.com/openvm-org/openvm.git", features = ["std"], tag = "v1.2.0" }
test-utils = { path = "../../../crates/test-utils" }

View File

@@ -1,16 +1,30 @@
use core::array::from_fn;
use openvm::io::{read, read_vec, reveal_u32};
use test_utils::guest::BasicStruct;
use test_utils::guest::{BasicStruct, BASIC_PROGRAM_BYTES_LENGTH};
fn main() {
// Read `Hello world` bytes.
// Read `bytes`.
let bytes = read_vec();
assert_eq!(String::from_utf8_lossy(&bytes), "Hello world");
// Read `BasicStruct`.
// Read `basic_struct`.
let basic_struct = read::<BasicStruct>();
let output = basic_struct.output();
output.chunks(4).enumerate().for_each(|(idx, bytes)| {
reveal_u32(u32::from_le_bytes(bytes.try_into().unwrap()), idx);
});
// Check `bytes` length is as expected.
assert_eq!(bytes.len(), BASIC_PROGRAM_BYTES_LENGTH);
// Do some computation on `basic_struct`.
let basic_struct_output = basic_struct.output();
// Write reversed `bytes` and `basic_struct_output`
let public_values = core::iter::empty()
.chain(bytes.into_iter().rev())
.chain(bincode::serialize(&basic_struct_output).unwrap())
.collect::<Vec<_>>();
public_values
.chunks(4)
.enumerate()
.for_each(|(idx, bytes)| {
let bytes = from_fn(|i| bytes.get(i).copied().unwrap_or_default());
reveal_u32(u32::from_le_bytes(bytes), idx);
});
}

View File

@@ -1,19 +1,24 @@
#![no_main]
use pico_sdk::io::{commit, read_as, read_vec};
use test_utils::guest::BasicStruct;
use pico_sdk::io::{commit, commit_bytes, read_as, read_vec};
use test_utils::guest::{BasicStruct, BASIC_PROGRAM_BYTES_LENGTH};
pico_sdk::entrypoint!(main);
pub fn main() {
// Read `Hello world` bytes.
// Read `bytes`.
let bytes = read_vec();
assert_eq!(String::from_utf8_lossy(&bytes), "Hello world");
// Read `BasicStruct`.
// Read `basic_struct`.
let basic_struct = read_as::<BasicStruct>();
let output = basic_struct.output();
// Write `output`
commit(&output);
// Check `bytes` length is as expected.
assert_eq!(bytes.len(), BASIC_PROGRAM_BYTES_LENGTH);
// Do some computation on `basic_struct`.
let basic_struct_output = basic_struct.output();
// Write reversed `bytes` and `basic_struct_output`
commit_bytes(&bytes.into_iter().rev().collect::<Vec<_>>());
commit(&basic_struct_output);
}

View File

@@ -7,4 +7,5 @@ edition = "2021"
[dependencies]
risc0-zkvm = { version = "3.0.1", default-features = false, features = ["std", "unstable"] }
risc0-zkvm-platform = { version = "=2.0.4" }
test-utils = { path = "../../../crates/test-utils" }

View File

@@ -1,15 +1,20 @@
use risc0_zkvm::guest::env;
use test_utils::guest::BasicStruct;
use test_utils::guest::{BasicStruct, BASIC_PROGRAM_BYTES_LENGTH};
fn main() {
// Read `Hello world` bytes.
// Read `bytes`.
let bytes = env::read_frame();
assert_eq!(String::from_utf8_lossy(&bytes), "Hello world");
// Read `BasicStruct`.
// Read `basic_struct`.
let basic_struct = env::read::<BasicStruct>();
let output = basic_struct.output();
// Write `output`
env::commit(&output);
// Check `bytes` length is as expected.
assert_eq!(bytes.len(), BASIC_PROGRAM_BYTES_LENGTH);
// Do some computation on `basic_struct`.
let basic_struct_output = basic_struct.output();
// Write reversed `bytes` and `basic_struct_output`
env::commit_slice(&bytes.into_iter().rev().collect::<Vec<_>>());
env::commit(&basic_struct_output);
}

View File

@@ -1,18 +1,23 @@
#![no_main]
use test_utils::guest::BasicStruct;
use test_utils::guest::{BasicStruct, BASIC_PROGRAM_BYTES_LENGTH};
sp1_zkvm::entrypoint!(main);
pub fn main() {
// Read `Hello world` bytes.
// Read `bytes`.
let bytes = sp1_zkvm::io::read_vec();
assert_eq!(String::from_utf8_lossy(&bytes), "Hello world");
// Read `BasicStruct`.
// Read `basic_struct`.
let basic_struct = sp1_zkvm::io::read::<BasicStruct>();
let output = basic_struct.output();
// Write `output`
sp1_zkvm::io::commit(&output);
// Check `bytes` length is as expected.
assert_eq!(bytes.len(), BASIC_PROGRAM_BYTES_LENGTH);
// Do some computation on `basic_struct`.
let basic_struct_output = basic_struct.output();
// Write reversed `bytes` and `basic_struct_output`
sp1_zkvm::io::commit_slice(&bytes.into_iter().rev().collect::<Vec<_>>());
sp1_zkvm::io::commit(&basic_struct_output);
}

View File

@@ -1,6 +1,7 @@
#![no_main]
use test_utils::guest::BasicStruct;
use core::array::from_fn;
use test_utils::guest::{BasicStruct, BASIC_PROGRAM_BYTES_LENGTH};
ziskos::entrypoint!(main);
@@ -8,15 +9,31 @@ fn main() {
let input = ziskos::read_input();
let mut input = input.as_slice();
// Read `Hello world` bytes.
// Read `bytes`.
let bytes: Vec<u8> = bincode::deserialize_from(&mut input).unwrap();
assert_eq!(String::from_utf8_lossy(&bytes), "Hello world");
// Read `BasicStruct`.
// Read `basic_struct`.
let basic_struct: BasicStruct = bincode::deserialize_from(&mut input).unwrap();
let output = basic_struct.output();
output.chunks(4).enumerate().for_each(|(idx, bytes)| {
ziskos::set_output(idx, u32::from_le_bytes(bytes.try_into().unwrap()));
});
// Check input is fully read.
assert!(input.is_empty());
// Check `bytes` length is as expected.
assert_eq!(bytes.len(), BASIC_PROGRAM_BYTES_LENGTH);
// Do some computation on `basic_struct`.
let basic_struct_output = basic_struct.output();
// Write reversed `bytes` and `basic_struct_output`
let public_values = core::iter::empty()
.chain(bytes.into_iter().rev())
.chain(bincode::serialize(&basic_struct_output).unwrap())
.collect::<Vec<_>>();
public_values
.chunks(4)
.enumerate()
.for_each(|(idx, bytes)| {
let bytes = from_fn(|i| bytes.get(i).copied().unwrap_or_default());
ziskos::set_output(idx, u32::from_le_bytes(bytes));
});
}