fix tests
This commit is contained in:
parent
2b9c1e8854
commit
f1c7d76cf5
37 changed files with 538 additions and 555 deletions
|
@ -1,11 +1,9 @@
|
||||||
def func<N>() -> bool {
|
def func<N>() -> bool {
|
||||||
for u32 i in 0..N {}
|
|
||||||
|
|
||||||
u64[N] y = [...[0; N-1], 1]; // the rhs should *not* be reduced to [1] because the spread is not empty
|
u64[N] y = [...[0; N-1], 1]; // the rhs should *not* be reduced to [1] because the spread is not empty
|
||||||
u64 q = 0;
|
u64 q = 0;
|
||||||
|
|
||||||
for u32 i in 0..N {
|
for u32 i in 0..N {
|
||||||
q = y[i]
|
q = y[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
|
|
@ -4,7 +4,7 @@ import "hashes/utils/256bitsDirectionHelper" as multiplex;
|
||||||
const u32 DEPTH = 3;
|
const u32 DEPTH = 3;
|
||||||
|
|
||||||
def select(bool condition, u32[8] left, u32[8] right) -> (u32[8], u32[8]) {
|
def select(bool condition, u32[8] left, u32[8] right) -> (u32[8], u32[8]) {
|
||||||
return condition ? right : left, condition ? left : right
|
return condition ? right : left, condition ? left : right;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Merke-Tree inclusion proof for tree depth 4 using sha256
|
// Merke-Tree inclusion proof for tree depth 4 using sha256
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
// simple ifelse example
|
// simple conditional example
|
||||||
// x = 2 -> 2 + 1 + 2**3 = 11
|
// x = 2 -> 2 + 1 + 2**3 = 11
|
||||||
// x = 5 -> 5 + 5 + 5**3 = 135
|
// x = 5 -> 5 + 5 + 5**3 = 135
|
||||||
def main(field x) -> field {
|
def main(field x) -> field {
|
||||||
field y = x < 3 ? 1 : 5;
|
field y = x < 3 ? 1 : 5;
|
||||||
field z = y < x ? x**3 : y**3:
|
field z = y < x ? x**3 : y**3;
|
||||||
return x + y + z;
|
return x + y + z;
|
||||||
}
|
}
|
||||||
|
|
|
@ -906,7 +906,7 @@ mod tests {
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn return_forty_two() {
|
fn return_forty_two() {
|
||||||
let source = "def main() -> field: return 42";
|
let source = "def main() -> field { return 42; }";
|
||||||
let ast = pest::generate_ast(source).unwrap();
|
let ast = pest::generate_ast(source).unwrap();
|
||||||
let expected: absy::Module = absy::Module {
|
let expected: absy::Module = absy::Module {
|
||||||
symbols: vec![absy::SymbolDeclaration {
|
symbols: vec![absy::SymbolDeclaration {
|
||||||
|
@ -937,7 +937,7 @@ mod tests {
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn return_true() {
|
fn return_true() {
|
||||||
let source = "def main() -> bool: return true";
|
let source = "def main() -> bool { return true; }";
|
||||||
let ast = pest::generate_ast(source).unwrap();
|
let ast = pest::generate_ast(source).unwrap();
|
||||||
let expected: absy::Module = absy::Module {
|
let expected: absy::Module = absy::Module {
|
||||||
symbols: vec![absy::SymbolDeclaration {
|
symbols: vec![absy::SymbolDeclaration {
|
||||||
|
@ -966,7 +966,7 @@ mod tests {
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn arguments() {
|
fn arguments() {
|
||||||
let source = "def main(private field a, bool b) -> field: return 42";
|
let source = "def main(private field a, bool b) -> field { return 42; }";
|
||||||
let ast = pest::generate_ast(source).unwrap();
|
let ast = pest::generate_ast(source).unwrap();
|
||||||
|
|
||||||
let expected: absy::Module = absy::Module {
|
let expected: absy::Module = absy::Module {
|
||||||
|
@ -1020,7 +1020,7 @@ mod tests {
|
||||||
mod types {
|
mod types {
|
||||||
use super::*;
|
use super::*;
|
||||||
|
|
||||||
/// Helper method to generate the ast for `def main(private {ty} a): return` which we use to check ty
|
/// Helper method to generate the ast for `def main(private {ty} a) { return; }` which we use to check ty
|
||||||
fn wrap(ty: UnresolvedType<'static>) -> absy::Module<'static> {
|
fn wrap(ty: UnresolvedType<'static>) -> absy::Module<'static> {
|
||||||
absy::Module {
|
absy::Module {
|
||||||
symbols: vec![absy::SymbolDeclaration {
|
symbols: vec![absy::SymbolDeclaration {
|
||||||
|
@ -1084,7 +1084,7 @@ mod tests {
|
||||||
];
|
];
|
||||||
|
|
||||||
for (ty, expected) in vectors {
|
for (ty, expected) in vectors {
|
||||||
let source = format!("def main(private {} a): return", ty);
|
let source = format!("def main(private {} a) {{ return; }}", ty);
|
||||||
let expected = wrap(expected);
|
let expected = wrap(expected);
|
||||||
let ast = pest::generate_ast(&source).unwrap();
|
let ast = pest::generate_ast(&source).unwrap();
|
||||||
assert_eq!(absy::Module::from(ast), expected);
|
assert_eq!(absy::Module::from(ast), expected);
|
||||||
|
@ -1184,7 +1184,7 @@ mod tests {
|
||||||
];
|
];
|
||||||
|
|
||||||
for (source, expected) in vectors {
|
for (source, expected) in vectors {
|
||||||
let source = format!("def main(): return {}", source);
|
let source = format!("def main() {{ return {}; }}", source);
|
||||||
let expected = wrap(expected);
|
let expected = wrap(expected);
|
||||||
let ast = pest::generate_ast(&source).unwrap();
|
let ast = pest::generate_ast(&source).unwrap();
|
||||||
assert_eq!(absy::Module::from(ast), expected);
|
assert_eq!(absy::Module::from(ast), expected);
|
||||||
|
@ -1194,7 +1194,7 @@ mod tests {
|
||||||
#[test]
|
#[test]
|
||||||
fn call_array_element() {
|
fn call_array_element() {
|
||||||
// a call after an array access should be accepted
|
// a call after an array access should be accepted
|
||||||
let source = "def main(): return a[2](3)";
|
let source = "def main() { return a[2](3); }";
|
||||||
let ast = pest::generate_ast(source).unwrap();
|
let ast = pest::generate_ast(source).unwrap();
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
absy::Module::from(ast),
|
absy::Module::from(ast),
|
||||||
|
@ -1215,7 +1215,7 @@ mod tests {
|
||||||
#[test]
|
#[test]
|
||||||
fn call_call_result() {
|
fn call_call_result() {
|
||||||
// a call after a call should be accepted
|
// a call after a call should be accepted
|
||||||
let source = "def main(): return a(2)(3)";
|
let source = "def main() { return a(2)(3); }";
|
||||||
|
|
||||||
let ast = pest::generate_ast(source).unwrap();
|
let ast = pest::generate_ast(source).unwrap();
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
|
|
|
@ -316,10 +316,11 @@ mod test {
|
||||||
#[test]
|
#[test]
|
||||||
fn no_resolver_with_imports() {
|
fn no_resolver_with_imports() {
|
||||||
let source = r#"
|
let source = r#"
|
||||||
import "./path/to/file" as foo
|
import "./path/to/file" as foo;
|
||||||
def main() -> field:
|
def main() -> field {
|
||||||
return foo()
|
return foo();
|
||||||
"#
|
}
|
||||||
|
"#
|
||||||
.to_string();
|
.to_string();
|
||||||
let arena = Arena::new();
|
let arena = Arena::new();
|
||||||
let res: Result<CompilationArtifacts<Bn128Field, _>, CompileErrors> = compile(
|
let res: Result<CompilationArtifacts<Bn128Field, _>, CompileErrors> = compile(
|
||||||
|
@ -341,9 +342,10 @@ mod test {
|
||||||
#[test]
|
#[test]
|
||||||
fn no_resolver_without_imports() {
|
fn no_resolver_without_imports() {
|
||||||
let source = r#"
|
let source = r#"
|
||||||
def main() -> field:
|
def main() -> field {
|
||||||
return 1
|
return 1;
|
||||||
"#
|
}
|
||||||
|
"#
|
||||||
.to_string();
|
.to_string();
|
||||||
|
|
||||||
let arena = Arena::new();
|
let arena = Arena::new();
|
||||||
|
@ -368,10 +370,10 @@ mod test {
|
||||||
// when importing types and renaming them, we use the canonical struct names in the ABI
|
// when importing types and renaming them, we use the canonical struct names in the ABI
|
||||||
|
|
||||||
// // main.zok
|
// // main.zok
|
||||||
// from foo import Foo as FooMain
|
// from foo import Foo as FooMain;
|
||||||
//
|
//
|
||||||
// // foo.zok
|
// // foo.zok
|
||||||
// from bar import Bar as BarFoo
|
// from bar import Bar as BarFoo;
|
||||||
// struct Foo { BarFoo b }
|
// struct Foo { BarFoo b }
|
||||||
//
|
//
|
||||||
// // bar.zok
|
// // bar.zok
|
||||||
|
@ -381,9 +383,10 @@ mod test {
|
||||||
// Foo { Bar b }
|
// Foo { Bar b }
|
||||||
|
|
||||||
let main = r#"
|
let main = r#"
|
||||||
from "foo" import Foo as FooMain
|
from "foo" import Foo as FooMain;
|
||||||
def main(FooMain f):
|
def main(FooMain f) {
|
||||||
return
|
return;
|
||||||
|
}
|
||||||
"#;
|
"#;
|
||||||
|
|
||||||
struct CustomResolver;
|
struct CustomResolver;
|
||||||
|
@ -398,9 +401,10 @@ def main(FooMain f):
|
||||||
if loc == "main" {
|
if loc == "main" {
|
||||||
Ok((
|
Ok((
|
||||||
r#"
|
r#"
|
||||||
from "foo" import Foo as FooMain
|
from "foo" import Foo as FooMain;
|
||||||
def main(FooMain f):
|
def main(FooMain f) {
|
||||||
return
|
return;
|
||||||
|
}
|
||||||
"#
|
"#
|
||||||
.into(),
|
.into(),
|
||||||
"main".into(),
|
"main".into(),
|
||||||
|
@ -408,9 +412,9 @@ def main(FooMain f):
|
||||||
} else if loc == "foo" {
|
} else if loc == "foo" {
|
||||||
Ok((
|
Ok((
|
||||||
r#"
|
r#"
|
||||||
from "bar" import Bar as BarFoo
|
from "bar" import Bar as BarFoo;
|
||||||
struct Foo {
|
struct Foo {
|
||||||
BarFoo b
|
BarFoo b;
|
||||||
}
|
}
|
||||||
"#
|
"#
|
||||||
.into(),
|
.into(),
|
||||||
|
@ -419,7 +423,7 @@ struct Foo {
|
||||||
} else if loc == "bar" {
|
} else if loc == "bar" {
|
||||||
Ok((
|
Ok((
|
||||||
r#"
|
r#"
|
||||||
struct Bar { field a }
|
struct Bar { field a; }
|
||||||
"#
|
"#
|
||||||
.into(),
|
.into(),
|
||||||
"bar".into(),
|
"bar".into(),
|
||||||
|
|
|
@ -88,9 +88,7 @@ impl<'ast, T: Field> Folder<'ast, T> for ConditionRedefiner<'ast, T> {
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
use super::*;
|
use super::*;
|
||||||
use crate::typed_absy::{
|
use crate::typed_absy::{Block, BooleanExpression, Conditional, FieldElementExpression, Type};
|
||||||
Block, BooleanExpression, Conditional, ConditionalKind, FieldElementExpression, Type,
|
|
||||||
};
|
|
||||||
use zokrates_field::Bn128Field;
|
use zokrates_field::Bn128Field;
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
|
@ -104,7 +102,6 @@ mod tests {
|
||||||
BooleanExpression::Value(true),
|
BooleanExpression::Value(true),
|
||||||
FieldElementExpression::Number(Bn128Field::from(1)),
|
FieldElementExpression::Number(Bn128Field::from(1)),
|
||||||
FieldElementExpression::Number(Bn128Field::from(2)),
|
FieldElementExpression::Number(Bn128Field::from(2)),
|
||||||
ConditionalKind::IfElse,
|
|
||||||
)
|
)
|
||||||
.into(),
|
.into(),
|
||||||
);
|
);
|
||||||
|
@ -125,7 +122,6 @@ mod tests {
|
||||||
BooleanExpression::Identifier("c".into()),
|
BooleanExpression::Identifier("c".into()),
|
||||||
FieldElementExpression::Number(Bn128Field::from(1)),
|
FieldElementExpression::Number(Bn128Field::from(1)),
|
||||||
FieldElementExpression::Number(Bn128Field::from(2)),
|
FieldElementExpression::Number(Bn128Field::from(2)),
|
||||||
ConditionalKind::IfElse,
|
|
||||||
)
|
)
|
||||||
.into(),
|
.into(),
|
||||||
);
|
);
|
||||||
|
@ -153,7 +149,6 @@ mod tests {
|
||||||
condition.clone(),
|
condition.clone(),
|
||||||
FieldElementExpression::Number(Bn128Field::from(1)),
|
FieldElementExpression::Number(Bn128Field::from(1)),
|
||||||
FieldElementExpression::Number(Bn128Field::from(2)),
|
FieldElementExpression::Number(Bn128Field::from(2)),
|
||||||
ConditionalKind::IfElse,
|
|
||||||
)
|
)
|
||||||
.into(),
|
.into(),
|
||||||
);
|
);
|
||||||
|
@ -173,7 +168,6 @@ mod tests {
|
||||||
BooleanExpression::Identifier(CoreIdentifier::Condition(0).into()),
|
BooleanExpression::Identifier(CoreIdentifier::Condition(0).into()),
|
||||||
FieldElementExpression::Number(Bn128Field::from(1)),
|
FieldElementExpression::Number(Bn128Field::from(1)),
|
||||||
FieldElementExpression::Number(Bn128Field::from(2)),
|
FieldElementExpression::Number(Bn128Field::from(2)),
|
||||||
ConditionalKind::IfElse,
|
|
||||||
)
|
)
|
||||||
.into(),
|
.into(),
|
||||||
),
|
),
|
||||||
|
@ -210,10 +204,8 @@ mod tests {
|
||||||
condition_1.clone(),
|
condition_1.clone(),
|
||||||
FieldElementExpression::Number(Bn128Field::from(1)),
|
FieldElementExpression::Number(Bn128Field::from(1)),
|
||||||
FieldElementExpression::Number(Bn128Field::from(2)),
|
FieldElementExpression::Number(Bn128Field::from(2)),
|
||||||
ConditionalKind::IfElse,
|
|
||||||
),
|
),
|
||||||
FieldElementExpression::Number(Bn128Field::from(3)),
|
FieldElementExpression::Number(Bn128Field::from(3)),
|
||||||
ConditionalKind::IfElse,
|
|
||||||
)
|
)
|
||||||
.into(),
|
.into(),
|
||||||
);
|
);
|
||||||
|
@ -239,10 +231,8 @@ mod tests {
|
||||||
BooleanExpression::Identifier(CoreIdentifier::Condition(1).into()),
|
BooleanExpression::Identifier(CoreIdentifier::Condition(1).into()),
|
||||||
FieldElementExpression::Number(Bn128Field::from(1)),
|
FieldElementExpression::Number(Bn128Field::from(1)),
|
||||||
FieldElementExpression::Number(Bn128Field::from(2)),
|
FieldElementExpression::Number(Bn128Field::from(2)),
|
||||||
ConditionalKind::IfElse,
|
|
||||||
),
|
),
|
||||||
FieldElementExpression::Number(Bn128Field::from(3)),
|
FieldElementExpression::Number(Bn128Field::from(3)),
|
||||||
ConditionalKind::IfElse,
|
|
||||||
)
|
)
|
||||||
.into(),
|
.into(),
|
||||||
),
|
),
|
||||||
|
@ -306,7 +296,6 @@ mod tests {
|
||||||
condition_1.clone(),
|
condition_1.clone(),
|
||||||
FieldElementExpression::Number(Bn128Field::from(2)),
|
FieldElementExpression::Number(Bn128Field::from(2)),
|
||||||
FieldElementExpression::Number(Bn128Field::from(3)),
|
FieldElementExpression::Number(Bn128Field::from(3)),
|
||||||
ConditionalKind::IfElse,
|
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
FieldElementExpression::block(
|
FieldElementExpression::block(
|
||||||
|
@ -318,10 +307,8 @@ mod tests {
|
||||||
condition_2.clone(),
|
condition_2.clone(),
|
||||||
FieldElementExpression::Number(Bn128Field::from(2)),
|
FieldElementExpression::Number(Bn128Field::from(2)),
|
||||||
FieldElementExpression::Number(Bn128Field::from(3)),
|
FieldElementExpression::Number(Bn128Field::from(3)),
|
||||||
ConditionalKind::IfElse,
|
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
ConditionalKind::IfElse,
|
|
||||||
)
|
)
|
||||||
.into(),
|
.into(),
|
||||||
);
|
);
|
||||||
|
@ -358,7 +345,6 @@ mod tests {
|
||||||
condition_id_1,
|
condition_id_1,
|
||||||
FieldElementExpression::Number(Bn128Field::from(2)),
|
FieldElementExpression::Number(Bn128Field::from(2)),
|
||||||
FieldElementExpression::Number(Bn128Field::from(3)),
|
FieldElementExpression::Number(Bn128Field::from(3)),
|
||||||
ConditionalKind::IfElse,
|
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
FieldElementExpression::block(
|
FieldElementExpression::block(
|
||||||
|
@ -380,10 +366,8 @@ mod tests {
|
||||||
condition_id_2,
|
condition_id_2,
|
||||||
FieldElementExpression::Number(Bn128Field::from(2)),
|
FieldElementExpression::Number(Bn128Field::from(2)),
|
||||||
FieldElementExpression::Number(Bn128Field::from(3)),
|
FieldElementExpression::Number(Bn128Field::from(3)),
|
||||||
ConditionalKind::IfElse,
|
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
ConditionalKind::IfElse,
|
|
||||||
)
|
)
|
||||||
.into(),
|
.into(),
|
||||||
),
|
),
|
||||||
|
|
|
@ -1484,7 +1484,6 @@ mod tests {
|
||||||
BooleanExpression::Value(true),
|
BooleanExpression::Value(true),
|
||||||
FieldElementExpression::Number(Bn128Field::from(2)),
|
FieldElementExpression::Number(Bn128Field::from(2)),
|
||||||
FieldElementExpression::Number(Bn128Field::from(3)),
|
FieldElementExpression::Number(Bn128Field::from(3)),
|
||||||
ConditionalKind::IfElse,
|
|
||||||
);
|
);
|
||||||
|
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
|
@ -1499,7 +1498,6 @@ mod tests {
|
||||||
BooleanExpression::Value(false),
|
BooleanExpression::Value(false),
|
||||||
FieldElementExpression::Number(Bn128Field::from(2)),
|
FieldElementExpression::Number(Bn128Field::from(2)),
|
||||||
FieldElementExpression::Number(Bn128Field::from(3)),
|
FieldElementExpression::Number(Bn128Field::from(3)),
|
||||||
ConditionalKind::IfElse,
|
|
||||||
);
|
);
|
||||||
|
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
|
|
|
@ -789,7 +789,6 @@ impl<'ast, T> From<BigUint> for IntExpression<'ast, T> {
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
use super::*;
|
use super::*;
|
||||||
use crate::typed_absy::ConditionalKind;
|
|
||||||
use zokrates_field::Bn128Field;
|
use zokrates_field::Bn128Field;
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
|
@ -811,7 +810,7 @@ mod tests {
|
||||||
n.clone() * n.clone(),
|
n.clone() * n.clone(),
|
||||||
IntExpression::pow(n.clone(), n.clone()),
|
IntExpression::pow(n.clone(), n.clone()),
|
||||||
n.clone() / n.clone(),
|
n.clone() / n.clone(),
|
||||||
IntExpression::conditional(c.clone(), n.clone(), n.clone(), ConditionalKind::IfElse),
|
IntExpression::conditional(c.clone(), n.clone(), n.clone()),
|
||||||
IntExpression::select(n_a.clone(), i.clone()),
|
IntExpression::select(n_a.clone(), i.clone()),
|
||||||
];
|
];
|
||||||
|
|
||||||
|
@ -822,12 +821,7 @@ mod tests {
|
||||||
t.clone() * t.clone(),
|
t.clone() * t.clone(),
|
||||||
FieldElementExpression::pow(t.clone(), i.clone()),
|
FieldElementExpression::pow(t.clone(), i.clone()),
|
||||||
t.clone() / t.clone(),
|
t.clone() / t.clone(),
|
||||||
FieldElementExpression::conditional(
|
FieldElementExpression::conditional(c.clone(), t.clone(), t.clone()),
|
||||||
c.clone(),
|
|
||||||
t.clone(),
|
|
||||||
t.clone(),
|
|
||||||
ConditionalKind::IfElse,
|
|
||||||
),
|
|
||||||
FieldElementExpression::select(t_a.clone(), i.clone()),
|
FieldElementExpression::select(t_a.clone(), i.clone()),
|
||||||
];
|
];
|
||||||
|
|
||||||
|
@ -882,7 +876,7 @@ mod tests {
|
||||||
IntExpression::left_shift(n.clone(), i.clone()),
|
IntExpression::left_shift(n.clone(), i.clone()),
|
||||||
IntExpression::right_shift(n.clone(), i.clone()),
|
IntExpression::right_shift(n.clone(), i.clone()),
|
||||||
!n.clone(),
|
!n.clone(),
|
||||||
IntExpression::conditional(c.clone(), n.clone(), n.clone(), ConditionalKind::IfElse),
|
IntExpression::conditional(c.clone(), n.clone(), n.clone()),
|
||||||
IntExpression::select(n_a.clone(), i.clone()),
|
IntExpression::select(n_a.clone(), i.clone()),
|
||||||
];
|
];
|
||||||
|
|
||||||
|
@ -899,7 +893,7 @@ mod tests {
|
||||||
UExpression::left_shift(t.clone(), i.clone()),
|
UExpression::left_shift(t.clone(), i.clone()),
|
||||||
UExpression::right_shift(t.clone(), i.clone()),
|
UExpression::right_shift(t.clone(), i.clone()),
|
||||||
!t.clone(),
|
!t.clone(),
|
||||||
UExpression::conditional(c.clone(), t.clone(), t.clone(), ConditionalKind::IfElse),
|
UExpression::conditional(c.clone(), t.clone(), t.clone()),
|
||||||
UExpression::select(t_a.clone(), i.clone()),
|
UExpression::select(t_a.clone(), i.clone()),
|
||||||
];
|
];
|
||||||
|
|
||||||
|
|
|
@ -22,7 +22,7 @@
|
||||||
"left": "0",
|
"left": "0",
|
||||||
"right": "1",
|
"right": "1",
|
||||||
"error": {
|
"error": {
|
||||||
"SourceAssertion": "Assertion failed at ./tests/tests/assert_array_equality.zok:2:2"
|
"SourceAssertion": "Assertion failed at ./tests/tests/assert_array_equality.zok:2:5"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,7 +8,7 @@ struct State {
|
||||||
const State STATE = State {
|
const State STATE = State {
|
||||||
a: [1, 2],
|
a: [1, 2],
|
||||||
b: [[3, 4], [5, 6]]
|
b: [[3, 4], [5, 6]]
|
||||||
}
|
};
|
||||||
|
|
||||||
def main() -> State {
|
def main() -> State {
|
||||||
return STATE;
|
return STATE;
|
||||||
|
|
|
@ -10,7 +10,7 @@ def le<N>(bool[N] a_bits, bool[N] c_bits) -> bool {
|
||||||
size_unknown = true;
|
size_unknown = true;
|
||||||
|
|
||||||
for u32 i in 0..N {
|
for u32 i in 0..N {
|
||||||
verified_conditions = verified_conditions + c_bits[i] || (!size_unknown || !a_bits[i]) ? 1 : 0;
|
verified_conditions = verified_conditions + (c_bits[i] || (!size_unknown || !a_bits[i]) ? 1 : 0);
|
||||||
size_unknown = c_bits[i] ? size_unknown && a_bits[i] : size_unknown; // this is actually not required in the last round
|
size_unknown = c_bits[i] ? size_unknown && a_bits[i] : size_unknown; // this is actually not required in the last round
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -14,7 +14,7 @@
|
||||||
"left": "0",
|
"left": "0",
|
||||||
"right": "1",
|
"right": "1",
|
||||||
"error": {
|
"error": {
|
||||||
"SourceAssertion": "Assertion failed at ./tests/tests/panics/loop_bound.zok:2:3"
|
"SourceAssertion": "Assertion failed at ./tests/tests/panics/loop_bound.zok:2:5"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,7 +20,7 @@
|
||||||
"left": "1",
|
"left": "1",
|
||||||
"right": "21888242871839275222246405745257275088548364400416034343698204186575808495577",
|
"right": "21888242871839275222246405745257275088548364400416034343698204186575808495577",
|
||||||
"error": {
|
"error": {
|
||||||
"SourceAssertion": "Assertion failed at ./tests/tests/panics/panic_isolation.zok:18:5"
|
"SourceAssertion": "Assertion failed at ./tests/tests/panics/panic_isolation.zok:22:5"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,7 +20,7 @@
|
||||||
"left": "1",
|
"left": "1",
|
||||||
"right": "0",
|
"right": "0",
|
||||||
"error": {
|
"error": {
|
||||||
"SourceAssertion": "Assertion failed at ./tests/tests/panics/panic_isolation.zok:14:5"
|
"SourceAssertion": "Assertion failed at ./tests/tests/panics/panic_isolation.zok:17:5"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
from "EMBED" import snark_verify_bls12_377
|
from "EMBED" import snark_verify_bls12_377;
|
||||||
|
|
||||||
// Verifies a proof with 1 public input (0 inputs + 1 output)
|
// Verifies a proof with 1 public input (0 inputs + 1 output)
|
||||||
// Circuit used in this test:
|
// Circuit used in this test:
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
from "EMBED" import snark_verify_bls12_377
|
from "EMBED" import snark_verify_bls12_377;
|
||||||
|
|
||||||
// Verifies a proof with 2 public inputs (1 input + 1 output)
|
// Verifies a proof with 2 public inputs (1 input + 1 output)
|
||||||
// Circuit used in this test:
|
// Circuit used in this test:
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
from "EMBED" import snark_verify_bls12_377
|
from "EMBED" import snark_verify_bls12_377;
|
||||||
|
|
||||||
// Verifies a proof with 5 public inputs (4 inputs + 1 output)
|
// Verifies a proof with 5 public inputs (4 inputs + 1 output)
|
||||||
// Circuit used in this test:
|
// Circuit used in this test:
|
||||||
|
|
|
@ -1131,50 +1131,50 @@ mod tests {
|
||||||
SymbolDeclaration::Import(ImportDirective::Main(MainImportDirective {
|
SymbolDeclaration::Import(ImportDirective::Main(MainImportDirective {
|
||||||
source: AnyString {
|
source: AnyString {
|
||||||
value: String::from("foo"),
|
value: String::from("foo"),
|
||||||
span: Span::new(source, 8, 11).unwrap()
|
span: Span::new(source, 17, 20).unwrap()
|
||||||
},
|
},
|
||||||
alias: None,
|
alias: None,
|
||||||
span: Span::new(source, 0, 29).unwrap()
|
span: Span::new(source, 9, 21).unwrap()
|
||||||
})),
|
})),
|
||||||
SymbolDeclaration::Function(FunctionDefinition {
|
SymbolDeclaration::Function(FunctionDefinition {
|
||||||
generics: vec![],
|
generics: vec![],
|
||||||
id: IdentifierExpression {
|
id: IdentifierExpression {
|
||||||
value: String::from("main"),
|
value: String::from("main"),
|
||||||
span: Span::new(source, 33, 37).unwrap()
|
span: Span::new(source, 36, 40).unwrap()
|
||||||
},
|
},
|
||||||
parameters: vec![],
|
parameters: vec![],
|
||||||
returns: vec![Type::Basic(BasicType::Field(FieldType {
|
returns: vec![Type::Basic(BasicType::Field(FieldType {
|
||||||
span: Span::new(source, 44, 49).unwrap()
|
span: Span::new(source, 47, 52).unwrap()
|
||||||
}))],
|
}))],
|
||||||
statements: vec![Statement::Return(ReturnStatement {
|
statements: vec![Statement::Return(ReturnStatement {
|
||||||
expressions: vec![Expression::add(
|
expressions: vec![Expression::add(
|
||||||
Expression::Literal(LiteralExpression::DecimalLiteral(
|
Expression::Literal(LiteralExpression::DecimalLiteral(
|
||||||
DecimalLiteralExpression {
|
DecimalLiteralExpression {
|
||||||
value: DecimalNumber {
|
value: DecimalNumber {
|
||||||
span: Span::new(source, 59, 60).unwrap()
|
span: Span::new(source, 75, 76).unwrap()
|
||||||
},
|
},
|
||||||
suffix: None,
|
suffix: None,
|
||||||
span: Span::new(source, 59, 60).unwrap()
|
span: Span::new(source, 75, 76).unwrap()
|
||||||
}
|
}
|
||||||
)),
|
)),
|
||||||
Expression::Literal(LiteralExpression::DecimalLiteral(
|
Expression::Literal(LiteralExpression::DecimalLiteral(
|
||||||
DecimalLiteralExpression {
|
DecimalLiteralExpression {
|
||||||
value: DecimalNumber {
|
value: DecimalNumber {
|
||||||
span: Span::new(source, 63, 64).unwrap()
|
span: Span::new(source, 79, 80).unwrap()
|
||||||
},
|
},
|
||||||
suffix: None,
|
suffix: None,
|
||||||
span: Span::new(source, 63, 64).unwrap()
|
span: Span::new(source, 79, 80).unwrap()
|
||||||
}
|
}
|
||||||
)),
|
)),
|
||||||
Span::new(source, 59, 64).unwrap()
|
Span::new(source, 75, 80).unwrap()
|
||||||
)],
|
)],
|
||||||
span: Span::new(source, 52, 64).unwrap(),
|
span: Span::new(source, 68, 80).unwrap(),
|
||||||
})],
|
})],
|
||||||
span: Span::new(source, 29, source.len()).unwrap(),
|
span: Span::new(source, 32, 91).unwrap(),
|
||||||
})
|
})
|
||||||
],
|
],
|
||||||
eoi: EOI {},
|
eoi: EOI {},
|
||||||
span: Span::new(source, 0, 65).unwrap()
|
span: Span::new(source, 0, 92).unwrap()
|
||||||
})
|
})
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -1196,20 +1196,20 @@ mod tests {
|
||||||
SymbolDeclaration::Import(ImportDirective::Main(MainImportDirective {
|
SymbolDeclaration::Import(ImportDirective::Main(MainImportDirective {
|
||||||
source: AnyString {
|
source: AnyString {
|
||||||
value: String::from("foo"),
|
value: String::from("foo"),
|
||||||
span: Span::new(source, 8, 11).unwrap()
|
span: Span::new(source, 17, 20).unwrap()
|
||||||
},
|
},
|
||||||
alias: None,
|
alias: None,
|
||||||
span: Span::new(source, 0, 29).unwrap()
|
span: Span::new(source, 9, 21).unwrap()
|
||||||
})),
|
})),
|
||||||
SymbolDeclaration::Function(FunctionDefinition {
|
SymbolDeclaration::Function(FunctionDefinition {
|
||||||
generics: vec![],
|
generics: vec![],
|
||||||
id: IdentifierExpression {
|
id: IdentifierExpression {
|
||||||
value: String::from("main"),
|
value: String::from("main"),
|
||||||
span: Span::new(source, 33, 37).unwrap()
|
span: Span::new(source, 36, 40).unwrap()
|
||||||
},
|
},
|
||||||
parameters: vec![],
|
parameters: vec![],
|
||||||
returns: vec![Type::Basic(BasicType::Field(FieldType {
|
returns: vec![Type::Basic(BasicType::Field(FieldType {
|
||||||
span: Span::new(source, 44, 49).unwrap()
|
span: Span::new(source, 47, 52).unwrap()
|
||||||
}))],
|
}))],
|
||||||
statements: vec![Statement::Return(ReturnStatement {
|
statements: vec![Statement::Return(ReturnStatement {
|
||||||
expressions: vec![Expression::add(
|
expressions: vec![Expression::add(
|
||||||
|
@ -1217,9 +1217,9 @@ mod tests {
|
||||||
DecimalLiteralExpression {
|
DecimalLiteralExpression {
|
||||||
suffix: None,
|
suffix: None,
|
||||||
value: DecimalNumber {
|
value: DecimalNumber {
|
||||||
span: Span::new(source, 59, 60).unwrap()
|
span: Span::new(source, 75, 76).unwrap()
|
||||||
},
|
},
|
||||||
span: Span::new(source, 59, 60).unwrap()
|
span: Span::new(source, 75, 76).unwrap()
|
||||||
}
|
}
|
||||||
)),
|
)),
|
||||||
Expression::mul(
|
Expression::mul(
|
||||||
|
@ -1227,9 +1227,9 @@ mod tests {
|
||||||
DecimalLiteralExpression {
|
DecimalLiteralExpression {
|
||||||
suffix: None,
|
suffix: None,
|
||||||
value: DecimalNumber {
|
value: DecimalNumber {
|
||||||
span: Span::new(source, 63, 64).unwrap()
|
span: Span::new(source, 79, 80).unwrap()
|
||||||
},
|
},
|
||||||
span: Span::new(source, 63, 64).unwrap()
|
span: Span::new(source, 79, 80).unwrap()
|
||||||
}
|
}
|
||||||
)),
|
)),
|
||||||
Expression::pow(
|
Expression::pow(
|
||||||
|
@ -1237,33 +1237,33 @@ mod tests {
|
||||||
DecimalLiteralExpression {
|
DecimalLiteralExpression {
|
||||||
suffix: None,
|
suffix: None,
|
||||||
value: DecimalNumber {
|
value: DecimalNumber {
|
||||||
span: Span::new(source, 67, 68).unwrap()
|
span: Span::new(source, 83, 84).unwrap()
|
||||||
},
|
},
|
||||||
span: Span::new(source, 67, 68).unwrap()
|
span: Span::new(source, 83, 84).unwrap()
|
||||||
}
|
}
|
||||||
)),
|
)),
|
||||||
Expression::Literal(LiteralExpression::DecimalLiteral(
|
Expression::Literal(LiteralExpression::DecimalLiteral(
|
||||||
DecimalLiteralExpression {
|
DecimalLiteralExpression {
|
||||||
suffix: None,
|
suffix: None,
|
||||||
value: DecimalNumber {
|
value: DecimalNumber {
|
||||||
span: Span::new(source, 72, 73).unwrap()
|
span: Span::new(source, 88, 89).unwrap()
|
||||||
},
|
},
|
||||||
span: Span::new(source, 72, 73).unwrap()
|
span: Span::new(source, 88, 89).unwrap()
|
||||||
}
|
}
|
||||||
)),
|
)),
|
||||||
Span::new(source, 67, 73).unwrap()
|
Span::new(source, 83, 89).unwrap()
|
||||||
),
|
),
|
||||||
Span::new(source, 63, 73).unwrap()
|
Span::new(source, 79, 89).unwrap()
|
||||||
),
|
),
|
||||||
Span::new(source, 59, 73).unwrap()
|
Span::new(source, 75, 89).unwrap()
|
||||||
)],
|
)],
|
||||||
span: Span::new(source, 52, 73).unwrap(),
|
span: Span::new(source, 68, 89).unwrap(),
|
||||||
})],
|
})],
|
||||||
span: Span::new(source, 29, 74).unwrap(),
|
span: Span::new(source, 32, 100).unwrap(),
|
||||||
})
|
})
|
||||||
],
|
],
|
||||||
eoi: EOI {},
|
eoi: EOI {},
|
||||||
span: Span::new(source, 0, 74).unwrap()
|
span: Span::new(source, 0, 101).unwrap()
|
||||||
})
|
})
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -1285,20 +1285,20 @@ mod tests {
|
||||||
SymbolDeclaration::Import(ImportDirective::Main(MainImportDirective {
|
SymbolDeclaration::Import(ImportDirective::Main(MainImportDirective {
|
||||||
source: AnyString {
|
source: AnyString {
|
||||||
value: String::from("foo"),
|
value: String::from("foo"),
|
||||||
span: Span::new(source, 8, 11).unwrap()
|
span: Span::new(source, 17, 20).unwrap()
|
||||||
},
|
},
|
||||||
alias: None,
|
alias: None,
|
||||||
span: Span::new(source, 0, 29).unwrap()
|
span: Span::new(source, 9, 21).unwrap()
|
||||||
})),
|
})),
|
||||||
SymbolDeclaration::Function(FunctionDefinition {
|
SymbolDeclaration::Function(FunctionDefinition {
|
||||||
generics: vec![],
|
generics: vec![],
|
||||||
id: IdentifierExpression {
|
id: IdentifierExpression {
|
||||||
value: String::from("main"),
|
value: String::from("main"),
|
||||||
span: Span::new(source, 33, 37).unwrap()
|
span: Span::new(source, 36, 40).unwrap()
|
||||||
},
|
},
|
||||||
parameters: vec![],
|
parameters: vec![],
|
||||||
returns: vec![Type::Basic(BasicType::Field(FieldType {
|
returns: vec![Type::Basic(BasicType::Field(FieldType {
|
||||||
span: Span::new(source, 44, 49).unwrap()
|
span: Span::new(source, 47, 52).unwrap()
|
||||||
}))],
|
}))],
|
||||||
statements: vec![Statement::Return(ReturnStatement {
|
statements: vec![Statement::Return(ReturnStatement {
|
||||||
expressions: vec![Expression::ternary(
|
expressions: vec![Expression::ternary(
|
||||||
|
@ -1306,38 +1306,38 @@ mod tests {
|
||||||
DecimalLiteralExpression {
|
DecimalLiteralExpression {
|
||||||
suffix: None,
|
suffix: None,
|
||||||
value: DecimalNumber {
|
value: DecimalNumber {
|
||||||
span: Span::new(source, 62, 63).unwrap()
|
span: Span::new(source, 75, 76).unwrap()
|
||||||
},
|
},
|
||||||
span: Span::new(source, 62, 63).unwrap()
|
span: Span::new(source, 75, 76).unwrap()
|
||||||
}
|
}
|
||||||
))),
|
))),
|
||||||
Box::new(Expression::Literal(LiteralExpression::DecimalLiteral(
|
Box::new(Expression::Literal(LiteralExpression::DecimalLiteral(
|
||||||
DecimalLiteralExpression {
|
DecimalLiteralExpression {
|
||||||
suffix: None,
|
suffix: None,
|
||||||
value: DecimalNumber {
|
value: DecimalNumber {
|
||||||
span: Span::new(source, 69, 70).unwrap()
|
span: Span::new(source, 79, 80).unwrap()
|
||||||
},
|
},
|
||||||
span: Span::new(source, 69, 70).unwrap()
|
span: Span::new(source, 79, 80).unwrap()
|
||||||
}
|
}
|
||||||
))),
|
))),
|
||||||
Box::new(Expression::Literal(LiteralExpression::DecimalLiteral(
|
Box::new(Expression::Literal(LiteralExpression::DecimalLiteral(
|
||||||
DecimalLiteralExpression {
|
DecimalLiteralExpression {
|
||||||
suffix: None,
|
suffix: None,
|
||||||
value: DecimalNumber {
|
value: DecimalNumber {
|
||||||
span: Span::new(source, 76, 77).unwrap()
|
span: Span::new(source, 83, 84).unwrap()
|
||||||
},
|
},
|
||||||
span: Span::new(source, 76, 77).unwrap()
|
span: Span::new(source, 83, 84).unwrap()
|
||||||
}
|
}
|
||||||
))),
|
))),
|
||||||
Span::new(source, 59, 80).unwrap()
|
Span::new(source, 75, 84).unwrap()
|
||||||
)],
|
)],
|
||||||
span: Span::new(source, 52, 80).unwrap(),
|
span: Span::new(source, 68, 84).unwrap(),
|
||||||
})],
|
})],
|
||||||
span: Span::new(source, 29, 81).unwrap(),
|
span: Span::new(source, 32, 95).unwrap(),
|
||||||
})
|
})
|
||||||
],
|
],
|
||||||
eoi: EOI {},
|
eoi: EOI {},
|
||||||
span: Span::new(source, 0, 81).unwrap()
|
span: Span::new(source, 0, 96).unwrap()
|
||||||
})
|
})
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -1365,17 +1365,17 @@ mod tests {
|
||||||
DecimalLiteralExpression {
|
DecimalLiteralExpression {
|
||||||
suffix: None,
|
suffix: None,
|
||||||
value: DecimalNumber {
|
value: DecimalNumber {
|
||||||
span: Span::new(source, 31, 32).unwrap()
|
span: Span::new(source, 32, 33).unwrap()
|
||||||
},
|
},
|
||||||
span: Span::new(source, 31, 32).unwrap()
|
span: Span::new(source, 32, 33).unwrap()
|
||||||
}
|
}
|
||||||
))],
|
))],
|
||||||
span: Span::new(source, 23, 33).unwrap(),
|
span: Span::new(source, 24, 34).unwrap(),
|
||||||
})],
|
})],
|
||||||
span: Span::new(source, 0, 34).unwrap(),
|
span: Span::new(source, 0, 37).unwrap(),
|
||||||
})],
|
})],
|
||||||
eoi: EOI {},
|
eoi: EOI {},
|
||||||
span: Span::new(source, 0, 34).unwrap()
|
span: Span::new(source, 0, 38).unwrap()
|
||||||
})
|
})
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -1402,27 +1402,27 @@ mod tests {
|
||||||
lhs: vec![
|
lhs: vec![
|
||||||
TypedIdentifierOrAssignee::TypedIdentifier(TypedIdentifier {
|
TypedIdentifierOrAssignee::TypedIdentifier(TypedIdentifier {
|
||||||
ty: Type::Basic(BasicType::Field(FieldType {
|
ty: Type::Basic(BasicType::Field(FieldType {
|
||||||
span: Span::new(source, 23, 28).unwrap()
|
span: Span::new(source, 24, 29).unwrap()
|
||||||
})),
|
})),
|
||||||
identifier: IdentifierExpression {
|
identifier: IdentifierExpression {
|
||||||
value: String::from("a"),
|
value: String::from("a"),
|
||||||
span: Span::new(source, 29, 30).unwrap(),
|
span: Span::new(source, 30, 31).unwrap(),
|
||||||
},
|
},
|
||||||
span: Span::new(source, 23, 30).unwrap()
|
span: Span::new(source, 24, 31).unwrap()
|
||||||
}),
|
}),
|
||||||
TypedIdentifierOrAssignee::Assignee(Assignee {
|
TypedIdentifierOrAssignee::Assignee(Assignee {
|
||||||
id: IdentifierExpression {
|
id: IdentifierExpression {
|
||||||
value: String::from("b"),
|
value: String::from("b"),
|
||||||
span: Span::new(source, 32, 33).unwrap(),
|
span: Span::new(source, 33, 34).unwrap(),
|
||||||
},
|
},
|
||||||
accesses: vec![],
|
accesses: vec![],
|
||||||
span: Span::new(source, 32, 34).unwrap()
|
span: Span::new(source, 33, 35).unwrap()
|
||||||
}),
|
}),
|
||||||
],
|
],
|
||||||
expression: Expression::Postfix(PostfixExpression {
|
expression: Expression::Postfix(PostfixExpression {
|
||||||
base: Box::new(Expression::Identifier(IdentifierExpression {
|
base: Box::new(Expression::Identifier(IdentifierExpression {
|
||||||
value: String::from("foo"),
|
value: String::from("foo"),
|
||||||
span: Span::new(source, 36, 39).unwrap()
|
span: Span::new(source, 37, 40).unwrap()
|
||||||
})),
|
})),
|
||||||
accesses: vec![Access::Call(CallAccess {
|
accesses: vec![Access::Call(CallAccess {
|
||||||
explicit_generics: None,
|
explicit_generics: None,
|
||||||
|
@ -1432,9 +1432,9 @@ mod tests {
|
||||||
DecimalLiteralExpression {
|
DecimalLiteralExpression {
|
||||||
suffix: None,
|
suffix: None,
|
||||||
value: DecimalNumber {
|
value: DecimalNumber {
|
||||||
span: Span::new(source, 40, 41).unwrap()
|
span: Span::new(source, 41, 42).unwrap()
|
||||||
},
|
},
|
||||||
span: Span::new(source, 40, 41).unwrap()
|
span: Span::new(source, 41, 42).unwrap()
|
||||||
}
|
}
|
||||||
)),
|
)),
|
||||||
Expression::add(
|
Expression::add(
|
||||||
|
@ -1442,35 +1442,35 @@ mod tests {
|
||||||
DecimalLiteralExpression {
|
DecimalLiteralExpression {
|
||||||
suffix: None,
|
suffix: None,
|
||||||
value: DecimalNumber {
|
value: DecimalNumber {
|
||||||
span: Span::new(source, 43, 44).unwrap()
|
span: Span::new(source, 44, 45).unwrap()
|
||||||
},
|
},
|
||||||
span: Span::new(source, 43, 44).unwrap()
|
span: Span::new(source, 44, 45).unwrap()
|
||||||
}
|
}
|
||||||
)),
|
)),
|
||||||
Expression::Literal(LiteralExpression::DecimalLiteral(
|
Expression::Literal(LiteralExpression::DecimalLiteral(
|
||||||
DecimalLiteralExpression {
|
DecimalLiteralExpression {
|
||||||
suffix: None,
|
suffix: None,
|
||||||
value: DecimalNumber {
|
value: DecimalNumber {
|
||||||
span: Span::new(source, 47, 48).unwrap()
|
span: Span::new(source, 48, 49).unwrap()
|
||||||
},
|
},
|
||||||
span: Span::new(source, 47, 48).unwrap()
|
span: Span::new(source, 48, 49).unwrap()
|
||||||
}
|
}
|
||||||
)),
|
)),
|
||||||
Span::new(source, 43, 48).unwrap()
|
Span::new(source, 44, 49).unwrap()
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
span: Span::new(source, 40, 48).unwrap()
|
span: Span::new(source, 41, 49).unwrap()
|
||||||
},
|
},
|
||||||
span: Span::new(source, 39, 49).unwrap()
|
span: Span::new(source, 40, 50).unwrap()
|
||||||
})],
|
})],
|
||||||
span: Span::new(source, 36, 49).unwrap(),
|
span: Span::new(source, 37, 50).unwrap(),
|
||||||
}),
|
}),
|
||||||
span: Span::new(source, 23, 49).unwrap()
|
span: Span::new(source, 24, 50).unwrap()
|
||||||
})],
|
})],
|
||||||
span: Span::new(source, 0, 50).unwrap(),
|
span: Span::new(source, 0, 53).unwrap(),
|
||||||
})],
|
})],
|
||||||
eoi: EOI {},
|
eoi: EOI {},
|
||||||
span: Span::new(source, 0, 50).unwrap()
|
span: Span::new(source, 0, 54).unwrap()
|
||||||
})
|
})
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
@ -236,7 +236,7 @@ def main(field xL_in, field xR_in, field k) -> field[2] {
|
||||||
for u32 i in 0..R {
|
for u32 i in 0..R {
|
||||||
u32 j = i == 0 ? 0 : i - 1;
|
u32 j = i == 0 ? 0 : i - 1;
|
||||||
|
|
||||||
c = IV[i]
|
c = IV[i];
|
||||||
t = i == 0 ? k + xL_in : k + xL[j] + c;
|
t = i == 0 ? k + xL_in : k + xL[j] + c;
|
||||||
|
|
||||||
t2[i] = t * t;
|
t2[i] = t * t;
|
||||||
|
|
|
@ -3,7 +3,7 @@ import "utils/casts/u32_to_bits" as to_bits;
|
||||||
import "utils/casts/u32_from_bits" as from_bits;
|
import "utils/casts/u32_from_bits" as from_bits;
|
||||||
|
|
||||||
def main(u32[16] inputs) -> u32[8] {
|
def main(u32[16] inputs) -> u32[8] {
|
||||||
bool[512] e = [\
|
bool[512] e = [
|
||||||
...to_bits(inputs[0]),
|
...to_bits(inputs[0]),
|
||||||
...to_bits(inputs[1]),
|
...to_bits(inputs[1]),
|
||||||
...to_bits(inputs[2]),
|
...to_bits(inputs[2]),
|
||||||
|
@ -23,7 +23,7 @@ def main(u32[16] inputs) -> u32[8] {
|
||||||
];
|
];
|
||||||
|
|
||||||
bool[256] aC = pedersen(e);
|
bool[256] aC = pedersen(e);
|
||||||
return [\
|
return [
|
||||||
from_bits(aC[0..32]),
|
from_bits(aC[0..32]),
|
||||||
from_bits(aC[32..64]),
|
from_bits(aC[32..64]),
|
||||||
from_bits(aC[64..96]),
|
from_bits(aC[64..96]),
|
||||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -7,7 +7,7 @@ def main(u32[8] a, u32[8] b) -> u32[8] {
|
||||||
// Hash is computed on the full 512bit block size
|
// Hash is computed on the full 512bit block size
|
||||||
// padding does not fit in the primary block
|
// padding does not fit in the primary block
|
||||||
// add dummy block (single "1" followed by "0" + total length)
|
// add dummy block (single "1" followed by "0" + total length)
|
||||||
u32[8] dummyblock1 = [ \
|
u32[8] dummyblock1 = [
|
||||||
0x80000000,
|
0x80000000,
|
||||||
0x00000000,
|
0x00000000,
|
||||||
0x00000000,
|
0x00000000,
|
||||||
|
@ -18,7 +18,7 @@ def main(u32[8] a, u32[8] b) -> u32[8] {
|
||||||
0x00000000
|
0x00000000
|
||||||
];
|
];
|
||||||
|
|
||||||
u32[8] dummyblock2 = [ \
|
u32[8] dummyblock2 = [
|
||||||
0x00000000,
|
0x00000000,
|
||||||
0x00000000,
|
0x00000000,
|
||||||
0x00000000,
|
0x00000000,
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
import "hashes/keccak/keccak" as keccak
|
import "hashes/keccak/keccak" as keccak;
|
||||||
|
|
||||||
def main<N>(u64[N] input) -> (u64[8]) {
|
def main<N>(u64[N] input) -> (u64[8]) {
|
||||||
return keccak::<_, 512>(input, 0x0000000000000006)[..8];
|
return keccak::<_, 512>(input, 0x0000000000000006)[..8];
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
// Concatenate two u32[8] arrays in an order defined by a boolean selector
|
// Concatenate two u32[8] arrays in an order defined by a boolean selector
|
||||||
def main(bool selector, u32[8] lhs, u32[8] rhs) -> u32[16]:
|
def main(bool selector, u32[8] lhs, u32[8] rhs) -> u32[16] {
|
||||||
return if selector then [...rhs, ...lhs] else [...lhs, ...rhs] fi
|
return selector ? [...rhs, ...lhs] : [...lhs, ...rhs];
|
||||||
|
}
|
||||||
|
|
|
@ -1,12 +1,12 @@
|
||||||
import "hashes/sha256/1024bitPadded" as sha256
|
import "hashes/sha256/1024bitPadded" as sha256;
|
||||||
import "ecc/edwardsScalarMult" as scalarMult
|
import "ecc/edwardsScalarMult" as scalarMult;
|
||||||
import "ecc/edwardsAdd" as add
|
import "ecc/edwardsAdd" as add;
|
||||||
import "utils/pack/bool/nonStrictUnpack256" as unpack256bool
|
import "utils/pack/bool/nonStrictUnpack256" as unpack256bool;
|
||||||
import "utils/pack/u32/nonStrictUnpack256" as unpack256u
|
import "utils/pack/u32/nonStrictUnpack256" as unpack256u;
|
||||||
import "ecc/edwardsOnCurve" as onCurve
|
import "ecc/edwardsOnCurve" as onCurve;
|
||||||
import "ecc/edwardsOrderCheck" as orderCheck
|
import "ecc/edwardsOrderCheck" as orderCheck;
|
||||||
from "ecc/babyjubjubParams" import BabyJubJubParams
|
from "ecc/babyjubjubParams" import BabyJubJubParams;
|
||||||
import "utils/casts/u32_8_to_bool_256"
|
import "utils/casts/u32_8_to_bool_256";
|
||||||
|
|
||||||
/// Verifies an EdDSA Signature.
|
/// Verifies an EdDSA Signature.
|
||||||
///
|
///
|
||||||
|
@ -29,24 +29,23 @@ import "utils/casts/u32_8_to_bool_256"
|
||||||
///
|
///
|
||||||
/// Returns:
|
/// Returns:
|
||||||
/// Return true for S being a valid EdDSA Signature, false otherwise.
|
/// Return true for S being a valid EdDSA Signature, false otherwise.
|
||||||
def main(private field[2] R, private field S, field[2] A, u32[8] M0, u32[8] M1, BabyJubJubParams context) -> bool:
|
def main(private field[2] R, private field S, field[2] A, u32[8] M0, u32[8] M1, BabyJubJubParams context) -> bool {
|
||||||
|
field[2] G = [context.Gu, context.Gv];
|
||||||
field[2] G = [context.Gu, context.Gv]
|
|
||||||
|
|
||||||
// Check if R is on curve and if it is not in a small subgroup. A is public input and can be checked offline
|
// Check if R is on curve and if it is not in a small subgroup. A is public input and can be checked offline
|
||||||
assert(onCurve(R, context)) // throws if R is not on curve
|
assert(onCurve(R, context)); // throws if R is not on curve
|
||||||
assert(orderCheck(R, context))
|
assert(orderCheck(R, context));
|
||||||
|
|
||||||
u32[8] Rx = unpack256u(R[0])
|
u32[8] Rx = unpack256u(R[0]);
|
||||||
u32[8] Ax = unpack256u(A[0])
|
u32[8] Ax = unpack256u(A[0]);
|
||||||
bool[256] hRAM = u32_8_to_bool_256(sha256(Rx, Ax, M0, M1))
|
bool[256] hRAM = u32_8_to_bool_256(sha256(Rx, Ax, M0, M1));
|
||||||
|
|
||||||
bool[256] sBits = unpack256bool(S)
|
bool[256] sBits = unpack256bool(S);
|
||||||
field[2] lhs = scalarMult(sBits, G, context)
|
field[2] lhs = scalarMult(sBits, G, context);
|
||||||
|
|
||||||
field[2] AhRAM = scalarMult(hRAM, A, context)
|
field[2] AhRAM = scalarMult(hRAM, A, context);
|
||||||
field[2] rhs = add(R, AhRAM, context)
|
field[2] rhs = add(R, AhRAM, context);
|
||||||
|
|
||||||
bool out = rhs[0] == lhs[0] && rhs[1] == lhs[1]
|
bool out = rhs[0] == lhs[0] && rhs[1] == lhs[1];
|
||||||
|
return out;
|
||||||
return out
|
}
|
||||||
|
|
|
@ -1,44 +1,47 @@
|
||||||
#pragma curve bw6_761
|
#pragma curve bw6_761
|
||||||
from "EMBED" import snark_verify_bls12_377 as verify
|
|
||||||
|
from "EMBED" import snark_verify_bls12_377 as verify;
|
||||||
|
|
||||||
struct ProofInner {
|
struct ProofInner {
|
||||||
field[2] a
|
field[2] a;
|
||||||
field[2][2] b
|
field[2][2] b;
|
||||||
field[2] c
|
field[2] c;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct Proof<N> {
|
struct Proof<N> {
|
||||||
ProofInner proof
|
ProofInner proof;
|
||||||
field[N] inputs
|
field[N] inputs;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct VerificationKey<N> {
|
struct VerificationKey<N> {
|
||||||
field[2][2] h
|
field[2][2] h;
|
||||||
field[2] g_alpha
|
field[2] g_alpha;
|
||||||
field[2][2] h_beta
|
field[2][2] h_beta;
|
||||||
field[2] g_gamma
|
field[2] g_gamma;
|
||||||
field[2][2] h_gamma
|
field[2][2] h_gamma;
|
||||||
field[N][2] query // input length + 1
|
field[N][2] query; // input length + 1
|
||||||
}
|
}
|
||||||
|
|
||||||
def flat<N, F>(field[N][2] input) -> field[F]:
|
def flat<N, F>(field[N][2] input) -> field[F] {
|
||||||
assert(F == N * 2)
|
assert(F == N * 2);
|
||||||
field[F] out = [0; F]
|
field[F] out = [0; F];
|
||||||
for u32 i in 0..N do
|
for u32 i in 0..N {
|
||||||
for u32 j in 0..2 do
|
for u32 j in 0..2 {
|
||||||
out[(i * 2) + j] = input[i][j]
|
out[(i * 2) + j] = input[i][j];
|
||||||
endfor
|
}
|
||||||
endfor
|
}
|
||||||
return out
|
return out;
|
||||||
|
}
|
||||||
|
|
||||||
def main<N, Q>(Proof<N> proof, VerificationKey<Q> vk) -> bool:
|
def main<N, Q>(Proof<N> proof, VerificationKey<Q> vk) -> bool {
|
||||||
assert(Q == N + 1) // query length (Q) should be N + 1
|
assert(Q == N + 1); // query length (Q) should be N + 1
|
||||||
field[8] flat_proof = [
|
field[8] flat_proof = [
|
||||||
...proof.proof.a,
|
...proof.proof.a,
|
||||||
...flat::<2, 4>(proof.proof.b),
|
...flat::<2, 4>(proof.proof.b),
|
||||||
...proof.proof.c
|
...proof.proof.c
|
||||||
]
|
];
|
||||||
|
|
||||||
u32 two_Q = 2 * Q
|
u32 two_Q = 2 * Q;
|
||||||
|
|
||||||
field[16 + (2 * Q)] flat_vk = [
|
field[16 + (2 * Q)] flat_vk = [
|
||||||
...flat::<2, 4>(vk.h),
|
...flat::<2, 4>(vk.h),
|
||||||
|
@ -47,6 +50,7 @@ def main<N, Q>(Proof<N> proof, VerificationKey<Q> vk) -> bool:
|
||||||
...vk.g_gamma,
|
...vk.g_gamma,
|
||||||
...flat::<2, 4>(vk.h_gamma),
|
...flat::<2, 4>(vk.h_gamma),
|
||||||
...flat::<Q, two_Q>(vk.query)
|
...flat::<Q, two_Q>(vk.query)
|
||||||
]
|
];
|
||||||
|
|
||||||
return verify(proof.inputs, flat_proof, flat_vk)
|
return verify(proof.inputs, flat_proof, flat_vk);
|
||||||
|
}
|
|
@ -5,7 +5,7 @@ def main(u16 i) -> field {
|
||||||
field res = 0;
|
field res = 0;
|
||||||
for u32 j in 0..16 {
|
for u32 j in 0..16 {
|
||||||
u32 exponent = 16 - j - 1;
|
u32 exponent = 16 - j - 1;
|
||||||
res = res + bits[j] ? 2 ** exponent : 0;
|
res = res + (bits[j] ? 2 ** exponent : 0);
|
||||||
}
|
}
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
|
@ -5,7 +5,7 @@ def main(u32 i) -> field {
|
||||||
field res = 0;
|
field res = 0;
|
||||||
for u32 j in 0..32 {
|
for u32 j in 0..32 {
|
||||||
u32 exponent = 32 - j - 1;
|
u32 exponent = 32 - j - 1;
|
||||||
res = res + bits[j] ? 2 ** exponent : 0;
|
res = res + (bits[j] ? 2 ** exponent : 0);
|
||||||
}
|
}
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
|
@ -5,7 +5,7 @@ def main(u64 i) -> field {
|
||||||
field res = 0;
|
field res = 0;
|
||||||
for u32 j in 0..64 {
|
for u32 j in 0..64 {
|
||||||
u32 exponent = 64 - j - 1;
|
u32 exponent = 64 - j - 1;
|
||||||
res = res + bits[j] ? 2 ** exponent : 0;
|
res = res + (bits[j] ? 2 ** exponent : 0);
|
||||||
}
|
}
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
|
@ -5,7 +5,7 @@ def main(u8 i) -> field {
|
||||||
field res = 0;
|
field res = 0;
|
||||||
for u32 j in 0..8 {
|
for u32 j in 0..8 {
|
||||||
u32 exponent = 8 - j - 1;
|
u32 exponent = 8 - j - 1;
|
||||||
res = res + bits[j] ? 2 ** exponent : 0;
|
res = res + (bits[j] ? 2 ** exponent : 0);
|
||||||
}
|
}
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
|
@ -1,7 +1,7 @@
|
||||||
// Two-bit window lookup table using one constraint
|
// Two-bit window lookup table using one constraint
|
||||||
// Maps the bits `b` to a list of field elements `c`
|
// Maps the bits `b` to a list of field elements `c`
|
||||||
def main(bool[2] b, field[4] c) -> field {
|
def main(bool[2] b, field[4] c) -> field {
|
||||||
field alpha = c[1] - c[0] + b[1] ? (c[3] - c[2] - c[1] + c[0]) : 0;
|
field alpha = c[1] - c[0] + (b[1] ? (c[3] - c[2] - c[1] + c[0]) : 0);
|
||||||
field out = b[0] ? alpha : 0 + c[0] - (b[1] ? (0 - c[2] + c[0]) : 0);
|
field out = (b[0] ? alpha : 0) + c[0] - (b[1] ? (0 - c[2] + c[0]) : 0);
|
||||||
return out;
|
return out;
|
||||||
}
|
}
|
|
@ -4,6 +4,6 @@ import "./lookup2bit" as lookup;
|
||||||
// using two constraints. Maps the bits `b` to a list of constants `c`
|
// using two constraints. Maps the bits `b` to a list of constants `c`
|
||||||
def main(bool[3] b, field[4] c) -> field {
|
def main(bool[3] b, field[4] c) -> field {
|
||||||
field alpha = lookup([b[0], b[1]], c);
|
field alpha = lookup([b[0], b[1]], c);
|
||||||
field out = alpha - 2 * b[2] ? alpha : 0;
|
field out = alpha - 2 * (b[2] ? alpha : 0);
|
||||||
return out;
|
return out;
|
||||||
}
|
}
|
|
@ -2,7 +2,7 @@ def main<N>(bool[N] bits) -> field {
|
||||||
field out = 0;
|
field out = 0;
|
||||||
for u32 j in 0..N {
|
for u32 j in 0..N {
|
||||||
u32 i = N - (j + 1);
|
u32 i = N - (j + 1);
|
||||||
out = out + bits[i] ? (2 ** j) : 0;
|
out = out + (bits[i] ? 2 ** j : 0);
|
||||||
}
|
}
|
||||||
return out;
|
return out;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
import "./unpack_unchecked.zok"
|
import "./unpack_unchecked.zok";
|
||||||
from "field" import FIELD_SIZE_IN_BITS;
|
from "field" import FIELD_SIZE_IN_BITS;
|
||||||
from "EMBED" import bit_array_le;
|
from "EMBED" import bit_array_le;
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
from "field" import FIELD_MIN, FIELD_MAX, FIELD_SIZE_IN_BITS
|
from "field" import FIELD_MIN, FIELD_MAX, FIELD_SIZE_IN_BITS;
|
||||||
|
|
||||||
def main() -> (field, field, u32) {
|
def main() -> (field, field, u32) {
|
||||||
return FIELD_MIN, FIELD_MAX, FIELD_SIZE_IN_BITS;
|
return FIELD_MIN, FIELD_MAX, FIELD_SIZE_IN_BITS;
|
||||||
|
|
|
@ -6,6 +6,7 @@ def first() -> bool {
|
||||||
|
|
||||||
assert(0 == lookup(sel, t));
|
assert(0 == lookup(sel, t));
|
||||||
return true;
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
def firstNeg() -> bool {
|
def firstNeg() -> bool {
|
||||||
bool[3] sel = [false, false, true];
|
bool[3] sel = [false, false, true];
|
||||||
|
@ -32,7 +33,7 @@ def secondNeg() -> bool {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
def thrid() -> bool {
|
def third() -> bool {
|
||||||
bool[3] sel = [false, true, false];
|
bool[3] sel = [false, true, false];
|
||||||
field[4] t = [0, 1, 2, 3];
|
field[4] t = [0, 1, 2, 3];
|
||||||
|
|
||||||
|
@ -40,7 +41,7 @@ def thrid() -> bool {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
def thridNeg() -> bool {
|
def thirdNeg() -> bool {
|
||||||
bool[3] sel = [false, true, true];
|
bool[3] sel = [false, true, true];
|
||||||
field[4] t = [0, 1, 2, 3];
|
field[4] t = [0, 1, 2, 3];
|
||||||
|
|
||||||
|
@ -71,8 +72,8 @@ def main() {
|
||||||
assert(firstNeg());
|
assert(firstNeg());
|
||||||
assert(second());
|
assert(second());
|
||||||
assert(secondNeg());
|
assert(secondNeg());
|
||||||
assert(thrid());
|
assert(third());
|
||||||
assert(thridNeg());
|
assert(thirdNeg());
|
||||||
assert(fourth());
|
assert(fourth());
|
||||||
assert(fourthNeg());
|
assert(fourthNeg());
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -16,7 +16,7 @@ def testZero() -> bool {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
def testMax() -> bool:
|
def testMax() -> bool {
|
||||||
bool[128] b = [true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true];
|
bool[128] b = [true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true];
|
||||||
field n = pack128(b);
|
field n = pack128(b);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue