|
|
@@ -0,0 +1,85 @@
|
|
|
+use std::{fs::*, path::PathBuf, time::Instant};
|
|
|
+
|
|
|
+use crate::{
|
|
|
+ circuit::MintContract,
|
|
|
+ crypto::proof::{ProvingKey, VerifyingKey},
|
|
|
+ serial::Decodable,
|
|
|
+ vm, Result,
|
|
|
+};
|
|
|
+
|
|
|
+pub struct ContractLoader {}
|
|
|
+
|
|
|
+impl ContractLoader {
|
|
|
+ // let bin = from_bincode("Mint", "proofs/mint.zk.bin");
|
|
|
+ pub fn from_bincode(name: String, path: PathBuf) -> Result<vm::ZkContract> {
|
|
|
+ let start = Instant::now();
|
|
|
+ let file = File::open(path)?;
|
|
|
+ let zkbin = vm::ZkBinary::decode(file)?;
|
|
|
+ for contract_name in zkbin.contracts.keys() {
|
|
|
+ println!("Loaded '{}' contract.", contract_name);
|
|
|
+ }
|
|
|
+ println!("Load time: [{:?}]", start.elapsed());
|
|
|
+ let contract = zkbin.contracts[&name].clone();
|
|
|
+ Ok(contract)
|
|
|
+ }
|
|
|
+
|
|
|
+ // let prk = load_prk("Mint", "proofs/mint.zk/bin", "proofs/mint.prk")
|
|
|
+ pub fn load_prk(
|
|
|
+ contract_name: String,
|
|
|
+ contract_path: PathBuf,
|
|
|
+ key_path: PathBuf,
|
|
|
+ ) -> Result<()> {
|
|
|
+ // TODO: benchmarks
|
|
|
+ //let start = Instant::now();
|
|
|
+ let contract_data = metadata(contract_path)?;
|
|
|
+ let key_data = metadata(key_path)?;
|
|
|
+
|
|
|
+ let contract_time = contract_data.modified()?;
|
|
|
+ let key_time = key_data.modified()?;
|
|
|
+
|
|
|
+ if key_time > contract_time {
|
|
|
+ println!("Key is newer than contract.");
|
|
|
+ } else {
|
|
|
+ Self::create_prk(contract_name)?;
|
|
|
+ }
|
|
|
+ Ok(())
|
|
|
+ }
|
|
|
+
|
|
|
+ // let prk = load_vrk("Mint", "proofs/mint.zk/bin", "proofs/mint.vrk")
|
|
|
+ pub fn load_vrk(
|
|
|
+ contract_name: String,
|
|
|
+ contract_path: PathBuf,
|
|
|
+ key_path: PathBuf,
|
|
|
+ ) -> Result<()> {
|
|
|
+ // TODO: benchmarks
|
|
|
+ //let start = Instant::now();
|
|
|
+ let contract_data = metadata(contract_path)?;
|
|
|
+ let key_data = metadata(key_path)?;
|
|
|
+
|
|
|
+ let contract_time = contract_data.modified()?;
|
|
|
+ let key_time = key_data.modified()?;
|
|
|
+
|
|
|
+ if key_time > contract_time {
|
|
|
+ println!("Key is newer than contract.");
|
|
|
+ } else {
|
|
|
+ Self::create_vrk(contract_name)?;
|
|
|
+ }
|
|
|
+ Ok(())
|
|
|
+ }
|
|
|
+
|
|
|
+ pub fn create_prk(name: String) -> Result<()> {
|
|
|
+ // TODO: implement this
|
|
|
+ let mint_vk = ProvingKey::build(11, MintContract::default());
|
|
|
+ let mut file = File::create(name + ".prk")?;
|
|
|
+ // TODO: serialize and save file
|
|
|
+ Ok(())
|
|
|
+ }
|
|
|
+
|
|
|
+ pub fn create_vrk(name: String) -> Result<()> {
|
|
|
+ // TODO: implement this
|
|
|
+ let _mint_vk = VerifyingKey::build(11, MintContract::default());
|
|
|
+ let mut file = File::create(name + ".vrk")?;
|
|
|
+ // TODO: serialize and save file
|
|
|
+ Ok(())
|
|
|
+ }
|
|
|
+}
|