Skip to content

Commit

Permalink
chore: move js-witness conversion code into module
Browse files Browse the repository at this point in the history
  • Loading branch information
TomAFrench committed May 15, 2023
1 parent c84ffd4 commit a05430e
Show file tree
Hide file tree
Showing 4 changed files with 67 additions and 64 deletions.
2 changes: 1 addition & 1 deletion src/abi.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ use wasm_bindgen::{prelude::wasm_bindgen, JsValue};

mod temp;

use crate::{js_map_to_witness_map, witness_map_to_js_map};
use crate::js_transforms::{js_map_to_witness_map, witness_map_to_js_map};

use self::temp::{input_value_from_json_type, JsonTypes};

Expand Down
2 changes: 1 addition & 1 deletion src/execute.rs
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ use std::collections::BTreeMap;

use wasm_bindgen::prelude::wasm_bindgen;

use crate::{js_map_to_witness_map, witness_map_to_js_map};
use crate::js_transforms::{js_map_to_witness_map, witness_map_to_js_map};

struct SimulatedBackend;

Expand Down
62 changes: 62 additions & 0 deletions src/js_transforms.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
use acvm::{acir::native_types::Witness, FieldElement};
use std::collections::BTreeMap;

pub(crate) fn js_map_to_witness_map(js_map: js_sys::Map) -> BTreeMap<Witness, FieldElement> {
let mut witness_map: BTreeMap<Witness, FieldElement> = BTreeMap::new();
js_map.for_each(&mut |value, key| {
let witness_index = Witness(key.as_string().unwrap().parse::<u32>().unwrap());
// let witness_value: String = js_sys::BigInt::from(value)
// .to_string(16)
// .expect("Could not get value of witness")
// .into();
let witness_value: String = value.as_string().expect("Could not get value of witness");

let witness_value =
FieldElement::from_hex(&witness_value).expect("could not convert bigint to fields");
witness_map.insert(witness_index, witness_value);
});
witness_map
}

pub(crate) fn witness_map_to_js_map(witness_map: BTreeMap<Witness, FieldElement>) -> js_sys::Map {
let js_map = js_sys::Map::new();
for (key, value) in witness_map {
// This currently maps `0x30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000000`
// to the bigint `-1n`. This fails when converting back to a `FieldElement`.

// let witness_bigint = js_sys::BigInt::from_str(&value.to_hex())
// .expect("could not convert field to bigint");

let witness_bigint = wasm_bindgen::JsValue::from_str(&value.to_hex());

js_map.set(
&wasm_bindgen::JsValue::from_str(&key.witness_index().to_string()),
&witness_bigint,
);
}
js_map
}

#[cfg(test)]
mod test {
use std::collections::BTreeMap;

use acvm::{acir::native_types::Witness, FieldElement};
use wasm_bindgen::JsValue;
use wasm_bindgen_test::*;

use super::witness_map_to_js_map;

#[wasm_bindgen_test]
fn test_witness_map_to_js() {
let witness_map = BTreeMap::from([
(Witness(1), FieldElement::one()),
(Witness(2), FieldElement::zero()),
(Witness(3), -FieldElement::one()),
]);

let js_map = witness_map_to_js_map(witness_map);

assert_eq!(js_map.get(&JsValue::from("1")), JsValue::from_str("1"));
}
}
65 changes: 3 additions & 62 deletions src/lib.rs
Original file line number Diff line number Diff line change
@@ -1,15 +1,16 @@
#![forbid(unsafe_code)]
#![warn(unused_crate_dependencies, unused_extern_crates)]
#![warn(unreachable_pub)]
use acvm::{acir::native_types::Witness, FieldElement};

use gloo_utils::format::JsValueSerdeExt;
use log::Level;
use serde::{Deserialize, Serialize};
use std::{collections::BTreeMap, str::FromStr};
use std::str::FromStr;
use wasm_bindgen::prelude::*;

mod abi;
mod execute;
mod js_transforms;

pub use abi::{abi_decode, abi_encode};
pub use execute::execute_circuit;
Expand Down Expand Up @@ -44,63 +45,3 @@ pub fn build_info() -> JsValue {
console_error_panic_hook::set_once();
<JsValue as JsValueSerdeExt>::from_serde(&BUILD_INFO).unwrap()
}

fn js_map_to_witness_map(js_map: js_sys::Map) -> BTreeMap<Witness, FieldElement> {
let mut witness_map: BTreeMap<Witness, FieldElement> = BTreeMap::new();
js_map.for_each(&mut |value, key| {
let witness_index = Witness(key.as_string().unwrap().parse::<u32>().unwrap());
// let witness_value: String = js_sys::BigInt::from(value)
// .to_string(16)
// .expect("Could not get value of witness")
// .into();
let witness_value: String = value.as_string().expect("Could not get value of witness");

let witness_value =
FieldElement::from_hex(&witness_value).expect("could not convert bigint to fields");
witness_map.insert(witness_index, witness_value);
});
witness_map
}

fn witness_map_to_js_map(witness_map: BTreeMap<Witness, FieldElement>) -> js_sys::Map {
let js_map = js_sys::Map::new();
for (key, value) in witness_map {
// This currently maps `0x30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000000`
// to the bigint `-1n`. This fails when converting back to a `FieldElement`.

// let witness_bigint = js_sys::BigInt::from_str(&value.to_hex())
// .expect("could not convert field to bigint");

let witness_bigint = JsValue::from_str(&value.to_hex());

js_map.set(
&wasm_bindgen::JsValue::from_str(&key.witness_index().to_string()),
&witness_bigint,
);
}
js_map
}

#[cfg(test)]
mod test {
use std::collections::BTreeMap;

use acvm::{acir::native_types::Witness, FieldElement};
use wasm_bindgen::JsValue;
use wasm_bindgen_test::*;

use crate::witness_map_to_js_map;

#[wasm_bindgen_test]
fn test_witness_map_to_js() {
let witness_map = BTreeMap::from([
(Witness(1), FieldElement::one()),
(Witness(2), FieldElement::zero()),
(Witness(3), -FieldElement::one()),
]);

let js_map = witness_map_to_js_map(witness_map);

assert_eq!(js_map.get(&JsValue::from("1")), JsValue::from_str("1"));
}
}

0 comments on commit a05430e

Please sign in to comment.