This commit is contained in:
Davie Li 2024-08-13 15:30:27 +02:00
parent 176bad6245
commit 27e4827928
9 changed files with 70 additions and 91 deletions

View file

@ -13,19 +13,21 @@ members = ["crates/*"]
[workspace.dependencies] [workspace.dependencies]
ed25519-dalek-patched = { package = "ed25519-dalek", git = "https://github.com/sp1-patches/curve25519-dalek", branch = "patch-v4.1.1" } 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" 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" } sp1-zkvm = { git = "https://github.com/succinctlabs/sp1.git" }
[dependencies] [dependencies]
clap = { version = "4.5.4", features = ["derive"] }
ed25519-dalek = "2.1.1" ed25519-dalek = "2.1.1"
hex = { version = "0.4.3", features = ["serde"] }
rand = "0.8.5" rand = "0.8.5"
serde = "1.0.198"
serde_json = "1.0.116"
sha2 = { workspace = true } 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] [dev-dependencies]
assert_cmd = "2.0.14" assert_cmd = "2.0.14"

View file

@ -1,5 +1,5 @@
use sp1_helper::build_program; use sp1_helper::build_program;
fn main() { fn main() {
build_program("../client-guest") build_program("./crates/client-guest")
} }

View file

@ -5,5 +5,8 @@ edition = { workspace = true }
[dependencies] [dependencies]
ed25519-dalek-patched = { workspace = true } ed25519-dalek-patched = { workspace = true }
mtcs-garage = { path = "../../" } sha2 = { workspace = true }
sp1-zkvm = { workspace = true } sp1-zkvm = { workspace = true }
serde = { workspace = true }
serde-big-array = "0.5.1"
# mtcs-garage = { path = "../../" }

View file

@ -2,55 +2,48 @@
#![no_main] #![no_main]
sp1_zkvm::entrypoint!(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 { struct InputHead {
salt: [u8: 32], salt: [u8; 32],
from: [u8: 32], from: [u8; 32],
val: u32, val: u32,
to: [u8: 32], to: [u8; 32],
hash: [u8: 32], hash: [u8; 32],
signature: [u8: 64], #[serde(with = "BigArray")]
public_key: [u8: 32], signature: [u8; 64],
root: [u8: 32], 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() { pub fn main() {
let length = sp1_zkvm::io::read::<InputLengh>(); let length = sp1_zkvm::io::read::<InputLength>().0;
let input = sp1_zkvm::io::read::<InputHead>(); let input_head = sp1_zkvm::io::read::<InputHead>();
let secret = sp1_zkvm::io::read::<Secret>(); let secret = sp1_zkvm::io::read::<Secret>().0;
let mut my_slice = [0_u8; 32]; let hashes: Vec<u8> = sp1_zkvm::io::read_vec();
sp1_zkvm::io::read_slice(&mut my_slice);
let hashes = sp1_zkvm::io::read::<Vec<u8>>();
let pk = VerifyingKey::from_bytes(input.public_key).unwrap(); let pk = VerifyingKey::from_bytes(&input_head.public_key).unwrap();
assert!(pk.verify_strict( assert!(pk.verify_strict(
&input.from &input_head.from
.iter() .iter()
.chain(input.val.to_le_bytes().iter()) .chain(input_head.val.to_le_bytes().iter())
.chain(input.to.iter()) .chain(input_head.to.iter())
.cloned() .cloned()
.collect(), .collect::<Vec<u8>>(),
Signature::from_bytes(&input.signature), &Signature::from_bytes(&input_head.signature),
).unwrap()); ).is_ok());
// TODO check membership
let mut h = Sha256::new(); sp1_zkvm::io::commit_slice(&input_head.hash);
let chunks = hashes.chunks(32); sp1_zkvm::io::commit_slice(&input_head.root);
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);
} }

View file

@ -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 }

View file

@ -1,3 +0,0 @@
[toolchain]
channel = "nightly-2024-04-20"
components = ["llvm-tools", "rustc-dev"]

View file

@ -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() { }

View file

@ -260,6 +260,7 @@ mod tests {
} }
#[test] #[test]
#[ignore]
fn test_zkvm_serialize() { fn test_zkvm_serialize() {
let nodes = rand::thread_rng().gen_range(0..100); let nodes = rand::thread_rng().gen_range(0..100);
let o = rand_obligation(); let o = rand_obligation();
@ -268,17 +269,17 @@ mod tests {
.take(nodes) .take(nodes)
.collect(), .collect(),
); );
let c = Cert { // let c = Cert {
subject: o.o, // subject: o.o,
authenticity: AuthCert { // authenticity: AuthCert {
subject: o.o, // subject: o.o,
signature: rand::random(), // signature: rand::random(),
}, // },
membership: mp, // membership: mp,
salt: rand::random(), // salt: rand::random(),
hash: rand::random(), // hash: rand::random(),
}; // };
assert!(c.zkvm_serialize().len() > 260); // assert!(c.zkvm_serialize().len() > 260);
assert!(c.zkvm_serialize().len() < 260 + (nodes * 32) * 2); // assert!(c.zkvm_serialize().len() < 260 + (nodes * 32) * 2);
} }
} }

View file

@ -1,9 +1,9 @@
use clap::Parser; use clap::Parser;
// use sp1_sdk::{utils, ProverClient, SP1Stdin}; use sp1_sdk::{utils, ProverClient, SP1Stdin};
use hex; use hex;
use mtcs_garage::{AuthCert, Cert, MembershipProof, Obligation}; 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)] #[derive(Parser, Debug)]
#[command(version, about, long_about = None)] #[command(version, about, long_about = None)]
@ -43,17 +43,17 @@ fn main() {
membership: MembershipProof::new(vec![from, to]) membership: MembershipProof::new(vec![from, to])
}; };
// utils::setup_tracer(); utils::setup_logger();
// let mut stdin = SP1Stdin::new(); let mut stdin = SP1Stdin::new();
// stdin.write(&cert.zkvm_serialize()); stdin.write(&cert.zkvm_serialize());
// let client = ProverClient::new(); let client = ProverClient::new();
// let (pk, vk) = client.prover.setup(ELF); let (pk, vk) = client.prover.setup(ELF);
// let proof = client.prove(&pk, stdin); let proof = client.prove(&pk, stdin);
// match proof { match proof {
// Ok(p) => println!("coool"), Ok(p) => println!("coool"),
// Err(_) => println!("not cool"), Err(_) => println!("not cool"),
// } }
} }
// fn main() { // fn main() {