//! 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::().0; let input_head = sp1_zkvm::io::read::(); let secret = sp1_zkvm::io::read::().0; let hashes: Vec = 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::>(), &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); }