mtcs-garage/crates/client-guest/src/main.rs
2024-08-13 15:30:27 +02:00

50 lines
1.4 KiB
Rust

//! Client side zkvm program.
#![no_main]
sp1_zkvm::entrypoint!(main);
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;
#[derive(Serialize, Deserialize, Debug, PartialEq)]
struct InputLength(u64);
#[derive(Serialize, Deserialize, Debug, PartialEq)]
struct Secret([u8; 32]);
#[derive(Serialize, Deserialize, Debug, PartialEq)]
struct InputHead {
salt: [u8; 32],
from: [u8; 32],
val: u32,
to: [u8; 32],
hash: [u8; 32],
#[serde(with = "BigArray")]
signature: [u8; 64],
public_key: [u8; 32],
root: [u8; 32],
}
pub fn main() {
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_head.public_key).unwrap();
assert!(pk.verify_strict(
&input_head.from
.iter()
.chain(input_head.val.to_le_bytes().iter())
.chain(input_head.to.iter())
.cloned()
.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);
}