aboutsummaryrefslogtreecommitdiff
path: root/guests
diff options
context:
space:
mode:
Diffstat (limited to 'guests')
-rw-r--r--guests/zk_dungeon/.no_zkwasm1
-rw-r--r--guests/zk_dungeon/Cargo.lock14
-rw-r--r--guests/zk_dungeon/Cargo.toml16
-rw-r--r--guests/zk_dungeon/default.env2
-rw-r--r--guests/zk_dungeon/default_private_input.toml10
-rw-r--r--guests/zk_dungeon/default_public_input.toml12
-rw-r--r--guests/zk_dungeon/src/dungeon.rs65
-rw-r--r--guests/zk_dungeon/src/lib.rs10
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);
+}