50 lines
1.4 KiB
Rust
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);
|
|
}
|