diff options
Diffstat (limited to 'guests/zk_dungeon')
| -rw-r--r-- | guests/zk_dungeon/.no_zkwasm | 1 | ||||
| -rw-r--r-- | guests/zk_dungeon/Cargo.lock | 14 | ||||
| -rw-r--r-- | guests/zk_dungeon/Cargo.toml | 16 | ||||
| -rw-r--r-- | guests/zk_dungeon/default.env | 2 | ||||
| -rw-r--r-- | guests/zk_dungeon/default_private_input.toml | 10 | ||||
| -rw-r--r-- | guests/zk_dungeon/default_public_input.toml | 12 | ||||
| -rw-r--r-- | guests/zk_dungeon/src/dungeon.rs | 65 | ||||
| -rw-r--r-- | guests/zk_dungeon/src/lib.rs | 10 |
8 files changed, 130 insertions, 0 deletions
diff --git a/guests/zk_dungeon/.no_zkwasm b/guests/zk_dungeon/.no_zkwasm new file mode 100644 index 0000000..1cf6d2a --- /dev/null +++ b/guests/zk_dungeon/.no_zkwasm @@ -0,0 +1 @@ +zkWasm only supports an integer output type diff --git a/guests/zk_dungeon/Cargo.lock b/guests/zk_dungeon/Cargo.lock new file mode 100644 index 0000000..e312d61 --- /dev/null +++ b/guests/zk_dungeon/Cargo.lock @@ -0,0 +1,14 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "fibonacci" +version = "0.1.0" +dependencies = [ + "guests_macro", +] + +[[package]] +name = "guests_macro" +version = "0.1.0" diff --git a/guests/zk_dungeon/Cargo.toml b/guests/zk_dungeon/Cargo.toml new file mode 100644 index 0000000..6ada0c6 --- /dev/null +++ b/guests/zk_dungeon/Cargo.toml @@ -0,0 +1,16 @@ +[package] +name = "fibonacci" +version = "0.1.0" +edition = "2021" + +[dependencies] +guests_macro = { version = "0.1.0", path = "../../guests_macro" } + +[features] +no_std = [] +jolt = [] +nexus = [] +risc0 = [] +sp1 = [] +zkm = [] +zkwasm = [] diff --git a/guests/zk_dungeon/default.env b/guests/zk_dungeon/default.env new file mode 100644 index 0000000..c35181d --- /dev/null +++ b/guests/zk_dungeon/default.env @@ -0,0 +1,2 @@ +## ZKM ## +SEG_SIZE=3053 diff --git a/guests/zk_dungeon/default_private_input.toml b/guests/zk_dungeon/default_private_input.toml new file mode 100644 index 0000000..4892ef3 --- /dev/null +++ b/guests/zk_dungeon/default_private_input.toml @@ -0,0 +1,10 @@ +path = [ + [0, 0], + [1, 2], + [0, 0], + [1, 2], + [0, 0], + [1, 2], + [3, 3], + [5, 4], +] diff --git a/guests/zk_dungeon/default_public_input.toml b/guests/zk_dungeon/default_public_input.toml new file mode 100644 index 0000000..0c44073 --- /dev/null +++ b/guests/zk_dungeon/default_public_input.toml @@ -0,0 +1,12 @@ +watcher_map = [ + [false, false, false, false, false, false, false, false], + [false, false, false, false, false, false, false, false], + [false, false, false, false, false, false, false, false], + [false, false, false, false, false, false, false, false], + [false, false, false, false, false, false, false, false], + [false, false, false, true, false, false, false, false], + [false, false, false, false, false, false, false, false], + [false, true, false, false, true, true, false, false] +] + +dagger = [5, 4] diff --git a/guests/zk_dungeon/src/dungeon.rs b/guests/zk_dungeon/src/dungeon.rs new file mode 100644 index 0000000..f0659a2 --- /dev/null +++ b/guests/zk_dungeon/src/dungeon.rs @@ -0,0 +1,65 @@ +#[derive(Copy, Clone)] +pub struct Square { + x: u8, + y: u8, +} + +impl From<(u8, u8)> for Square { + fn from(val: (u8, u8)) -> Self { + Square { x: val.0, y: val.1 } + } +} + +impl Square { + pub fn from_array<const N: usize>(val: [(u8, u8); N]) -> [Square; N] { + val.map(|x| x.into()) + } +} + +fn is_valid_step(prev: Square, curr: Square) -> bool { + ((prev.x + 2 == curr.x) & (prev.y + 1 == curr.y)) + | ((prev.x - 2 == curr.x) & (prev.y + 1 == curr.y)) + | ((prev.x + 2 == curr.x) & (prev.y - 1 == curr.y)) + | ((prev.x - 2 == curr.x) & (prev.y - 1 == curr.y)) + | ((prev.x + 1 == curr.x) & (prev.y + 2 == curr.y)) + | ((prev.x - 1 == curr.x) & (prev.y + 2 == curr.y)) + | ((prev.x + 1 == curr.x) & (prev.y - 2 == curr.y)) + | ((prev.x - 1 == curr.x) & (prev.y - 2 == curr.y)) +} + +fn is_within_bounds(square: Square) -> bool { + (square.x >= 0) & (square.x < 8) & (square.y >= 0) & (square.y < 8) +} + +pub fn is_valid_path(path: [Square; 8], dagger: Square) { + assert!(path[0].x == 0); + assert!(path[0].y == 0); + assert!(path[7].x == dagger.x); + assert!(path[7].y == dagger.y); + for i in 1..8 { + assert!(is_within_bounds(path[i])); + assert!(is_valid_step(path[i - 1], path[i])); + } +} + +fn is_safe_step(square: Square, watcher_map: [[bool; 8]; 8]) -> bool { + let mut result = true; + for x in 0..8 { + for y in 0..8 { + if watcher_map[x][y] { + let fx = x as u8; + let fy = y as u8; + if (square.x - fx == square.y - fy) | (square.x - fx == fy - square.y) { + result = false; + } + } + } + } + result +} + +pub fn is_safe_path(path: [Square; 8], watcher_map: [[bool; 8]; 8]) { + for i in 0..8 { + assert!(is_safe_step(path[i], watcher_map)); + } +} diff --git a/guests/zk_dungeon/src/lib.rs b/guests/zk_dungeon/src/lib.rs new file mode 100644 index 0000000..b79167a --- /dev/null +++ b/guests/zk_dungeon/src/lib.rs @@ -0,0 +1,10 @@ +#![cfg_attr(feature = "no_std", no_std)] + +mod dungeon; + +#[guests_macro::proving_entrypoint] +pub fn main(watcher_map: [[bool; 8]; 8], dagger: (u8, u8), path: [(u8, u8); 8]) { + let path = dungeon::Square::from_array(path); + dungeon::is_valid_path(path, dagger.into()); + dungeon::is_safe_path(path, watcher_map); +} |
