mtcs-garage/crates/client-guest/src/main.rs

50 lines
1.4 KiB
Rust
Raw Normal View History

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