chore: accept tree_config in new_with_params

This commit is contained in:
Richard Ramos 2023-08-04 11:28:07 -04:00 committed by richΛrd
parent ef1da42d94
commit 7d63912ace
4 changed files with 50 additions and 9 deletions

View File

@ -250,11 +250,7 @@ pub fn wasm_set_metadata(ctx: *mut RLNWrapper, input: Uint8Array) -> Result<(),
#[allow(clippy::not_unsafe_ptr_arg_deref)] #[allow(clippy::not_unsafe_ptr_arg_deref)]
#[wasm_bindgen(js_name = getMetadata)] #[wasm_bindgen(js_name = getMetadata)]
pub fn wasm_get_metadata(ctx: *mut RLNWrapper) -> Result<Uint8Array, String> { pub fn wasm_get_metadata(ctx: *mut RLNWrapper) -> Result<Uint8Array, String> {
call_with_output_and_error_msg!( call_with_output_and_error_msg!(ctx, get_metadata, "could not get metadata".to_string())
ctx,
get_metadata,
"could not get metadata".to_string()
)
} }
#[allow(clippy::not_unsafe_ptr_arg_deref)] #[allow(clippy::not_unsafe_ptr_arg_deref)]

View File

@ -186,6 +186,7 @@ pub extern "C" fn new_with_params(
circom_buffer: *const Buffer, circom_buffer: *const Buffer,
zkey_buffer: *const Buffer, zkey_buffer: *const Buffer,
vk_buffer: *const Buffer, vk_buffer: *const Buffer,
tree_config: *const Buffer,
ctx: *mut *mut RLN, ctx: *mut *mut RLN,
) -> bool { ) -> bool {
if let Ok(rln) = RLN::new_with_params( if let Ok(rln) = RLN::new_with_params(
@ -193,6 +194,7 @@ pub extern "C" fn new_with_params(
circom_buffer.process().to_vec(), circom_buffer.process().to_vec(),
zkey_buffer.process().to_vec(), zkey_buffer.process().to_vec(),
vk_buffer.process().to_vec(), vk_buffer.process().to_vec(),
tree_config.process(),
) { ) {
unsafe { *ctx = Box::into_raw(Box::new(rln)) }; unsafe { *ctx = Box::into_raw(Box::new(rln)) };
true true

View File

@ -117,6 +117,7 @@ impl RLN<'_> {
/// - `circom_vec`: a byte vector containing the ZK circuit (`rln.wasm`) as binary file /// - `circom_vec`: a byte vector containing the ZK circuit (`rln.wasm`) as binary file
/// - `zkey_vec`: a byte vector containing to the proving key (`rln_final.zkey`) as binary file /// - `zkey_vec`: a byte vector containing to the proving key (`rln_final.zkey`) as binary file
/// - `vk_vec`: a byte vector containing to the verification key (`verification_key.json`) as binary file /// - `vk_vec`: a byte vector containing to the verification key (`verification_key.json`) as binary file
/// - `tree_config`: a reader for a string containing a json with the merkle tree configuration
/// ///
/// Example: /// Example:
/// ``` /// ```
@ -134,6 +135,8 @@ impl RLN<'_> {
/// let mut buffer = vec![0; metadata.len() as usize]; /// let mut buffer = vec![0; metadata.len() as usize];
/// file.read_exact(&mut buffer).expect("buffer overflow"); /// file.read_exact(&mut buffer).expect("buffer overflow");
/// resources.push(buffer); /// resources.push(buffer);
/// let tree_config = "{}".to_string();
/// let tree_config_buffer = &Buffer::from(tree_config.as_bytes());
/// } /// }
/// ///
/// let mut rln = RLN::new_with_params( /// let mut rln = RLN::new_with_params(
@ -141,11 +144,51 @@ impl RLN<'_> {
/// resources[0].clone(), /// resources[0].clone(),
/// resources[1].clone(), /// resources[1].clone(),
/// resources[2].clone(), /// resources[2].clone(),
/// tree_config_buffer,
/// ); /// );
/// ``` /// ```
#[cfg(not(target_arch = "wasm32"))]
pub fn new_with_params<R: Read>(
tree_height: usize,
circom_vec: Vec<u8>,
zkey_vec: Vec<u8>,
vk_vec: Vec<u8>,
mut tree_config_input: R,
) -> Result<RLN<'static>> {
#[cfg(not(target_arch = "wasm32"))]
let witness_calculator = circom_from_raw(circom_vec)?;
let proving_key = zkey_from_raw(&zkey_vec)?;
let verification_key = vk_from_raw(&vk_vec, &zkey_vec)?;
let mut tree_config_vec: Vec<u8> = Vec::new();
tree_config_input.read_to_end(&mut tree_config_vec)?;
let tree_config_str = String::from_utf8(tree_config_vec)?;
let tree_config: <PoseidonTree as ZerokitMerkleTree>::Config = if tree_config_str.is_empty()
{
<PoseidonTree as ZerokitMerkleTree>::Config::default()
} else {
<PoseidonTree as ZerokitMerkleTree>::Config::from_str(&tree_config_str)?
};
// We compute a default empty tree
let tree = PoseidonTree::new(
tree_height,
<PoseidonTree as ZerokitMerkleTree>::Hasher::default_leaf(),
tree_config,
)?;
Ok(RLN {
witness_calculator,
proving_key,
verification_key,
tree,
})
}
#[cfg(target_arch = "wasm32")]
pub fn new_with_params( pub fn new_with_params(
tree_height: usize, tree_height: usize,
#[cfg(not(target_arch = "wasm32"))] circom_vec: Vec<u8>,
zkey_vec: Vec<u8>, zkey_vec: Vec<u8>,
vk_vec: Vec<u8>, vk_vec: Vec<u8>,
) -> Result<RLN<'static>> { ) -> Result<RLN<'static>> {
@ -159,12 +202,9 @@ impl RLN<'_> {
let tree = PoseidonTree::default(tree_height)?; let tree = PoseidonTree::default(tree_height)?;
Ok(RLN { Ok(RLN {
#[cfg(not(target_arch = "wasm32"))]
witness_calculator,
proving_key, proving_key,
verification_key, verification_key,
tree, tree,
#[cfg(target_arch = "wasm32")]
_marker: PhantomData, _marker: PhantomData,
}) })
} }

View File

@ -617,11 +617,14 @@ mod test {
// Creating a RLN instance passing the raw data // Creating a RLN instance passing the raw data
let mut rln_pointer_raw_bytes = MaybeUninit::<*mut RLN>::uninit(); let mut rln_pointer_raw_bytes = MaybeUninit::<*mut RLN>::uninit();
let tree_config = "".to_string();
let tree_config_buffer = &Buffer::from(tree_config.as_bytes());
let success = new_with_params( let success = new_with_params(
tree_height, tree_height,
circom_data, circom_data,
zkey_data, zkey_data,
vk_data, vk_data,
tree_config_buffer,
rln_pointer_raw_bytes.as_mut_ptr(), rln_pointer_raw_bytes.as_mut_ptr(),
); );
assert!(success, "RLN object creation failed"); assert!(success, "RLN object creation failed");