1
0
Fork 0
mirror of synced 2025-09-24 04:40:05 +00:00

Merge branch 'develop' of github.com:Zokrates/ZoKrates into textmate-highlighter

This commit is contained in:
schaeff 2021-03-24 14:06:05 +01:00
commit d4220e8de7
24 changed files with 1049 additions and 305 deletions

42
Cargo.lock generated
View file

@ -1,5 +1,7 @@
# This file is automatically @generated by Cargo.
# It is not intended for manual editing.
version = 3
[[package]]
name = "addr2line"
version = "0.14.0"
@ -904,7 +906,20 @@ checksum = "fc587bc0ec293155d5bfa6b9891ec18a1e330c234f896ea47fbada4cadbe47e6"
dependencies = [
"cfg-if 0.1.10",
"libc",
"wasi",
"wasi 0.9.0+wasi-snapshot-preview1",
]
[[package]]
name = "getrandom"
version = "0.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c9495705279e7140bf035dde1f6e750c162df8b625267cd52cc44e0b156732c8"
dependencies = [
"cfg-if 1.0.0",
"js-sys",
"libc",
"wasi 0.10.2+wasi-snapshot-preview1",
"wasm-bindgen",
]
[[package]]
@ -1431,7 +1446,7 @@ version = "0.7.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03"
dependencies = [
"getrandom",
"getrandom 0.1.15",
"libc",
"rand_chacha",
"rand_core 0.5.1",
@ -1469,7 +1484,7 @@ version = "0.5.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19"
dependencies = [
"getrandom",
"getrandom 0.1.15",
]
[[package]]
@ -1502,7 +1517,7 @@ version = "0.3.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "de0737333e7a9502c789a36d7c7fa6092a49895d4faa31ca5df163857ded2e9d"
dependencies = [
"getrandom",
"getrandom 0.1.15",
"redox_syscall",
"rust-argon2",
]
@ -1991,6 +2006,12 @@ version = "0.9.0+wasi-snapshot-preview1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519"
[[package]]
name = "wasi"
version = "0.10.2+wasi-snapshot-preview1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6"
[[package]]
name = "wasm-bindgen"
version = "0.2.69"
@ -2156,7 +2177,7 @@ dependencies = [
[[package]]
name = "zokrates_cli"
version = "0.6.3"
version = "0.6.4"
dependencies = [
"assert_cli",
"bincode",
@ -2181,7 +2202,7 @@ version = "0.1.0"
[[package]]
name = "zokrates_core"
version = "0.5.3"
version = "0.5.4"
dependencies = [
"ark-bls12-377",
"ark-bn254",
@ -2198,6 +2219,7 @@ dependencies = [
"cmake",
"csv",
"ff_ce 0.9.0",
"getrandom 0.2.2",
"git2",
"hex",
"lazy_static",
@ -2221,7 +2243,7 @@ dependencies = [
[[package]]
name = "zokrates_core_test"
version = "0.1.4"
version = "0.1.5"
dependencies = [
"zokrates_test",
"zokrates_test_derive",
@ -2237,7 +2259,7 @@ dependencies = [
[[package]]
name = "zokrates_field"
version = "0.3.7"
version = "0.3.8"
dependencies = [
"ark-bls12-377",
"ark-bn254",
@ -2288,7 +2310,7 @@ dependencies = [
[[package]]
name = "zokrates_stdlib"
version = "0.1.7"
version = "0.1.8"
dependencies = [
"fs_extra",
"zokrates_test",
@ -2297,7 +2319,7 @@ dependencies = [
[[package]]
name = "zokrates_test"
version = "0.1.4"
version = "0.1.5"
dependencies = [
"serde",
"serde_derive",

View file

@ -29,7 +29,7 @@ echo "Published zokrates/zokrates:$TAG"
# Release on Github
git tag -f latest
git tag $TAG
git tag -f $TAG
git push origin -f latest
git push origin $TAG

View file

@ -1,6 +1,6 @@
[package]
name = "zokrates_cli"
version = "0.6.3"
version = "0.6.4"
authors = ["Jacob Eberhardt <jacob.eberhardt@tu-berlin.de>", "Dennis Kuhnert <mail@kyroy.com>", "Thibaut Schaeffer <thibaut@schaeff.fr>"]
repository = "https://github.com/JacobEberhardt/ZoKrates.git"
edition = "2018"

View file

@ -152,7 +152,7 @@ fn cli_setup<T: Field, S: Scheme<T>, B: Backend<T, S>>(
let mut vk_file = File::create(vk_path)
.map_err(|why| format!("couldn't create {}: {}", vk_path.display(), why))?;
vk_file
.write(
.write_all(
serde_json::to_string_pretty(&keypair.vk)
.unwrap()
.as_bytes(),
@ -163,7 +163,7 @@ fn cli_setup<T: Field, S: Scheme<T>, B: Backend<T, S>>(
let mut pk_file = File::create(pk_path)
.map_err(|why| format!("couldn't create {}: {}", pk_path.display(), why))?;
pk_file
.write(keypair.pk.as_ref())
.write_all(keypair.pk.as_ref())
.map_err(|why| format!("couldn't write to {}: {}", pk_path.display(), why))?;
println!("Setup completed.");

View file

@ -1,6 +1,6 @@
[package]
name = "zokrates_core"
version = "0.5.3"
version = "0.5.4"
edition = "2018"
authors = ["Jacob Eberhardt <jacob.eberhardt@tu-berlin.de>", "Dennis Kuhnert <mail@kyroy.com>"]
repository = "https://github.com/JacobEberhardt/ZoKrates"
@ -32,6 +32,7 @@ zokrates_field = { version = "0.3.0", path = "../zokrates_field", default-featur
zokrates_pest_ast = { version = "0.1.0", path = "../zokrates_pest_ast" }
zokrates_common = { path = "../zokrates_common" }
zokrates_embed = { path = "../zokrates_embed" }
getrandom = { version = "0.2", features = ["js"] }
rand_0_4 = { version = "0.4", package = "rand" }
rand_0_7 = { version = "0.7", package = "rand" }
csv = "1"

View file

@ -2016,8 +2016,42 @@ impl<'ast, T: Field> Flattener<'ast, T> {
}
}
ZirStatement::Assertion(e) => {
// naive approach: flatten the boolean to a single field element and constrain it to 1
match e {
BooleanExpression::And(..) => {
for boolean in e.into_conjunction_iterator() {
self.flatten_statement(
symbols,
statements_flattened,
ZirStatement::Assertion(boolean),
)
}
}
BooleanExpression::FieldEq(box lhs, box rhs) => {
let lhs = self.flatten_field_expression(symbols, statements_flattened, lhs);
let rhs = self.flatten_field_expression(symbols, statements_flattened, rhs);
self.flatten_equality(statements_flattened, lhs, rhs)
}
BooleanExpression::UintEq(box lhs, box rhs) => {
let lhs = self
.flatten_uint_expression(symbols, statements_flattened, lhs)
.get_field_unchecked();
let rhs = self
.flatten_uint_expression(symbols, statements_flattened, rhs)
.get_field_unchecked();
self.flatten_equality(statements_flattened, lhs, rhs)
}
BooleanExpression::BoolEq(box lhs, box rhs) => {
let lhs =
self.flatten_boolean_expression(symbols, statements_flattened, lhs);
let rhs =
self.flatten_boolean_expression(symbols, statements_flattened, rhs);
self.flatten_equality(statements_flattened, lhs, rhs)
}
_ => {
// naive approach: flatten the boolean to a single field element and constrain it to 1
let e = self.flatten_boolean_expression(symbols, statements_flattened, e);
if e.is_linear() {
@ -2033,6 +2067,8 @@ impl<'ast, T: Field> Flattener<'ast, T> {
));
}
}
}
}
ZirStatement::MultipleDefinition(vars, rhs) => {
// flatten the right side to p = sum(var_i.type.primitive_count) expressions
// define p new variables to the right side expressions
@ -2147,6 +2183,59 @@ impl<'ast, T: Field> Flattener<'ast, T> {
}
}
/// Flattens an equality expression
///
/// # Arguments
///
/// * `statements_flattened` - `FlatStatements<T>` Vector where new flattened statements can be added.
/// * `lhs` - `FlatExpression<T>` Left-hand side of the equality expression.
/// * `rhs` - `FlatExpression<T>` Right-hand side of the equality expression.
fn flatten_equality(
&mut self,
statements_flattened: &mut FlatStatements<T>,
lhs: FlatExpression<T>,
rhs: FlatExpression<T>,
) {
let (lhs, rhs) = match (lhs, rhs) {
(FlatExpression::Mult(box x, box y), z) | (z, FlatExpression::Mult(box x, box y)) => (
self.identify_expression(z, statements_flattened),
FlatExpression::Mult(
box self.identify_expression(x, statements_flattened),
box self.identify_expression(y, statements_flattened),
),
),
(x, z) => (
self.identify_expression(z, statements_flattened),
FlatExpression::Mult(
box self.identify_expression(x, statements_flattened),
box FlatExpression::Number(T::from(1)),
),
),
};
statements_flattened.push(FlatStatement::Condition(lhs, rhs));
}
/// Identifies a non-linear expression by assigning it to a new identifier.
///
/// # Arguments
///
/// * `e` - `FlatExpression<T>` Expression to be assigned to an identifier.
/// * `statements_flattened` - `FlatStatements<T>` Vector where new flattened statements can be added.
fn identify_expression(
&mut self,
e: FlatExpression<T>,
statements_flattened: &mut FlatStatements<T>,
) -> FlatExpression<T> {
match e.is_linear() {
true => e,
false => {
let sym = self.use_sym();
statements_flattened.push(FlatStatement::Definition(sym, e));
FlatExpression::Identifier(sym)
}
}
}
/// Returns a fresh FlatVariable for a given Variable
/// # Arguments
///
@ -2246,6 +2335,499 @@ mod tests {
use crate::zir::types::Type;
use zokrates_field::Bn128Field;
#[test]
fn assertion_bool_eq() {
// def main():
// bool x = true
// bool y = true
// assert(x == y)
// def main():
// _0 = 1
// _1 = 1
// _1 == (_0 * 1)
let function = ZirFunction::<Bn128Field> {
arguments: vec![],
statements: vec![
ZirStatement::Definition(
Variable::boolean("x".into()),
BooleanExpression::Value(true).into(),
),
ZirStatement::Definition(
Variable::boolean("y".into()),
BooleanExpression::Value(true).into(),
),
ZirStatement::Assertion(BooleanExpression::BoolEq(
box BooleanExpression::Identifier("x".into()),
box BooleanExpression::Identifier("y".into()),
)),
],
signature: Signature {
inputs: vec![],
outputs: vec![],
},
};
let config = CompileConfig::default();
let mut flattener = Flattener::new(&config);
let flat = flattener.flatten_function(&HashMap::new(), function);
let expected = FlatFunction {
arguments: vec![],
statements: vec![
FlatStatement::Definition(
FlatVariable::new(0),
FlatExpression::Number(Bn128Field::from(1)),
),
FlatStatement::Definition(
FlatVariable::new(1),
FlatExpression::Number(Bn128Field::from(1)),
),
FlatStatement::Condition(
FlatExpression::Identifier(FlatVariable::new(1)),
FlatExpression::Mult(
box FlatExpression::Identifier(FlatVariable::new(0)),
box FlatExpression::Number(Bn128Field::from(1)),
),
),
],
};
assert_eq!(flat, expected);
}
#[test]
fn assertion_field_eq() {
// def main():
// field x = 1
// field y = 2
// assert(x + 1 == y)
// def main():
// _0 = 42
// _1 = 42
// _1 == ((_0 + 1) * 1)
let function = ZirFunction {
arguments: vec![],
statements: vec![
ZirStatement::Definition(
Variable::field_element("x"),
FieldElementExpression::Number(Bn128Field::from(1)).into(),
),
ZirStatement::Definition(
Variable::field_element("y"),
FieldElementExpression::Number(Bn128Field::from(2)).into(),
),
ZirStatement::Assertion(BooleanExpression::FieldEq(
box FieldElementExpression::Add(
box FieldElementExpression::Identifier("x".into()),
box FieldElementExpression::Number(Bn128Field::from(1)).into(),
),
box FieldElementExpression::Identifier("y".into()),
)),
],
signature: Signature {
inputs: vec![],
outputs: vec![],
},
};
let config = CompileConfig::default();
let mut flattener = Flattener::new(&config);
let flat = flattener.flatten_function(&HashMap::new(), function);
let expected = FlatFunction {
arguments: vec![],
statements: vec![
FlatStatement::Definition(
FlatVariable::new(0),
FlatExpression::Number(Bn128Field::from(1)),
),
FlatStatement::Definition(
FlatVariable::new(1),
FlatExpression::Number(Bn128Field::from(2)),
),
FlatStatement::Condition(
FlatExpression::Identifier(FlatVariable::new(1)),
FlatExpression::Mult(
box FlatExpression::Add(
box FlatExpression::Identifier(FlatVariable::new(0)),
box FlatExpression::Number(Bn128Field::from(1)),
),
box FlatExpression::Number(Bn128Field::from(1)),
),
),
],
};
assert_eq!(flat, expected);
}
#[test]
fn assertion_uint_eq() {
// def main():
// u32 x = 42
// assert(x == 42)
// def main():
// _0 = 42
// 42 == (_0 * 1)
let metadata = UMetadata {
max: 0xffffffff_u32.into(),
should_reduce: ShouldReduce::True,
};
let function = ZirFunction::<Bn128Field> {
arguments: vec![],
statements: vec![
ZirStatement::Definition(
Variable::uint("x".into(), 32),
ZirExpression::Uint(
UExpressionInner::Value(42)
.annotate(32)
.metadata(metadata.clone()),
),
),
ZirStatement::Assertion(BooleanExpression::UintEq(
box UExpressionInner::Identifier("x".into())
.annotate(32)
.metadata(metadata.clone()),
box UExpressionInner::Value(42).annotate(32).metadata(metadata),
)),
],
signature: Signature {
inputs: vec![],
outputs: vec![],
},
};
let config = CompileConfig::default();
let mut flattener = Flattener::new(&config);
let flat = flattener.flatten_function(&HashMap::new(), function);
let expected = FlatFunction {
arguments: vec![],
statements: vec![
FlatStatement::Definition(
FlatVariable::new(0),
FlatExpression::Number(Bn128Field::from(42)),
),
FlatStatement::Condition(
FlatExpression::Number(Bn128Field::from(42)),
FlatExpression::Mult(
box FlatExpression::Identifier(FlatVariable::new(0)),
box FlatExpression::Number(Bn128Field::from(1)),
),
),
],
};
assert_eq!(flat, expected);
}
#[test]
fn assertion_ident_eq_ident() {
// def main():
// field x = 2
// field y = 2
// assert(x == y)
// def main():
// _0 = 2
// _1 = 2
// _1 == (_0 * 1)
let function = ZirFunction {
arguments: vec![],
statements: vec![
ZirStatement::Definition(
Variable::field_element("x"),
FieldElementExpression::Number(Bn128Field::from(2)).into(),
),
ZirStatement::Definition(
Variable::field_element("y"),
FieldElementExpression::Number(Bn128Field::from(2)).into(),
),
ZirStatement::Assertion(BooleanExpression::FieldEq(
box FieldElementExpression::Identifier("x".into()),
box FieldElementExpression::Identifier("y".into()),
)),
],
signature: Signature {
inputs: vec![],
outputs: vec![],
},
};
let config = CompileConfig::default();
let mut flattener = Flattener::new(&config);
let flat = flattener.flatten_function(&HashMap::new(), function);
let expected = FlatFunction {
arguments: vec![],
statements: vec![
FlatStatement::Definition(
FlatVariable::new(0),
FlatExpression::Number(Bn128Field::from(2)),
),
FlatStatement::Definition(
FlatVariable::new(1),
FlatExpression::Number(Bn128Field::from(2)),
),
FlatStatement::Condition(
FlatExpression::Identifier(FlatVariable::new(1)),
FlatExpression::Mult(
box FlatExpression::Identifier(FlatVariable::new(0)),
box FlatExpression::Number(Bn128Field::from(1)),
),
),
],
};
assert_eq!(flat, expected);
}
#[test]
fn assertion_mult_eq_ident() {
// def main():
// field x = 2
// field y = 2
// field z = 4
// assert(x * y == z)
// def main():
// _0 = 2
// _1 = 2
// _2 = 4
// _2 == (_0 * _1)
let function = ZirFunction {
arguments: vec![],
statements: vec![
ZirStatement::Definition(
Variable::field_element("x"),
FieldElementExpression::Number(Bn128Field::from(2)).into(),
),
ZirStatement::Definition(
Variable::field_element("y"),
FieldElementExpression::Number(Bn128Field::from(2)).into(),
),
ZirStatement::Definition(
Variable::field_element("z"),
FieldElementExpression::Number(Bn128Field::from(4)).into(),
),
ZirStatement::Assertion(BooleanExpression::FieldEq(
box FieldElementExpression::Mult(
box FieldElementExpression::Identifier("x".into()),
box FieldElementExpression::Identifier("y".into()),
),
box FieldElementExpression::Identifier("z".into()),
)),
],
signature: Signature {
inputs: vec![],
outputs: vec![],
},
};
let config = CompileConfig::default();
let mut flattener = Flattener::new(&config);
let flat = flattener.flatten_function(&HashMap::new(), function);
let expected = FlatFunction {
arguments: vec![],
statements: vec![
FlatStatement::Definition(
FlatVariable::new(0),
FlatExpression::Number(Bn128Field::from(2)),
),
FlatStatement::Definition(
FlatVariable::new(1),
FlatExpression::Number(Bn128Field::from(2)),
),
FlatStatement::Definition(
FlatVariable::new(2),
FlatExpression::Number(Bn128Field::from(4)),
),
FlatStatement::Condition(
FlatExpression::Identifier(FlatVariable::new(2)),
FlatExpression::Mult(
box FlatExpression::Identifier(FlatVariable::new(0)),
box FlatExpression::Identifier(FlatVariable::new(1)),
),
),
],
};
assert_eq!(flat, expected);
}
#[test]
fn assertion_ident_eq_mult() {
// def main():
// field x = 2
// field y = 2
// field z = 4
// assert(z == x * y)
// def main():
// _0 = 2
// _1 = 2
// _2 = 4
// _2 == (_0 * _1)
let function = ZirFunction {
arguments: vec![],
statements: vec![
ZirStatement::Definition(
Variable::field_element("x"),
FieldElementExpression::Number(Bn128Field::from(2)).into(),
),
ZirStatement::Definition(
Variable::field_element("y"),
FieldElementExpression::Number(Bn128Field::from(2)).into(),
),
ZirStatement::Definition(
Variable::field_element("z"),
FieldElementExpression::Number(Bn128Field::from(4)).into(),
),
ZirStatement::Assertion(BooleanExpression::FieldEq(
box FieldElementExpression::Identifier("z".into()),
box FieldElementExpression::Mult(
box FieldElementExpression::Identifier("x".into()),
box FieldElementExpression::Identifier("y".into()),
),
)),
],
signature: Signature {
inputs: vec![],
outputs: vec![],
},
};
let config = CompileConfig::default();
let mut flattener = Flattener::new(&config);
let flat = flattener.flatten_function(&HashMap::new(), function);
let expected = FlatFunction {
arguments: vec![],
statements: vec![
FlatStatement::Definition(
FlatVariable::new(0),
FlatExpression::Number(Bn128Field::from(2)),
),
FlatStatement::Definition(
FlatVariable::new(1),
FlatExpression::Number(Bn128Field::from(2)),
),
FlatStatement::Definition(
FlatVariable::new(2),
FlatExpression::Number(Bn128Field::from(4)),
),
FlatStatement::Condition(
FlatExpression::Identifier(FlatVariable::new(2)),
FlatExpression::Mult(
box FlatExpression::Identifier(FlatVariable::new(0)),
box FlatExpression::Identifier(FlatVariable::new(1)),
),
),
],
};
assert_eq!(flat, expected);
}
#[test]
fn assertion_mult_eq_mult() {
// def main():
// field x = 4
// field y = 4
// field z = 8
// field t = 2
// assert(x * y == z * t)
// def main():
// _0 = 4
// _1 = 4
// _2 = 8
// _3 = 2
// _4 = (_2 * _3)
// _4 == (_0 * _1)
let function = ZirFunction {
arguments: vec![],
statements: vec![
ZirStatement::Definition(
Variable::field_element("x"),
FieldElementExpression::Number(Bn128Field::from(4)).into(),
),
ZirStatement::Definition(
Variable::field_element("y"),
FieldElementExpression::Number(Bn128Field::from(4)).into(),
),
ZirStatement::Definition(
Variable::field_element("z"),
FieldElementExpression::Number(Bn128Field::from(8)).into(),
),
ZirStatement::Definition(
Variable::field_element("t"),
FieldElementExpression::Number(Bn128Field::from(2)).into(),
),
ZirStatement::Assertion(BooleanExpression::FieldEq(
box FieldElementExpression::Mult(
box FieldElementExpression::Identifier("x".into()),
box FieldElementExpression::Identifier("y".into()),
),
box FieldElementExpression::Mult(
box FieldElementExpression::Identifier("z".into()),
box FieldElementExpression::Identifier("t".into()),
),
)),
],
signature: Signature {
inputs: vec![],
outputs: vec![],
},
};
let config = CompileConfig::default();
let mut flattener = Flattener::new(&config);
let flat = flattener.flatten_function(&HashMap::new(), function);
let expected = FlatFunction {
arguments: vec![],
statements: vec![
FlatStatement::Definition(
FlatVariable::new(0),
FlatExpression::Number(Bn128Field::from(4)),
),
FlatStatement::Definition(
FlatVariable::new(1),
FlatExpression::Number(Bn128Field::from(4)),
),
FlatStatement::Definition(
FlatVariable::new(2),
FlatExpression::Number(Bn128Field::from(8)),
),
FlatStatement::Definition(
FlatVariable::new(3),
FlatExpression::Number(Bn128Field::from(2)),
),
FlatStatement::Definition(
FlatVariable::new(4),
FlatExpression::Mult(
box FlatExpression::Identifier(FlatVariable::new(2)),
box FlatExpression::Identifier(FlatVariable::new(3)),
),
),
FlatStatement::Condition(
FlatExpression::Identifier(FlatVariable::new(4)),
FlatExpression::Mult(
box FlatExpression::Identifier(FlatVariable::new(0)),
box FlatExpression::Identifier(FlatVariable::new(1)),
),
),
],
};
assert_eq!(flat, expected);
}
#[test]
fn powers_zero() {
// def main():

View file

@ -133,11 +133,10 @@ mod serialization {
mod tests {
use zokrates_field::Bn128Field;
use super::*;
use crate::flat_absy::FlatVariable;
use crate::ir::{Function, Interpreter, Prog, Statement};
use super::*;
#[test]
fn verify() {
let program: Prog<Bn128Field> = Prog {

View file

@ -162,8 +162,22 @@ impl<T: BellmanFieldExtensions + Field> Prog<T> {
}
impl<T: BellmanFieldExtensions + Field> Computation<T> {
fn get_random_seed(&self) -> Result<[u32; 8], getrandom::Error> {
let mut seed = [0u8; 32];
getrandom::getrandom(&mut seed)?;
use std::mem::transmute;
// This is safe because we are just reinterpreting the bytes (u8[32] -> u32[8]),
// byte order or the actual content does not matter here as this is used
// as a random seed for the rng.
let seed: [u32; 8] = unsafe { transmute(seed) };
Ok(seed)
}
pub fn prove(self, params: &Parameters<T::BellmanEngine>) -> Proof<T::BellmanEngine> {
let rng = &mut ChaChaRng::new_unseeded();
use rand_0_4::SeedableRng;
let seed = self.get_random_seed().unwrap();
let rng = &mut ChaChaRng::from_seed(seed.as_ref());
let proof = create_random_proof(self.clone(), params, rng).unwrap();
@ -186,7 +200,9 @@ impl<T: BellmanFieldExtensions + Field> Computation<T> {
}
pub fn setup(self) -> Parameters<T::BellmanEngine> {
let rng = &mut ChaChaRng::new_unseeded();
use rand_0_4::SeedableRng;
let seed = self.get_random_seed().unwrap();
let rng = &mut ChaChaRng::from_seed(seed.as_ref());
// run setup phase
generate_random_parameters(self, rng).unwrap()
}

View file

@ -40,7 +40,7 @@ pub trait Analyse {
impl<'ast, T: Field> TypedProgram<'ast, T> {
pub fn analyse(self) -> ZirProgram<'ast, T> {
// propagated unrolling
let r = PropagatedUnroller::unroll(self).unwrap_or_else(|e| panic!(e));
let r = PropagatedUnroller::unroll(self).unwrap_or_else(|e| panic!("{}", e));
// return binding
let r = ReturnBinder::bind(r);

View file

@ -28,7 +28,6 @@ impl UnconstrainedVariableDetector {
// we should probably handle this case instead of asserting at some point
assert!(
instance.variables.is_empty(),
format!(
"Unconstrained variables are not allowed (found {} occurrence{})",
instance.variables.len(),
if instance.variables.len() == 1 {
@ -36,7 +35,6 @@ impl UnconstrainedVariableDetector {
} else {
"s"
}
)
);
p
}

View file

@ -422,6 +422,36 @@ pub enum BooleanExpression<'ast, T> {
),
}
pub struct ConjunctionIterator<T> {
current: Vec<T>,
}
impl<'ast, T> Iterator for ConjunctionIterator<BooleanExpression<'ast, T>> {
type Item = BooleanExpression<'ast, T>;
fn next(&mut self) -> Option<Self::Item> {
self.current
.pop()
.map(|n| match n {
BooleanExpression::And(box left, box right) => {
self.current.push(left);
self.current.push(right);
self.next()
}
n => Some(n),
})
.flatten()
}
}
impl<'ast, T> BooleanExpression<'ast, T> {
pub fn into_conjunction_iterator(self) -> ConjunctionIterator<Self> {
ConjunctionIterator {
current: vec![self],
}
}
}
// Downcasts
impl<'ast, T> TryFrom<ZirExpression<'ast, T>> for FieldElementExpression<'ast, T> {
type Error = ();

View file

@ -1,6 +1,6 @@
[package]
name = "zokrates_core_test"
version = "0.1.4"
version = "0.1.5"
authors = ["schaeff <thibaut@schaeff.fr>"]
edition = "2018"

View file

@ -9,8 +9,8 @@
"output": {
"Err": {
"UnsatisfiedConstraint": {
"left": "1",
"right": "0"
"left": "0",
"right": "1"
}
}
}

View file

@ -1,6 +1,6 @@
[package]
name = "zokrates_field"
version = "0.3.7"
version = "0.3.8"
authors = ["Thibaut Schaeffer <thibaut@schaeff.fr>", "Guillaume Ballet <gballet@gmail.com>"]
edition = "2018"

129
zokrates_js/Cargo.lock generated
View file

@ -24,6 +24,15 @@ dependencies = [
"memchr",
]
[[package]]
name = "arrayvec"
version = "0.4.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cd9fd44efafa8690358b7408d253adf110036b88f55672a933f01d616ad9b1b9"
dependencies = [
"nodrop",
]
[[package]]
name = "autocfg"
version = "1.0.0"
@ -37,7 +46,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "46254cf2fdcdf1badb5934448c1bcbe046a56537b3987d96c51a7afc5d03f293"
dependencies = [
"addr2line",
"cfg-if",
"cfg-if 0.1.10",
"libc",
"miniz_oxide",
"object",
@ -52,7 +61,7 @@ checksum = "a5ca1343d8690bb4d62e0665116bd4f109e33a642f86908ed107d226a402b0ef"
dependencies = [
"bit-vec",
"byteorder",
"cfg-if",
"cfg-if 0.1.10",
"futures",
"num_cpus",
"pairing_ce",
@ -87,6 +96,17 @@ version = "0.6.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5f0dc55f2d8a1a85650ac47858bb001b4c0dd73d79e3c455a842925e68d29cd3"
[[package]]
name = "blake2-rfc_bellman_edition"
version = "0.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fdc60350286c7c3db13b98e91dbe5c8b6830a6821bc20af5b0c310ce94d74915"
dependencies = [
"arrayvec",
"byteorder",
"constant_time_eq",
]
[[package]]
name = "block-buffer"
version = "0.7.3"
@ -144,16 +164,34 @@ version = "0.1.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822"
[[package]]
name = "cfg-if"
version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
[[package]]
name = "console_error_panic_hook"
version = "0.1.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b8d976903543e0c48546a91908f21588a680a8c8f984df9a5d69feccb2b2a211"
dependencies = [
"cfg-if",
"cfg-if 0.1.10",
"wasm-bindgen",
]
[[package]]
name = "constant_time_eq"
version = "0.1.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc"
[[package]]
name = "crunchy"
version = "0.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7"
[[package]]
name = "csv"
version = "1.1.3"
@ -367,9 +405,22 @@ version = "0.1.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fc587bc0ec293155d5bfa6b9891ec18a1e330c234f896ea47fbada4cadbe47e6"
dependencies = [
"cfg-if",
"cfg-if 0.1.10",
"libc",
"wasi",
"wasi 0.9.0+wasi-snapshot-preview1",
]
[[package]]
name = "getrandom"
version = "0.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c9495705279e7140bf035dde1f6e750c162df8b625267cd52cc44e0b156732c8"
dependencies = [
"cfg-if 1.0.0",
"js-sys",
"libc",
"wasi 0.10.2+wasi-snapshot-preview1",
"wasm-bindgen",
]
[[package]]
@ -435,7 +486,7 @@ version = "0.4.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "14b6052be84e6b71ab17edffc2eeabf5c2c3ae1fdb464aae35ac50c67a44e1f7"
dependencies = [
"cfg-if",
"cfg-if 0.1.10",
]
[[package]]
@ -459,6 +510,12 @@ dependencies = [
"adler",
]
[[package]]
name = "nodrop"
version = "0.1.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "72ef4a56884ca558e5ddb05a1d1e7e1bfd9a68d9ed024c21704cc98872dae1bb"
[[package]]
name = "num"
version = "0.1.42"
@ -703,7 +760,7 @@ version = "0.7.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03"
dependencies = [
"getrandom",
"getrandom 0.1.15",
"libc",
"rand_chacha",
"rand_core 0.5.1",
@ -741,7 +798,7 @@ version = "0.5.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19"
dependencies = [
"getrandom",
"getrandom 0.1.15",
]
[[package]]
@ -811,6 +868,23 @@ version = "1.0.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "71d301d4193d031abdd79ff7e3dd721168a9572ef3fe51a1517aba235bd8f86e"
[[package]]
name = "sapling-crypto_ce"
version = "0.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1c4ff5309ec3e4bd800ad4ab3f71e9b76e9ea81c9f0eda6efa16008afbe440b3"
dependencies = [
"bellman_ce",
"blake2-rfc_bellman_edition",
"byteorder",
"digest",
"rand 0.4.6",
"serde",
"serde_derive",
"sha2",
"tiny-keccak",
]
[[package]]
name = "serde"
version = "1.0.114"
@ -924,6 +998,15 @@ dependencies = [
"lazy_static",
]
[[package]]
name = "tiny-keccak"
version = "2.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2c9d3793400a45f954c52e73d068316d76b6f4e36977e3fcebb13a2721e80237"
dependencies = [
"crunchy",
]
[[package]]
name = "typed-arena"
version = "1.7.0"
@ -978,13 +1061,19 @@ version = "0.9.0+wasi-snapshot-preview1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519"
[[package]]
name = "wasi"
version = "0.10.2+wasi-snapshot-preview1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6"
[[package]]
name = "wasm-bindgen"
version = "0.2.65"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f3edbcc9536ab7eababcc6d2374a0b7bfe13a2b6d562c5e07f370456b1a8f33d"
dependencies = [
"cfg-if",
"cfg-if 0.1.10",
"serde",
"serde_json",
"wasm-bindgen-macro",
@ -1068,7 +1157,7 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
[[package]]
name = "zokrates_abi"
version = "0.1.2"
version = "0.1.3"
dependencies = [
"serde",
"serde_derive",
@ -1083,13 +1172,14 @@ version = "0.1.0"
[[package]]
name = "zokrates_core"
version = "0.5.2"
version = "0.5.3"
dependencies = [
"bellman_ce",
"bincode 0.8.0",
"cfg-if",
"cfg-if 0.1.10",
"csv",
"ff_ce 0.9.0",
"getrandom 0.2.2",
"hex",
"lazy_static",
"num",
@ -1103,10 +1193,19 @@ dependencies = [
"serde_json",
"typed-arena",
"zokrates_common",
"zokrates_embed",
"zokrates_field",
"zokrates_pest_ast",
]
[[package]]
name = "zokrates_embed"
version = "0.1.1"
dependencies = [
"bellman_ce",
"sapling-crypto_ce",
]
[[package]]
name = "zokrates_field"
version = "0.3.7"
@ -1125,7 +1224,7 @@ dependencies = [
[[package]]
name = "zokrates_js"
version = "1.0.26"
version = "1.0.27"
dependencies = [
"bincode 1.3.1",
"console_error_panic_hook",
@ -1141,7 +1240,7 @@ dependencies = [
[[package]]
name = "zokrates_parser"
version = "0.1.5"
version = "0.1.6"
dependencies = [
"pest",
"pest_derive",
@ -1149,7 +1248,7 @@ dependencies = [
[[package]]
name = "zokrates_pest_ast"
version = "0.1.4"
version = "0.1.5"
dependencies = [
"from-pest",
"lazy_static",

View file

@ -1,6 +1,6 @@
[package]
name = "zokrates_js"
version = "1.0.27"
version = "1.0.28"
authors = ["Darko Macesic"]
edition = "2018"

View file

@ -1,6 +1,6 @@
{
"name": "zokrates-js",
"version": "1.0.27",
"version": "1.0.28",
"lockfileVersion": 1,
"requires": true,
"dependencies": {

View file

@ -2,7 +2,7 @@
"name": "zokrates-js",
"main": "index.js",
"author": "Darko Macesic <darem966@gmail.com>",
"version": "1.0.27",
"version": "1.0.28",
"keywords": [
"zokrates",
"wasm-bindgen",

View file

@ -36,8 +36,8 @@ pub struct ComputationResult {
}
#[inline]
fn deserialize_program(value: &Vec<u8>) -> Result<ir::Prog<Bn128Field>, JsValue> {
deserialize(&value)
fn deserialize_program(value: &[u8]) -> Result<ir::Prog<Bn128Field>, JsValue> {
deserialize(value)
.map_err(|err| JsValue::from_str(&format!("Could not deserialize program: {}", err)))
}
@ -125,11 +125,9 @@ pub fn compile(
}
#[wasm_bindgen]
pub fn compute_witness(artifacts: JsValue, args: JsValue) -> Result<JsValue, JsValue> {
let result: CompilationResult = artifacts.into_serde().unwrap();
let program_flattened = deserialize_program(&result.program)?;
let abi: Abi = serde_json::from_str(result.abi.as_str())
pub fn compute_witness(program: &[u8], abi: JsValue, args: JsValue) -> Result<JsValue, JsValue> {
let program_flattened = deserialize_program(program)?;
let abi: Abi = serde_json::from_str(abi.as_string().unwrap().as_str())
.map_err(|err| JsValue::from_str(&format!("Could not deserialize abi: {}", err)))?;
let signature: Signature = abi.signature();
@ -157,9 +155,8 @@ pub fn compute_witness(artifacts: JsValue, args: JsValue) -> Result<JsValue, JsV
}
#[wasm_bindgen]
pub fn setup(program: JsValue) -> Result<JsValue, JsValue> {
let input: Vec<u8> = program.into_serde().unwrap();
let program_flattened = deserialize_program(&input)?;
pub fn setup(program: &[u8]) -> Result<JsValue, JsValue> {
let program_flattened = deserialize_program(program)?;
let keypair = <Bellman as Backend<Bn128Field, G16>>::setup(program_flattened);
Ok(JsValue::from_serde(&keypair).unwrap())
}
@ -178,19 +175,17 @@ pub fn export_solidity_verifier(vk: JsValue, abi_version: JsValue) -> Result<JsV
}
#[wasm_bindgen]
pub fn generate_proof(program: JsValue, witness: JsValue, pk: JsValue) -> Result<JsValue, JsValue> {
let input: Vec<u8> = program.into_serde().unwrap();
let program_flattened = deserialize_program(&input)?;
pub fn generate_proof(program: &[u8], witness: JsValue, pk: &[u8]) -> Result<JsValue, JsValue> {
let program_flattened = deserialize_program(program)?;
let str_witness = witness.as_string().unwrap();
let ir_witness: ir::Witness<Bn128Field> = ir::Witness::read(str_witness.as_bytes())
.map_err(|err| JsValue::from_str(&format!("Could not read witness: {}", err)))?;
let proving_key: Vec<u8> = pk.into_serde().unwrap();
let proof = <Bellman as Backend<Bn128Field, G16>>::generate_proof(
program_flattened,
ir_witness,
proving_key,
pk.to_vec(),
);
Ok(JsValue::from_serde(&proof).unwrap())

View file

@ -137,6 +137,7 @@ describe('tests', function() {
assert(this.zokrates.verify(keypair.vk, proof) == true);
})
});
it('should fail', function() {
assert.doesNotThrow(() => {
const code = 'def main(private field a) -> field: return a * a';

View file

@ -46,7 +46,7 @@ module.exports = (dep) => {
};
const { program, abi } = zokrates.compile(source, location, callback, createConfig(config));
return {
program: Array.from(program),
program: new Uint8Array(program),
abi
}
},
@ -54,11 +54,12 @@ module.exports = (dep) => {
const { vk, pk } = zokrates.setup(program);
return {
vk,
pk: Array.from(pk)
pk: new Uint8Array(pk)
};
},
computeWitness: (artifacts, args) => {
return zokrates.compute_witness(artifacts, JSON.stringify(Array.from(args)));
const { program, abi } = artifacts;
return zokrates.compute_witness(program, abi, JSON.stringify(Array.from(args)));
},
exportSolidityVerifier: (verificationKey, abiVersion) => {
return zokrates.export_solidity_verifier(verificationKey, abiVersion);

View file

@ -53,224 +53,224 @@ mod tests {
mod rules {
use super::*;
#[test]
fn parse_valid_identifier() {
parses_to! {
parser: ZoKratesParser,
input: "valididentifier_01",
rule: Rule::identifier,
tokens: [
identifier(0, 18)
]
};
}
// #[test]
// fn parse_valid_identifier() {
// parses_to! {
// parser: ZoKratesParser,
// input: "valididentifier_01",
// rule: Rule::identifier,
// tokens: [
// identifier(0, 18)
// ]
// };
// }
#[test]
fn parse_parameter_list() {
parses_to! {
parser: ZoKratesParser,
input: "def foo(field a) -> (field, field): return 1
",
rule: Rule::function_definition,
tokens: [
function_definition(0, 45, [
identifier(4, 7),
// parameter_list is not created (silent rule)
parameter(8, 15, [
ty(8, 13, [
ty_basic(8, 13, [
ty_field(8, 13)
])
]),
identifier(14, 15)
]),
// type_list is not created (silent rule)
ty(21, 26, [
ty_basic(21, 26, [
ty_field(21, 26)
])
]),
ty(28, 33, [
ty_basic(28, 33, [
ty_field(28, 33)
])
]),
statement(36, 45, [
return_statement(36, 44, [
expression(43, 44, [
term(43, 44, [
primary_expression(43, 44, [
constant(43, 44, [
decimal_number(43, 44)
])
])
])
])
])
])
])
]
};
}
// #[test]
// fn parse_parameter_list() {
// parses_to! {
// parser: ZoKratesParser,
// input: "def foo(field a) -> (field, field): return 1
// ",
// rule: Rule::function_definition,
// tokens: [
// function_definition(0, 45, [
// identifier(4, 7),
// // parameter_list is not created (silent rule)
// parameter(8, 15, [
// ty(8, 13, [
// ty_basic(8, 13, [
// ty_field(8, 13)
// ])
// ]),
// identifier(14, 15)
// ]),
// // type_list is not created (silent rule)
// ty(21, 26, [
// ty_basic(21, 26, [
// ty_field(21, 26)
// ])
// ]),
// ty(28, 33, [
// ty_basic(28, 33, [
// ty_field(28, 33)
// ])
// ]),
// statement(36, 45, [
// return_statement(36, 44, [
// expression(43, 44, [
// term(43, 44, [
// primary_expression(43, 44, [
// constant(43, 44, [
// decimal_number(43, 44)
// ])
// ])
// ])
// ])
// ])
// ])
// ])
// ]
// };
// }
#[test]
fn parse_single_def_to_multi() {
parses_to! {
parser: ZoKratesParser,
input: r#"a = foo()
"#,
rule: Rule::statement,
tokens: [
statement(0, 22, [
definition_statement(0, 9, [
optionally_typed_assignee(0, 2, [
assignee(0, 2, [
identifier(0, 1)
])
]),
expression(4, 9, [
term(4, 9, [
postfix_expression(4, 9, [
identifier(4, 7),
access(7, 9, [
call_access(7, 9)
])
])
])
]),
])
])
]
};
}
// #[test]
// fn parse_single_def_to_multi() {
// parses_to! {
// parser: ZoKratesParser,
// input: r#"a = foo()
// "#,
// rule: Rule::statement,
// tokens: [
// statement(0, 22, [
// definition_statement(0, 9, [
// optionally_typed_assignee(0, 2, [
// assignee(0, 2, [
// identifier(0, 1)
// ])
// ]),
// expression(4, 9, [
// term(4, 9, [
// postfix_expression(4, 9, [
// identifier(4, 7),
// access(7, 9, [
// call_access(7, 9)
// ])
// ])
// ])
// ]),
// ])
// ])
// ]
// };
// }
#[test]
fn parse_field_def_to_multi() {
parses_to! {
parser: ZoKratesParser,
input: r#"field a = foo()
"#,
rule: Rule::statement,
tokens: [
statement(0, 28, [
definition_statement(0, 15, [
optionally_typed_assignee(0, 8, [
ty(0, 5, [
ty_basic(0, 5, [
ty_field(0, 5)
])
]),
assignee(6, 8, [
identifier(6, 7)
])
]),
expression(10, 15, [
term(10, 15, [
postfix_expression(10, 15, [
identifier(10, 13),
access(13, 15, [
call_access(13, 15)
])
])
])
]),
])
])
]
};
}
// #[test]
// fn parse_field_def_to_multi() {
// parses_to! {
// parser: ZoKratesParser,
// input: r#"field a = foo()
// "#,
// rule: Rule::statement,
// tokens: [
// statement(0, 28, [
// definition_statement(0, 15, [
// optionally_typed_assignee(0, 8, [
// ty(0, 5, [
// ty_basic(0, 5, [
// ty_field(0, 5)
// ])
// ]),
// assignee(6, 8, [
// identifier(6, 7)
// ])
// ]),
// expression(10, 15, [
// term(10, 15, [
// postfix_expression(10, 15, [
// identifier(10, 13),
// access(13, 15, [
// call_access(13, 15)
// ])
// ])
// ])
// ]),
// ])
// ])
// ]
// };
// }
#[test]
fn parse_u8_def_to_multi() {
parses_to! {
parser: ZoKratesParser,
input: r#"u32 a = foo()
"#,
rule: Rule::statement,
tokens: [
statement(0, 26, [
definition_statement(0, 13, [
optionally_typed_assignee(0, 6, [
ty(0, 3, [
ty_basic(0, 3, [
ty_u32(0, 3)
])
]),
assignee(4, 6, [
identifier(4, 5)
])
]),
expression(8, 13, [
term(8, 13, [
postfix_expression(8, 13, [
identifier(8, 11),
access(11, 13, [
call_access(11, 13)
])
])
])
]),
])
])
]
};
}
// #[test]
// fn parse_u8_def_to_multi() {
// parses_to! {
// parser: ZoKratesParser,
// input: r#"u32 a = foo()
// "#,
// rule: Rule::statement,
// tokens: [
// statement(0, 26, [
// definition_statement(0, 13, [
// optionally_typed_assignee(0, 6, [
// ty(0, 3, [
// ty_basic(0, 3, [
// ty_u32(0, 3)
// ])
// ]),
// assignee(4, 6, [
// identifier(4, 5)
// ])
// ]),
// expression(8, 13, [
// term(8, 13, [
// postfix_expression(8, 13, [
// identifier(8, 11),
// access(11, 13, [
// call_access(11, 13)
// ])
// ])
// ])
// ]),
// ])
// ])
// ]
// };
// }
#[test]
fn parse_invalid_identifier() {
fails_with! {
parser: ZoKratesParser,
input: "0_invalididentifier",
rule: Rule::identifier,
positives: vec![Rule::identifier],
negatives: vec![],
pos: 0
};
}
// #[test]
// fn parse_invalid_identifier() {
// fails_with! {
// parser: ZoKratesParser,
// input: "0_invalididentifier",
// rule: Rule::identifier,
// positives: vec![Rule::identifier],
// negatives: vec![],
// pos: 0
// };
// }
#[test]
fn parse_struct_def() {
parses_to! {
parser: ZoKratesParser,
input: "struct Foo { field foo\n field[2] bar }
",
rule: Rule::ty_struct_definition,
tokens: [
ty_struct_definition(0, 39, [
identifier(7, 10),
struct_field(13, 22, [
ty(13, 18, [
ty_basic(13, 18, [
ty_field(13, 18)
])
]),
identifier(19, 22)
]),
struct_field(24, 36, [
ty(24, 33, [
ty_array(24, 33, [
ty_basic_or_struct(24, 29, [
ty_basic(24, 29, [
ty_field(24, 29)
])
]),
expression(30, 31, [
term(30, 31, [
primary_expression(30, 31, [
constant(30, 31, [
decimal_number(30, 31)
])
])
])
])
])
]),
identifier(33, 36)
])
])
]
};
}
// #[test]
// fn parse_struct_def() {
// parses_to! {
// parser: ZoKratesParser,
// input: "struct Foo { field foo\n field[2] bar }
// ",
// rule: Rule::ty_struct_definition,
// tokens: [
// ty_struct_definition(0, 39, [
// identifier(7, 10),
// struct_field(13, 22, [
// ty(13, 18, [
// ty_basic(13, 18, [
// ty_field(13, 18)
// ])
// ]),
// identifier(19, 22)
// ]),
// struct_field(24, 36, [
// ty(24, 33, [
// ty_array(24, 33, [
// ty_basic_or_struct(24, 29, [
// ty_basic(24, 29, [
// ty_field(24, 29)
// ])
// ]),
// expression(30, 31, [
// term(30, 31, [
// primary_expression(30, 31, [
// constant(30, 31, [
// decimal_number(30, 31)
// ])
// ])
// ])
// ])
// ])
// ]),
// identifier(33, 36)
// ])
// ])
// ]
// };
// }
#[test]
fn parse_invalid_identifier_because_keyword() {

View file

@ -1,6 +1,6 @@
[package]
name = "zokrates_stdlib"
version = "0.1.7"
version = "0.1.8"
authors = ["Stefan Deml <stefandeml@gmail.com>", "schaeff <thibaut@schaeff.fr>"]
edition = "2018"

View file

@ -1,6 +1,6 @@
[package]
name = "zokrates_test"
version = "0.1.4"
version = "0.1.5"
authors = ["schaeff <thibaut@schaeff.fr>"]
edition = "2018"