|
@@ -147,6 +147,8 @@ fn eval_ast(ast: &MalVal, env: &Env) -> MalRet {
|
|
|
fn eval(mut ast: MalVal, mut env: Env) -> MalRet {
|
|
fn eval(mut ast: MalVal, mut env: Env) -> MalRet {
|
|
|
let ret: MalRet;
|
|
let ret: MalRet;
|
|
|
|
|
|
|
|
|
|
+ let start = Instant::now();
|
|
|
|
|
+
|
|
|
'tco: loop {
|
|
'tco: loop {
|
|
|
ret = match ast.clone() {
|
|
ret = match ast.clone() {
|
|
|
List(l, _) => {
|
|
List(l, _) => {
|
|
@@ -573,6 +575,8 @@ fn eval(mut ast: MalVal, mut env: Env) -> MalRet {
|
|
|
break;
|
|
break;
|
|
|
} // end 'tco loop
|
|
} // end 'tco loop
|
|
|
|
|
|
|
|
|
|
+ println!("eval end \t {:?} \t {:?}", ast, start.elapsed());
|
|
|
|
|
+
|
|
|
ret
|
|
ret
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -648,7 +652,7 @@ pub fn setup(_ast: MalVal, env: Env) -> Result<VerifyKeyParams, MalErr> {
|
|
|
})
|
|
})
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-pub fn prove(_ast: MalVal, env: Env) -> MalRet {
|
|
|
|
|
|
|
+pub fn prove(_ast: MalVal, env: Env) -> MalRet {
|
|
|
let start = Instant::now();
|
|
let start = Instant::now();
|
|
|
let allocs_input = get_allocations(&env, "AllocationsInput");
|
|
let allocs_input = get_allocations(&env, "AllocationsInput");
|
|
|
let allocs = get_allocations(&env, "Allocations");
|
|
let allocs = get_allocations(&env, "Allocations");
|
|
@@ -664,6 +668,7 @@ pub fn prove(_ast: MalVal, env: Env) -> MalRet {
|
|
|
};
|
|
};
|
|
|
groth16::generate_random_parameters::<Bls12, _, _>(circuit, &mut OsRng)?
|
|
groth16::generate_random_parameters::<Bls12, _, _>(circuit, &mut OsRng)?
|
|
|
});
|
|
});
|
|
|
|
|
+
|
|
|
let verifying_key = Some(groth16::prepare_verifying_key(¶ms.as_ref().unwrap().vk));
|
|
let verifying_key = Some(groth16::prepare_verifying_key(¶ms.as_ref().unwrap().vk));
|
|
|
// prove
|
|
// prove
|
|
|
let circuit = LispCircuit {
|
|
let circuit = LispCircuit {
|
|
@@ -672,7 +677,6 @@ pub fn prove(_ast: MalVal, env: Env) -> MalRet {
|
|
|
alloc_inputs: allocs_input.borrow().clone(),
|
|
alloc_inputs: allocs_input.borrow().clone(),
|
|
|
constraints: enforce_allocs.clone(),
|
|
constraints: enforce_allocs.clone(),
|
|
|
};
|
|
};
|
|
|
-
|
|
|
|
|
let proof = groth16::create_random_proof(circuit, params.as_ref().unwrap(), &mut OsRng)?;
|
|
let proof = groth16::create_random_proof(circuit, params.as_ref().unwrap(), &mut OsRng)?;
|
|
|
let mut vec_input = vec![];
|
|
let mut vec_input = vec![];
|
|
|
for (k, val) in allocs_input.borrow_mut().iter() {
|
|
for (k, val) in allocs_input.borrow_mut().iter() {
|
|
@@ -686,10 +690,13 @@ pub fn prove(_ast: MalVal, env: Env) -> MalRet {
|
|
|
_ => {}
|
|
_ => {}
|
|
|
};
|
|
};
|
|
|
}
|
|
}
|
|
|
|
|
+ println!("groth16::create_random_proof: {:?}", start.elapsed());
|
|
|
|
|
+ // verification process
|
|
|
|
|
+ let start = Instant::now();
|
|
|
let result = groth16::verify_proof(verifying_key.as_ref().unwrap(), &proof, &vec_input);
|
|
let result = groth16::verify_proof(verifying_key.as_ref().unwrap(), &proof, &vec_input);
|
|
|
|
|
+ println!("groth16::verify_proof: {:?}", start.elapsed());
|
|
|
println!("vec public {:?}", vec_input);
|
|
println!("vec public {:?}", vec_input);
|
|
|
- println!("result {:?}", result);
|
|
|
|
|
- println!("Elapsed time: {:?}", start.elapsed());
|
|
|
|
|
|
|
+ println!("result {:?}", result);
|
|
|
Ok(MalVal::Nil)
|
|
Ok(MalVal::Nil)
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -746,6 +753,7 @@ fn main() -> Result<(), ()> {
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
fn repl_load(file: String) -> Result<(), ()> {
|
|
fn repl_load(file: String) -> Result<(), ()> {
|
|
|
|
|
+ let start = Instant::now();
|
|
|
let repl_env = env_new(None);
|
|
let repl_env = env_new(None);
|
|
|
for (k, v) in core::ns() {
|
|
for (k, v) in core::ns() {
|
|
|
env_sets(&repl_env, k, v);
|
|
env_sets(&repl_env, k, v);
|
|
@@ -756,10 +764,21 @@ fn repl_load(file: String) -> Result<(), ()> {
|
|
|
&repl_env,
|
|
&repl_env,
|
|
|
);
|
|
);
|
|
|
match rep(&format!("(load-file \"{}\")", file), &repl_env) {
|
|
match rep(&format!("(load-file \"{}\")", file), &repl_env) {
|
|
|
- Ok(_) => std::process::exit(0),
|
|
|
|
|
|
|
+ Ok(_) => {
|
|
|
|
|
+ println!("lisp end \t {:?}", start.elapsed());
|
|
|
|
|
+ std::process::exit(0)
|
|
|
|
|
+ },
|
|
|
Err(e) => {
|
|
Err(e) => {
|
|
|
println!("Error: {}", format_error(e));
|
|
println!("Error: {}", format_error(e));
|
|
|
std::process::exit(1);
|
|
std::process::exit(1);
|
|
|
}
|
|
}
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+#[cfg(test)]
|
|
|
|
|
+mod tests {
|
|
|
|
|
+ #[test]
|
|
|
|
|
+ fn it_works() {
|
|
|
|
|
+ assert_eq!(2 + 2, 4);
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|