diff options
| author | Kamen Mladenov <kamen@syndamia.com> | 2025-02-04 13:24:36 +0200 |
|---|---|---|
| committer | Kamen Mladenov <kamen@syndamia.com> | 2025-02-04 13:24:36 +0200 |
| commit | 7a98d5ec0849f0d13235a8f09dadf736c9409aa2 (patch) | |
| tree | 3a4e6fc1a868a025d58a982be93e09b69b37fb24 | |
| parent | b8c709b87ad8b9fd1a74de4b73f9bbd1bf51e364 (diff) | |
| download | zkVMs-benchmarks-7a98d5ec0849f0d13235a8f09dadf736c9409aa2.tar zkVMs-benchmarks-7a98d5ec0849f0d13235a8f09dadf736c9409aa2.tar.gz zkVMs-benchmarks-7a98d5ec0849f0d13235a8f09dadf736c9409aa2.zip | |
feat(zkvms/zkwasm): Proper Vec input type handling
Also handles multidimentional vec
| -rw-r--r-- | zkvms/zkwasm/guest/src/lib.rs | 14 | ||||
| -rw-r--r-- | zkvms/zkwasm/wrapper_macro/src/lib.rs | 28 |
2 files changed, 25 insertions, 17 deletions
diff --git a/zkvms/zkwasm/guest/src/lib.rs b/zkvms/zkwasm/guest/src/lib.rs index eba34b0..c92b97c 100644 --- a/zkvms/zkwasm/guest/src/lib.rs +++ b/zkvms/zkwasm/guest/src/lib.rs @@ -22,22 +22,12 @@ fn write(value: u64) { static VERTICES: u64 = 10; macro_rules! read { - // HACK for graph_coloring - (Vec , u32 $readfn:tt) => { - { - let mut ret = Vec::new(); - for _ in 0..2 { - ret.push(read!(u32 $readfn)); - } - ret - } - }; // Vec<Vec<...<Vec<primitive>>>> is converted by entrypoint_expr! to // Vec,Vec,...,Vec,primitive - (Vec , $($type:tt)*) => { + (Vec $size:literal , $($type:tt)*) => { { let mut ret = Vec::new(); - for _ in 0..VERTICES { + for _ in 0..$size { ret.push(read!($($type)*)); } ret diff --git a/zkvms/zkwasm/wrapper_macro/src/lib.rs b/zkvms/zkwasm/wrapper_macro/src/lib.rs index 8fe7fd0..caebc4d 100644 --- a/zkvms/zkwasm/wrapper_macro/src/lib.rs +++ b/zkvms/zkwasm/wrapper_macro/src/lib.rs @@ -3,9 +3,11 @@ use proc_macro::TokenStream; #[path = "../../../../guests_macro/src/parse_fn.rs"] mod parse_fn; use crate::parse_fn::{ split_fn, args_divide_grouped, args_divide_public, group_streams }; +use toml::Table; -fn insert_reads(out: &mut TokenStream, patterns: &Vec<TokenStream>, types: &Vec<TokenStream>, readfn: &str) { +fn insert_reads(out: &mut TokenStream, patterns: &Vec<TokenStream>, types: &Vec<TokenStream>, inputs: &Table, readfn: &str) { for i in 0..patterns.len() { + let mut value = &inputs[&patterns[i].to_string()]; let type_note: String = format!("{}", types[i]) .chars() .map(|c| match c { @@ -13,7 +15,19 @@ fn insert_reads(out: &mut TokenStream, patterns: &Vec<TokenStream>, types: &Vec< '>' => ' ', _ => c, }) - .collect(); + .collect::<String>() + .split(" , ") + .map(|typ| match typ { + "Vec" => if let Some(array) = value.as_array() { + value = &array[0]; + format!("{} {}", typ, array.len()) + } else { + typ.to_string() + }, + _ => typ.to_string() + }) + .collect::<Vec<String>>() + .join(","); out.extend(format!("let {} : {} = read!({} {});", patterns[i], types[i], type_note, readfn).parse::<TokenStream>()); } } @@ -22,16 +36,20 @@ fn insert_reads(out: &mut TokenStream, patterns: &Vec<TokenStream>, types: &Vec< pub fn make_wrapper(item: TokenStream) -> TokenStream { let (name, args, ret) = split_fn(&item); - let public_inputs = toml::from_str::<toml::Table>( + let public_inputs = toml::from_str::<Table>( include_str!(concat!(env!("INPUTS_DIR"), "/default_public_input.toml")) ) .unwrap(); + let private_inputs = toml::from_str::<Table>( + include_str!(concat!(env!("INPUTS_DIR"), "/default_private_input.toml")) + ) + .unwrap(); let ((pub_pat, pub_typ), (prv_pat, prv_typ)) = args_divide_public(&args, &public_inputs.keys().collect()); let mut out = TokenStream::new(); - insert_reads(&mut out, &pub_pat, &pub_typ, "read_public"); - insert_reads(&mut out, &prv_pat, &prv_typ, "read_private"); + insert_reads(&mut out, &pub_pat, &pub_typ, &public_inputs, "read_public"); + insert_reads(&mut out, &prv_pat, &prv_typ, &private_inputs, "read_private"); let (ts_patterns, _) = args_divide_grouped(&args); |
