use soroban_sdk::{BytesN, Env};
use super::error::ZKError;
use super::groth16::verify_groth16;
use super::types::{Groth16Proof, Scalar, VerificationKey};
pub trait GameCircuit {
fn verification_key(&self) -> &VerificationKey;
fn verify_with_inputs(
&self,
env: &Env,
proof: &Groth16Proof,
public_inputs: &[Scalar],
) -> Result<bool, ZKError> {
verify_groth16(env, self.verification_key(), proof, public_inputs)
}
}
pub fn u32_to_scalar(env: &Env, val: u32) -> Scalar {
let mut bytes = [0u8; 32];
bytes[..4].copy_from_slice(&val.to_le_bytes());
Scalar {
bytes: BytesN::from_array(env, &bytes),
}
}
pub fn i32_to_scalar(env: &Env, val: i32) -> Scalar {
let mut bytes = [0u8; 32];
bytes[..4].copy_from_slice(&val.to_le_bytes());
Scalar {
bytes: BytesN::from_array(env, &bytes),
}
}
pub fn u64_to_scalar(env: &Env, val: u64) -> Scalar {
let mut bytes = [0u8; 32];
bytes[..8].copy_from_slice(&val.to_le_bytes());
Scalar {
bytes: BytesN::from_array(env, &bytes),
}
}
pub fn bytes32_to_scalar(val: &BytesN<32>) -> Scalar {
Scalar { bytes: val.clone() }
}
#[cfg(test)]
mod tests {
use super::*;
use soroban_sdk::Env;
#[test]
fn test_u32_to_scalar() {
let env = Env::default();
let s = u32_to_scalar(&env, 42);
assert_eq!(s.bytes.len(), 32);
let arr = s.bytes.to_array();
assert_eq!(arr[0], 42);
assert_eq!(arr[1], 0);
}
#[test]
fn test_i32_to_scalar_positive() {
let env = Env::default();
let s = i32_to_scalar(&env, 100);
assert_eq!(s.bytes.len(), 32);
let arr = s.bytes.to_array();
assert_eq!(arr[0], 100);
}
#[test]
fn test_i32_to_scalar_negative() {
let env = Env::default();
let s = i32_to_scalar(&env, -1);
let arr = s.bytes.to_array();
assert_eq!(arr[0], 0xFF);
assert_eq!(arr[1], 0xFF);
assert_eq!(arr[2], 0xFF);
assert_eq!(arr[3], 0xFF);
}
#[test]
fn test_bytes32_to_scalar() {
let env = Env::default();
let b = BytesN::from_array(&env, &[7u8; 32]);
let s = bytes32_to_scalar(&b);
assert_eq!(s.bytes, b);
}
#[test]
fn test_u64_to_scalar() {
let env = Env::default();
let s = u64_to_scalar(&env, 0x0102_0304_0506_0708);
let arr = s.bytes.to_array();
assert_eq!(arr[..8], [0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01]);
}
}