Compare commits

..

1 Commits

Author SHA1 Message Date
seemenkina
c6d7172af2 fix(ci): add Binaryen installation to CI workflows and Makefile 2025-12-19 14:23:10 +07:00
11 changed files with 57 additions and 174 deletions

View File

@@ -92,6 +92,23 @@ jobs:
- name: Install stable toolchain
uses: dtolnay/rust-toolchain@stable
- uses: Swatinem/rust-cache@v2
- name: Install Binaryen
if: matrix.crate == 'rln-wasm'
run: |
BINARYEN_VERSION=125
if [[ "${{ matrix.platform }}" == "ubuntu-latest" ]]; then
ARCHIVE_NAME=binaryen-version_${BINARYEN_VERSION}-x86_64-linux.tar.gz
wget https://github.com/WebAssembly/binaryen/releases/download/version_${BINARYEN_VERSION}/${ARCHIVE_NAME}
tar -xzf ${ARCHIVE_NAME}
sudo cp binaryen-version_${BINARYEN_VERSION}/bin/* /usr/local/bin/
rm -rf binaryen-version_${BINARYEN_VERSION} ${ARCHIVE_NAME}
elif [[ "${{ matrix.platform }}" == "macos-latest" ]]; then
ARCHIVE_NAME=binaryen-version_${BINARYEN_VERSION}-x86_64-macos.tar.gz
wget https://github.com/WebAssembly/binaryen/releases/download/version_${BINARYEN_VERSION}/${ARCHIVE_NAME}
tar -xzf ${ARCHIVE_NAME}
sudo cp binaryen-version_${BINARYEN_VERSION}/bin/* /usr/local/bin/
rm -rf binaryen-version_${BINARYEN_VERSION} ${ARCHIVE_NAME}
fi
- name: Install dependencies
run: make installdeps
- name: Build rln-wasm
@@ -124,6 +141,22 @@ jobs:
components: rust-src
targets: wasm32-unknown-unknown
- uses: Swatinem/rust-cache@v2
- name: Install Binaryen
run: |
BINARYEN_VERSION=125
if [[ "${{ matrix.platform }}" == "ubuntu-latest" ]]; then
ARCHIVE_NAME=binaryen-version_${BINARYEN_VERSION}-x86_64-linux.tar.gz
wget https://github.com/WebAssembly/binaryen/releases/download/version_${BINARYEN_VERSION}/${ARCHIVE_NAME}
tar -xzf ${ARCHIVE_NAME}
sudo cp binaryen-version_${BINARYEN_VERSION}/bin/* /usr/local/bin/
rm -rf binaryen-version_${BINARYEN_VERSION} ${ARCHIVE_NAME}
elif [[ "${{ matrix.platform }}" == "macos-latest" ]]; then
ARCHIVE_NAME=binaryen-version_${BINARYEN_VERSION}-x86_64-macos.tar.gz
wget https://github.com/WebAssembly/binaryen/releases/download/version_${BINARYEN_VERSION}/${ARCHIVE_NAME}
tar -xzf ${ARCHIVE_NAME}
sudo cp binaryen-version_${BINARYEN_VERSION}/bin/* /usr/local/bin/
rm -rf binaryen-version_${BINARYEN_VERSION} ${ARCHIVE_NAME}
fi
- name: Install dependencies
run: make installdeps
- name: Build rln-wasm in parallel mode

View File

@@ -111,6 +111,14 @@ jobs:
components: rust-src
targets: wasm32-unknown-unknown
- uses: Swatinem/rust-cache@v2
- name: Install Binaryen
run: |
BINARYEN_VERSION=125
ARCHIVE_NAME=binaryen-version_${BINARYEN_VERSION}-x86_64-linux.tar.gz
wget https://github.com/WebAssembly/binaryen/releases/download/version_${BINARYEN_VERSION}/${ARCHIVE_NAME}
tar -xzf ${ARCHIVE_NAME}
sudo cp binaryen-version_${BINARYEN_VERSION}/bin/* /usr/local/bin/
rm -rf binaryen-version_${BINARYEN_VERSION} ${ARCHIVE_NAME}
- name: Install dependencies
run: make installdeps
- name: Build rln-wasm package

4
Cargo.lock generated
View File

@@ -1206,7 +1206,7 @@ checksum = "7a2d987857b319362043e95f5353c0535c1f58eec5336fdfcf626430af7def58"
[[package]]
name = "rln"
version = "1.0.0"
version = "0.9.0"
dependencies = [
"ark-bn254",
"ark-ec",
@@ -1875,7 +1875,7 @@ dependencies = [
[[package]]
name = "zerokit_utils"
version = "1.0.0"
version = "0.7.0"
dependencies = [
"ark-bn254",
"ark-ff",

View File

@@ -13,13 +13,13 @@ endif
installdeps: .pre-build
ifeq ($(shell uname),Darwin)
@brew install ninja
@brew install ninja binaryen
else ifeq ($(shell uname),Linux)
@if [ -f /etc/os-release ] && grep -q "ID=nixos" /etc/os-release; then \
echo "Detected NixOS, skipping apt installation."; \
else \
sudo apt update; \
sudo apt install -y cmake ninja-build; \
sudo apt install -y cmake ninja-build binaryen; \
fi
endif
@which wasm-pack > /dev/null && wasm-pack --version | grep -q "0.13.1" || cargo install wasm-pack --version=0.13.1

View File

@@ -13,8 +13,8 @@ path = "src/examples/stateless.rs"
required-features = ["stateless"]
[dependencies]
rln = { path = "../rln", version = "1.0.0", default-features = false }
zerokit_utils = { path = "../utils", version = "1.0.0", default-features = false }
rln = { path = "../rln", version = "0.9.0", default-features = false }
zerokit_utils = { path = "../utils", version = "0.7.0", default-features = false }
clap = { version = "4.5.53", features = ["cargo", "derive", "env"] }
serde_json = "1.0.145"
serde = { version = "1.0.228", features = ["derive"] }

View File

@@ -1,6 +1,6 @@
[package]
name = "rln-wasm"
version = "1.0.0"
version = "0.3.0"
edition = "2021"
license = "MIT OR Apache-2.0"
@@ -8,10 +8,10 @@ license = "MIT OR Apache-2.0"
crate-type = ["cdylib", "rlib"]
[dependencies]
rln = { path = "../rln", version = "1.0.0", default-features = false, features = [
rln = { path = "../rln", version = "0.9.0", default-features = false, features = [
"stateless",
] }
zerokit_utils = { path = "../utils", version = "1.0.0", default-features = false }
zerokit_utils = { path = "../utils", version = "0.7.0", default-features = false }
num-bigint = { version = "0.4.6", default-features = false }
js-sys = "0.3.83"
wasm-bindgen = "0.2.106"

View File

@@ -1,6 +1,6 @@
[package]
name = "rln"
version = "1.0.0"
version = "0.9.0"
edition = "2021"
license = "MIT OR Apache-2.0"
description = "APIs to manage, compute and verify zkSNARK proofs and RLN primitives"
@@ -46,7 +46,7 @@ ruint = { version = "1.17.0", default-features = false, features = [
tiny-keccak = { version = "2.0.2", features = ["keccak"] }
zeroize = "1.8.2"
tempfile = "3.23.0"
zerokit_utils = { version = "1.0.0", path = "../utils", default-features = false }
zerokit_utils = { version = "0.7.0", path = "../utils", default-features = false }
# FFI
safer-ffi.version = "0.1"

View File

@@ -24,7 +24,7 @@ We start by adding zerokit RLN to our `Cargo.toml`
```toml
[dependencies]
rln = "1.0.0"
rln = "0.9.0"
```
## Basic Usage Example

View File

@@ -182,9 +182,9 @@ mod test {
#[cfg(not(feature = "stateless"))]
mod tree_test {
use ark_std::{rand::thread_rng, UniformRand};
use rand::{rngs::ThreadRng, Rng};
use rand::Rng;
use rln::{
circuit::{Fr, Proof, DEFAULT_TREE_DEPTH},
circuit::{Fr, DEFAULT_TREE_DEPTH},
hashers::{hash_to_field_le, poseidon_hash},
pm_tree_adapter::PmtreeConfig,
protocol::*,
@@ -194,57 +194,6 @@ mod test {
const NO_OF_LEAVES: usize = 256;
fn setup_rln_proof(
mutate_path_elements: bool,
) -> (RLN, Proof, RLNProofValues, Fr, ThreadRng) {
let tree_depth = DEFAULT_TREE_DEPTH;
let mut leaves: Vec<Fr> = Vec::new();
let mut rng = thread_rng();
for _ in 0..NO_OF_LEAVES {
leaves.push(Fr::rand(&mut rng));
}
let mut rln = RLN::new(tree_depth, "").unwrap();
rln.init_tree_with_leaves(leaves.clone()).unwrap();
let (identity_secret, id_commitment) = keygen().unwrap();
let identity_index = rln.leaves_set();
let user_message_limit = Fr::from(100);
let rate_commitment = poseidon_hash(&[id_commitment, user_message_limit]).unwrap();
rln.set_next_leaf(rate_commitment).unwrap();
let signal: [u8; 32] = rng.gen();
let epoch = hash_to_field_le(b"test-epoch").unwrap();
let rln_identifier = hash_to_field_le(b"test-rln-identifier").unwrap();
let external_nullifier = poseidon_hash(&[epoch, rln_identifier]).unwrap();
let message_id = Fr::from(1);
let x = hash_to_field_le(&signal).unwrap();
let (mut path_elements, identity_path_index) =
rln.get_merkle_proof(identity_index).unwrap();
// Mutate path_elements if requested (simulating mutated path_element)
if mutate_path_elements && !path_elements.is_empty() {
path_elements[0] = Fr::rand(&mut rng);
}
let rln_witness = RLNWitnessInput::new(
identity_secret,
user_message_limit,
message_id,
path_elements,
identity_path_index,
x,
external_nullifier,
)
.unwrap();
let (proof, proof_values) = rln.generate_rln_proof(&rln_witness).unwrap();
(rln, proof, proof_values, x, rng)
}
#[test]
// We test merkle batch Merkle tree additions
fn test_merkle_operations() {
@@ -968,113 +917,6 @@ mod test {
RLN::new(DEFAULT_TREE_DEPTH, custom_pmtree_config.unwrap());
assert!(rln_with_custom_tree_config.is_ok());
}
#[test]
fn test_verify_rln_proof_failure_mutated_external_nullifier() {
let (rln, proof, mut proof_values, x, _rng) = setup_rln_proof(false);
// Mutate external_nullifier by adding 1
proof_values.external_nullifier += Fr::from(1);
// Verification should fail
let verified = rln.verify_rln_proof(&proof, &proof_values, &x).is_ok();
assert!(!verified);
}
#[test]
fn test_verify_rln_proof_failure_mutated_x() {
let (rln, proof, proof_values, _, mut rng) = setup_rln_proof(false);
// Generate unrelated x
let mutated_x = Fr::rand(&mut rng);
// Verification should fail
let verified = rln
.verify_rln_proof(&proof, &proof_values, &mutated_x)
.is_ok();
assert!(!verified);
}
#[test]
fn test_verify_rln_proof_failure_mutated_nullifier() {
let (rln, proof, mut proof_values, x, mut rng) = setup_rln_proof(false);
// Mutate nullifier (simulating mutated message_id)
proof_values.nullifier = Fr::rand(&mut rng);
// Verification should fail
let verified = rln.verify_rln_proof(&proof, &proof_values, &x).is_ok();
assert!(!verified);
}
#[test]
fn test_verify_rln_proof_failure_mutated_root() {
let (rln, proof, mut proof_values, x, mut rng) = setup_rln_proof(false);
// Mutate root (simulating mutated path_element)
proof_values.root = Fr::rand(&mut rng);
// Verification should fail
let verified = rln.verify_rln_proof(&proof, &proof_values, &x).is_ok();
assert!(!verified);
}
#[test]
fn test_verify_with_roots_failure_mutated_external_nullifier() {
let (rln, proof, mut proof_values, x, _rng) = setup_rln_proof(false);
let roots = vec![rln.get_root()];
// Mutate external_nullifier by adding 1
proof_values.external_nullifier += Fr::from(1);
// Verification should fail
let verified = rln
.verify_with_roots(&proof, &proof_values, &x, &roots)
.is_ok();
assert!(!verified);
}
#[test]
fn test_verify_with_roots_failure_mutated_x() {
let (rln, proof, proof_values, _, mut rng) = setup_rln_proof(false);
let roots = vec![rln.get_root()];
// Mutate x
let mutated_x = Fr::rand(&mut rng);
// Verification should fail
let verified = rln
.verify_with_roots(&proof, &proof_values, &mutated_x, &roots)
.is_ok();
assert!(!verified);
}
#[test]
fn test_verify_with_roots_failure_mutated_nullifier() {
let (rln, proof, mut proof_values, x, mut rng) = setup_rln_proof(false);
let roots = vec![rln.get_root()];
// Mutate nullifier (simulating mutated message_id)
proof_values.nullifier = Fr::rand(&mut rng);
// Verification should fail
let verified = rln
.verify_with_roots(&proof, &proof_values, &x, &roots)
.is_ok();
assert!(!verified);
}
#[test]
fn test_verify_with_roots_failure_mutated_root() {
let (rln, proof, proof_values, x, _rng) = setup_rln_proof(true);
let roots = vec![rln.get_root()];
// Verification should fail due to mutated path_elements leading to wrong root
let verified = rln
.verify_with_roots(&proof, &proof_values, &x, &roots)
.is_ok();
assert!(!verified);
}
}
#[cfg(feature = "stateless")]

View File

@@ -1,6 +1,6 @@
[package]
name = "zerokit_utils"
version = "1.0.0"
version = "0.7.0"
edition = "2021"
license = "MIT OR Apache-2.0"
description = "Various utilities for Zerokit"

View File

@@ -105,7 +105,7 @@ Add zerokit-utils as a dependency to your Cargo.toml file:
```toml
[dependencies]
zerokit-utils = "1.0.0"
zerokit-utils = "0.7.0"
```
## Building and Testing