arnaucube
arnaucube/ethdos-foldPublic Self-hosted repository
compress IVCProof
arnaucube root@arnaucube.com
Thu, 02 Jan 2025 10:47:03 +0100
commit

7a53b91981b1c40b11eb9249449d7918a62eec27

parent

24774715603ed857c3d2b9ca2184a2d3965c4e16

4 files changed, 38 insertions(+), 11 deletions(-)

jump to
M Cargo.toml → Cargo.toml

@@ -24,6 +24,7 @@ ark-serialize = { version = "^0.5.0", default-features = false }

rand = "0.8.5" rand_core = {version = "0.6", default-features = false} base64 = "0.22.1" +lz4_flex = { version = "0.11" } # compression folding-schemes = { git = "https://github.com/privacy-scaling-explorations/sonobe", package = "folding-schemes", features=["light-test"], rev="c6f1a246e0705582a75de6becf4ad21f325fa5a1"} arkeddsa = { git = "https://github.com/arnaucube/arkeddsa", features=["r1cs"], rev="0a9ea7ac1df07363af0fda723e313e775563b9f4"}
M README.md → README.md

@@ -3,6 +3,7 @@ Follows the ideas of ETHdos (https://ethdos.xyz/blog), but using folding schemes.

It uses <a target="_blank" href="https://github.com/privacy-scaling-explorations/sonobe">Sonobe</a> under the hood, compiled to WASM. ## Usage +- requirements: [rust](https://rustup.rs/), [wasm-pack](https://rustwasm.github.io/wasm-pack/installer/) - run native tests: `cargo test --release -- --nocapture` - build wasm: `wasm-pack build --target web` - serve the web: `python -m http.server 8080`
M src/fcircuit.rs → src/fcircuit.rs

@@ -115,7 +115,7 @@ let poseidon_config = poseidon_canonical_config::<Fr>();

const N: usize = 1; let ext_inps = gen_signatures::<OsRng, EdwardsProjective>(&mut rng, &poseidon_config, 1); - let e = ext_inps[0].clone(); + let e = ext_inps[0]; let msg = hash_pk(&poseidon_config, e.pk);

@@ -143,7 +143,7 @@

let circuit = FC::new(poseidon_config).unwrap(); let xy: (Fr, Fr) = pks_sigs[0].pk.0.xy().unwrap(); let pk0 = vec![xy.0, xy.1]; - let z_i: Vec<Fr> = vec![pk0.clone(), pk0, vec![Fr::zero()]].concat(); + let z_i: Vec<Fr> = [pk0.clone(), pk0, vec![Fr::zero()]].concat(); let external_inputs_var = SigPkVar::<EdwardsProjective, EdwardsVar>::new_witness(cs.clone(), || Ok(pks_sigs[0]))
M src/lib.rs → src/lib.rs

@@ -171,16 +171,23 @@ let mut ivc_proof_bytes = vec![];

ivc_proof .serialize_compressed(&mut ivc_proof_bytes) .unwrap(); + + let ivc_proof_bytes_comp = lz4_flex::block::compress_prepend_size(&ivc_proof_bytes); + dbg(format!( - "ivc_proof size: {} mb", + "ivc_proof size (uncompressed): {} mb", ivc_proof_bytes.len() / (1024 * 1024) )); + dbg(format!( + "ivc_proof size (compressed): {} mb", + ivc_proof_bytes_comp.len() / (1024 * 1024) + )); - b64.encode(ivc_proof_bytes) + b64.encode(ivc_proof_bytes_comp) } #[wasm_bindgen] -pub fn verify_proof(verifier_params: String, ivc_proof: String) -> String { +pub fn verify_proof(verifier_params: String, ivc_proof_b64: String) -> String { let poseidon_config = poseidon_canonical_config::<Fr>(); let vp = FS::vp_deserialize_with_mode(

@@ -190,13 +197,14 @@ ark_serialize::Validate::Yes,

poseidon_config.clone(), // fcircuit_params ) .unwrap(); - // let proof = - // FS::IVCProof::deserialize_compressed(b64.decode(ivc_proof).unwrap().as_slice()).unwrap(); + let ivc_proof_bytes_comp = b64.decode(ivc_proof_b64).unwrap(); + let ivc_proof_bytes = + lz4_flex::block::decompress_size_prepended(&ivc_proof_bytes_comp).unwrap(); let proof = <Nova<G1, G2, FC, Pedersen<G1>, Pedersen<G2>, false> as FoldingScheme< G1, G2, FC, - >>::IVCProof::deserialize_compressed(b64.decode(ivc_proof).unwrap().as_slice()) + >>::IVCProof::deserialize_compressed(ivc_proof_bytes.as_slice()) .unwrap(); FS::verify(

@@ -212,6 +220,7 @@ mod tests {

use ark_bn254::{Fr, G1Projective as G1}; use ark_ec::AffineRepr; use ark_grumpkin::Projective as G2; + use ark_serialize::CanonicalSerialize; use ark_std::Zero; use rand::rngs::OsRng;

@@ -250,7 +259,7 @@

// set the initial state let xy = pks_sigs[0].pk.0.xy().unwrap(); let pk0 = vec![xy.0, xy.1]; - let z_0: Vec<Fr> = vec![pk0.clone(), pk0, vec![Fr::zero()]].concat(); + let z_0: Vec<Fr> = [pk0.clone(), pk0, vec![Fr::zero()]].concat(); type FC = EthDosCircuit<Fr, EdwardsProjective, EdwardsVar>; let f_circuit = FC::new(poseidon_config.clone()).unwrap();

@@ -271,9 +280,10 @@ let mut nova = FS::init(&nova_params, f_circuit, z_0.clone()).unwrap();

// run n steps of the folding iteration let start_full = get_time(); + #[allow(clippy::needless_range_loop)] for i in 0..N_STEPS { let start = get_time(); - nova.prove_step(rng, pks_sigs[i].clone(), None).unwrap(); + nova.prove_step(rng, pks_sigs[i], None).unwrap(); dbg(format!("Nova::prove_step {}: {:?}", nova.i, elapsed(start))); } dbg(format!(

@@ -287,8 +297,23 @@ let ivc_proof = nova.ivc_proof();

dbg!(&ivc_proof.z_i); FS::verify( nova_params.1.clone(), // Nova's verifier params - ivc_proof, + ivc_proof.clone(), ) .unwrap(); + + // print IVCProof size (uncompressed & compressed) + let mut ivc_proof_bytes = vec![]; + ivc_proof + .serialize_compressed(&mut ivc_proof_bytes) + .unwrap(); + let ivc_proof_bytes_comp = lz4_flex::block::compress_prepend_size(&ivc_proof_bytes); + dbg(format!( + "ivc_proof size (uncompressed): {} mb", + ivc_proof_bytes.len() / (1024 * 1024) + )); + dbg(format!( + "ivc_proof size (compressed): {} mb", + ivc_proof_bytes_comp.len() / (1024 * 1024) + )); } }