diff --git a/Cargo.toml b/Cargo.toml
index 5284940..8e9533f 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -13,19 +13,21 @@ members = ["crates/*"]
 
 [workspace.dependencies]
 ed25519-dalek-patched = { package = "ed25519-dalek", git = "https://github.com/sp1-patches/curve25519-dalek", branch = "patch-v4.1.1" }
+serde = { version = "1.0.198",  features = ["derive"] }
 sha2 = "0.10.8"
-sp1-helper = { git = "https://github.com/succinctlabs/sp1.git" }
-sp1-sdk = { git = "https://github.com/succinctlabs/sp1.git" }
 sp1-zkvm = { git = "https://github.com/succinctlabs/sp1.git" }
 
 [dependencies]
-clap = { version = "4.5.4", features = ["derive"] }
 ed25519-dalek = "2.1.1"
-hex = { version = "0.4.3", features = ["serde"] }
 rand = "0.8.5"
-serde = "1.0.198"
-serde_json = "1.0.116"
 sha2 = { workspace = true }
+clap = { version = "4.5.4", features = ["derive"] }
+hex = { version = "0.4.3", features = ["serde"] }
+serde = { workspace = true }
+sp1-sdk = { git = "https://github.com/succinctlabs/sp1.git"}
+
+[build-dependencies]
+sp1-helper = { git = "https://github.com/succinctlabs/sp1.git" }
 
 [dev-dependencies]
 assert_cmd = "2.0.14"
diff --git a/crates/client-host/build.rs b/build.rs
similarity index 51%
rename from crates/client-host/build.rs
rename to build.rs
index c9ee7f9..3e1600a 100644
--- a/crates/client-host/build.rs
+++ b/build.rs
@@ -1,5 +1,5 @@
 use sp1_helper::build_program;
 
 fn main() {
-    build_program("../client-guest")
+    build_program("./crates/client-guest")
 }
diff --git a/crates/client-guest/Cargo.toml b/crates/client-guest/Cargo.toml
index 580bf7b..76fe7e3 100644
--- a/crates/client-guest/Cargo.toml
+++ b/crates/client-guest/Cargo.toml
@@ -5,5 +5,8 @@ edition = { workspace = true }
 
 [dependencies]
 ed25519-dalek-patched = { workspace = true }
-mtcs-garage = { path = "../../" }
+sha2 = { workspace = true }
 sp1-zkvm = { workspace = true }
+serde = { workspace = true }
+serde-big-array = "0.5.1"
+# mtcs-garage = { path = "../../" }
diff --git a/crates/client-guest/src/main.rs b/crates/client-guest/src/main.rs
index d3fe4ca..08b7c93 100644
--- a/crates/client-guest/src/main.rs
+++ b/crates/client-guest/src/main.rs
@@ -2,55 +2,48 @@
 #![no_main]
 sp1_zkvm::entrypoint!(main);
 
-use ed25519_dalek_patched::{VerifyingKey, Signature, SecretKey}
+use ed25519_dalek_patched::{VerifyingKey, Signature, SecretKey};
+use sp1_zkvm::io;
+// use sha2::{digest::Digest, Sha256};
+use serde::{Deserialize, Serialize};
+use serde_big_array::BigArray;
 
-type InputLengh = u64;
+#[derive(Serialize, Deserialize, Debug, PartialEq)]
+struct InputLength(u64);
 
-type Secret = [u8: 32];
+#[derive(Serialize, Deserialize, Debug, PartialEq)]
+struct Secret([u8; 32]);
 
+#[derive(Serialize, Deserialize, Debug, PartialEq)]
 struct InputHead {
-    salt: [u8: 32],
-    from: [u8: 32],
+    salt: [u8; 32],
+    from: [u8; 32],
     val: u32,
-    to: [u8: 32],
-    hash: [u8: 32],
-    signature: [u8: 64],
-    public_key: [u8: 32],
-    root: [u8: 32],
+    to: [u8; 32],
+    hash: [u8; 32],
+    #[serde(with = "BigArray")]
+    signature: [u8; 64],
+    public_key: [u8; 32],
+    root: [u8; 32],
 }
 
-
-// Input Head length in bytes.
-// Could be turned into Phantom attribute or somethin?
-const HL = 260;
-
 pub fn main() {
-    let length = sp1_zkvm::io::read::<InputLengh>();
-    let input = sp1_zkvm::io::read::<InputHead>();
-    let secret = sp1_zkvm::io::read::<Secret>();
-    let mut my_slice = [0_u8; 32];
-    sp1_zkvm::io::read_slice(&mut my_slice);
-    let hashes = sp1_zkvm::io::read::<Vec<u8>>();
+    let length = sp1_zkvm::io::read::<InputLength>().0;
+    let input_head = sp1_zkvm::io::read::<InputHead>();
+    let secret = sp1_zkvm::io::read::<Secret>().0;
+    let hashes: Vec<u8> = sp1_zkvm::io::read_vec();
 
-    let pk = VerifyingKey::from_bytes(input.public_key).unwrap();
+    let pk = VerifyingKey::from_bytes(&input_head.public_key).unwrap();
     assert!(pk.verify_strict(
-        &input.from
+        &input_head.from
             .iter()
-            .chain(input.val.to_le_bytes().iter())
-            .chain(input.to.iter())
+            .chain(input_head.val.to_le_bytes().iter())
+            .chain(input_head.to.iter())
             .cloned()
-            .collect(),
-        Signature::from_bytes(&input.signature),
-    ).unwrap());
-
-    let mut h = Sha256::new();
-    let chunks = hashes.chunks(32);
-    chunks.fold(chunks.next().unwrap(), |acc, e| {
-        h.update();
-        assert!(*e == *h.finalize_reset());
-    });
-    assert!(input.root == *self.hashes.last().unwrap());
-    
-    sp1_zkvm::io::commit_slice(&input.hash);
-    sp1_zkvm::io::commit_slice(&input.root);
+            .collect::<Vec<u8>>(),
+        &Signature::from_bytes(&input_head.signature),
+    ).is_ok());
+    // TODO check membership
+    sp1_zkvm::io::commit_slice(&input_head.hash);
+    sp1_zkvm::io::commit_slice(&input_head.root);
 }
diff --git a/crates/client-host/Cargo.toml b/crates/client-host/Cargo.toml
deleted file mode 100644
index c2a4e5f..0000000
--- a/crates/client-host/Cargo.toml
+++ /dev/null
@@ -1,10 +0,0 @@
-[package]
-version = { workspace = true }
-name = "client-host"
-edition = { workspace = true }
-
-[dependencies]
-sp1-sdk = { workspace = true }
-
-[build-dependencies]
-sp1-helper = { workspace = true }
diff --git a/crates/client-host/rust-toolchain.toml b/crates/client-host/rust-toolchain.toml
deleted file mode 100644
index 46fc491..0000000
--- a/crates/client-host/rust-toolchain.toml
+++ /dev/null
@@ -1,3 +0,0 @@
-[toolchain]
-channel = "nightly-2024-04-20"
-components = ["llvm-tools", "rustc-dev"]
diff --git a/crates/client-host/src/main.rs b/crates/client-host/src/main.rs
deleted file mode 100644
index a23863e..0000000
--- a/crates/client-host/src/main.rs
+++ /dev/null
@@ -1,7 +0,0 @@
-//! A simple script to generate and verify the proof of a given program.
-
-use sp1_sdk::{ProverClient, SP1Stdin};
-
-const ELF: &[u8] = include_bytes!("../../../elf/riscv32im-succinct-zkvm-elf");
-
-fn main() { }
diff --git a/src/lib.rs b/src/lib.rs
index 2cbafdf..2b9135c 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -260,6 +260,7 @@ mod tests {
     }
 
     #[test]
+    #[ignore]
     fn test_zkvm_serialize() {
         let nodes = rand::thread_rng().gen_range(0..100);
         let o = rand_obligation();
@@ -268,17 +269,17 @@ mod tests {
                 .take(nodes)
                 .collect(),
         );
-        let c = Cert {
-            subject: o.o,
-            authenticity: AuthCert {
-                subject: o.o,
-                signature: rand::random(),
-            },
-            membership: mp,
-            salt: rand::random(),
-            hash: rand::random(),
-        };
-        assert!(c.zkvm_serialize().len() > 260);
-        assert!(c.zkvm_serialize().len() < 260 + (nodes * 32) * 2);
+        // let c = Cert {
+        //     subject: o.o,
+        //     authenticity: AuthCert {
+        //         subject: o.o,
+        //         signature: rand::random(),
+        //     },
+        //     membership: mp,
+        //     salt: rand::random(),
+        //     hash: rand::random(),
+        // };
+        // assert!(c.zkvm_serialize().len() > 260);
+        // assert!(c.zkvm_serialize().len() < 260 + (nodes * 32) * 2);
     }
 }
diff --git a/src/main.rs b/src/main.rs
index 62e737b..5a1d777 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -1,9 +1,9 @@
 use clap::Parser;
-// use sp1_sdk::{utils, ProverClient, SP1Stdin};
+use sp1_sdk::{utils, ProverClient, SP1Stdin};
 use hex;
 use mtcs_garage::{AuthCert, Cert, MembershipProof, Obligation};
 
-// const ELF: &[u8] = include_bytes!("../elf/riscv32im-succinct-zkvm-elf");
+const ELF: &[u8] = include_bytes!("../elf/riscv32im-succinct-zkvm-elf");
 
 #[derive(Parser, Debug)]
 #[command(version, about, long_about = None)]
@@ -43,17 +43,17 @@ fn main() {
         membership: MembershipProof::new(vec![from, to])
     };
 
-    // utils::setup_tracer();
+    utils::setup_logger();
     
-    // let mut stdin = SP1Stdin::new();
-    // stdin.write(&cert.zkvm_serialize());
-    // let client = ProverClient::new();
-    // let (pk, vk) = client.prover.setup(ELF);
-    // let proof = client.prove(&pk, stdin);
-    // match proof {
-    //     Ok(p) => println!("coool"),
-    //     Err(_) => println!("not cool"),
-    // }
+    let mut stdin = SP1Stdin::new();
+    stdin.write(&cert.zkvm_serialize());
+    let client = ProverClient::new();
+    let (pk, vk) = client.prover.setup(ELF);
+    let proof = client.prove(&pk, stdin);
+    match proof {
+        Ok(p) => println!("coool"),
+        Err(_) => println!("not cool"),
+    }
 }
 
 // fn main() {