mirror of
https://github.com/logos-storage/circom-compat.git
synced 2026-01-03 13:33:08 +00:00
* Import circom-2 test vectors
* Add failing test under feature flag
* Add exceptionHandler
* Add showSharedRWMemory
* Add getFieldNumLen32 and disable getFrLen
* Add getVersion
Also print version, n32
* Add getRawPrime
- Disable getPtrRawPrime
- Write as conditional cfg code blocks
* Refactor cfg code blocks
* Add readSharedRWMemory and get prime from WASM mem
- Add fromArray32 convenience function
* WIP: Debug R1CSfile header
field_size in header is 1, not 32 as expected
Don't see anything recently changed here:
https://github.com/iden3/r1csfile/blob/master/src/r1csfile.js (used by snarkjs)
But this seems new: 0149dc0643/constraint_writers/src/r1cs_writer.rs
* Add CircomVersion struct to Wasm
* XXX: Enum test
* Trait version
* Move traits to Circom, CircomBase, Circom2
* Simplify Wasm struct and remove version
* Feature gate Circom1/Circom2 traits
* Use cfg_if for witness calculation
Make normal dependency
* Fix visibilty for both test paths
* Remove println
Can introduce tracing separately
* refactor
* Make clippy happy with imports, unused variables
93 lines
2.4 KiB
Rust
93 lines
2.4 KiB
Rust
use ark_circom::{CircomBuilder, CircomConfig};
|
|
use ark_std::rand::thread_rng;
|
|
use color_eyre::Result;
|
|
|
|
use ark_bn254::Bn254;
|
|
use ark_groth16::{
|
|
create_random_proof as prove, generate_random_parameters, prepare_verifying_key, verify_proof,
|
|
};
|
|
|
|
#[test]
|
|
fn groth16_proof() -> Result<()> {
|
|
let cfg = CircomConfig::<Bn254>::new(
|
|
"./test-vectors/mycircuit.wasm",
|
|
"./test-vectors/mycircuit.r1cs",
|
|
)?;
|
|
let mut builder = CircomBuilder::new(cfg);
|
|
builder.push_input("a", 3);
|
|
builder.push_input("b", 11);
|
|
|
|
// create an empty instance for setting it up
|
|
let circom = builder.setup();
|
|
|
|
let mut rng = thread_rng();
|
|
let params = generate_random_parameters::<Bn254, _, _>(circom, &mut rng)?;
|
|
|
|
let circom = builder.build()?;
|
|
|
|
let inputs = circom.get_public_inputs().unwrap();
|
|
|
|
let proof = prove(circom, ¶ms, &mut rng)?;
|
|
|
|
let pvk = prepare_verifying_key(¶ms.vk);
|
|
|
|
let verified = verify_proof(&pvk, &proof, &inputs)?;
|
|
|
|
assert!(verified);
|
|
|
|
Ok(())
|
|
}
|
|
|
|
#[test]
|
|
fn groth16_proof_wrong_input() {
|
|
let cfg = CircomConfig::<Bn254>::new(
|
|
"./test-vectors/mycircuit.wasm",
|
|
"./test-vectors/mycircuit.r1cs",
|
|
)
|
|
.unwrap();
|
|
let mut builder = CircomBuilder::new(cfg);
|
|
builder.push_input("a", 3);
|
|
// This isn't a public input to the circuit, should faild
|
|
builder.push_input("foo", 11);
|
|
|
|
// create an empty instance for setting it up
|
|
let circom = builder.setup();
|
|
|
|
let mut rng = thread_rng();
|
|
let _params = generate_random_parameters::<Bn254, _, _>(circom, &mut rng).unwrap();
|
|
|
|
builder.build().unwrap_err();
|
|
}
|
|
|
|
#[test]
|
|
#[cfg(feature = "circom-2")]
|
|
fn groth16_proof_circom2() -> Result<()> {
|
|
let cfg = CircomConfig::<Bn254>::new(
|
|
"./test-vectors/circom2_multiplier2.wasm",
|
|
"./test-vectors/circom2_multiplier2.r1cs",
|
|
)?;
|
|
let mut builder = CircomBuilder::new(cfg);
|
|
builder.push_input("a", 3);
|
|
builder.push_input("b", 11);
|
|
|
|
// create an empty instance for setting it up
|
|
let circom = builder.setup();
|
|
|
|
let mut rng = thread_rng();
|
|
let params = generate_random_parameters::<Bn254, _, _>(circom, &mut rng)?;
|
|
|
|
let circom = builder.build()?;
|
|
|
|
let inputs = circom.get_public_inputs().unwrap();
|
|
|
|
let proof = prove(circom, ¶ms, &mut rng)?;
|
|
|
|
let pvk = prepare_verifying_key(¶ms.vk);
|
|
|
|
let verified = verify_proof(&pvk, &proof, &inputs)?;
|
|
|
|
assert!(verified);
|
|
|
|
Ok(())
|
|
}
|