Merge pull request #616 from Zokrates/any-assertion
Implement assertion of any boolean
This commit is contained in:
commit
26f4d72ee6
110 changed files with 742 additions and 541 deletions
|
@ -5,5 +5,5 @@ def foo(field[3] a) -> (field):
|
||||||
def main() -> (field, field):
|
def main() -> (field, field):
|
||||||
field[3] a = [0, 0, 0]
|
field[3] a = [0, 0, 0]
|
||||||
field res = foo(a)
|
field res = foo(a)
|
||||||
a[1] == 0
|
assert(a[1] == 0)
|
||||||
return res, a[1]
|
return res, a[1]
|
||||||
|
|
|
@ -5,5 +5,5 @@ def main(field a) -> (field, field):
|
||||||
field[2] result = [0, 0]
|
field[2] result = [0, 0]
|
||||||
field r = foo(a)
|
field r = foo(a)
|
||||||
result[1] = r
|
result[1] = r
|
||||||
result[1] == r
|
assert(result[1] == r)
|
||||||
return result[1], r
|
return result[1], r
|
|
@ -1,4 +1,4 @@
|
||||||
def main() -> ():
|
def main() -> ():
|
||||||
field pMinusOne = 21888242871839275222246405745257275088548364400416034343698204186575808495616
|
field pMinusOne = 21888242871839275222246405745257275088548364400416034343698204186575808495616
|
||||||
0 - 1 == pMinusOne
|
assert(0 - 1 == pMinusOne)
|
||||||
return
|
return
|
|
@ -2,6 +2,6 @@ import "hashes/sha256/512bitPacked" as sha256packed
|
||||||
|
|
||||||
def main(private field a, private field b, private field c, private field d) -> ():
|
def main(private field a, private field b, private field c, private field d) -> ():
|
||||||
field[2] h = sha256packed([a, b, c, d])
|
field[2] h = sha256packed([a, b, c, d])
|
||||||
h[0] == 263561599766550617289250058199814760685
|
assert(h[0] == 263561599766550617289250058199814760685)
|
||||||
h[1] == 65303172752238645975888084098459749904
|
assert(h[1] == 65303172752238645975888084098459749904)
|
||||||
return
|
return
|
|
@ -5,5 +5,5 @@ def incr(field a) -> (field):
|
||||||
def main() -> ():
|
def main() -> ():
|
||||||
field x = 1
|
field x = 1
|
||||||
field res = incr(x)
|
field res = incr(x)
|
||||||
x == 1 // x has not changed
|
assert(x == 1) // x has not changed
|
||||||
return
|
return
|
|
@ -3,5 +3,5 @@
|
||||||
def main(field a, field b) -> (field):
|
def main(field a, field b) -> (field):
|
||||||
field y = if a + 2 == 3 && a * 2 == 2 then 1 else 0 fi
|
field y = if a + 2 == 3 && a * 2 == 2 then 1 else 0 fi
|
||||||
field z = if y == 1 && 1-y == 0 then y else 1 fi
|
field z = if y == 1 && 1-y == 0 then y else 1 fi
|
||||||
b == 1
|
assert(b == 1)
|
||||||
return a
|
return a
|
|
@ -2,6 +2,6 @@
|
||||||
def main(field a, field b) -> (field):
|
def main(field a, field b) -> (field):
|
||||||
field y = if a + 2 == 4 || b * 2 == 2 then 1 else 0 fi
|
field y = if a + 2 == 4 || b * 2 == 2 then 1 else 0 fi
|
||||||
field z = if y == 1 || y == 0 then y else 1 fi
|
field z = if y == 1 || y == 0 then y else 1 fi
|
||||||
z == 1
|
assert(z == 1)
|
||||||
return z
|
return z
|
||||||
|
|
||||||
|
|
|
@ -2,6 +2,6 @@
|
||||||
def main(field a) -> (field): // a needs to be 1
|
def main(field a) -> (field): // a needs to be 1
|
||||||
field b = a + 5 // inline comment
|
field b = a + 5 // inline comment
|
||||||
field c = a + b + a + 4
|
field c = a + b + a + 4
|
||||||
a == 1 // another inline comment
|
assert(a == 1) // another inline comment
|
||||||
field d = a + c + a + b
|
field d = a + c + a + b
|
||||||
return b + c + d
|
return b + c + d
|
||||||
|
|
|
@ -1,6 +1,19 @@
|
||||||
|
struct Foo {
|
||||||
|
field a
|
||||||
|
}
|
||||||
|
|
||||||
|
struct Bar {
|
||||||
|
Foo[1] foo
|
||||||
|
}
|
||||||
|
|
||||||
|
def isEqual(field a, field b) -> (bool):
|
||||||
|
return a == b
|
||||||
|
|
||||||
def main(field a) -> (field):
|
def main(field a) -> (field):
|
||||||
field b = (a + 5) * 6
|
field b = (a + 5) * 6
|
||||||
2 * b == a * 12 + 60
|
assert(2 * b == a * 12 + 60)
|
||||||
field c = 7 * (b + a)
|
field c = 7 * (b + a)
|
||||||
c == 7 * b + 7 * a
|
assert(isEqual(c, 7 * b + 7 * a))
|
||||||
return b + c
|
field k = if [1, 2] == [3, 4] then 1 else 3 fi
|
||||||
|
assert([Bar { foo : [Foo { a: 42 }]}] == [Bar { foo : [Foo { a: 42 }]}])
|
||||||
|
return b + c
|
5
zokrates_cli/examples/error/assert.zok
Normal file
5
zokrates_cli/examples/error/assert.zok
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
def assert() -> ():
|
||||||
|
return
|
||||||
|
|
||||||
|
def main() -> ():
|
||||||
|
return
|
|
@ -1,5 +1,5 @@
|
||||||
// a and b are factorization of c
|
// a and b are factorization of c
|
||||||
def main(field c, private field a, private field b) -> ():
|
def main(field c, private field a, private field b) -> ():
|
||||||
field d = a * b
|
field d = a * b
|
||||||
c == d
|
assert(c == d)
|
||||||
return
|
return
|
||||||
|
|
|
@ -7,5 +7,5 @@ import "./bar"
|
||||||
def main() -> (field):
|
def main() -> (field):
|
||||||
MyBar my_bar = MyBar {}
|
MyBar my_bar = MyBar {}
|
||||||
Bar bar = Bar {}
|
Bar bar = Bar {}
|
||||||
my_bar == bar
|
assert(my_bar == bar)
|
||||||
return foo() + bar()
|
return foo() + bar()
|
|
@ -2,5 +2,5 @@ def foo() -> (field):
|
||||||
return 1
|
return 1
|
||||||
|
|
||||||
def main() -> ():
|
def main() -> ():
|
||||||
foo() + (1 + 44*3) == 1
|
assert(foo() + (1 + 44*3) == 1)
|
||||||
return
|
return
|
||||||
|
|
|
@ -22,7 +22,7 @@ def main(bool[256] rootDigest, private bool[256] leafDigest, private bool[3] dir
|
||||||
preimage = multiplex(directionSelector[2], currentDigest, PathDigest2)
|
preimage = multiplex(directionSelector[2], currentDigest, PathDigest2)
|
||||||
currentDigest = hash(preimage)
|
currentDigest = hash(preimage)
|
||||||
|
|
||||||
rootDigest == currentDigest
|
assert(rootDigest == currentDigest)
|
||||||
|
|
||||||
return
|
return
|
||||||
|
|
||||||
|
|
|
@ -23,7 +23,7 @@ def main(field treeDepth, bool[256] rootDigest, private bool[256] leafDigest, pr
|
||||||
currentDigest = sha256(lhs, rhs)
|
currentDigest = sha256(lhs, rhs)
|
||||||
counter = counter + 1
|
counter = counter + 1
|
||||||
|
|
||||||
counter == treeDepth
|
assert(counter == treeDepth)
|
||||||
rootDigest == currentDigest
|
assert(rootDigest == currentDigest)
|
||||||
|
|
||||||
return
|
return
|
|
@ -1,4 +1,4 @@
|
||||||
// this code does not need to be flattened
|
// this code does not need to be flattened
|
||||||
def main(field x, field a, field b) -> (field):
|
def main(field x, field a, field b) -> (field):
|
||||||
a == b * 7
|
assert(a == b * 7)
|
||||||
return x + a + b
|
return x + a + b
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
// this code does not need to be flattened
|
// this code does not need to be flattened
|
||||||
def main(field x, field y, field z) -> (field):
|
def main(field x, field y, field z) -> (field):
|
||||||
field a = x + 3*y - z *2 - x * 12
|
field a = x + 3*y - z *2 - x * 12
|
||||||
3*y - z *2 - x * 12 == a - x
|
assert(3*y - z *2 - x * 12 == a - x)
|
||||||
(x + y) - ((z + 3*x) - y) == (x - y) + ((2*x - 4*y) + (4*y - 2*z))
|
assert((x + y) - ((z + 3*x) - y) == (x - y) + ((2*x - 4*y) + (4*y - 2*z)))
|
||||||
return x
|
return x
|
||||||
|
|
|
@ -1,16 +1,16 @@
|
||||||
def main() -> ():
|
def main() -> ():
|
||||||
field x = 2**4
|
field x = 2**4
|
||||||
x == 16
|
assert(x == 16)
|
||||||
x = x**2
|
x = x**2
|
||||||
x == 256
|
assert(x == 256)
|
||||||
field y = 3**3
|
field y = 3**3
|
||||||
y == 27
|
assert(y == 27)
|
||||||
field z = y**2
|
field z = y**2
|
||||||
z == 729
|
assert(z == 729)
|
||||||
field a = 5**2
|
field a = 5**2
|
||||||
a == 25
|
assert(a == 25)
|
||||||
a = a**2
|
a = a**2
|
||||||
a == 625
|
assert(a == 625)
|
||||||
a = 5**5
|
a = 5**5
|
||||||
a == 3125
|
assert(a == 3125)
|
||||||
return
|
return
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
def foo(field a, field b) -> (field, field):
|
def foo(field a, field b) -> (field, field):
|
||||||
a == b + 2
|
assert(a == b + 2)
|
||||||
return a, b
|
return a, b
|
||||||
|
|
||||||
def main() -> (field):
|
def main() -> (field):
|
||||||
|
|
|
@ -20,32 +20,32 @@ def countDuplicates(field e11,field e12,field e21,field e22) -> (field):
|
||||||
return duplicates
|
return duplicates
|
||||||
|
|
||||||
// returns 0 for x in (1..4)
|
// returns 0 for x in (1..4)
|
||||||
def validateInput(field x) -> (field):
|
def validateInput(field x) -> (bool):
|
||||||
return (x-1)*(x-2)*(x-3)*(x-4)
|
return (x-1)*(x-2)*(x-3)*(x-4) == 0
|
||||||
|
|
||||||
// variables naming: box'row''column'
|
// variables naming: box'row''column'
|
||||||
def main(field a21, field b11, field b22, field c11, field c22, field d21, private field a11, private field a12, private field a22, private field b12, private field b21, private field c12, private field c21, private field d11, private field d12, private field d22) -> (bool):
|
def main(field a21, field b11, field b22, field c11, field c22, field d21, private field a11, private field a12, private field a22, private field b12, private field b21, private field c12, private field c21, private field d11, private field d12, private field d22) -> (bool):
|
||||||
|
|
||||||
// validate inputs
|
// validate inputs
|
||||||
0 == validateInput(a11)
|
assert(validateInput(a11))
|
||||||
0 == validateInput(a12)
|
assert(validateInput(a12))
|
||||||
0 == validateInput(a21)
|
assert(validateInput(a21))
|
||||||
0 == validateInput(a22)
|
assert(validateInput(a22))
|
||||||
|
|
||||||
0 == validateInput(b11)
|
assert(validateInput(b11))
|
||||||
0 == validateInput(b12)
|
assert(validateInput(b12))
|
||||||
0 == validateInput(b21)
|
assert(validateInput(b21))
|
||||||
0 == validateInput(b22)
|
assert(validateInput(b22))
|
||||||
|
|
||||||
0 == validateInput(c11)
|
assert(validateInput(c11))
|
||||||
0 == validateInput(c12)
|
assert(validateInput(c12))
|
||||||
0 == validateInput(c21)
|
assert(validateInput(c21))
|
||||||
0 == validateInput(c22)
|
assert(validateInput(c22))
|
||||||
|
|
||||||
0 == validateInput(d11)
|
assert(validateInput(d11))
|
||||||
0 == validateInput(d12)
|
assert(validateInput(d12))
|
||||||
0 == validateInput(d21)
|
assert(validateInput(d21))
|
||||||
0 == validateInput(d22)
|
assert(validateInput(d22))
|
||||||
|
|
||||||
field duplicates = 0 // globally counts duplicate entries in boxes, rows and columns
|
field duplicates = 0 // globally counts duplicate entries in boxes, rows and columns
|
||||||
|
|
||||||
|
|
|
@ -3,11 +3,11 @@ def main(field x) -> (field):
|
||||||
field a = 5
|
field a = 5
|
||||||
field b = 7
|
field b = 7
|
||||||
field c = if a == b then 4 else 3 fi
|
field c = if a == b then 4 else 3 fi
|
||||||
c == 3
|
assert(c == 3)
|
||||||
field d = if a == 5 then 1 else 2 fi
|
field d = if a == 5 then 1 else 2 fi
|
||||||
d == 1
|
assert(d == 1)
|
||||||
field e = if a < b then 5 else 6 fi
|
field e = if a < b then 5 else 6 fi
|
||||||
e == 5
|
assert(e == 5)
|
||||||
field f = if b < a then 7 else 8 fi
|
field f = if b < a then 7 else 8 fi
|
||||||
f == 8
|
assert(f == 8)
|
||||||
return x
|
return x
|
||||||
|
|
|
@ -3,12 +3,13 @@
|
||||||
// * we don't enforce only one number being non-prime, so there could be multiple Waldos
|
// * we don't enforce only one number being non-prime, so there could be multiple Waldos
|
||||||
|
|
||||||
def isWaldo(field a, field p, field q) -> (bool):
|
def isWaldo(field a, field p, field q) -> (bool):
|
||||||
// make sure that neither `p` nor `q` is `1`
|
// make sure that p and q are both not one
|
||||||
(!(p == 1) && !(q == 1)) == true
|
assert(p != 1 && q != 1)
|
||||||
|
|
||||||
// we know how to factor a
|
// we know how to factor a
|
||||||
return a == p * q
|
return a == p * q
|
||||||
|
|
||||||
|
// define all
|
||||||
def main(field[3] a, private field index, private field p, private field q) -> (bool):
|
def main(field[3] a, private field index, private field p, private field q) -> (bool):
|
||||||
// prover provides the index of Waldo
|
// prover provides the index of Waldo
|
||||||
return isWaldo(a[index], p, q)
|
return isWaldo(a[index], p, q)
|
|
@ -1,3 +1,3 @@
|
||||||
def main(field a, field b) -> ():
|
def main(field a, field b) -> ():
|
||||||
a==b
|
assert(a == b)
|
||||||
return
|
return
|
|
@ -9,6 +9,6 @@ def main(private bool[256] expected) -> (field):
|
||||||
|
|
||||||
bool[256] IV = [false, true, true, false, true, false, true, false, false, false, false, false, true, false, false, true, true, true, true, false, false, true, true, false, false, true, true, false, false, true, true, true, true, false, true, true, true, false, true, true, false, true, true, false, false, true, true, true, true, false, true, false, true, true, true, false, true, false, false, false, false, true, false, true, false, false, true, true, true, true, false, false, false, true, true, false, true, true, true, false, true, true, true, true, false, false, true, true, false, true, true, true, false, false, true, false, true, false, true, false, false, true, false, true, false, true, false, false, true, true, true, true, true, true, true, true, false, true, false, true, false, false, true, true, true, false, true, false, false, true, false, true, false, false, false, true, false, false, false, false, true, true, true, false, false, true, false, true, false, false, true, false, false, true, true, true, true, true, true, true, true, false, false, true, true, false, true, true, false, false, false, false, false, true, false, true, false, true, true, false, true, false, false, false, true, false, false, false, true, true, false, false, false, false, false, true, true, true, true, true, true, false, false, false, false, false, true, true, true, true, false, true, true, false, false, true, true, false, true, false, true, false, true, true, false, true, false, true, true, false, true, true, true, true, true, false, false, false, false, false, true, true, false, false, true, true, false, true, false, false, false, true, true, false, false, true]
|
bool[256] IV = [false, true, true, false, true, false, true, false, false, false, false, false, true, false, false, true, true, true, true, false, false, true, true, false, false, true, true, false, false, true, true, true, true, false, true, true, true, false, true, true, false, true, true, false, false, true, true, true, true, false, true, false, true, true, true, false, true, false, false, false, false, true, false, true, false, false, true, true, true, true, false, false, false, true, true, false, true, true, true, false, true, true, true, true, false, false, true, true, false, true, true, true, false, false, true, false, true, false, true, false, false, true, false, true, false, true, false, false, true, true, true, true, true, true, true, true, false, true, false, true, false, false, true, true, true, false, true, false, false, true, false, true, false, false, false, true, false, false, false, false, true, true, true, false, false, true, false, true, false, false, true, false, false, true, true, true, true, true, true, true, true, false, false, true, true, false, true, true, false, false, false, false, false, true, false, true, false, true, true, false, true, false, false, false, true, false, false, false, true, true, false, false, false, false, false, true, true, true, true, true, true, false, false, false, false, false, true, true, true, true, false, true, true, false, false, true, true, false, true, false, true, false, true, true, false, true, false, true, true, false, true, true, true, true, true, false, false, false, false, false, true, true, false, false, true, true, false, true, false, false, false, true, true, false, false, true]
|
||||||
|
|
||||||
expected == sha256([...a, ...b], IV)
|
assert(expected == sha256([...a, ...b], IV))
|
||||||
|
|
||||||
return 1
|
return 1
|
|
@ -262,23 +262,8 @@ impl<'ast, T: Field> From<pest::AssertionStatement<'ast>> for absy::StatementNod
|
||||||
fn from(statement: pest::AssertionStatement<'ast>) -> absy::StatementNode<T> {
|
fn from(statement: pest::AssertionStatement<'ast>) -> absy::StatementNode<T> {
|
||||||
use absy::NodeValue;
|
use absy::NodeValue;
|
||||||
|
|
||||||
match statement.expression {
|
absy::Statement::Assertion(absy::ExpressionNode::from(statement.expression))
|
||||||
pest::Expression::Binary(e) => match e.op {
|
.span(statement.span)
|
||||||
pest::BinaryOperator::Eq => absy::Statement::Condition(
|
|
||||||
absy::ExpressionNode::from(*e.left),
|
|
||||||
absy::ExpressionNode::from(*e.right),
|
|
||||||
),
|
|
||||||
_ => unimplemented!(
|
|
||||||
"Assertion statements should be an equality check, found {}",
|
|
||||||
statement.span.as_str()
|
|
||||||
),
|
|
||||||
},
|
|
||||||
_ => unimplemented!(
|
|
||||||
"Assertion statements should be an equality check, found {}",
|
|
||||||
statement.span.as_str()
|
|
||||||
),
|
|
||||||
}
|
|
||||||
.span(statement.span)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -389,7 +374,14 @@ impl<'ast, T: Field> From<pest::BinaryExpression<'ast>> for absy::ExpressionNode
|
||||||
box absy::ExpressionNode::from(*expression.left),
|
box absy::ExpressionNode::from(*expression.left),
|
||||||
box absy::ExpressionNode::from(*expression.right),
|
box absy::ExpressionNode::from(*expression.right),
|
||||||
),
|
),
|
||||||
o => unimplemented!("Operator {:?} not implemented", o),
|
// rewrite (a != b)` as `!(a == b)`
|
||||||
|
pest::BinaryOperator::NotEq => absy::Expression::Not(
|
||||||
|
box absy::Expression::Eq(
|
||||||
|
box absy::ExpressionNode::from(*expression.left),
|
||||||
|
box absy::ExpressionNode::from(*expression.right),
|
||||||
|
)
|
||||||
|
.span(expression.span.clone()),
|
||||||
|
),
|
||||||
}
|
}
|
||||||
.span(expression.span)
|
.span(expression.span)
|
||||||
}
|
}
|
||||||
|
|
|
@ -299,7 +299,7 @@ pub enum Statement<'ast, T> {
|
||||||
Return(ExpressionListNode<'ast, T>),
|
Return(ExpressionListNode<'ast, T>),
|
||||||
Declaration(VariableNode<'ast>),
|
Declaration(VariableNode<'ast>),
|
||||||
Definition(AssigneeNode<'ast, T>, ExpressionNode<'ast, T>),
|
Definition(AssigneeNode<'ast, T>, ExpressionNode<'ast, T>),
|
||||||
Condition(ExpressionNode<'ast, T>, ExpressionNode<'ast, T>),
|
Assertion(ExpressionNode<'ast, T>),
|
||||||
For(
|
For(
|
||||||
VariableNode<'ast>,
|
VariableNode<'ast>,
|
||||||
ExpressionNode<'ast, T>,
|
ExpressionNode<'ast, T>,
|
||||||
|
@ -317,7 +317,7 @@ impl<'ast, T: fmt::Display> fmt::Display for Statement<'ast, T> {
|
||||||
Statement::Return(ref expr) => write!(f, "return {}", expr),
|
Statement::Return(ref expr) => write!(f, "return {}", expr),
|
||||||
Statement::Declaration(ref var) => write!(f, "{}", var),
|
Statement::Declaration(ref var) => write!(f, "{}", var),
|
||||||
Statement::Definition(ref lhs, ref rhs) => write!(f, "{} = {}", lhs, rhs),
|
Statement::Definition(ref lhs, ref rhs) => write!(f, "{} = {}", lhs, rhs),
|
||||||
Statement::Condition(ref lhs, ref rhs) => write!(f, "{} == {}", lhs, rhs),
|
Statement::Assertion(ref e) => write!(f, "assert({})", e),
|
||||||
Statement::For(ref var, ref start, ref stop, ref list) => {
|
Statement::For(ref var, ref start, ref stop, ref list) => {
|
||||||
write!(f, "for {} in {}..{} do\n", var, start, stop)?;
|
write!(f, "for {} in {}..{} do\n", var, start, stop)?;
|
||||||
for l in list {
|
for l in list {
|
||||||
|
@ -346,7 +346,7 @@ impl<'ast, T: fmt::Debug> fmt::Debug for Statement<'ast, T> {
|
||||||
Statement::Definition(ref lhs, ref rhs) => {
|
Statement::Definition(ref lhs, ref rhs) => {
|
||||||
write!(f, "Definition({:?}, {:?})", lhs, rhs)
|
write!(f, "Definition({:?}, {:?})", lhs, rhs)
|
||||||
}
|
}
|
||||||
Statement::Condition(ref lhs, ref rhs) => write!(f, "Condition({:?}, {:?})", lhs, rhs),
|
Statement::Assertion(ref e) => write!(f, "Assertion({:?})", e),
|
||||||
Statement::For(ref var, ref start, ref stop, ref list) => {
|
Statement::For(ref var, ref start, ref stop, ref list) => {
|
||||||
write!(f, "for {:?} in {:?}..{:?} do\n", var, start, stop)?;
|
write!(f, "for {:?} in {:?}..{:?} do\n", var, start, stop)?;
|
||||||
for l in list {
|
for l in list {
|
||||||
|
|
|
@ -575,9 +575,6 @@ impl<'ast, T: Field> Flattener<'ast, T> {
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
BooleanExpression::FieldEq(box lhs, box rhs) => {
|
BooleanExpression::FieldEq(box lhs, box rhs) => {
|
||||||
// We know from semantic checking that lhs and rhs have the same type
|
|
||||||
// What the expression will flatten to depends on that type
|
|
||||||
|
|
||||||
// Wanted: (Y = (X != 0) ? 1 : 0)
|
// Wanted: (Y = (X != 0) ? 1 : 0)
|
||||||
// X = a - b
|
// X = a - b
|
||||||
// # Y = if X == 0 then 0 else 1 fi
|
// # Y = if X == 0 then 0 else 1 fi
|
||||||
|
@ -616,6 +613,53 @@ impl<'ast, T: Field> Flattener<'ast, T> {
|
||||||
|
|
||||||
res
|
res
|
||||||
}
|
}
|
||||||
|
BooleanExpression::UintEq(box lhs, box rhs) => {
|
||||||
|
// We reduce each side into range and apply the same approach as for field elements
|
||||||
|
|
||||||
|
// Wanted: (Y = (X != 0) ? 1 : 0)
|
||||||
|
// X = a - b
|
||||||
|
// # Y = if X == 0 then 0 else 1 fi
|
||||||
|
// # M = if X == 0 then 1 else 1/X fi
|
||||||
|
// Y == X * M
|
||||||
|
// 0 == (1-Y) * X
|
||||||
|
|
||||||
|
let name_y = self.use_sym();
|
||||||
|
let name_m = self.use_sym();
|
||||||
|
|
||||||
|
assert!(lhs.metadata.clone().unwrap().should_reduce.to_bool());
|
||||||
|
assert!(rhs.metadata.clone().unwrap().should_reduce.to_bool());
|
||||||
|
|
||||||
|
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();
|
||||||
|
|
||||||
|
let x = FlatExpression::Sub(box lhs, box rhs);
|
||||||
|
|
||||||
|
statements_flattened.push(FlatStatement::Directive(FlatDirective::new(
|
||||||
|
vec![name_y, name_m],
|
||||||
|
Solver::ConditionEq,
|
||||||
|
vec![x.clone()],
|
||||||
|
)));
|
||||||
|
statements_flattened.push(FlatStatement::Condition(
|
||||||
|
FlatExpression::Identifier(name_y),
|
||||||
|
FlatExpression::Mult(box x.clone(), box FlatExpression::Identifier(name_m)),
|
||||||
|
));
|
||||||
|
|
||||||
|
let res = FlatExpression::Sub(
|
||||||
|
box FlatExpression::Number(T::one()),
|
||||||
|
box FlatExpression::Identifier(name_y),
|
||||||
|
);
|
||||||
|
|
||||||
|
statements_flattened.push(FlatStatement::Condition(
|
||||||
|
FlatExpression::Number(T::zero()),
|
||||||
|
FlatExpression::Mult(box res.clone(), box x),
|
||||||
|
));
|
||||||
|
|
||||||
|
res
|
||||||
|
}
|
||||||
BooleanExpression::Le(box lhs, box rhs) => {
|
BooleanExpression::Le(box lhs, box rhs) => {
|
||||||
let lt = self.flatten_boolean_expression(
|
let lt = self.flatten_boolean_expression(
|
||||||
symbols,
|
symbols,
|
||||||
|
@ -1851,24 +1895,22 @@ impl<'ast, T: Field> Flattener<'ast, T> {
|
||||||
None => {}
|
None => {}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ZirStatement::Condition(lhs, rhs) => {
|
ZirStatement::Assertion(e) => {
|
||||||
// flatten expr1 and expr2 to n flattened expressions with n the number of primitive types for expr1
|
// naive approach: flatten the boolean to a single field element and constrain it to 1
|
||||||
// add n conditions to check equality of the n expressions
|
|
||||||
|
|
||||||
let lhs = self
|
let e = self.flatten_boolean_expression(symbols, statements_flattened, e);
|
||||||
.flatten_expression(symbols, statements_flattened, lhs)
|
|
||||||
.get_field_unchecked();
|
|
||||||
let rhs = self
|
|
||||||
.flatten_expression(symbols, statements_flattened, rhs)
|
|
||||||
.get_field_unchecked();
|
|
||||||
|
|
||||||
if lhs.is_linear() {
|
if e.is_linear() {
|
||||||
statements_flattened.push(FlatStatement::Condition(lhs, rhs));
|
statements_flattened.push(FlatStatement::Condition(
|
||||||
} else if rhs.is_linear() {
|
e,
|
||||||
// swap so that left side is linear
|
FlatExpression::Number(T::from(1)),
|
||||||
statements_flattened.push(FlatStatement::Condition(rhs, lhs));
|
));
|
||||||
} else {
|
} else {
|
||||||
unreachable!()
|
// swap so that left side is linear
|
||||||
|
statements_flattened.push(FlatStatement::Condition(
|
||||||
|
FlatExpression::Number(T::from(1)),
|
||||||
|
e,
|
||||||
|
));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ZirStatement::MultipleDefinition(vars, rhs) => {
|
ZirStatement::MultipleDefinition(vars, rhs) => {
|
||||||
|
|
|
@ -875,27 +875,21 @@ impl<'ast> Checker<'ast> {
|
||||||
}
|
}
|
||||||
.map_err(|e| vec![e])
|
.map_err(|e| vec![e])
|
||||||
}
|
}
|
||||||
Statement::Condition(lhs, rhs) => {
|
Statement::Assertion(e) => {
|
||||||
let checked_lhs = self
|
let e = self
|
||||||
.check_expression(lhs, module_id, &types)
|
.check_expression(e, module_id, &types)
|
||||||
.map_err(|e| vec![e])?;
|
|
||||||
let checked_rhs = self
|
|
||||||
.check_expression(rhs, module_id, &types)
|
|
||||||
.map_err(|e| vec![e])?;
|
.map_err(|e| vec![e])?;
|
||||||
|
|
||||||
if checked_lhs.get_type() == checked_rhs.get_type() {
|
match e {
|
||||||
Ok(TypedStatement::Condition(checked_lhs, checked_rhs))
|
TypedExpression::Boolean(e) => Ok(TypedStatement::Assertion(e)),
|
||||||
} else {
|
e => Err(ErrorInner {
|
||||||
Err(ErrorInner {
|
|
||||||
pos: Some(pos),
|
pos: Some(pos),
|
||||||
message: format!(
|
message: format!(
|
||||||
"Cannot compare {} of type {:?} to {} of type {:?}",
|
"Expected {} to be of type bool, found {}",
|
||||||
checked_lhs,
|
e,
|
||||||
checked_lhs.get_type(),
|
e.get_type(),
|
||||||
checked_rhs,
|
|
||||||
checked_rhs.get_type(),
|
|
||||||
),
|
),
|
||||||
})
|
}),
|
||||||
}
|
}
|
||||||
.map_err(|e| vec![e])
|
.map_err(|e| vec![e])
|
||||||
}
|
}
|
||||||
|
@ -1543,6 +1537,54 @@ impl<'ast> Checker<'ast> {
|
||||||
(TypedExpression::Boolean(e1), TypedExpression::Boolean(e2)) => {
|
(TypedExpression::Boolean(e1), TypedExpression::Boolean(e2)) => {
|
||||||
Ok(BooleanExpression::BoolEq(box e1, box e2).into())
|
Ok(BooleanExpression::BoolEq(box e1, box e2).into())
|
||||||
}
|
}
|
||||||
|
(TypedExpression::Array(e1), TypedExpression::Array(e2)) => {
|
||||||
|
if e1.get_type() == e2.get_type() {
|
||||||
|
Ok(BooleanExpression::ArrayEq(box e1, box e2).into())
|
||||||
|
} else {
|
||||||
|
Err(ErrorInner {
|
||||||
|
pos: Some(pos),
|
||||||
|
message: format!(
|
||||||
|
"Cannot compare {} of type {} to {} of type {}",
|
||||||
|
e1,
|
||||||
|
e1.get_type(),
|
||||||
|
e2,
|
||||||
|
e2.get_type()
|
||||||
|
),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
(TypedExpression::Struct(e1), TypedExpression::Struct(e2)) => {
|
||||||
|
if e1.get_type() == e2.get_type() {
|
||||||
|
Ok(BooleanExpression::StructEq(box e1, box e2).into())
|
||||||
|
} else {
|
||||||
|
Err(ErrorInner {
|
||||||
|
pos: Some(pos),
|
||||||
|
message: format!(
|
||||||
|
"Cannot compare {} of type {} to {} of type {}",
|
||||||
|
e1,
|
||||||
|
e1.get_type(),
|
||||||
|
e2,
|
||||||
|
e2.get_type()
|
||||||
|
),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
(TypedExpression::Uint(e1), TypedExpression::Uint(e2)) => {
|
||||||
|
if e1.get_type() == e2.get_type() {
|
||||||
|
Ok(BooleanExpression::UintEq(box e1, box e2).into())
|
||||||
|
} else {
|
||||||
|
Err(ErrorInner {
|
||||||
|
pos: Some(pos),
|
||||||
|
message: format!(
|
||||||
|
"Cannot compare {} of type {} to {} of type {}",
|
||||||
|
e1,
|
||||||
|
e1.get_type(),
|
||||||
|
e2,
|
||||||
|
e2.get_type()
|
||||||
|
),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
(e1, e2) => Err(ErrorInner {
|
(e1, e2) => Err(ErrorInner {
|
||||||
pos: Some(pos),
|
pos: Some(pos),
|
||||||
message: format!(
|
message: format!(
|
||||||
|
@ -3136,9 +3178,12 @@ mod tests {
|
||||||
// def bar():
|
// def bar():
|
||||||
// 2 == foo()
|
// 2 == foo()
|
||||||
// should fail
|
// should fail
|
||||||
let bar_statements: Vec<StatementNode<Bn128Field>> = vec![Statement::Condition(
|
let bar_statements: Vec<StatementNode<Bn128Field>> = vec![Statement::Assertion(
|
||||||
Expression::FieldConstant(Bn128Field::from(2)).mock(),
|
Expression::Eq(
|
||||||
Expression::FunctionCall("foo", vec![]).mock(),
|
box Expression::FieldConstant(Bn128Field::from(2)).mock(),
|
||||||
|
box Expression::FunctionCall("foo", vec![]).mock(),
|
||||||
|
)
|
||||||
|
.mock(),
|
||||||
)
|
)
|
||||||
.mock()];
|
.mock()];
|
||||||
|
|
||||||
|
@ -3535,9 +3580,12 @@ mod tests {
|
||||||
// def bar():
|
// def bar():
|
||||||
// 1 == foo()
|
// 1 == foo()
|
||||||
// should fail
|
// should fail
|
||||||
let bar_statements: Vec<StatementNode<Bn128Field>> = vec![Statement::Condition(
|
let bar_statements: Vec<StatementNode<Bn128Field>> = vec![Statement::Assertion(
|
||||||
Expression::FieldConstant(Bn128Field::from(1)).mock(),
|
Expression::Eq(
|
||||||
Expression::FunctionCall("foo", vec![]).mock(),
|
box Expression::FieldConstant(Bn128Field::from(1)).mock(),
|
||||||
|
box Expression::FunctionCall("foo", vec![]).mock(),
|
||||||
|
)
|
||||||
|
.mock(),
|
||||||
)
|
)
|
||||||
.mock()];
|
.mock()];
|
||||||
|
|
||||||
|
|
|
@ -248,14 +248,9 @@ pub fn fold_statement<'ast, T: Field>(
|
||||||
.map(|v| zir::ZirStatement::Declaration(v))
|
.map(|v| zir::ZirStatement::Declaration(v))
|
||||||
.collect()
|
.collect()
|
||||||
}
|
}
|
||||||
typed_absy::TypedStatement::Condition(left, right) => {
|
typed_absy::TypedStatement::Assertion(e) => {
|
||||||
let left = f.fold_expression(left);
|
let e = f.fold_boolean_expression(e);
|
||||||
let right = f.fold_expression(right);
|
vec![zir::ZirStatement::Assertion(e)]
|
||||||
assert_eq!(left.len(), right.len());
|
|
||||||
left.into_iter()
|
|
||||||
.zip(right.into_iter())
|
|
||||||
.map(|(left, right)| zir::ZirStatement::Condition(left, right))
|
|
||||||
.collect()
|
|
||||||
}
|
}
|
||||||
typed_absy::TypedStatement::For(..) => unreachable!(),
|
typed_absy::TypedStatement::For(..) => unreachable!(),
|
||||||
typed_absy::TypedStatement::MultipleDefinition(variables, elist) => {
|
typed_absy::TypedStatement::MultipleDefinition(variables, elist) => {
|
||||||
|
@ -555,6 +550,68 @@ pub fn fold_boolean_expression<'ast, T: Field>(
|
||||||
let e2 = f.fold_boolean_expression(e2);
|
let e2 = f.fold_boolean_expression(e2);
|
||||||
zir::BooleanExpression::BoolEq(box e1, box e2)
|
zir::BooleanExpression::BoolEq(box e1, box e2)
|
||||||
}
|
}
|
||||||
|
typed_absy::BooleanExpression::ArrayEq(box e1, box e2) => {
|
||||||
|
let e1 = f.fold_array_expression(e1);
|
||||||
|
let e2 = f.fold_array_expression(e2);
|
||||||
|
|
||||||
|
assert_eq!(e1.len(), e2.len());
|
||||||
|
|
||||||
|
e1.into_iter().zip(e2.into_iter()).fold(
|
||||||
|
zir::BooleanExpression::Value(true),
|
||||||
|
|acc, (e1, e2)| {
|
||||||
|
zir::BooleanExpression::And(
|
||||||
|
box acc,
|
||||||
|
box match (e1, e2) {
|
||||||
|
(
|
||||||
|
zir::ZirExpression::FieldElement(e1),
|
||||||
|
zir::ZirExpression::FieldElement(e2),
|
||||||
|
) => zir::BooleanExpression::FieldEq(box e1, box e2),
|
||||||
|
(zir::ZirExpression::Boolean(e1), zir::ZirExpression::Boolean(e2)) => {
|
||||||
|
zir::BooleanExpression::BoolEq(box e1, box e2)
|
||||||
|
}
|
||||||
|
(zir::ZirExpression::Uint(e1), zir::ZirExpression::Uint(e2)) => {
|
||||||
|
zir::BooleanExpression::UintEq(box e1, box e2)
|
||||||
|
}
|
||||||
|
_ => unreachable!(),
|
||||||
|
},
|
||||||
|
)
|
||||||
|
},
|
||||||
|
)
|
||||||
|
}
|
||||||
|
typed_absy::BooleanExpression::StructEq(box e1, box e2) => {
|
||||||
|
let e1 = f.fold_struct_expression(e1);
|
||||||
|
let e2 = f.fold_struct_expression(e2);
|
||||||
|
|
||||||
|
assert_eq!(e1.len(), e2.len());
|
||||||
|
|
||||||
|
e1.into_iter().zip(e2.into_iter()).fold(
|
||||||
|
zir::BooleanExpression::Value(true),
|
||||||
|
|acc, (e1, e2)| {
|
||||||
|
zir::BooleanExpression::And(
|
||||||
|
box acc,
|
||||||
|
box match (e1, e2) {
|
||||||
|
(
|
||||||
|
zir::ZirExpression::FieldElement(e1),
|
||||||
|
zir::ZirExpression::FieldElement(e2),
|
||||||
|
) => zir::BooleanExpression::FieldEq(box e1, box e2),
|
||||||
|
(zir::ZirExpression::Boolean(e1), zir::ZirExpression::Boolean(e2)) => {
|
||||||
|
zir::BooleanExpression::BoolEq(box e1, box e2)
|
||||||
|
}
|
||||||
|
(zir::ZirExpression::Uint(e1), zir::ZirExpression::Uint(e2)) => {
|
||||||
|
zir::BooleanExpression::UintEq(box e1, box e2)
|
||||||
|
}
|
||||||
|
_ => unreachable!(),
|
||||||
|
},
|
||||||
|
)
|
||||||
|
},
|
||||||
|
)
|
||||||
|
}
|
||||||
|
typed_absy::BooleanExpression::UintEq(box e1, box e2) => {
|
||||||
|
let e1 = f.fold_uint_expression(e1);
|
||||||
|
let e2 = f.fold_uint_expression(e2);
|
||||||
|
|
||||||
|
zir::BooleanExpression::UintEq(box e1, box e2)
|
||||||
|
}
|
||||||
typed_absy::BooleanExpression::Lt(box e1, box e2) => {
|
typed_absy::BooleanExpression::Lt(box e1, box e2) => {
|
||||||
let e1 = f.fold_field_expression(e1);
|
let e1 = f.fold_field_expression(e1);
|
||||||
let e2 = f.fold_field_expression(e2);
|
let e2 = f.fold_field_expression(e2);
|
||||||
|
|
|
@ -55,7 +55,7 @@ impl<'ast, T: Field> TypedProgram<'ast, T> {
|
||||||
let r = VariableAccessRemover::apply(r);
|
let r = VariableAccessRemover::apply(r);
|
||||||
|
|
||||||
// convert to zir, removing complex types
|
// convert to zir, removing complex types
|
||||||
let zir = Flattener::flatten(r.clone());
|
let zir = Flattener::flatten(r);
|
||||||
|
|
||||||
// optimize uint expressions
|
// optimize uint expressions
|
||||||
let zir = UintOptimizer::optimize(zir);
|
let zir = UintOptimizer::optimize(zir);
|
||||||
|
|
|
@ -112,13 +112,10 @@ impl<'ast, T: Field> Folder<'ast, T> for Propagator<'ast, T> {
|
||||||
TypedStatement::Definition(TypedAssignee::Member(..), _) => {
|
TypedStatement::Definition(TypedAssignee::Member(..), _) => {
|
||||||
unreachable!("struct update should have been replaced with full struct redef")
|
unreachable!("struct update should have been replaced with full struct redef")
|
||||||
}
|
}
|
||||||
// propagate lhs and rhs for conditions
|
// propagate the boolean
|
||||||
TypedStatement::Condition(e1, e2) => {
|
TypedStatement::Assertion(e) => {
|
||||||
// could stop execution here if condition is known to fail
|
// could stop execution here if condition is known to fail
|
||||||
Some(TypedStatement::Condition(
|
Some(TypedStatement::Assertion(self.fold_boolean_expression(e)))
|
||||||
self.fold_expression(e1),
|
|
||||||
self.fold_expression(e2),
|
|
||||||
))
|
|
||||||
}
|
}
|
||||||
// only loops with variable bounds are expected here
|
// only loops with variable bounds are expected here
|
||||||
// we stop propagation here as constants maybe be modified inside the loop body
|
// we stop propagation here as constants maybe be modified inside the loop body
|
||||||
|
@ -957,6 +954,11 @@ impl<'ast, T: Field> Folder<'ast, T> for Propagator<'ast, T> {
|
||||||
&mut self,
|
&mut self,
|
||||||
e: BooleanExpression<'ast, T>,
|
e: BooleanExpression<'ast, T>,
|
||||||
) -> BooleanExpression<'ast, T> {
|
) -> BooleanExpression<'ast, T> {
|
||||||
|
// Note: we only propagate when we see constants, as comparing of arbitrary expressions would lead to
|
||||||
|
// a lot of false negatives due to expressions not being in a canonical form
|
||||||
|
// For example, `2 * a` is equivalent to `a + a`, but our notion of equality would not detect that here
|
||||||
|
// These kind of reduction rules are easier to apply later in the process, when we have canonical representations
|
||||||
|
// of expressions, ie `a + a` would always be written `2 * a`
|
||||||
match e {
|
match e {
|
||||||
BooleanExpression::Identifier(id) => match self
|
BooleanExpression::Identifier(id) => match self
|
||||||
.constants
|
.constants
|
||||||
|
|
|
@ -53,6 +53,24 @@ fn force_no_reduce<'ast, T: Field>(e: UExpression<'ast, T>) -> UExpression<'ast,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'ast, T: Field> Folder<'ast, T> for UintOptimizer<'ast, T> {
|
impl<'ast, T: Field> Folder<'ast, T> for UintOptimizer<'ast, T> {
|
||||||
|
fn fold_boolean_expression(
|
||||||
|
&mut self,
|
||||||
|
e: BooleanExpression<'ast, T>,
|
||||||
|
) -> BooleanExpression<'ast, T> {
|
||||||
|
match e {
|
||||||
|
BooleanExpression::UintEq(box left, box right) => {
|
||||||
|
let left = self.fold_uint_expression(left);
|
||||||
|
let right = self.fold_uint_expression(right);
|
||||||
|
|
||||||
|
let left = force_reduce(left);
|
||||||
|
let right = force_reduce(right);
|
||||||
|
|
||||||
|
BooleanExpression::UintEq(box left, box right)
|
||||||
|
}
|
||||||
|
e => fold_boolean_expression(self, e),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fn fold_uint_expression(&mut self, e: UExpression<'ast, T>) -> UExpression<'ast, T> {
|
fn fold_uint_expression(&mut self, e: UExpression<'ast, T>) -> UExpression<'ast, T> {
|
||||||
if e.metadata.is_some() {
|
if e.metadata.is_some() {
|
||||||
return e;
|
return e;
|
||||||
|
@ -398,17 +416,17 @@ impl<'ast, T: Field> Folder<'ast, T> for UintOptimizer<'ast, T> {
|
||||||
)],
|
)],
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
// we need to put back in range to assert
|
ZirStatement::Assertion(BooleanExpression::UintEq(box left, box right)) => {
|
||||||
ZirStatement::Condition(lhs, rhs) => {
|
let left = self.fold_uint_expression(left);
|
||||||
match (self.fold_expression(lhs), self.fold_expression(rhs)) {
|
let right = self.fold_uint_expression(right);
|
||||||
(ZirExpression::Uint(lhs), ZirExpression::Uint(rhs)) => {
|
|
||||||
vec![ZirStatement::Condition(
|
// we can only compare two unsigned integers if they are in range
|
||||||
force_reduce(lhs).into(),
|
let left = force_reduce(left);
|
||||||
force_reduce(rhs).into(),
|
let right = force_reduce(right);
|
||||||
)]
|
|
||||||
}
|
vec![ZirStatement::Assertion(BooleanExpression::UintEq(
|
||||||
(lhs, rhs) => vec![ZirStatement::Condition(lhs, rhs)],
|
box left, box right,
|
||||||
}
|
))]
|
||||||
}
|
}
|
||||||
s => fold_statement(self, s),
|
s => fold_statement(self, s),
|
||||||
}
|
}
|
||||||
|
|
|
@ -84,13 +84,12 @@ impl<'ast> Unroller<'ast> {
|
||||||
|
|
||||||
match head {
|
match head {
|
||||||
Access::Select(head) => {
|
Access::Select(head) => {
|
||||||
statements.insert(TypedStatement::Condition(
|
statements.insert(TypedStatement::Assertion(
|
||||||
BooleanExpression::Lt(
|
BooleanExpression::Lt(
|
||||||
box head.clone(),
|
box head.clone(),
|
||||||
box FieldElementExpression::Number(T::from(size)),
|
box FieldElementExpression::Number(T::from(size)),
|
||||||
)
|
)
|
||||||
.into(),
|
.into(),
|
||||||
BooleanExpression::Value(true).into(),
|
|
||||||
));
|
));
|
||||||
|
|
||||||
ArrayExpressionInner::Value(
|
ArrayExpressionInner::Value(
|
||||||
|
@ -1089,13 +1088,12 @@ mod tests {
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
u.fold_statement(s),
|
u.fold_statement(s),
|
||||||
vec![
|
vec![
|
||||||
TypedStatement::Condition(
|
TypedStatement::Assertion(
|
||||||
BooleanExpression::Lt(
|
BooleanExpression::Lt(
|
||||||
box FieldElementExpression::Number(Bn128Field::from(1)),
|
box FieldElementExpression::Number(Bn128Field::from(1)),
|
||||||
box FieldElementExpression::Number(Bn128Field::from(2))
|
box FieldElementExpression::Number(Bn128Field::from(2))
|
||||||
)
|
)
|
||||||
.into(),
|
.into(),
|
||||||
BooleanExpression::Value(true).into()
|
|
||||||
),
|
),
|
||||||
TypedStatement::Definition(
|
TypedStatement::Definition(
|
||||||
TypedAssignee::Identifier(Variable::field_array(
|
TypedAssignee::Identifier(Variable::field_array(
|
||||||
|
@ -1227,13 +1225,12 @@ mod tests {
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
u.fold_statement(s),
|
u.fold_statement(s),
|
||||||
vec![
|
vec![
|
||||||
TypedStatement::Condition(
|
TypedStatement::Assertion(
|
||||||
BooleanExpression::Lt(
|
BooleanExpression::Lt(
|
||||||
box FieldElementExpression::Number(Bn128Field::from(1)),
|
box FieldElementExpression::Number(Bn128Field::from(1)),
|
||||||
box FieldElementExpression::Number(Bn128Field::from(2))
|
box FieldElementExpression::Number(Bn128Field::from(2))
|
||||||
)
|
)
|
||||||
.into(),
|
.into(),
|
||||||
BooleanExpression::Value(true).into()
|
|
||||||
),
|
),
|
||||||
TypedStatement::Definition(
|
TypedStatement::Definition(
|
||||||
TypedAssignee::Identifier(Variable::with_id_and_type(
|
TypedAssignee::Identifier(Variable::with_id_and_type(
|
||||||
|
|
|
@ -39,7 +39,7 @@ impl<'ast, T: Field> VariableAccessRemover<'ast, T> {
|
||||||
_ => unreachable!(),
|
_ => unreachable!(),
|
||||||
};
|
};
|
||||||
|
|
||||||
self.statements.push(TypedStatement::Condition(
|
self.statements.push(TypedStatement::Assertion(
|
||||||
(0..size)
|
(0..size)
|
||||||
.map(|index| {
|
.map(|index| {
|
||||||
BooleanExpression::FieldEq(
|
BooleanExpression::FieldEq(
|
||||||
|
@ -53,7 +53,6 @@ impl<'ast, T: Field> VariableAccessRemover<'ast, T> {
|
||||||
})
|
})
|
||||||
.unwrap()
|
.unwrap()
|
||||||
.into(),
|
.into(),
|
||||||
BooleanExpression::Value(true).into(),
|
|
||||||
));
|
));
|
||||||
|
|
||||||
(0..size)
|
(0..size)
|
||||||
|
@ -170,7 +169,7 @@ mod tests {
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
VariableAccessRemover::new().fold_statement(access),
|
VariableAccessRemover::new().fold_statement(access),
|
||||||
vec![
|
vec![
|
||||||
TypedStatement::Condition(
|
TypedStatement::Assertion(
|
||||||
BooleanExpression::Or(
|
BooleanExpression::Or(
|
||||||
box BooleanExpression::FieldEq(
|
box BooleanExpression::FieldEq(
|
||||||
box FieldElementExpression::Identifier("i".into()),
|
box FieldElementExpression::Identifier("i".into()),
|
||||||
|
@ -182,7 +181,6 @@ mod tests {
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
.into(),
|
.into(),
|
||||||
BooleanExpression::Value(true).into()
|
|
||||||
),
|
),
|
||||||
TypedStatement::Definition(
|
TypedStatement::Definition(
|
||||||
TypedAssignee::Identifier(Variable::field_element("b")),
|
TypedAssignee::Identifier(Variable::field_element("b")),
|
||||||
|
|
|
@ -165,9 +165,7 @@ pub fn fold_statement<'ast, T: Field, F: Folder<'ast, T>>(
|
||||||
TypedStatement::Definition(f.fold_assignee(a), f.fold_expression(e))
|
TypedStatement::Definition(f.fold_assignee(a), f.fold_expression(e))
|
||||||
}
|
}
|
||||||
TypedStatement::Declaration(v) => TypedStatement::Declaration(f.fold_variable(v)),
|
TypedStatement::Declaration(v) => TypedStatement::Declaration(f.fold_variable(v)),
|
||||||
TypedStatement::Condition(left, right) => {
|
TypedStatement::Assertion(e) => TypedStatement::Assertion(f.fold_boolean_expression(e)),
|
||||||
TypedStatement::Condition(f.fold_expression(left), f.fold_expression(right))
|
|
||||||
}
|
|
||||||
TypedStatement::For(v, from, to, statements) => TypedStatement::For(
|
TypedStatement::For(v, from, to, statements) => TypedStatement::For(
|
||||||
f.fold_variable(v),
|
f.fold_variable(v),
|
||||||
from,
|
from,
|
||||||
|
@ -325,6 +323,21 @@ pub fn fold_boolean_expression<'ast, T: Field, F: Folder<'ast, T>>(
|
||||||
let e2 = f.fold_boolean_expression(e2);
|
let e2 = f.fold_boolean_expression(e2);
|
||||||
BooleanExpression::BoolEq(box e1, box e2)
|
BooleanExpression::BoolEq(box e1, box e2)
|
||||||
}
|
}
|
||||||
|
BooleanExpression::ArrayEq(box e1, box e2) => {
|
||||||
|
let e1 = f.fold_array_expression(e1);
|
||||||
|
let e2 = f.fold_array_expression(e2);
|
||||||
|
BooleanExpression::ArrayEq(box e1, box e2)
|
||||||
|
}
|
||||||
|
BooleanExpression::StructEq(box e1, box e2) => {
|
||||||
|
let e1 = f.fold_struct_expression(e1);
|
||||||
|
let e2 = f.fold_struct_expression(e2);
|
||||||
|
BooleanExpression::StructEq(box e1, box e2)
|
||||||
|
}
|
||||||
|
BooleanExpression::UintEq(box e1, box e2) => {
|
||||||
|
let e1 = f.fold_uint_expression(e1);
|
||||||
|
let e2 = f.fold_uint_expression(e2);
|
||||||
|
BooleanExpression::UintEq(box e1, box e2)
|
||||||
|
}
|
||||||
BooleanExpression::Lt(box e1, box e2) => {
|
BooleanExpression::Lt(box e1, box e2) => {
|
||||||
let e1 = f.fold_field_expression(e1);
|
let e1 = f.fold_field_expression(e1);
|
||||||
let e2 = f.fold_field_expression(e2);
|
let e2 = f.fold_field_expression(e2);
|
||||||
|
|
|
@ -300,7 +300,7 @@ pub enum TypedStatement<'ast, T> {
|
||||||
Return(Vec<TypedExpression<'ast, T>>),
|
Return(Vec<TypedExpression<'ast, T>>),
|
||||||
Definition(TypedAssignee<'ast, T>, TypedExpression<'ast, T>),
|
Definition(TypedAssignee<'ast, T>, TypedExpression<'ast, T>),
|
||||||
Declaration(Variable<'ast>),
|
Declaration(Variable<'ast>),
|
||||||
Condition(TypedExpression<'ast, T>, TypedExpression<'ast, T>),
|
Assertion(BooleanExpression<'ast, T>),
|
||||||
For(
|
For(
|
||||||
Variable<'ast>,
|
Variable<'ast>,
|
||||||
FieldElementExpression<'ast, T>,
|
FieldElementExpression<'ast, T>,
|
||||||
|
@ -327,9 +327,7 @@ impl<'ast, T: fmt::Debug> fmt::Debug for TypedStatement<'ast, T> {
|
||||||
TypedStatement::Definition(ref lhs, ref rhs) => {
|
TypedStatement::Definition(ref lhs, ref rhs) => {
|
||||||
write!(f, "Definition({:?}, {:?})", lhs, rhs)
|
write!(f, "Definition({:?}, {:?})", lhs, rhs)
|
||||||
}
|
}
|
||||||
TypedStatement::Condition(ref lhs, ref rhs) => {
|
TypedStatement::Assertion(ref e) => write!(f, "Assertion({:?})", e),
|
||||||
write!(f, "Condition({:?}, {:?})", lhs, rhs)
|
|
||||||
}
|
|
||||||
TypedStatement::For(ref var, ref start, ref stop, ref list) => {
|
TypedStatement::For(ref var, ref start, ref stop, ref list) => {
|
||||||
write!(f, "for {:?} in {:?}..{:?} do\n", var, start, stop)?;
|
write!(f, "for {:?} in {:?}..{:?} do\n", var, start, stop)?;
|
||||||
for l in list {
|
for l in list {
|
||||||
|
@ -376,7 +374,7 @@ impl<'ast, T: fmt::Display> fmt::Display for TypedStatement<'ast, T> {
|
||||||
}
|
}
|
||||||
TypedStatement::Declaration(ref var) => write!(f, "{}", var),
|
TypedStatement::Declaration(ref var) => write!(f, "{}", var),
|
||||||
TypedStatement::Definition(ref lhs, ref rhs) => write!(f, "{} = {}", lhs, rhs),
|
TypedStatement::Definition(ref lhs, ref rhs) => write!(f, "{} = {}", lhs, rhs),
|
||||||
TypedStatement::Condition(ref lhs, ref rhs) => write!(f, "{} == {}", lhs, rhs),
|
TypedStatement::Assertion(ref e) => write!(f, "assert({})", e),
|
||||||
TypedStatement::For(ref var, ref start, ref stop, ref list) => {
|
TypedStatement::For(ref var, ref start, ref stop, ref list) => {
|
||||||
write!(f, "for {} in {}..{} do\n", var, start, stop)?;
|
write!(f, "for {} in {}..{} do\n", var, start, stop)?;
|
||||||
for l in list {
|
for l in list {
|
||||||
|
@ -639,6 +637,12 @@ pub enum BooleanExpression<'ast, T> {
|
||||||
Box<BooleanExpression<'ast, T>>,
|
Box<BooleanExpression<'ast, T>>,
|
||||||
Box<BooleanExpression<'ast, T>>,
|
Box<BooleanExpression<'ast, T>>,
|
||||||
),
|
),
|
||||||
|
ArrayEq(Box<ArrayExpression<'ast, T>>, Box<ArrayExpression<'ast, T>>),
|
||||||
|
StructEq(
|
||||||
|
Box<StructExpression<'ast, T>>,
|
||||||
|
Box<StructExpression<'ast, T>>,
|
||||||
|
),
|
||||||
|
UintEq(Box<UExpression<'ast, T>>, Box<UExpression<'ast, T>>),
|
||||||
Ge(
|
Ge(
|
||||||
Box<FieldElementExpression<'ast, T>>,
|
Box<FieldElementExpression<'ast, T>>,
|
||||||
Box<FieldElementExpression<'ast, T>>,
|
Box<FieldElementExpression<'ast, T>>,
|
||||||
|
@ -906,6 +910,9 @@ impl<'ast, T: fmt::Display> fmt::Display for BooleanExpression<'ast, T> {
|
||||||
BooleanExpression::Le(ref lhs, ref rhs) => write!(f, "{} <= {}", lhs, rhs),
|
BooleanExpression::Le(ref lhs, ref rhs) => write!(f, "{} <= {}", lhs, rhs),
|
||||||
BooleanExpression::FieldEq(ref lhs, ref rhs) => write!(f, "{} == {}", lhs, rhs),
|
BooleanExpression::FieldEq(ref lhs, ref rhs) => write!(f, "{} == {}", lhs, rhs),
|
||||||
BooleanExpression::BoolEq(ref lhs, ref rhs) => write!(f, "{} == {}", lhs, rhs),
|
BooleanExpression::BoolEq(ref lhs, ref rhs) => write!(f, "{} == {}", lhs, rhs),
|
||||||
|
BooleanExpression::ArrayEq(ref lhs, ref rhs) => write!(f, "{} == {}", lhs, rhs),
|
||||||
|
BooleanExpression::StructEq(ref lhs, ref rhs) => write!(f, "{} == {}", lhs, rhs),
|
||||||
|
BooleanExpression::UintEq(ref lhs, ref rhs) => write!(f, "{} == {}", lhs, rhs),
|
||||||
BooleanExpression::Ge(ref lhs, ref rhs) => write!(f, "{} >= {}", lhs, rhs),
|
BooleanExpression::Ge(ref lhs, ref rhs) => write!(f, "{} >= {}", lhs, rhs),
|
||||||
BooleanExpression::Gt(ref lhs, ref rhs) => write!(f, "{} > {}", lhs, rhs),
|
BooleanExpression::Gt(ref lhs, ref rhs) => write!(f, "{} > {}", lhs, rhs),
|
||||||
BooleanExpression::Or(ref lhs, ref rhs) => write!(f, "{} || {}", lhs, rhs),
|
BooleanExpression::Or(ref lhs, ref rhs) => write!(f, "{} || {}", lhs, rhs),
|
||||||
|
@ -985,6 +992,15 @@ impl<'ast, T: fmt::Debug> fmt::Debug for BooleanExpression<'ast, T> {
|
||||||
BooleanExpression::BoolEq(ref lhs, ref rhs) => {
|
BooleanExpression::BoolEq(ref lhs, ref rhs) => {
|
||||||
write!(f, "BoolEq({:?}, {:?})", lhs, rhs)
|
write!(f, "BoolEq({:?}, {:?})", lhs, rhs)
|
||||||
}
|
}
|
||||||
|
BooleanExpression::ArrayEq(ref lhs, ref rhs) => {
|
||||||
|
write!(f, "ArrayEq({:?}, {:?})", lhs, rhs)
|
||||||
|
}
|
||||||
|
BooleanExpression::StructEq(ref lhs, ref rhs) => {
|
||||||
|
write!(f, "StructEq({:?}, {:?})", lhs, rhs)
|
||||||
|
}
|
||||||
|
BooleanExpression::UintEq(ref lhs, ref rhs) => {
|
||||||
|
write!(f, "UintEq({:?}, {:?})", lhs, rhs)
|
||||||
|
}
|
||||||
BooleanExpression::Ge(ref lhs, ref rhs) => write!(f, "Ge({:?}, {:?})", lhs, rhs),
|
BooleanExpression::Ge(ref lhs, ref rhs) => write!(f, "Ge({:?}, {:?})", lhs, rhs),
|
||||||
BooleanExpression::Gt(ref lhs, ref rhs) => write!(f, "Gt({:?}, {:?})", lhs, rhs),
|
BooleanExpression::Gt(ref lhs, ref rhs) => write!(f, "Gt({:?}, {:?})", lhs, rhs),
|
||||||
BooleanExpression::And(ref lhs, ref rhs) => write!(f, "And({:?}, {:?})", lhs, rhs),
|
BooleanExpression::And(ref lhs, ref rhs) => write!(f, "And({:?}, {:?})", lhs, rhs),
|
||||||
|
|
|
@ -130,9 +130,7 @@ pub fn fold_statement<'ast, T: Field, F: Folder<'ast, T>>(
|
||||||
ZirStatement::Definition(f.fold_assignee(a), f.fold_expression(e))
|
ZirStatement::Definition(f.fold_assignee(a), f.fold_expression(e))
|
||||||
}
|
}
|
||||||
ZirStatement::Declaration(v) => ZirStatement::Declaration(f.fold_variable(v)),
|
ZirStatement::Declaration(v) => ZirStatement::Declaration(f.fold_variable(v)),
|
||||||
ZirStatement::Condition(left, right) => {
|
ZirStatement::Assertion(e) => ZirStatement::Assertion(f.fold_boolean_expression(e)),
|
||||||
ZirStatement::Condition(f.fold_expression(left), f.fold_expression(right))
|
|
||||||
}
|
|
||||||
ZirStatement::MultipleDefinition(variables, elist) => ZirStatement::MultipleDefinition(
|
ZirStatement::MultipleDefinition(variables, elist) => ZirStatement::MultipleDefinition(
|
||||||
variables.into_iter().map(|v| f.fold_variable(v)).collect(),
|
variables.into_iter().map(|v| f.fold_variable(v)).collect(),
|
||||||
f.fold_expression_list(elist),
|
f.fold_expression_list(elist),
|
||||||
|
@ -201,6 +199,11 @@ pub fn fold_boolean_expression<'ast, T: Field, F: Folder<'ast, T>>(
|
||||||
let e2 = f.fold_boolean_expression(e2);
|
let e2 = f.fold_boolean_expression(e2);
|
||||||
BooleanExpression::BoolEq(box e1, box e2)
|
BooleanExpression::BoolEq(box e1, box e2)
|
||||||
}
|
}
|
||||||
|
BooleanExpression::UintEq(box e1, box e2) => {
|
||||||
|
let e1 = f.fold_uint_expression(e1);
|
||||||
|
let e2 = f.fold_uint_expression(e2);
|
||||||
|
BooleanExpression::UintEq(box e1, box e2)
|
||||||
|
}
|
||||||
BooleanExpression::Lt(box e1, box e2) => {
|
BooleanExpression::Lt(box e1, box e2) => {
|
||||||
let e1 = f.fold_field_expression(e1);
|
let e1 = f.fold_field_expression(e1);
|
||||||
let e2 = f.fold_field_expression(e2);
|
let e2 = f.fold_field_expression(e2);
|
||||||
|
|
|
@ -191,7 +191,7 @@ pub enum ZirStatement<'ast, T> {
|
||||||
Return(Vec<ZirExpression<'ast, T>>),
|
Return(Vec<ZirExpression<'ast, T>>),
|
||||||
Definition(ZirAssignee<'ast>, ZirExpression<'ast, T>),
|
Definition(ZirAssignee<'ast>, ZirExpression<'ast, T>),
|
||||||
Declaration(Variable<'ast>),
|
Declaration(Variable<'ast>),
|
||||||
Condition(ZirExpression<'ast, T>, ZirExpression<'ast, T>),
|
Assertion(BooleanExpression<'ast, T>),
|
||||||
MultipleDefinition(Vec<Variable<'ast>>, ZirExpressionList<'ast, T>),
|
MultipleDefinition(Vec<Variable<'ast>>, ZirExpressionList<'ast, T>),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -212,9 +212,7 @@ impl<'ast, T: fmt::Debug> fmt::Debug for ZirStatement<'ast, T> {
|
||||||
ZirStatement::Definition(ref lhs, ref rhs) => {
|
ZirStatement::Definition(ref lhs, ref rhs) => {
|
||||||
write!(f, "Definition({:?}, {:?})", lhs, rhs)
|
write!(f, "Definition({:?}, {:?})", lhs, rhs)
|
||||||
}
|
}
|
||||||
ZirStatement::Condition(ref lhs, ref rhs) => {
|
ZirStatement::Assertion(ref e) => write!(f, "Assertion({:?})", e),
|
||||||
write!(f, "Condition({:?}, {:?})", lhs, rhs)
|
|
||||||
}
|
|
||||||
ZirStatement::MultipleDefinition(ref lhs, ref rhs) => {
|
ZirStatement::MultipleDefinition(ref lhs, ref rhs) => {
|
||||||
write!(f, "MultipleDefinition({:?}, {:?})", lhs, rhs)
|
write!(f, "MultipleDefinition({:?}, {:?})", lhs, rhs)
|
||||||
}
|
}
|
||||||
|
@ -235,9 +233,9 @@ impl<'ast, T: fmt::Display> fmt::Display for ZirStatement<'ast, T> {
|
||||||
}
|
}
|
||||||
write!(f, "")
|
write!(f, "")
|
||||||
}
|
}
|
||||||
ZirStatement::Declaration(ref var) => write!(f, "{}", var),
|
ZirStatement::Declaration(ref var) => write!(f, "assert({})", var),
|
||||||
ZirStatement::Definition(ref lhs, ref rhs) => write!(f, "{} = {}", lhs, rhs),
|
ZirStatement::Definition(ref lhs, ref rhs) => write!(f, "{} = {}", lhs, rhs),
|
||||||
ZirStatement::Condition(ref lhs, ref rhs) => write!(f, "{} == {}", lhs, rhs),
|
ZirStatement::Assertion(ref e) => write!(f, "{}", e),
|
||||||
ZirStatement::MultipleDefinition(ref ids, ref rhs) => {
|
ZirStatement::MultipleDefinition(ref ids, ref rhs) => {
|
||||||
for (i, id) in ids.iter().enumerate() {
|
for (i, id) in ids.iter().enumerate() {
|
||||||
write!(f, "{}", id)?;
|
write!(f, "{}", id)?;
|
||||||
|
@ -399,6 +397,7 @@ pub enum BooleanExpression<'ast, T> {
|
||||||
Box<BooleanExpression<'ast, T>>,
|
Box<BooleanExpression<'ast, T>>,
|
||||||
Box<BooleanExpression<'ast, T>>,
|
Box<BooleanExpression<'ast, T>>,
|
||||||
),
|
),
|
||||||
|
UintEq(Box<UExpression<'ast, T>>, Box<UExpression<'ast, T>>),
|
||||||
Ge(
|
Ge(
|
||||||
Box<FieldElementExpression<'ast, T>>,
|
Box<FieldElementExpression<'ast, T>>,
|
||||||
Box<FieldElementExpression<'ast, T>>,
|
Box<FieldElementExpression<'ast, T>>,
|
||||||
|
@ -511,6 +510,7 @@ impl<'ast, T: fmt::Display> fmt::Display for BooleanExpression<'ast, T> {
|
||||||
BooleanExpression::Le(ref lhs, ref rhs) => write!(f, "{} <= {}", lhs, rhs),
|
BooleanExpression::Le(ref lhs, ref rhs) => write!(f, "{} <= {}", lhs, rhs),
|
||||||
BooleanExpression::FieldEq(ref lhs, ref rhs) => write!(f, "{} == {}", lhs, rhs),
|
BooleanExpression::FieldEq(ref lhs, ref rhs) => write!(f, "{} == {}", lhs, rhs),
|
||||||
BooleanExpression::BoolEq(ref lhs, ref rhs) => write!(f, "{} == {}", lhs, rhs),
|
BooleanExpression::BoolEq(ref lhs, ref rhs) => write!(f, "{} == {}", lhs, rhs),
|
||||||
|
BooleanExpression::UintEq(ref lhs, ref rhs) => write!(f, "{} == {}", lhs, rhs),
|
||||||
BooleanExpression::Ge(ref lhs, ref rhs) => write!(f, "{} >= {}", lhs, rhs),
|
BooleanExpression::Ge(ref lhs, ref rhs) => write!(f, "{} >= {}", lhs, rhs),
|
||||||
BooleanExpression::Gt(ref lhs, ref rhs) => write!(f, "{} > {}", lhs, rhs),
|
BooleanExpression::Gt(ref lhs, ref rhs) => write!(f, "{} > {}", lhs, rhs),
|
||||||
BooleanExpression::Or(ref lhs, ref rhs) => write!(f, "{} || {}", lhs, rhs),
|
BooleanExpression::Or(ref lhs, ref rhs) => write!(f, "{} || {}", lhs, rhs),
|
||||||
|
|
|
@ -15,7 +15,7 @@ fn out_of_range() {
|
||||||
let source = r#"
|
let source = r#"
|
||||||
def main(private field a) -> (field):
|
def main(private field a) -> (field):
|
||||||
field x = if a < 5555 then 3333 else 4444 fi
|
field x = if a < 5555 then 3333 else 4444 fi
|
||||||
x == 3333
|
assert(x == 3333)
|
||||||
return 1
|
return 1
|
||||||
"#
|
"#
|
||||||
.to_string();
|
.to_string();
|
||||||
|
|
|
@ -1,3 +1,3 @@
|
||||||
def main(field a) -> ():
|
def main(field a) -> ():
|
||||||
a == 1
|
assert(a == 1)
|
||||||
return
|
return
|
|
@ -6,9 +6,9 @@ def local(field a) -> (field): // this costs 3 constraints per call
|
||||||
|
|
||||||
def main(field a) -> ():
|
def main(field a) -> ():
|
||||||
// calling a local function many times with the same arg should cost only once
|
// calling a local function many times with the same arg should cost only once
|
||||||
local(a) + local(a) + local(a) + local(a) + local(a) == 5 * (a ** 8)
|
assert(local(a) + local(a) + local(a) + local(a) + local(a) == 5 * (a ** 8))
|
||||||
|
|
||||||
// calling an imported function many times with the same arg should cost only once
|
// calling an imported function many times with the same arg should cost only once
|
||||||
dep(a) + dep(a) + dep(a) + dep(a) + dep(a) == 5 * (a ** 4)
|
assert(dep(a) + dep(a) + dep(a) + dep(a) + dep(a) == 5 * (a ** 4))
|
||||||
|
|
||||||
return
|
return
|
||||||
|
|
|
@ -4,15 +4,11 @@
|
||||||
"tests": [
|
"tests": [
|
||||||
{
|
{
|
||||||
"input": {
|
"input": {
|
||||||
"values": [
|
"values": []
|
||||||
"12"
|
|
||||||
]
|
|
||||||
},
|
},
|
||||||
"output": {
|
"output": {
|
||||||
"Ok": {
|
"Ok": {
|
||||||
"values": [
|
"values": []
|
||||||
"12"
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
def main(field g) -> (field):
|
def main() -> ():
|
||||||
9 == 1 + 2 * 2 ** 2 // Checks precedence of arithmetic operators (expecting transitive behaviour)
|
assert(9 == 1 + 2 * 2 ** 2) // Checks precedence of arithmetic operators (expecting transitive behaviour)
|
||||||
9 == 2 ** 2 * 2 + 1
|
assert(9 == 2 ** 2 * 2 + 1)
|
||||||
7 == 2 ** 2 * 2 - 1
|
assert(7 == 2 ** 2 * 2 - 1)
|
||||||
3 == 2 ** 2 / 2 + 1
|
assert(3 == 2 ** 2 / 2 + 1)
|
||||||
|
|
||||||
field a = if 3 == 2 ** 2 / 2 + 1 && true then 1 else 0 fi // combines arithmetic with boolean operators
|
field a = if 3 == 2 ** 2 / 2 + 1 && true then 1 else 0 fi // combines arithmetic with boolean operators
|
||||||
field b = if 3 == 3 && 4 < 5 then 1 else 0 fi // checks precedence of boolean operators
|
field b = if 3 == 3 && 4 < 5 then 1 else 0 fi // checks precedence of boolean operators
|
||||||
|
@ -11,6 +11,8 @@ def main(field g) -> (field):
|
||||||
field e = if 2 >= 1 && 4 > 5 || 1 == 1 then 1 else 0 fi
|
field e = if 2 >= 1 && 4 > 5 || 1 == 1 then 1 else 0 fi
|
||||||
field f = if 1 < 2 && false || 4 < 5 && 2 >= 1 then 1 else 0 fi
|
field f = if 1 < 2 && false || 4 < 5 && 2 >= 1 then 1 else 0 fi
|
||||||
|
|
||||||
|
assert(0x00 ^ 0x00 == 0x00)
|
||||||
|
|
||||||
//check if all statements have evalutated to true
|
//check if all statements have evalutated to true
|
||||||
a * b * c * d * e * f == 1
|
assert(a * b * c * d * e * f == 1)
|
||||||
return g
|
return
|
||||||
|
|
4
zokrates_core_test/tests/tests/uint/eq.json
Normal file
4
zokrates_core_test/tests/tests/uint/eq.json
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
{
|
||||||
|
"entry_point": "./tests/tests/uint/eq.zok",
|
||||||
|
"tests": []
|
||||||
|
}
|
3
zokrates_core_test/tests/tests/uint/eq.zok
Normal file
3
zokrates_core_test/tests/tests/uint/eq.zok
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
def main(private u32 a, u32 b) -> (field):
|
||||||
|
field result = if a * a == b then 1 else 0 fi
|
||||||
|
return result
|
|
@ -60,47 +60,47 @@ def main(u32 e, u32 f, u32[4] terms) -> ():
|
||||||
|
|
||||||
// rotate
|
// rotate
|
||||||
u32 rotated = right_rotate_4(e)
|
u32 rotated = right_rotate_4(e)
|
||||||
rotated == 0x81234567
|
assert(rotated == 0x81234567)
|
||||||
|
|
||||||
// and
|
// and
|
||||||
(e & f) == 0x00204460
|
assert((e & f) == 0x00204460)
|
||||||
|
|
||||||
// xor
|
// xor
|
||||||
(e ^ f) == 0x1317131f
|
assert((e ^ f) == 0x1317131f)
|
||||||
|
|
||||||
// shift
|
// shift
|
||||||
e >> 12 == 0x00012345
|
assert(e >> 12 == 0x00012345)
|
||||||
e << 12 == 0x45678000
|
assert(e << 12 == 0x45678000)
|
||||||
|
|
||||||
// not
|
// not
|
||||||
!e == 0xedcba987
|
assert(!e == 0xedcba987)
|
||||||
|
|
||||||
// add
|
// add
|
||||||
terms[0] + terms[1] + terms[2] + terms[3] == 0xddddddda
|
assert(terms[0] + terms[1] + terms[2] + terms[3] == 0xddddddda)
|
||||||
|
|
||||||
// to_bits
|
// to_bits
|
||||||
bool[32] bits1 = to_bits(e)
|
bool[32] bits1 = to_bits(e)
|
||||||
bool[32] expected1 = [false, false, false, true, false, false, true, false, false, false, true, true, false, true, false, false, false, true, false, true, false, true, true, false, false, true, true, true, true, false, false, false]
|
bool[32] expected1 = [false, false, false, true, false, false, true, false, false, false, true, true, false, true, false, false, false, true, false, true, false, true, true, false, false, true, true, true, true, false, false, false]
|
||||||
bits1 == expected1
|
assert(bits1 == expected1)
|
||||||
e == from_bits(expected1)
|
assert(e == from_bits(expected1))
|
||||||
|
|
||||||
bool[32] bits2 = to_bits(f)
|
bool[32] bits2 = to_bits(f)
|
||||||
bool[32] expected2 = [false, false, false, false, false, false, false, true, false, false, true, false, false, false, true, true, false, true, false, false, false, true, false, true, false, true, true, false, false, true, true, true]
|
bool[32] expected2 = [false, false, false, false, false, false, false, true, false, false, true, false, false, false, true, true, false, true, false, false, false, true, false, true, false, true, true, false, false, true, true, true]
|
||||||
bits2 == expected2
|
assert(bits2 == expected2)
|
||||||
f == from_bits(expected2)
|
assert(f == from_bits(expected2))
|
||||||
|
|
||||||
// S0
|
// S0
|
||||||
u32 e2 = right_rotate_2(e)
|
u32 e2 = right_rotate_2(e)
|
||||||
u32 e13 = right_rotate_13(e)
|
u32 e13 = right_rotate_13(e)
|
||||||
u32 e22 = right_rotate_22(e)
|
u32 e22 = right_rotate_22(e)
|
||||||
u32 S0 = e2 ^ e13 ^ e22
|
u32 S0 = e2 ^ e13 ^ e22
|
||||||
S0 == 0x66146474
|
assert(S0 == 0x66146474)
|
||||||
|
|
||||||
// S1
|
// S1
|
||||||
u32 e6 = right_rotate_6(e)
|
u32 e6 = right_rotate_6(e)
|
||||||
u32 e11 = right_rotate_11(e)
|
u32 e11 = right_rotate_11(e)
|
||||||
u32 e25 = right_rotate_25(e)
|
u32 e25 = right_rotate_25(e)
|
||||||
u32 S1 = e6 ^ e11 ^ e25
|
u32 S1 = e6 ^ e11 ^ e25
|
||||||
S1 == 0x3561abda
|
assert(S1 == 0x3561abda)
|
||||||
|
|
||||||
return
|
return
|
|
@ -54,6 +54,7 @@ def right_rotate_22(u32 e) -> (u32):
|
||||||
def right_rotate_25(u32 e) -> (u32):
|
def right_rotate_25(u32 e) -> (u32):
|
||||||
bool[32] b = to_bits(e)
|
bool[32] b = to_bits(e)
|
||||||
u32 res = from_bits([...b[7..], ...b[..7]])
|
u32 res = from_bits([...b[7..], ...b[..7]])
|
||||||
|
|
||||||
return res
|
return res
|
||||||
|
|
||||||
def main() -> ():
|
def main() -> ():
|
||||||
|
@ -62,47 +63,47 @@ def main() -> ():
|
||||||
|
|
||||||
// rotate
|
// rotate
|
||||||
u32 rotated = right_rotate_4(e)
|
u32 rotated = right_rotate_4(e)
|
||||||
rotated == 0x81234567
|
assert(rotated == 0x81234567)
|
||||||
|
|
||||||
// and
|
// and
|
||||||
(e & f) == 0x00204460
|
assert((e & f) == 0x00204460)
|
||||||
|
|
||||||
// xor
|
// xor
|
||||||
(e ^ f) == 0x1317131f
|
assert((e ^ f) == 0x1317131f)
|
||||||
|
|
||||||
// shift
|
// shift
|
||||||
e >> 12 == 0x00012345
|
assert(e >> 12 == 0x00012345)
|
||||||
e << 12 == 0x45678000
|
assert(e << 12 == 0x45678000)
|
||||||
|
|
||||||
// not
|
// not
|
||||||
!e == 0xedcba987
|
assert(!e == 0xedcba987)
|
||||||
|
|
||||||
// add
|
// add
|
||||||
0xfefefefe + 0xefefefef + 0xffffffff + 0xeeeeeeee == 0xddddddda
|
assert(0xfefefefe + 0xefefefef + 0xffffffff + 0xeeeeeeee == 0xddddddda)
|
||||||
|
|
||||||
// to_bits
|
// to_bits
|
||||||
bool[32] bits1 = to_bits(e)
|
bool[32] bits1 = to_bits(e)
|
||||||
bool[32] expected1 = [false, false, false, true, false, false, true, false, false, false, true, true, false, true, false, false, false, true, false, true, false, true, true, false, false, true, true, true, true, false, false, false]
|
bool[32] expected1 = [false, false, false, true, false, false, true, false, false, false, true, true, false, true, false, false, false, true, false, true, false, true, true, false, false, true, true, true, true, false, false, false]
|
||||||
bits1 == expected1
|
assert(bits1 == expected1)
|
||||||
e == from_bits(expected1)
|
assert(e == from_bits(expected1))
|
||||||
|
|
||||||
bool[32] bits2 = to_bits(f)
|
bool[32] bits2 = to_bits(f)
|
||||||
bool[32] expected2 = [false, false, false, false, false, false, false, true, false, false, true, false, false, false, true, true, false, true, false, false, false, true, false, true, false, true, true, false, false, true, true, true]
|
bool[32] expected2 = [false, false, false, false, false, false, false, true, false, false, true, false, false, false, true, true, false, true, false, false, false, true, false, true, false, true, true, false, false, true, true, true]
|
||||||
bits2 == expected2
|
assert(bits2 == expected2)
|
||||||
f == from_bits(expected2)
|
assert(f == from_bits(expected2))
|
||||||
|
|
||||||
// S0
|
// S0
|
||||||
u32 e2 = right_rotate_2(e)
|
u32 e2 = right_rotate_2(e)
|
||||||
u32 e13 = right_rotate_13(e)
|
u32 e13 = right_rotate_13(e)
|
||||||
u32 e22 = right_rotate_22(e)
|
u32 e22 = right_rotate_22(e)
|
||||||
u32 S0 = e2 ^ e13 ^ e22
|
u32 S0 = e2 ^ e13 ^ e22
|
||||||
S0 == 0x66146474
|
assert(S0 == 0x66146474)
|
||||||
|
|
||||||
// S1
|
// S1
|
||||||
u32 e6 = right_rotate_6(e)
|
u32 e6 = right_rotate_6(e)
|
||||||
u32 e11 = right_rotate_11(e)
|
u32 e11 = right_rotate_11(e)
|
||||||
u32 e25 = right_rotate_25(e)
|
u32 e25 = right_rotate_25(e)
|
||||||
u32 S1 = e6 ^ e11 ^ e25
|
u32 S1 = e6 ^ e11 ^ e25
|
||||||
S1 == 0x3561abda
|
assert(S1 == 0x3561abda)
|
||||||
|
|
||||||
return
|
return
|
|
@ -37,7 +37,7 @@ ace.define("ace/mode/zokrates_highlight_rules",["require","exports","module","ac
|
||||||
var ZoKratesHighlightRules = function () {
|
var ZoKratesHighlightRules = function () {
|
||||||
|
|
||||||
var keywords = (
|
var keywords = (
|
||||||
"endfor|as|return|byte|field|bool|if|then|fi|do|else|export|false|def|for|import|from|uint|in|public|private|struct|true"
|
"assert|endfor|as|return|byte|field|bool|if|then|fi|do|else|export|false|def|for|import|from|uint|in|public|private|struct|true"
|
||||||
);
|
);
|
||||||
|
|
||||||
var keywordMapper = this.createKeywordMapper({
|
var keywordMapper = this.createKeywordMapper({
|
||||||
|
|
|
@ -46,7 +46,7 @@ statement = { (return_statement // does not require subsequent newline
|
||||||
iteration_statement = { "for" ~ ty ~ identifier ~ "in" ~ expression ~ ".." ~ expression ~ "do" ~ NEWLINE* ~ statement* ~ "endfor"}
|
iteration_statement = { "for" ~ ty ~ identifier ~ "in" ~ expression ~ ".." ~ expression ~ "do" ~ NEWLINE* ~ statement* ~ "endfor"}
|
||||||
return_statement = { "return" ~ expression_list}
|
return_statement = { "return" ~ expression_list}
|
||||||
definition_statement = { optionally_typed_assignee_list ~ "=" ~ expression } // declare and assign, so only identifiers are allowed, unlike `assignment_statement`
|
definition_statement = { optionally_typed_assignee_list ~ "=" ~ expression } // declare and assign, so only identifiers are allowed, unlike `assignment_statement`
|
||||||
expression_statement = {expression}
|
expression_statement = {"assert" ~ "(" ~ expression ~ ")"}
|
||||||
|
|
||||||
optionally_typed_assignee_list = _{ optionally_typed_assignee ~ ("," ~ optionally_typed_assignee)* }
|
optionally_typed_assignee_list = _{ optionally_typed_assignee ~ ("," ~ optionally_typed_assignee)* }
|
||||||
optionally_typed_assignee = { (ty ~ assignee) | (assignee) } // we don't use { ty? ~ identifier } as with a single token, it gets parsed as `ty` but we want `identifier`
|
optionally_typed_assignee = { (ty ~ assignee) | (assignee) } // we don't use { ty? ~ identifier } as with a single token, it gets parsed as `ty` but we want `identifier`
|
||||||
|
@ -124,6 +124,8 @@ op_unary = { op_not }
|
||||||
WHITESPACE = _{ " " | "\t" | "\\" ~ NEWLINE}
|
WHITESPACE = _{ " " | "\t" | "\\" ~ NEWLINE}
|
||||||
COMMENT = _{ ("/*" ~ (!"*/" ~ ANY)* ~ "*/") | ("//" ~ (!NEWLINE ~ ANY)*) }
|
COMMENT = _{ ("/*" ~ (!"*/" ~ ANY)* ~ "*/") | ("//" ~ (!NEWLINE ~ ANY)*) }
|
||||||
|
|
||||||
keyword = @{"as"|"bool"|"byte"|"def"|"do"|"else"|"endfor"|"export"|"false"|"field"|"for"|"if"|"then"|"fi"|"import"|"from"|
|
// the ordering of reserved keywords matters: if "as" is before "assert", then "assert" gets parsed as (as)(sert) and incorrectly
|
||||||
|
// accepted
|
||||||
|
keyword = @{"assert"|"as"|"bool"|"byte"|"def"|"do"|"else"|"endfor"|"export"|"false"|"field"|"for"|"if"|"then"|"fi"|"import"|"from"|
|
||||||
"in"|"private"|"public"|"return"|"struct"|"true"|"u8"|"u16"|"u32"
|
"in"|"private"|"public"|"return"|"struct"|"true"|"u8"|"u16"|"u32"
|
||||||
}
|
}
|
||||||
|
|
|
@ -32,21 +32,22 @@ mod ast {
|
||||||
static ref PREC_CLIMBER: PrecClimber<Rule> = build_precedence_climber();
|
static ref PREC_CLIMBER: PrecClimber<Rule> = build_precedence_climber();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// based on https://docs.python.org/3/reference/expressions.html#operator-precedence
|
||||||
fn build_precedence_climber() -> PrecClimber<Rule> {
|
fn build_precedence_climber() -> PrecClimber<Rule> {
|
||||||
PrecClimber::new(vec![
|
PrecClimber::new(vec![
|
||||||
Operator::new(Rule::op_or, Assoc::Left),
|
Operator::new(Rule::op_or, Assoc::Left),
|
||||||
Operator::new(Rule::op_and, Assoc::Left),
|
Operator::new(Rule::op_and, Assoc::Left),
|
||||||
|
Operator::new(Rule::op_lt, Assoc::Left)
|
||||||
|
| Operator::new(Rule::op_lte, Assoc::Left)
|
||||||
|
| Operator::new(Rule::op_gt, Assoc::Left)
|
||||||
|
| Operator::new(Rule::op_gte, Assoc::Left)
|
||||||
|
| Operator::new(Rule::op_not_equal, Assoc::Left)
|
||||||
|
| Operator::new(Rule::op_equal, Assoc::Left),
|
||||||
Operator::new(Rule::op_bit_or, Assoc::Left),
|
Operator::new(Rule::op_bit_or, Assoc::Left),
|
||||||
Operator::new(Rule::op_bit_xor, Assoc::Left),
|
Operator::new(Rule::op_bit_xor, Assoc::Left),
|
||||||
Operator::new(Rule::op_bit_and, Assoc::Left),
|
Operator::new(Rule::op_bit_and, Assoc::Left),
|
||||||
Operator::new(Rule::op_equal, Assoc::Left)
|
Operator::new(Rule::op_left_shift, Assoc::Left)
|
||||||
| Operator::new(Rule::op_not_equal, Assoc::Left),
|
| Operator::new(Rule::op_right_shift, Assoc::Left),
|
||||||
Operator::new(Rule::op_lte, Assoc::Left)
|
|
||||||
| Operator::new(Rule::op_gte, Assoc::Left)
|
|
||||||
| Operator::new(Rule::op_lt, Assoc::Left)
|
|
||||||
| Operator::new(Rule::op_gt, Assoc::Left),
|
|
||||||
Operator::new(Rule::op_right_shift, Assoc::Left)
|
|
||||||
| Operator::new(Rule::op_left_shift, Assoc::Left),
|
|
||||||
Operator::new(Rule::op_add, Assoc::Left) | Operator::new(Rule::op_sub, Assoc::Left),
|
Operator::new(Rule::op_add, Assoc::Left) | Operator::new(Rule::op_sub, Assoc::Left),
|
||||||
Operator::new(Rule::op_mul, Assoc::Left) | Operator::new(Rule::op_div, Assoc::Left),
|
Operator::new(Rule::op_mul, Assoc::Left) | Operator::new(Rule::op_div, Assoc::Left),
|
||||||
Operator::new(Rule::op_pow, Assoc::Left),
|
Operator::new(Rule::op_pow, Assoc::Left),
|
||||||
|
@ -1174,9 +1175,9 @@ mod tests {
|
||||||
field a = 1
|
field a = 1
|
||||||
a[32 + x][55] = y
|
a[32 + x][55] = y
|
||||||
for field i in 0..3 do
|
for field i in 0..3 do
|
||||||
a == 1 + 2 + 3+ 4+ 5+ 6+ 6+ 7+ 8 + 4+ 5+ 3+ 4+ 2+ 3
|
assert(a == 1 + 2 + 3+ 4+ 5+ 6+ 6+ 7+ 8 + 4+ 5+ 3+ 4+ 2+ 3)
|
||||||
endfor
|
endfor
|
||||||
a.member == 1
|
assert(a.member == 1)
|
||||||
return a
|
return a
|
||||||
"#;
|
"#;
|
||||||
let res = generate_ast(&source);
|
let res = generate_ast(&source);
|
||||||
|
|
|
@ -13,6 +13,6 @@ def main(field[2] pt, BabyJubJubParams context) -> (bool):
|
||||||
field vv = pt[1] * pt[1]
|
field vv = pt[1] * pt[1]
|
||||||
field uuvv = uu * vv
|
field uuvv = uu * vv
|
||||||
|
|
||||||
a * uu + vv == 1 + d * uuvv
|
assert(a * uu + vv == 1 + d * uuvv)
|
||||||
|
|
||||||
return true
|
return true
|
||||||
|
|
|
@ -6,14 +6,14 @@ from "ecc/babyjubjubParams" import BabyJubJubParams
|
||||||
// Verifies that the point is not one of the low-order points.
|
// Verifies that the point is not one of the low-order points.
|
||||||
// If any of the points is multiplied by the cofactor, the resulting point
|
// If any of the points is multiplied by the cofactor, the resulting point
|
||||||
// will be infinity.
|
// will be infinity.
|
||||||
// Returns 1 if the point is not one of the low-order points, 0 otherwise.
|
// Returns true if the point is not one of the low-order points, false otherwise.
|
||||||
// Curve parameters are defined with the last argument
|
// Curve parameters are defined with the last argument
|
||||||
// https://github.com/zcash-hackworks/sapling-crypto/blob/master/src/jubjub/edwards.rs#L166
|
// https://github.com/zcash-hackworks/sapling-crypto/blob/master/src/jubjub/edwards.rs#L166
|
||||||
def main(field[2] pt, BabyJubJubParams context) -> (field):
|
def main(field[2] pt, BabyJubJubParams context) -> (bool):
|
||||||
|
|
||||||
field cofactor = context.JUBJUBC
|
field cofactor = context.JUBJUBC
|
||||||
|
|
||||||
cofactor == 8
|
assert(cofactor == 8)
|
||||||
|
|
||||||
// Co-factor currently hard-coded to 8 for efficiency reasons
|
// Co-factor currently hard-coded to 8 for efficiency reasons
|
||||||
// See discussion here: https://github.com/Zokrates/ZoKrates/pull/301#discussion_r267203391
|
// See discussion here: https://github.com/Zokrates/ZoKrates/pull/301#discussion_r267203391
|
||||||
|
@ -24,6 +24,4 @@ def main(field[2] pt, BabyJubJubParams context) -> (field):
|
||||||
ptExp = add(ptExp, ptExp, context) // 4*pt
|
ptExp = add(ptExp, ptExp, context) // 4*pt
|
||||||
ptExp = add(ptExp, ptExp, context) // 8*pt
|
ptExp = add(ptExp, ptExp, context) // 8*pt
|
||||||
|
|
||||||
field out = if ptExp[0] == 0 && ptExp[1] == 1 then 0 else 1 fi
|
return !(ptExp[0] == 0 && ptExp[1] == 1)
|
||||||
|
|
||||||
return out
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
import "ecc/edwardsAdd" as add
|
import "ecc/edwardsAdd" as add
|
||||||
import "ecc/edwardsOnCurve" as assertOnCurve
|
import "ecc/edwardsOnCurve" as onCurve
|
||||||
from "ecc/babyjubjubParams" import BabyJubJubParams
|
from "ecc/babyjubjubParams" import BabyJubJubParams
|
||||||
|
|
||||||
// Function that implements scalar multiplication for a fixed base point
|
// Function that implements scalar multiplication for a fixed base point
|
||||||
|
@ -22,6 +22,6 @@ def main(bool[256] exponent, field[2] pt, BabyJubJubParams context) -> (field[2]
|
||||||
doubledP = add(doubledP, doubledP, context)
|
doubledP = add(doubledP, doubledP, context)
|
||||||
endfor
|
endfor
|
||||||
|
|
||||||
true == assertOnCurve(accumulatedP, context)
|
assert(onCurve(accumulatedP, context))
|
||||||
|
|
||||||
return accumulatedP
|
return accumulatedP
|
|
@ -24,6 +24,6 @@ def main(field[2] pk, field sk, BabyJubJubParams context) -> (bool):
|
||||||
bool[256] skBits = unpack256(sk)
|
bool[256] skBits = unpack256(sk)
|
||||||
field[2] ptExp = multiply(skBits, G, context)
|
field[2] ptExp = multiply(skBits, G, context)
|
||||||
|
|
||||||
bool out = ptExp[0] == pk[0] && ptExp[1] == pk[1]
|
bool out = ptExp[0] == pk[0] && ptExp[1] == pk[1]
|
||||||
|
|
||||||
return out
|
return out
|
||||||
|
|
|
@ -32,9 +32,8 @@ def main(private field[2] R, private field S, field[2] A, bool[256] M0, bool[256
|
||||||
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
|
||||||
true == onCurve(R, context) // throws if R is not on curve
|
assert(onCurve(R, context)) // throws if R is not on curve
|
||||||
field isPrimeOrder = orderCheck(R, context)
|
assert(orderCheck(R, context))
|
||||||
1 == isPrimeOrder
|
|
||||||
|
|
||||||
bool[256] Rx = unpack256(R[0])
|
bool[256] Rx = unpack256(R[0])
|
||||||
bool[256] Ax = unpack256(A[0])
|
bool[256] Ax = unpack256(A[0])
|
||||||
|
|
|
@ -6,6 +6,6 @@ def main(field i) -> (bool[128]):
|
||||||
|
|
||||||
bool[254] b = unpack(i)
|
bool[254] b = unpack(i)
|
||||||
|
|
||||||
b[0..126] == [false; 126]
|
assert(b[0..126] == [false; 126])
|
||||||
|
|
||||||
return b[126..254]
|
return b[126..254]
|
|
@ -8,7 +8,7 @@
|
||||||
},
|
},
|
||||||
"output": {
|
"output": {
|
||||||
"Ok": {
|
"Ok": {
|
||||||
"values": ["1"]
|
"values": []
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,34 +5,34 @@ from "ecc/babyjubjubParams" import BabyJubJubParams
|
||||||
|
|
||||||
// Code to create test cases:
|
// Code to create test cases:
|
||||||
// https://github.com/Zokrates/pycrypto
|
// https://github.com/Zokrates/pycrypto
|
||||||
def testDoubleViaAdd() -> (field):
|
def testDoubleViaAdd() -> (bool):
|
||||||
BabyJubJubParams context = context()
|
BabyJubJubParams context = context()
|
||||||
field[2] G = [context.Gu, context.Gv]
|
field[2] G = [context.Gu, context.Gv]
|
||||||
|
|
||||||
field[2] out = add(G, G, context)
|
field[2] out = add(G, G, context)
|
||||||
|
|
||||||
out[0] == 17324563846726889236817837922625232543153115346355010501047597319863650987830
|
assert(out[0] == 17324563846726889236817837922625232543153115346355010501047597319863650987830)
|
||||||
out[1] == 20022170825455209233733649024450576091402881793145646502279487074566492066831
|
assert(out[1] == 20022170825455209233733649024450576091402881793145646502279487074566492066831)
|
||||||
|
|
||||||
return 1
|
return true
|
||||||
|
|
||||||
def testIdentities() -> (field):
|
def testIdentities() -> (bool):
|
||||||
BabyJubJubParams context = context()
|
BabyJubJubParams context = context()
|
||||||
field[2] G = [context.Gu, context.Gv]
|
field[2] G = [context.Gu, context.Gv]
|
||||||
field[2] inf = context.INFINITY
|
field[2] inf = context.INFINITY
|
||||||
|
|
||||||
G == add(G, inf, context)
|
assert(G == add(G, inf, context))
|
||||||
|
|
||||||
field[2] nG = neg(G)
|
field[2] nG = neg(G)
|
||||||
field[2] nGaddG = add(G, nG, context)
|
field[2] nGaddG = add(G, nG, context)
|
||||||
|
|
||||||
inf == nGaddG
|
assert(inf == nGaddG)
|
||||||
|
|
||||||
return 1
|
return true
|
||||||
|
|
||||||
def main() -> (field):
|
def main() -> ():
|
||||||
|
|
||||||
1 == testDoubleViaAdd()
|
assert(testDoubleViaAdd())
|
||||||
1 == testIdentities()
|
assert(testIdentities())
|
||||||
|
|
||||||
return 1
|
return
|
|
@ -8,7 +8,7 @@
|
||||||
},
|
},
|
||||||
"output": {
|
"output": {
|
||||||
"Ok": {
|
"Ok": {
|
||||||
"values": ["1"]
|
"values": []
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,7 +4,7 @@ from "ecc/babyjubjubParams" import BabyJubJubParams
|
||||||
|
|
||||||
// Code to create test cases:
|
// Code to create test cases:
|
||||||
// https://github.com/Zokrates/pycrypto
|
// https://github.com/Zokrates/pycrypto
|
||||||
def testCompress() -> (field):
|
def testCompress() -> (bool):
|
||||||
BabyJubJubParams context = context()
|
BabyJubJubParams context = context()
|
||||||
|
|
||||||
field Gu = context.Gu
|
field Gu = context.Gu
|
||||||
|
@ -12,12 +12,12 @@ def testCompress() -> (field):
|
||||||
|
|
||||||
bool[256] Gcompressed = edwardsCompress([Gu, Gv])
|
bool[256] Gcompressed = edwardsCompress([Gu, Gv])
|
||||||
|
|
||||||
Gcompressed == [true, false, true, false, true, true, true, false, false, false, false, false, false, true, true, true, false, false, true, false, true, false, false, true, false, true, true, true, true, true, true, true, true, false, false, false, true, true, false, true, false, false, true, true, true, true, false, false, false, false, true, true, true, true, false, true, false, true, true, true, true, false, false, false, false, false, false, true, true, false, false, false, true, true, false, true, true, false, true, true, true, true, false, true, true, true, false, true, true, true, true, true, true, true, false, true, false, false, true, false, false, true, false, false, true, true, false, false, false, false, true, true, false, true, false, true, false, true, false, true, true, false, false, false, false, false, true, true, true, true, true, true, true, false, false, true, true, false, true, false, true, false, false, true, true, true, false, true, false, true, false, false, true, true, true, false, true, true, false, true, false, false, false, false, true, true, false, false, true, false, true, true, false, false, false, false, true, true, false, false, false, false, false, true, true, true, false, true, false, false, false, true, false, false, true, true, false, true, false, false, true, false, false, false, true, true, false, true, true, true, false, true, true, false, false, false, true, true, true, true, false, true, true, true, true, true, true, true, true, false, false, true, true, false, false, true, false, false, false, true, false, true, false, true, false, false, true, false, true, true, false, true, false, true, true, true]
|
assert(Gcompressed == [true, false, true, false, true, true, true, false, false, false, false, false, false, true, true, true, false, false, true, false, true, false, false, true, false, true, true, true, true, true, true, true, true, false, false, false, true, true, false, true, false, false, true, true, true, true, false, false, false, false, true, true, true, true, false, true, false, true, true, true, true, false, false, false, false, false, false, true, true, false, false, false, true, true, false, true, true, false, true, true, true, true, false, true, true, true, false, true, true, true, true, true, true, true, false, true, false, false, true, false, false, true, false, false, true, true, false, false, false, false, true, true, false, true, false, true, false, true, false, true, true, false, false, false, false, false, true, true, true, true, true, true, true, false, false, true, true, false, true, false, true, false, false, true, true, true, false, true, false, true, false, false, true, true, true, false, true, true, false, true, false, false, false, false, true, true, false, false, true, false, true, true, false, false, false, false, true, true, false, false, false, false, false, true, true, true, false, true, false, false, false, true, false, false, true, true, false, true, false, false, true, false, false, false, true, true, false, true, true, true, false, true, true, false, false, false, true, true, true, true, false, true, true, true, true, true, true, true, true, false, false, true, true, false, false, true, false, false, false, true, false, true, false, true, false, false, true, false, true, true, false, true, false, true, true, true])
|
||||||
|
|
||||||
return 1
|
return true
|
||||||
|
|
||||||
def main() -> (field):
|
def main() -> ():
|
||||||
|
|
||||||
1 == testCompress()
|
assert(testCompress())
|
||||||
|
|
||||||
return 1
|
return
|
|
@ -8,7 +8,7 @@
|
||||||
},
|
},
|
||||||
"output": {
|
"output": {
|
||||||
"Ok": {
|
"Ok": {
|
||||||
"values": ["1"]
|
"values": []
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,19 +4,19 @@ import "ecc/edwardsOnCurve" as onCurve
|
||||||
|
|
||||||
// Code to create test cases:
|
// Code to create test cases:
|
||||||
// https://github.com/Zokrates/pycrypto
|
// https://github.com/Zokrates/pycrypto
|
||||||
def testOnCurveTrue() -> (field):
|
def testOnCurveTrue() -> (bool):
|
||||||
BabyJubJubParams context = context()
|
BabyJubJubParams context = context()
|
||||||
|
|
||||||
field testU = 17324563846726889236817837922625232543153115346355010501047597319863650987830
|
field testU = 17324563846726889236817837922625232543153115346355010501047597319863650987830
|
||||||
field testV = 20022170825455209233733649024450576091402881793145646502279487074566492066831
|
field testV = 20022170825455209233733649024450576091402881793145646502279487074566492066831
|
||||||
|
|
||||||
true == onCurve([testU, testV], context)
|
assert(onCurve([testU, testV], context))
|
||||||
|
|
||||||
return 1
|
return true
|
||||||
|
|
||||||
def main() -> (field):
|
def main() -> ():
|
||||||
|
|
||||||
1 == testOnCurveTrue()
|
assert(testOnCurveTrue())
|
||||||
// onCurve throws for false
|
// onCurve throws for false
|
||||||
|
|
||||||
return 1
|
return
|
||||||
|
|
|
@ -8,7 +8,7 @@
|
||||||
},
|
},
|
||||||
"output": {
|
"output": {
|
||||||
"Ok": {
|
"Ok": {
|
||||||
"values": ["1"]
|
"values": []
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,31 +4,31 @@ from "ecc/babyjubjubParams" import BabyJubJubParams
|
||||||
|
|
||||||
// Code to create test cases:
|
// Code to create test cases:
|
||||||
// https://github.com/Zokrates/pycrypto
|
// https://github.com/Zokrates/pycrypto
|
||||||
def testOrderCheckTrue() -> (field):
|
def testOrderCheckTrue() -> (bool):
|
||||||
BabyJubJubParams context = context()
|
BabyJubJubParams context = context()
|
||||||
|
|
||||||
field testU = 17324563846726889236817837922625232543153115346355010501047597319863650987830
|
field testU = 17324563846726889236817837922625232543153115346355010501047597319863650987830
|
||||||
field testV = 20022170825455209233733649024450576091402881793145646502279487074566492066831
|
field testV = 20022170825455209233733649024450576091402881793145646502279487074566492066831
|
||||||
|
|
||||||
field out = orderCheck([testU, testV], context)
|
bool out = orderCheck([testU, testV], context)
|
||||||
out == 1
|
assert(out)
|
||||||
|
|
||||||
return 1
|
return true
|
||||||
|
|
||||||
def testOrderCheckFalse() -> (field):
|
def testOrderCheckFalse() -> (bool):
|
||||||
BabyJubJubParams context = context()
|
BabyJubJubParams context = context()
|
||||||
|
|
||||||
field testU = 4342719913949491028786768530115087822524712248835451589697801404893164183326
|
field testU = 4342719913949491028786768530115087822524712248835451589697801404893164183326
|
||||||
field testV = 4826523245007015323400664741523384119579596407052839571721035538011798951543
|
field testV = 4826523245007015323400664741523384119579596407052839571721035538011798951543
|
||||||
|
|
||||||
field out = orderCheck([testU, testV], context)
|
bool out = orderCheck([testU, testV], context)
|
||||||
out == 0
|
assert(!out)
|
||||||
|
|
||||||
return 1
|
return true
|
||||||
|
|
||||||
def main() -> (field):
|
def main() -> ():
|
||||||
|
|
||||||
1 == testOrderCheckFalse()
|
assert(testOrderCheckFalse())
|
||||||
1 == testOrderCheckTrue()
|
assert(testOrderCheckTrue())
|
||||||
|
|
||||||
return 1
|
return
|
|
@ -8,7 +8,7 @@
|
||||||
},
|
},
|
||||||
"output": {
|
"output": {
|
||||||
"Ok": {
|
"Ok": {
|
||||||
"values": ["1"]
|
"values": []
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,7 +4,7 @@ import "ecc/edwardsScalarMult" as mul
|
||||||
|
|
||||||
// Code to create test cases:
|
// Code to create test cases:
|
||||||
// https://github.com/Zokrates/pycrypto
|
// https://github.com/Zokrates/pycrypto
|
||||||
def testCyclic() -> (field):
|
def testCyclic() -> (bool):
|
||||||
BabyJubJubParams context = context()
|
BabyJubJubParams context = context()
|
||||||
field[2] G = [context.Gu, context.Gv]
|
field[2] G = [context.Gu, context.Gv]
|
||||||
|
|
||||||
|
@ -13,11 +13,11 @@ def testCyclic() -> (field):
|
||||||
|
|
||||||
field[2] out = mul(exp, G, context)
|
field[2] out = mul(exp, G, context)
|
||||||
|
|
||||||
G == out
|
assert(G == out)
|
||||||
|
|
||||||
return 1
|
return true
|
||||||
|
|
||||||
def testMul2() -> (field):
|
def testMul2() -> (bool):
|
||||||
BabyJubJubParams context = context()
|
BabyJubJubParams context = context()
|
||||||
field[2] G = [context.Gu, context.Gv]
|
field[2] G = [context.Gu, context.Gv]
|
||||||
|
|
||||||
|
@ -25,12 +25,12 @@ def testMul2() -> (field):
|
||||||
bool[256] exp = [false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false]
|
bool[256] exp = [false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false]
|
||||||
field[2] out = mul(exp, G, context)
|
field[2] out = mul(exp, G, context)
|
||||||
|
|
||||||
out[0] == 17324563846726889236817837922625232543153115346355010501047597319863650987830
|
assert(out[0] == 17324563846726889236817837922625232543153115346355010501047597319863650987830)
|
||||||
out[1] == 20022170825455209233733649024450576091402881793145646502279487074566492066831
|
assert(out[1] == 20022170825455209233733649024450576091402881793145646502279487074566492066831)
|
||||||
|
|
||||||
return 1
|
return true
|
||||||
|
|
||||||
def testAssociativity() -> (field):
|
def testAssociativity() -> (bool):
|
||||||
BabyJubJubParams context = context()
|
BabyJubJubParams context = context()
|
||||||
field[2] G = [context.Gu, context.Gv]
|
field[2] G = [context.Gu, context.Gv]
|
||||||
|
|
||||||
|
@ -55,13 +55,13 @@ def testAssociativity() -> (field):
|
||||||
field[2] Gca = mul(a, Gc, context)
|
field[2] Gca = mul(a, Gc, context)
|
||||||
field[2] Gcab = mul(b, Gca, context)
|
field[2] Gcab = mul(b, Gca, context)
|
||||||
|
|
||||||
Gabc == Gbca
|
assert(Gabc == Gbca)
|
||||||
Gbca == Gcab
|
assert(Gbca == Gcab)
|
||||||
Gabc == Gcab
|
assert(Gabc == Gcab)
|
||||||
|
|
||||||
return 1
|
return true
|
||||||
|
|
||||||
def testMultiplicative() -> (field):
|
def testMultiplicative() -> (bool):
|
||||||
BabyJubJubParams context = context()
|
BabyJubJubParams context = context()
|
||||||
field[2] G = [context.Gu, context.Gv]
|
field[2] G = [context.Gu, context.Gv]
|
||||||
|
|
||||||
|
@ -81,16 +81,16 @@ def testMultiplicative() -> (field):
|
||||||
|
|
||||||
field[2] Gmab = mul(ab, G, context)
|
field[2] Gmab = mul(ab, G, context)
|
||||||
|
|
||||||
Gab == Gba
|
assert(Gab == Gba)
|
||||||
Gba == Gmab
|
assert(Gba == Gmab)
|
||||||
Gab == Gmab
|
assert(Gab == Gmab)
|
||||||
|
|
||||||
return 1
|
return true
|
||||||
|
|
||||||
def main() -> (field):
|
def main() -> ():
|
||||||
1 == testMul2()
|
assert(testMul2())
|
||||||
1 == testCyclic()
|
assert(testCyclic())
|
||||||
1 == testAssociativity()
|
assert(testAssociativity())
|
||||||
1 == testMultiplicative()
|
assert(testMultiplicative())
|
||||||
|
|
||||||
return 1
|
return
|
|
@ -8,7 +8,7 @@
|
||||||
},
|
},
|
||||||
"output": {
|
"output": {
|
||||||
"Ok": {
|
"Ok": {
|
||||||
"values": ["1"]
|
"values": []
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,7 +6,7 @@ import "utils/pack/nonStrictUnpack256" as unpack256
|
||||||
|
|
||||||
// Code to create test cases:
|
// Code to create test cases:
|
||||||
// https://github.com/Zokrates/pycrypto
|
// https://github.com/Zokrates/pycrypto
|
||||||
def testOwnershipTrue() -> (field):
|
def testOwnershipTrue() -> (bool):
|
||||||
BabyJubJubParams context = context()
|
BabyJubJubParams context = context()
|
||||||
field[2] G = [context.Gu, context.Gv]
|
field[2] G = [context.Gu, context.Gv]
|
||||||
|
|
||||||
|
@ -15,22 +15,22 @@ def testOwnershipTrue() -> (field):
|
||||||
|
|
||||||
bool out = proofOfOwnership(Pk, sk, context)
|
bool out = proofOfOwnership(Pk, sk, context)
|
||||||
|
|
||||||
out == true
|
assert(out)
|
||||||
return 1
|
return true
|
||||||
|
|
||||||
def testtOwnershipFalse() -> (field):
|
def testtOwnershipFalse() -> (bool):
|
||||||
BabyJubJubParams context = context()
|
BabyJubJubParams context = context()
|
||||||
|
|
||||||
field[2] Pk = [16328093915569409528980874702678312730273137210288183490878184636452430630129, 9377227749598842756429258362864743065769435972445705966557343775367597326529]
|
field[2] Pk = [16328093915569409528980874702678312730273137210288183490878184636452430630129, 9377227749598842756429258362864743065769435972445705966557343775367597326529]
|
||||||
field sk = 1997011358982923168928344992199991480689546837621580239342656433234255379025
|
field sk = 1997011358982923168928344992199991480689546837621580239342656433234255379025
|
||||||
bool out = proofOfOwnership(Pk, sk, context)
|
bool out = proofOfOwnership(Pk, sk, context)
|
||||||
|
|
||||||
out == false
|
assert(!out)
|
||||||
return 1
|
return true
|
||||||
|
|
||||||
def main() -> (field):
|
def main() -> ():
|
||||||
|
|
||||||
1 == testOwnershipTrue()
|
assert(testOwnershipTrue())
|
||||||
1 == testtOwnershipFalse()
|
assert(testtOwnershipFalse())
|
||||||
|
|
||||||
return 1
|
return
|
|
@ -7,9 +7,7 @@
|
||||||
},
|
},
|
||||||
"output": {
|
"output": {
|
||||||
"Ok": {
|
"Ok": {
|
||||||
"values": [
|
"values": []
|
||||||
"1"
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
import "hashes/mimc7/mimc7R10"
|
import "hashes/mimc7/mimc7R10"
|
||||||
|
|
||||||
def main() -> (field):
|
def main() -> ():
|
||||||
mimc7R10(0, 0) == 6004544488495356385698286530147974336054653445122716140990101827963729149289
|
assert(mimc7R10(0, 0) == 6004544488495356385698286530147974336054653445122716140990101827963729149289)
|
||||||
mimc7R10(100, 0) == 2977550761518141183167168643824354554080911485709001361112529600968315693145
|
assert(mimc7R10(100, 0) == 2977550761518141183167168643824354554080911485709001361112529600968315693145)
|
||||||
mimc7R10(100, 21888242871839275222246405745257275088548364400416034343698204186575808495617) == 2977550761518141183167168643824354554080911485709001361112529600968315693145
|
assert(mimc7R10(100, 21888242871839275222246405745257275088548364400416034343698204186575808495617) == 2977550761518141183167168643824354554080911485709001361112529600968315693145)
|
||||||
mimc7R10(21888242871839275222246405745257275088548364400416034343698204186575808495618, 1) == 11476724043755138071320043459606423473319855817296339514744600646762741571430
|
assert(mimc7R10(21888242871839275222246405745257275088548364400416034343698204186575808495618, 1) == 11476724043755138071320043459606423473319855817296339514744600646762741571430)
|
||||||
mimc7R10(21888242871839275222246405745257275088548364400416034343698204186575808495617, 21888242871839275222246405745257275088548364400416034343698204186575808495617) == 6004544488495356385698286530147974336054653445122716140990101827963729149289
|
assert(mimc7R10(21888242871839275222246405745257275088548364400416034343698204186575808495617, 21888242871839275222246405745257275088548364400416034343698204186575808495617) == 6004544488495356385698286530147974336054653445122716140990101827963729149289)
|
||||||
return 1
|
return
|
|
@ -7,9 +7,7 @@
|
||||||
},
|
},
|
||||||
"output": {
|
"output": {
|
||||||
"Ok": {
|
"Ok": {
|
||||||
"values": [
|
"values": []
|
||||||
"1"
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
import "hashes/mimc7/mimc7R20"
|
import "hashes/mimc7/mimc7R20"
|
||||||
|
|
||||||
def main() -> (field):
|
def main() -> ():
|
||||||
mimc7R20(0, 0) == 19139739902058628561064841933381604453445216873412991992755775746150759284829
|
assert(mimc7R20(0, 0) == 19139739902058628561064841933381604453445216873412991992755775746150759284829)
|
||||||
mimc7R20(100, 0) == 8623418512398828792274158979964869393034224267928014534933203776818702139758
|
assert(mimc7R20(100, 0) == 8623418512398828792274158979964869393034224267928014534933203776818702139758)
|
||||||
mimc7R20(100, 21888242871839275222246405745257275088548364400416034343698204186575808495617) == 8623418512398828792274158979964869393034224267928014534933203776818702139758
|
assert(mimc7R20(100, 21888242871839275222246405745257275088548364400416034343698204186575808495617) == 8623418512398828792274158979964869393034224267928014534933203776818702139758)
|
||||||
mimc7R20(21888242871839275222246405745257275088548364400416034343698204186575808495618, 1) == 15315177265066649795408805007175121550344555424263995530745989936206840798041
|
assert(mimc7R20(21888242871839275222246405745257275088548364400416034343698204186575808495618, 1) == 15315177265066649795408805007175121550344555424263995530745989936206840798041)
|
||||||
mimc7R20(21888242871839275222246405745257275088548364400416034343698204186575808495617, 21888242871839275222246405745257275088548364400416034343698204186575808495617) == 19139739902058628561064841933381604453445216873412991992755775746150759284829
|
assert(mimc7R20(21888242871839275222246405745257275088548364400416034343698204186575808495617, 21888242871839275222246405745257275088548364400416034343698204186575808495617) == 19139739902058628561064841933381604453445216873412991992755775746150759284829)
|
||||||
return 1
|
return
|
|
@ -7,9 +7,7 @@
|
||||||
},
|
},
|
||||||
"output": {
|
"output": {
|
||||||
"Ok": {
|
"Ok": {
|
||||||
"values": [
|
"values": []
|
||||||
"1"
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
import "hashes/mimc7/mimc7R50"
|
import "hashes/mimc7/mimc7R50"
|
||||||
|
|
||||||
def main() -> (field):
|
def main() -> ():
|
||||||
mimc7R50(0, 0) == 3049953358280347916081509186284461274525472221619157672645224540758481713173
|
assert(mimc7R50(0, 0) == 3049953358280347916081509186284461274525472221619157672645224540758481713173)
|
||||||
mimc7R50(100, 0) == 18511388995652647480418174218630545482006454713617579894396683237092568946789
|
assert(mimc7R50(100, 0) == 18511388995652647480418174218630545482006454713617579894396683237092568946789)
|
||||||
mimc7R50(100, 21888242871839275222246405745257275088548364400416034343698204186575808495617) == 18511388995652647480418174218630545482006454713617579894396683237092568946789
|
assert(mimc7R50(100, 21888242871839275222246405745257275088548364400416034343698204186575808495617) == 18511388995652647480418174218630545482006454713617579894396683237092568946789)
|
||||||
mimc7R50(21888242871839275222246405745257275088548364400416034343698204186575808495618, 1) == 9149577627043020462780389988155990926223727917856424056384664564191878439702
|
assert(mimc7R50(21888242871839275222246405745257275088548364400416034343698204186575808495618, 1) == 9149577627043020462780389988155990926223727917856424056384664564191878439702)
|
||||||
mimc7R50(21888242871839275222246405745257275088548364400416034343698204186575808495617, 21888242871839275222246405745257275088548364400416034343698204186575808495617) == 3049953358280347916081509186284461274525472221619157672645224540758481713173
|
assert(mimc7R50(21888242871839275222246405745257275088548364400416034343698204186575808495617, 21888242871839275222246405745257275088548364400416034343698204186575808495617) == 3049953358280347916081509186284461274525472221619157672645224540758481713173)
|
||||||
return 1
|
return
|
|
@ -7,9 +7,7 @@
|
||||||
},
|
},
|
||||||
"output": {
|
"output": {
|
||||||
"Ok": {
|
"Ok": {
|
||||||
"values": [
|
"values": []
|
||||||
"1"
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
import "hashes/mimc7/mimc7R90"
|
import "hashes/mimc7/mimc7R90"
|
||||||
|
|
||||||
def main() -> (field):
|
def main() -> ():
|
||||||
mimc7R90(0, 0) == 20281265111705407344053532742843085357648991805359414661661476832595822221514
|
assert(mimc7R90(0, 0) == 20281265111705407344053532742843085357648991805359414661661476832595822221514)
|
||||||
mimc7R90(100, 0) == 1010054095264022068840870550831559811104631937745987065544478027572003292636
|
assert(mimc7R90(100, 0) == 1010054095264022068840870550831559811104631937745987065544478027572003292636)
|
||||||
mimc7R90(100, 21888242871839275222246405745257275088548364400416034343698204186575808495617) == 1010054095264022068840870550831559811104631937745987065544478027572003292636
|
assert(mimc7R90(100, 21888242871839275222246405745257275088548364400416034343698204186575808495617) == 1010054095264022068840870550831559811104631937745987065544478027572003292636)
|
||||||
mimc7R90(21888242871839275222246405745257275088548364400416034343698204186575808495618, 1) == 8189519586469873426687580455476035992041353456517724932462363814215190642760
|
assert(mimc7R90(21888242871839275222246405745257275088548364400416034343698204186575808495618, 1) == 8189519586469873426687580455476035992041353456517724932462363814215190642760)
|
||||||
mimc7R90(21888242871839275222246405745257275088548364400416034343698204186575808495617, 21888242871839275222246405745257275088548364400416034343698204186575808495617) == 20281265111705407344053532742843085357648991805359414661661476832595822221514
|
assert(mimc7R90(21888242871839275222246405745257275088548364400416034343698204186575808495617, 21888242871839275222246405745257275088548364400416034343698204186575808495617) == 20281265111705407344053532742843085357648991805359414661661476832595822221514)
|
||||||
return 1
|
return
|
|
@ -7,9 +7,7 @@
|
||||||
},
|
},
|
||||||
"output": {
|
"output": {
|
||||||
"Ok": {
|
"Ok": {
|
||||||
"values": [
|
"values": []
|
||||||
"1"
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
import "hashes/mimcSponge/mimcSponge" as mimcSponge
|
import "hashes/mimcSponge/mimcSponge" as mimcSponge
|
||||||
|
|
||||||
def main() -> (field):
|
def main() -> ():
|
||||||
mimcSponge([1,2], 3) == [20225509322021146255705869525264566735642015554514977326536820959638320229084,13871743498877225461925335509899475799121918157213219438898506786048812913771,21633608428713573518356618235457250173701815120501233429160399974209848779097]
|
assert(mimcSponge([1,2], 3) == [20225509322021146255705869525264566735642015554514977326536820959638320229084,13871743498877225461925335509899475799121918157213219438898506786048812913771,21633608428713573518356618235457250173701815120501233429160399974209848779097])
|
||||||
mimcSponge([0,0], 0) == [20636625426020718969131298365984859231982649550971729229988535915544421356929,6046202021237334713296073963481784771443313518730771623154467767602059802325,16227963524034219233279650312501310147918176407385833422019760797222680144279]
|
assert(mimcSponge([0,0], 0) == [20636625426020718969131298365984859231982649550971729229988535915544421356929,6046202021237334713296073963481784771443313518730771623154467767602059802325,16227963524034219233279650312501310147918176407385833422019760797222680144279])
|
||||||
mimcSponge([21888242871839275222246405745257275088548364400416034343698204186575808495617, 0], 0) == [20636625426020718969131298365984859231982649550971729229988535915544421356929,6046202021237334713296073963481784771443313518730771623154467767602059802325,16227963524034219233279650312501310147918176407385833422019760797222680144279]
|
assert(mimcSponge([21888242871839275222246405745257275088548364400416034343698204186575808495617, 0], 0) == [20636625426020718969131298365984859231982649550971729229988535915544421356929,6046202021237334713296073963481784771443313518730771623154467767602059802325,16227963524034219233279650312501310147918176407385833422019760797222680144279])
|
||||||
return 1
|
return
|
|
@ -8,7 +8,7 @@
|
||||||
},
|
},
|
||||||
"output": {
|
"output": {
|
||||||
"Ok": {
|
"Ok": {
|
||||||
"values": ["1"]
|
"values": []
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -14,12 +14,12 @@
|
||||||
|
|
||||||
import "hashes/pedersen/512bit" as pedersen
|
import "hashes/pedersen/512bit" as pedersen
|
||||||
|
|
||||||
def main() -> (field):
|
def main() -> ():
|
||||||
|
|
||||||
bool[512] e = [false, false, false, true, false, true, true, true, true, true, false, true, false, false, true, false, true, true, true, false, false, true, true, false, true, true, false, true, true, false, false, true, false, true, false, true, true, true, false, false, false, true, true, true, false, true, false, false, true, true, true, false, true, false, false, true, false, true, true, true, true, true, false, false, false, true, false, false, true, false, true, true, true, true, true, true, false, true, true, false, false, false, false, false, true, true, false, false, true, true, false, false, false, false, false, false, true, true, false, false, false, true, true, false, true, false, true, false, false, true, true, false, true, false, true, true, false, true, false, false, false, false, false, true, false, true, true, true, true, false, true, true, true, false, true, false, true, true, true, true, true, true, false, false, false, true, false, true, false, true, false, false, true, true, true, false, true, false, false, true, false, false, true, false, false, false, false, false, false, true, false, true, true, true, false, false, true, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, true, false, false, true, true, false, false, false, false, true, true, true, true, true, false, true, false, false, false, false, true, false, false, true, false, false, false, true, false, false, true, false, false, true, false, true, true, false, false, false, true, true, false, true, false, false, true, true, false, true, false, true, true, false, true, true, false, true, true, true, true, true, true, false, false, false, true, true, true, false, false, true, true, true, true, true, true, true, false, true, false, true, true, true, true, false, false, false, false, false, false, true, true, false, false, true, true, false, true, false, true, false, false, false, true, false, true, false, false, true, false, true, true, false, true, true, true, false, true, true, false, false, true, true, true, true, false, false, false, true, true, true, false, true, true, true, false, false, false, false, false, true, true, false, false, false, false, false, true, true, true, false, false, false, true, true, false, false, false, true, true, true, true, false, false, true, false, false, false, true, true, true, false, false, true, false, false, false, true, true, true, true, false, true, false, true, true, false, true, false, true, true, true, false, true, true, true, false, true, false, false, true, true, true, true, false, true, true, false, false, true, false, true, false, false, false, true, true, false, false, true, true, false, false, true, false, false, false, false, true, false, false, false, false, false, false, false, false, true, true, true, true, false, false, false, true, true, false, false, false, true, false, false, true, true, true, false, false, true, false, false, true, false, true, true, false, true, false, true, true, false, false, false, false, false, false, true, false, true, false, false, false, true, false, false, false, true, true, false, false, false, true, true, false, true, false, true, true, false, false, false, true, false, true, false, true, false, false, false, false, false, false, false, true, true, true, true, true]
|
bool[512] e = [false, false, false, true, false, true, true, true, true, true, false, true, false, false, true, false, true, true, true, false, false, true, true, false, true, true, false, true, true, false, false, true, false, true, false, true, true, true, false, false, false, true, true, true, false, true, false, false, true, true, true, false, true, false, false, true, false, true, true, true, true, true, false, false, false, true, false, false, true, false, true, true, true, true, true, true, false, true, true, false, false, false, false, false, true, true, false, false, true, true, false, false, false, false, false, false, true, true, false, false, false, true, true, false, true, false, true, false, false, true, true, false, true, false, true, true, false, true, false, false, false, false, false, true, false, true, true, true, true, false, true, true, true, false, true, false, true, true, true, true, true, true, false, false, false, true, false, true, false, true, false, false, true, true, true, false, true, false, false, true, false, false, true, false, false, false, false, false, false, true, false, true, true, true, false, false, true, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, true, false, false, true, true, false, false, false, false, true, true, true, true, true, false, true, false, false, false, false, true, false, false, true, false, false, false, true, false, false, true, false, false, true, false, true, true, false, false, false, true, true, false, true, false, false, true, true, false, true, false, true, true, false, true, true, false, true, true, true, true, true, true, false, false, false, true, true, true, false, false, true, true, true, true, true, true, true, false, true, false, true, true, true, true, false, false, false, false, false, false, true, true, false, false, true, true, false, true, false, true, false, false, false, true, false, true, false, false, true, false, true, true, false, true, true, true, false, true, true, false, false, true, true, true, true, false, false, false, true, true, true, false, true, true, true, false, false, false, false, false, true, true, false, false, false, false, false, true, true, true, false, false, false, true, true, false, false, false, true, true, true, true, false, false, true, false, false, false, true, true, true, false, false, true, false, false, false, true, true, true, true, false, true, false, true, true, false, true, false, true, true, true, false, true, true, true, false, true, false, false, true, true, true, true, false, true, true, false, false, true, false, true, false, false, false, true, true, false, false, true, true, false, false, true, false, false, false, false, true, false, false, false, false, false, false, false, false, true, true, true, true, false, false, false, true, true, false, false, false, true, false, false, true, true, true, false, false, true, false, false, true, false, true, true, false, true, false, true, true, false, false, false, false, false, false, true, false, true, false, false, false, true, false, false, false, true, true, false, false, false, true, true, false, true, false, true, true, false, false, false, true, false, true, false, true, false, false, false, false, false, false, false, true, true, true, true, true]
|
||||||
|
|
||||||
bool[256] d = pedersen(e)
|
bool[256] d = pedersen(e)
|
||||||
|
|
||||||
d == [false, false, false, false, false, true, true, false, true, true, false, true, true, true, true, true, true, false, true, false, true, true, false, false, true, false, true, false, false, false, false, false, true, true, false, true, true, false, false, false, false, false, true, false, true, true, false, false, false, false, false, false, false, true, true, true, true, false, true, false, true, true, true, false, false, false, true, true, false, false, true, true, false, true, true, true, true, false, false, false, false, true, true, true, true, false, true, true, false, false, true, false, true, true, true, true, false, true, true, false, false, true, true, false, false, true, false, true, false, false, true, true, false, false, false, true, true, false, false, false, false, false, false, false, false, false, true, false, true, false, false, true, true, true, true, true, false, true, true, true, true, false, false, false, true, false, false, true, true, true, true, true, false, false, false, true, false, true, true, false, true, false, false, false, true, false, false, true, false, false, true, false, false, false, false, true, true, false, false, false, true, false, false, true, false, false, true, false, false, true, true, false, false, false, true, false, true, false, false, true, true, true, true, true, false, false, false, true, false, true, false, false, true, true, false, true, false, true, true, true, false, false, false, false, false, false, true, false, true, false, true, false, false, false, true, false, true, false, false, false, false, false, true, false, true, false, false, false, false, false, false, false, true, false, true, true]
|
assert(d == [false, false, false, false, false, true, true, false, true, true, false, true, true, true, true, true, true, false, true, false, true, true, false, false, true, false, true, false, false, false, false, false, true, true, false, true, true, false, false, false, false, false, true, false, true, true, false, false, false, false, false, false, false, true, true, true, true, false, true, false, true, true, true, false, false, false, true, true, false, false, true, true, false, true, true, true, true, false, false, false, false, true, true, true, true, false, true, true, false, false, true, false, true, true, true, true, false, true, true, false, false, true, true, false, false, true, false, true, false, false, true, true, false, false, false, true, true, false, false, false, false, false, false, false, false, false, true, false, true, false, false, true, true, true, true, true, false, true, true, true, true, false, false, false, true, false, false, true, true, true, true, true, false, false, false, true, false, true, true, false, true, false, false, false, true, false, false, true, false, false, true, false, false, false, false, true, true, false, false, false, true, false, false, true, false, false, true, false, false, true, true, false, false, false, true, false, true, false, false, true, true, true, true, true, false, false, false, true, false, true, false, false, true, true, false, true, false, true, true, true, false, false, false, false, false, false, true, false, true, false, true, false, false, false, true, false, true, false, false, false, false, false, true, false, true, false, false, false, false, false, false, false, true, false, true, true])
|
||||||
|
|
||||||
return 1
|
return
|
|
@ -8,7 +8,7 @@
|
||||||
},
|
},
|
||||||
"output": {
|
"output": {
|
||||||
"Ok": {
|
"Ok": {
|
||||||
"values": ["1"]
|
"values": []
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,12 +8,12 @@
|
||||||
|
|
||||||
import "hashes/pedersen/6bit" as pedersen
|
import "hashes/pedersen/6bit" as pedersen
|
||||||
|
|
||||||
def main() -> (field):
|
def main() -> ():
|
||||||
|
|
||||||
bool[6] e = [true, true, false, false, false, false]
|
bool[6] e = [true, true, false, false, false, false]
|
||||||
field[2] d = pedersen(e)
|
field[2] d = pedersen(e)
|
||||||
|
|
||||||
5483803361072598088157572477433311028290255512997784196805059543720485966024 == d[0]
|
assert(5483803361072598088157572477433311028290255512997784196805059543720485966024 == d[0])
|
||||||
8712718144085345152615259409576985937188455136179509057889474614313734076278 == d[1]
|
assert(8712718144085345152615259409576985937188455136179509057889474614313734076278 == d[1])
|
||||||
|
|
||||||
return 1
|
return
|
|
@ -7,7 +7,7 @@
|
||||||
},
|
},
|
||||||
"output": {
|
"output": {
|
||||||
"Ok": {
|
"Ok": {
|
||||||
"values": ["1"]
|
"values": []
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,7 +15,7 @@
|
||||||
// bin(int(digest, 16))
|
// bin(int(digest, 16))
|
||||||
// # '0b1110111110100100000111001010010010100101110001110110101101001001010111010101010111011111110110111111100100010111010100110010000001000000010010110011110010000000010010001011001110001110101100011000011100111010101001100110001100111010001101100011100010000011'
|
// # '0b1110111110100100000111001010010010100101110001110110101101001001010111010101010111011111110110111111100100010111010100110010000001000000010010110011110010000000010010001011001110001110101100011000011100111010101001100110001100111010001101100011100010000011'
|
||||||
import "hashes/sha256/1024bitPadded" as sha256
|
import "hashes/sha256/1024bitPadded" as sha256
|
||||||
def main() -> (field):
|
def main() -> ():
|
||||||
|
|
||||||
bool[256] a = [false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false]
|
bool[256] a = [false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false]
|
||||||
bool[256] b = [false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false]
|
bool[256] b = [false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false]
|
||||||
|
@ -24,6 +24,6 @@ def main() -> (field):
|
||||||
|
|
||||||
bool[256] digest = sha256(a, b, c, d)
|
bool[256] digest = sha256(a, b, c, d)
|
||||||
|
|
||||||
digest == [true, true, true, false, true, true, true, true, true, false, true, false, false, true, false, false, false, false, false, true, true, true, false, false, true, false, true, false, false, true, false, false, true, false, true, false, false, true, false, true, true, true, false, false, false, true, true, true, false, true, true, false, true, false, true, true, false, true, false, false, true, false, false, true, false, true, false, true, true, true, false, true, false, true, false, true, false, true, false, true, true, true, false, true, true, true, true, true, true, true, false, true, true, false, true, true, true, true, true, true, true, false, false, true, false, false, false, true, false, true, true, true, false, true, false, true, false, false, true, true, false, false, true, false, false, false, false, false, false, true, false, false, false, false, false, false, false, true, false, false, true, false, true, true, false, false, true, true, true, true, false, false, true, false, false, false, false, false, false, false, false, true, false, false, true, false, false, false, true, false, true, true, false, false, true, true, true, false, false, false, true, true, true, false, true, false, true, true, false, false, false, true, true, false, false, false, false, true, true, true, false, false, true, true, true, false, true, false, true, false, true, false, false, true, true, false, false, true, true, false, false, false, true, true, false, false, true, true, true, false, true, false, false, false, true, true, false, true, true, false, false, false, true, true, true, false, false, false, true, false, false, false, false, false, true, true]
|
assert(digest == [true, true, true, false, true, true, true, true, true, false, true, false, false, true, false, false, false, false, false, true, true, true, false, false, true, false, true, false, false, true, false, false, true, false, true, false, false, true, false, true, true, true, false, false, false, true, true, true, false, true, true, false, true, false, true, true, false, true, false, false, true, false, false, true, false, true, false, true, true, true, false, true, false, true, false, true, false, true, false, true, true, true, false, true, true, true, true, true, true, true, false, true, true, false, true, true, true, true, true, true, true, false, false, true, false, false, false, true, false, true, true, true, false, true, false, true, false, false, true, true, false, false, true, false, false, false, false, false, false, true, false, false, false, false, false, false, false, true, false, false, true, false, true, true, false, false, true, true, true, true, false, false, true, false, false, false, false, false, false, false, false, true, false, false, true, false, false, false, true, false, true, true, false, false, true, true, true, false, false, false, true, true, true, false, true, false, true, true, false, false, false, true, true, false, false, false, false, true, true, true, false, false, true, true, true, false, true, false, true, false, true, false, false, true, true, false, false, true, true, false, false, false, true, true, false, false, true, true, true, false, true, false, false, false, true, true, false, true, true, false, false, false, true, true, true, false, false, false, true, false, false, false, false, false, true, true])
|
||||||
|
|
||||||
return 1
|
return
|
|
@ -8,7 +8,7 @@
|
||||||
},
|
},
|
||||||
"output": {
|
"output": {
|
||||||
"Ok": {
|
"Ok": {
|
||||||
"values": ["1"]
|
"values": []
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,11 +1,11 @@
|
||||||
import "hashes/sha256/512bit" as sha256
|
import "hashes/sha256/512bit" as sha256
|
||||||
def main() -> (field):
|
def main() -> ():
|
||||||
|
|
||||||
bool[256] a = [false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false]
|
bool[256] a = [false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false]
|
||||||
bool[256] b = [false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, true]
|
bool[256] b = [false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, true]
|
||||||
|
|
||||||
bool[256] digest = sha256(a, b)
|
bool[256] digest = sha256(a, b)
|
||||||
|
|
||||||
digest == [false, false, false, true, true, true, true, true, false, false, true, true, true, false, true, true, true, false, false, false, true, false, true, true, true, false, false, true, true, false, false, false, true, true, false, false, false, false, true, false, false, false, false, true, true, true, true, false, true, false, true, true, true, false, false, false, true, false, false, true, false, true, false, false, false, false, true, true, true, true, false, false, true, false, false, false, true, true, true, false, true, true, true, false, false, false, true, true, false, false, true, true, false, false, true, false, false, false, true, false, true, true, false, false, false, false, false, true, false, true, false, false, false, false, false, true, false, true, false, false, true, false, true, true, false, true, true, false, false, false, false, true, false, false, false, false, false, true, false, true, false, true, false, true, false, true, true, false, false, false, true, false, false, true, true, false, false, false, false, true, false, true, false, false, true, true, true, false, false, true, true, true, false, false, true, true, true, false, false, false, true, true, true, true, false, false, true, true, false, true, false, true, true, true, true, false, true, true, true, true, false, false, false, true, false, false, true, true, true, false, true, false, false, false, false, false, false, true, true, true, true, false, true, true, true, true, true, false, true, false, true, false, true, true, false, false, true, true, false, false, false, false, true, true, true, true, false, true, false, false, true, false, true, true, false, true]
|
assert(digest == [false, false, false, true, true, true, true, true, false, false, true, true, true, false, true, true, true, false, false, false, true, false, true, true, true, false, false, true, true, false, false, false, true, true, false, false, false, false, true, false, false, false, false, true, true, true, true, false, true, false, true, true, true, false, false, false, true, false, false, true, false, true, false, false, false, false, true, true, true, true, false, false, true, false, false, false, true, true, true, false, true, true, true, false, false, false, true, true, false, false, true, true, false, false, true, false, false, false, true, false, true, true, false, false, false, false, false, true, false, true, false, false, false, false, false, true, false, true, false, false, true, false, true, true, false, true, true, false, false, false, false, true, false, false, false, false, false, true, false, true, false, true, false, true, false, true, true, false, false, false, true, false, false, true, true, false, false, false, false, true, false, true, false, false, true, true, true, false, false, true, true, true, false, false, true, true, true, false, false, false, true, true, true, true, false, false, true, true, false, true, false, true, true, true, true, false, true, true, true, true, false, false, false, true, false, false, true, true, true, false, true, false, false, false, false, false, false, true, true, true, true, false, true, true, true, true, true, false, true, false, true, false, true, true, false, false, true, true, false, false, false, false, true, true, true, true, false, true, false, false, true, false, true, true, false, true])
|
||||||
|
|
||||||
return 1
|
return
|
|
@ -16,7 +16,7 @@
|
||||||
// # 65303172752238645975888084098459749904
|
// # 65303172752238645975888084098459749904
|
||||||
|
|
||||||
import "hashes/sha256/512bitPacked" as sha256packed
|
import "hashes/sha256/512bitPacked" as sha256packed
|
||||||
def main() -> (field):
|
def main() -> ():
|
||||||
|
|
||||||
field a = 0
|
field a = 0
|
||||||
field b = 0
|
field b = 0
|
||||||
|
@ -25,7 +25,7 @@ def main() -> (field):
|
||||||
|
|
||||||
field[2] h = sha256packed([a, b, c, d])
|
field[2] h = sha256packed([a, b, c, d])
|
||||||
|
|
||||||
h[0] == 263561599766550617289250058199814760685
|
assert(h[0] == 263561599766550617289250058199814760685)
|
||||||
h[1] == 65303172752238645975888084098459749904
|
assert(h[1] == 65303172752238645975888084098459749904)
|
||||||
|
|
||||||
return 1
|
return
|
|
@ -8,7 +8,7 @@
|
||||||
},
|
},
|
||||||
"output": {
|
"output": {
|
||||||
"Ok": {
|
"Ok": {
|
||||||
"values": ["1"]
|
"values": []
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,7 +8,7 @@
|
||||||
},
|
},
|
||||||
"output": {
|
"output": {
|
||||||
"Ok": {
|
"Ok": {
|
||||||
"values": ["1"]
|
"values": []
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -13,14 +13,14 @@
|
||||||
// bin(int(digest, 16))
|
// bin(int(digest, 16))
|
||||||
// # '0b1100011001001000000111100010001011000101111111110100000101100100101011110110100000001011100011001111101010100101111010001110110100110001001000001110111011111111100010011100010011110011000001111100010010100110111110101010101011100000010110011100111000010000'
|
// # '0b1100011001001000000111100010001011000101111111110100000101100100101011110110100000001011100011001111101010100101111010001110110100110001001000001110111011111111100010011100010011110011000001111100010010100110111110101010101011100000010110011100111000010000'
|
||||||
import "hashes/sha256/512bitPadded" as sha256
|
import "hashes/sha256/512bitPadded" as sha256
|
||||||
def main() -> (field):
|
def main() -> ():
|
||||||
|
|
||||||
bool[256] a = [false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false]
|
bool[256] a = [false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false]
|
||||||
bool[256] b = [false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, true]
|
bool[256] b = [false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, true]
|
||||||
|
|
||||||
bool[256] digest = sha256(a, b)
|
bool[256] digest = sha256(a, b)
|
||||||
|
|
||||||
digest == [true, true, false, false, false, true, true, false, false, true, false, false, true, false, false, false, false, false, false, true, true, true, true, false, false, false, true, false, false, false, true, false, true, true, false, false, false, true, false, true, true, true, true, true, true, true, true, true, false, true, false, false, false, false, false, true, false, true, true, false, false, true, false, false, true, false, true, false, true, true, true, true, false, true, true, false, true, false, false, false, false, false, false, false, true, false, true, true, true, false, false, false, true, true, false, false, true, true, true, true, true, false, true, false, true, false, true, false, false, true, false, true, true, true, true, false, true, false, false, false, true, true, true, false, true, true, false, true, false, false, true, true, false, false, false, true, false, false, true, false, false, false, false, false, true, true, true, false, true, true, true, false, true, true, true, true, true, true, true, true, true, false, false, false, true, false, false, true, true, true, false, false, false, true, false, false, true, true, true, true, false, false, true, true, false, false, false, false, false, true, true, true, true, true, false, false, false, true, false, false, true, false, true, false, false, true, true, false, true, true, true, true, true, false, true, false, true, false, true, false, true, false, true, false, true, true, true, false, false, false, false, false, false, true, false, true, true, false, false, true, true, true, false, false, true, true, true, false, false, false, false, true, false, false, false, false]
|
assert(digest == [true, true, false, false, false, true, true, false, false, true, false, false, true, false, false, false, false, false, false, true, true, true, true, false, false, false, true, false, false, false, true, false, true, true, false, false, false, true, false, true, true, true, true, true, true, true, true, true, false, true, false, false, false, false, false, true, false, true, true, false, false, true, false, false, true, false, true, false, true, true, true, true, false, true, true, false, true, false, false, false, false, false, false, false, true, false, true, true, true, false, false, false, true, true, false, false, true, true, true, true, true, false, true, false, true, false, true, false, false, true, false, true, true, true, true, false, true, false, false, false, true, true, true, false, true, true, false, true, false, false, true, true, false, false, false, true, false, false, true, false, false, false, false, false, true, true, true, false, true, true, true, false, true, true, true, true, true, true, true, true, true, false, false, false, true, false, false, true, true, true, false, false, false, true, false, false, true, true, true, true, false, false, true, true, false, false, false, false, false, true, true, true, true, true, false, false, false, true, false, false, true, false, true, false, false, true, true, false, true, true, true, true, true, false, true, false, true, false, true, false, true, false, true, false, true, true, true, false, false, false, false, false, false, true, false, true, true, false, false, true, true, true, false, false, true, true, true, false, false, false, false, true, false, false, false, false])
|
||||||
|
|
||||||
|
|
||||||
return 1
|
return
|
|
@ -8,7 +8,7 @@
|
||||||
},
|
},
|
||||||
"output": {
|
"output": {
|
||||||
"Ok": {
|
"Ok": {
|
||||||
"values": ["1"]
|
"values": []
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -14,27 +14,27 @@
|
||||||
|
|
||||||
import "hashes/utils/256bitsDirectionHelper" as direction
|
import "hashes/utils/256bitsDirectionHelper" as direction
|
||||||
|
|
||||||
def left() -> (field):
|
def left() -> (bool):
|
||||||
|
|
||||||
bool[256] a = [false, false, false, true, true, false, true, true, false, false, false, true, true, false, false, true, true, true, false, true, true, true, true, false, true, false, true, false, true, false, false, false, true, false, true, true, true, false, true, false, false, true, false, false, true, true, true, false, false, false, true, true, true, true, false, false, false, false, false, true, false, true, true, false, false, true, false, false, false, false, true, true, true, true, true, false, true, false, true, true, false, true, true, false, false, true, true, true, true, false, true, false, false, true, false, false, false, false, true, false, false, true, true, false, false, true, true, false, false, true, true, true, true, true, true, true, true, true, false, true, false, false, true, true, true, true, false, false, true, true, false, false, false, true, false, true, false, false, false, false, true, false, true, false, false, false, false, true, true, false, false, false, true, false, false, true, true, true, true, true, false, true, false, true, false, true, false, false, true, false, false, true, false, true, true, true, false, true, true, true, true, true, true, false, false, false, true, false, true, true, true, true, true, false, false, false, true, false, true, false, true, false, true, true, false, false, false, false, true, false, true, true, true, true, true, false, true, true, true, false, true, true, true, false, false, false, true, true, false, false, true, true, false, false, true, false, true, false, true, true, false, false, true, false, true, false, true, false, false, false, true, true, true, false, false, false]
|
bool[256] a = [false, false, false, true, true, false, true, true, false, false, false, true, true, false, false, true, true, true, false, true, true, true, true, false, true, false, true, false, true, false, false, false, true, false, true, true, true, false, true, false, false, true, false, false, true, true, true, false, false, false, true, true, true, true, false, false, false, false, false, true, false, true, true, false, false, true, false, false, false, false, true, true, true, true, true, false, true, false, true, true, false, true, true, false, false, true, true, true, true, false, true, false, false, true, false, false, false, false, true, false, false, true, true, false, false, true, true, false, false, true, true, true, true, true, true, true, true, true, false, true, false, false, true, true, true, true, false, false, true, true, false, false, false, true, false, true, false, false, false, false, true, false, true, false, false, false, false, true, true, false, false, false, true, false, false, true, true, true, true, true, false, true, false, true, false, true, false, false, true, false, false, true, false, true, true, true, false, true, true, true, true, true, true, false, false, false, true, false, true, true, true, true, true, false, false, false, true, false, true, false, true, false, true, true, false, false, false, false, true, false, true, true, true, true, true, false, true, true, true, false, true, true, true, false, false, false, true, true, false, false, true, true, false, false, true, false, true, false, true, true, false, false, true, false, true, false, true, false, false, false, true, true, true, false, false, false]
|
||||||
bool[256] b = [false, false, false, false, false, false, true, true, true, true, true, true, false, false, true, true, true, true, true, true, false, true, true, false, false, false, true, false, true, false, false, false, true, true, true, false, false, false, false, false, false, true, true, false, false, true, true, true, false, true, false, true, false, false, true, false, false, false, false, false, true, true, false, true, true, false, false, true, true, false, true, false, false, false, true, true, false, true, true, false, true, true, true, true, false, true, true, true, false, false, false, true, false, true, false, false, true, false, true, false, false, true, false, true, true, false, true, true, true, false, true, false, true, false, false, false, false, true, true, false, true, true, false, false, true, true, false, true, false, false, true, false, true, true, false, true, true, false, true, true, true, true, false, false, true, false, true, false, true, true, true, false, false, false, false, true, true, true, false, true, false, false, true, true, false, true, true, true, true, true, true, false, false, false, false, false, false, false, true, true, false, true, false, false, true, false, true, true, false, false, true, true, true, false, false, false, false, true, false, false, false, true, true, true, true, false, false, false, false, true, true, false, true, true, false, true, true, true, true, false, false, false, true, true, true, true, true, false, true, true, false, true, true, false, true, true, true, false, false, false, true, false, true, true, false, true, false, true, false, true, false, true, false, true, true, true]
|
bool[256] b = [false, false, false, false, false, false, true, true, true, true, true, true, false, false, true, true, true, true, true, true, false, true, true, false, false, false, true, false, true, false, false, false, true, true, true, false, false, false, false, false, false, true, true, false, false, true, true, true, false, true, false, true, false, false, true, false, false, false, false, false, true, true, false, true, true, false, false, true, true, false, true, false, false, false, true, true, false, true, true, false, true, true, true, true, false, true, true, true, false, false, false, true, false, true, false, false, true, false, true, false, false, true, false, true, true, false, true, true, true, false, true, false, true, false, false, false, false, true, true, false, true, true, false, false, true, true, false, true, false, false, true, false, true, true, false, true, true, false, true, true, true, true, false, false, true, false, true, false, true, true, true, false, false, false, false, true, true, true, false, true, false, false, true, true, false, true, true, true, true, true, true, false, false, false, false, false, false, false, true, true, false, true, false, false, true, false, true, true, false, false, true, true, true, false, false, false, false, true, false, false, false, true, true, true, true, false, false, false, false, true, true, false, true, true, false, true, true, true, true, false, false, false, true, true, true, true, true, false, true, true, false, true, true, false, true, true, true, false, false, false, true, false, true, true, false, true, false, true, false, true, false, true, false, true, true, true]
|
||||||
|
|
||||||
bool[512] out = direction(false, a, b)
|
bool[512] out = direction(false, a, b)
|
||||||
out == [false, false, false, true, true, false, true, true, false, false, false, true, true, false, false, true, true, true, false, true, true, true, true, false, true, false, true, false, true, false, false, false, true, false, true, true, true, false, true, false, false, true, false, false, true, true, true, false, false, false, true, true, true, true, false, false, false, false, false, true, false, true, true, false, false, true, false, false, false, false, true, true, true, true, true, false, true, false, true, true, false, true, true, false, false, true, true, true, true, false, true, false, false, true, false, false, false, false, true, false, false, true, true, false, false, true, true, false, false, true, true, true, true, true, true, true, true, true, false, true, false, false, true, true, true, true, false, false, true, true, false, false, false, true, false, true, false, false, false, false, true, false, true, false, false, false, false, true, true, false, false, false, true, false, false, true, true, true, true, true, false, true, false, true, false, true, false, false, true, false, false, true, false, true, true, true, false, true, true, true, true, true, true, false, false, false, true, false, true, true, true, true, true, false, false, false, true, false, true, false, true, false, true, true, false, false, false, false, true, false, true, true, true, true, true, false, true, true, true, false, true, true, true, false, false, false, true, true, false, false, true, true, false, false, true, false, true, false, true, true, false, false, true, false, true, false, true, false, false, false, true, true, true, false, false, false, false, false, false, false, false, false, true, true, true, true, true, true, false, false, true, true, true, true, true, true, false, true, true, false, false, false, true, false, true, false, false, false, true, true, true, false, false, false, false, false, false, true, true, false, false, true, true, true, false, true, false, true, false, false, true, false, false, false, false, false, true, true, false, true, true, false, false, true, true, false, true, false, false, false, true, true, false, true, true, false, true, true, true, true, false, true, true, true, false, false, false, true, false, true, false, false, true, false, true, false, false, true, false, true, true, false, true, true, true, false, true, false, true, false, false, false, false, true, true, false, true, true, false, false, true, true, false, true, false, false, true, false, true, true, false, true, true, false, true, true, true, true, false, false, true, false, true, false, true, true, true, false, false, false, false, true, true, true, false, true, false, false, true, true, false, true, true, true, true, true, true, false, false, false, false, false, false, false, true, true, false, true, false, false, true, false, true, true, false, false, true, true, true, false, false, false, false, true, false, false, false, true, true, true, true, false, false, false, false, true, true, false, true, true, false, true, true, true, true, false, false, false, true, true, true, true, true, false, true, true, false, true, true, false, true, true, true, false, false, false, true, false, true, true, false, true, false, true, false, true, false, true, false, true, true, true]
|
assert(out == [false, false, false, true, true, false, true, true, false, false, false, true, true, false, false, true, true, true, false, true, true, true, true, false, true, false, true, false, true, false, false, false, true, false, true, true, true, false, true, false, false, true, false, false, true, true, true, false, false, false, true, true, true, true, false, false, false, false, false, true, false, true, true, false, false, true, false, false, false, false, true, true, true, true, true, false, true, false, true, true, false, true, true, false, false, true, true, true, true, false, true, false, false, true, false, false, false, false, true, false, false, true, true, false, false, true, true, false, false, true, true, true, true, true, true, true, true, true, false, true, false, false, true, true, true, true, false, false, true, true, false, false, false, true, false, true, false, false, false, false, true, false, true, false, false, false, false, true, true, false, false, false, true, false, false, true, true, true, true, true, false, true, false, true, false, true, false, false, true, false, false, true, false, true, true, true, false, true, true, true, true, true, true, false, false, false, true, false, true, true, true, true, true, false, false, false, true, false, true, false, true, false, true, true, false, false, false, false, true, false, true, true, true, true, true, false, true, true, true, false, true, true, true, false, false, false, true, true, false, false, true, true, false, false, true, false, true, false, true, true, false, false, true, false, true, false, true, false, false, false, true, true, true, false, false, false, false, false, false, false, false, false, true, true, true, true, true, true, false, false, true, true, true, true, true, true, false, true, true, false, false, false, true, false, true, false, false, false, true, true, true, false, false, false, false, false, false, true, true, false, false, true, true, true, false, true, false, true, false, false, true, false, false, false, false, false, true, true, false, true, true, false, false, true, true, false, true, false, false, false, true, true, false, true, true, false, true, true, true, true, false, true, true, true, false, false, false, true, false, true, false, false, true, false, true, false, false, true, false, true, true, false, true, true, true, false, true, false, true, false, false, false, false, true, true, false, true, true, false, false, true, true, false, true, false, false, true, false, true, true, false, true, true, false, true, true, true, true, false, false, true, false, true, false, true, true, true, false, false, false, false, true, true, true, false, true, false, false, true, true, false, true, true, true, true, true, true, false, false, false, false, false, false, false, true, true, false, true, false, false, true, false, true, true, false, false, true, true, true, false, false, false, false, true, false, false, false, true, true, true, true, false, false, false, false, true, true, false, true, true, false, true, true, true, true, false, false, false, true, true, true, true, true, false, true, true, false, true, true, false, true, true, true, false, false, false, true, false, true, true, false, true, false, true, false, true, false, true, false, true, true, true])
|
||||||
return 1
|
return true
|
||||||
|
|
||||||
def right() -> (field):
|
def right() -> (bool):
|
||||||
|
|
||||||
bool[256] a = [false, false, false, true, true, false, true, true, false, false, false, true, true, false, false, true, true, true, false, true, true, true, true, false, true, false, true, false, true, false, false, false, true, false, true, true, true, false, true, false, false, true, false, false, true, true, true, false, false, false, true, true, true, true, false, false, false, false, false, true, false, true, true, false, false, true, false, false, false, false, true, true, true, true, true, false, true, false, true, true, false, true, true, false, false, true, true, true, true, false, true, false, false, true, false, false, false, false, true, false, false, true, true, false, false, true, true, false, false, true, true, true, true, true, true, true, true, true, false, true, false, false, true, true, true, true, false, false, true, true, false, false, false, true, false, true, false, false, false, false, true, false, true, false, false, false, false, true, true, false, false, false, true, false, false, true, true, true, true, true, false, true, false, true, false, true, false, false, true, false, false, true, false, true, true, true, false, true, true, true, true, true, true, false, false, false, true, false, true, true, true, true, true, false, false, false, true, false, true, false, true, false, true, true, false, false, false, false, true, false, true, true, true, true, true, false, true, true, true, false, true, true, true, false, false, false, true, true, false, false, true, true, false, false, true, false, true, false, true, true, false, false, true, false, true, false, true, false, false, false, true, true, true, false, false, false]
|
bool[256] a = [false, false, false, true, true, false, true, true, false, false, false, true, true, false, false, true, true, true, false, true, true, true, true, false, true, false, true, false, true, false, false, false, true, false, true, true, true, false, true, false, false, true, false, false, true, true, true, false, false, false, true, true, true, true, false, false, false, false, false, true, false, true, true, false, false, true, false, false, false, false, true, true, true, true, true, false, true, false, true, true, false, true, true, false, false, true, true, true, true, false, true, false, false, true, false, false, false, false, true, false, false, true, true, false, false, true, true, false, false, true, true, true, true, true, true, true, true, true, false, true, false, false, true, true, true, true, false, false, true, true, false, false, false, true, false, true, false, false, false, false, true, false, true, false, false, false, false, true, true, false, false, false, true, false, false, true, true, true, true, true, false, true, false, true, false, true, false, false, true, false, false, true, false, true, true, true, false, true, true, true, true, true, true, false, false, false, true, false, true, true, true, true, true, false, false, false, true, false, true, false, true, false, true, true, false, false, false, false, true, false, true, true, true, true, true, false, true, true, true, false, true, true, true, false, false, false, true, true, false, false, true, true, false, false, true, false, true, false, true, true, false, false, true, false, true, false, true, false, false, false, true, true, true, false, false, false]
|
||||||
bool[256] b = [false, false, false, false, false, false, true, true, true, true, true, true, false, false, true, true, true, true, true, true, false, true, true, false, false, false, true, false, true, false, false, false, true, true, true, false, false, false, false, false, false, true, true, false, false, true, true, true, false, true, false, true, false, false, true, false, false, false, false, false, true, true, false, true, true, false, false, true, true, false, true, false, false, false, true, true, false, true, true, false, true, true, true, true, false, true, true, true, false, false, false, true, false, true, false, false, true, false, true, false, false, true, false, true, true, false, true, true, true, false, true, false, true, false, false, false, false, true, true, false, true, true, false, false, true, true, false, true, false, false, true, false, true, true, false, true, true, false, true, true, true, true, false, false, true, false, true, false, true, true, true, false, false, false, false, true, true, true, false, true, false, false, true, true, false, true, true, true, true, true, true, false, false, false, false, false, false, false, true, true, false, true, false, false, true, false, true, true, false, false, true, true, true, false, false, false, false, true, false, false, false, true, true, true, true, false, false, false, false, true, true, false, true, true, false, true, true, true, true, false, false, false, true, true, true, true, true, false, true, true, false, true, true, false, true, true, true, false, false, false, true, false, true, true, false, true, false, true, false, true, false, true, false, true, true, true]
|
bool[256] b = [false, false, false, false, false, false, true, true, true, true, true, true, false, false, true, true, true, true, true, true, false, true, true, false, false, false, true, false, true, false, false, false, true, true, true, false, false, false, false, false, false, true, true, false, false, true, true, true, false, true, false, true, false, false, true, false, false, false, false, false, true, true, false, true, true, false, false, true, true, false, true, false, false, false, true, true, false, true, true, false, true, true, true, true, false, true, true, true, false, false, false, true, false, true, false, false, true, false, true, false, false, true, false, true, true, false, true, true, true, false, true, false, true, false, false, false, false, true, true, false, true, true, false, false, true, true, false, true, false, false, true, false, true, true, false, true, true, false, true, true, true, true, false, false, true, false, true, false, true, true, true, false, false, false, false, true, true, true, false, true, false, false, true, true, false, true, true, true, true, true, true, false, false, false, false, false, false, false, true, true, false, true, false, false, true, false, true, true, false, false, true, true, true, false, false, false, false, true, false, false, false, true, true, true, true, false, false, false, false, true, true, false, true, true, false, true, true, true, true, false, false, false, true, true, true, true, true, false, true, true, false, true, true, false, true, true, true, false, false, false, true, false, true, true, false, true, false, true, false, true, false, true, false, true, true, true]
|
||||||
|
|
||||||
bool[512] out = direction(true, a, b)
|
bool[512] out = direction(true, a, b)
|
||||||
out == [false, false, false, false, false, false, true, true, true, true, true, true, false, false, true, true, true, true, true, true, false, true, true, false, false, false, true, false, true, false, false, false, true, true, true, false, false, false, false, false, false, true, true, false, false, true, true, true, false, true, false, true, false, false, true, false, false, false, false, false, true, true, false, true, true, false, false, true, true, false, true, false, false, false, true, true, false, true, true, false, true, true, true, true, false, true, true, true, false, false, false, true, false, true, false, false, true, false, true, false, false, true, false, true, true, false, true, true, true, false, true, false, true, false, false, false, false, true, true, false, true, true, false, false, true, true, false, true, false, false, true, false, true, true, false, true, true, false, true, true, true, true, false, false, true, false, true, false, true, true, true, false, false, false, false, true, true, true, false, true, false, false, true, true, false, true, true, true, true, true, true, false, false, false, false, false, false, false, true, true, false, true, false, false, true, false, true, true, false, false, true, true, true, false, false, false, false, true, false, false, false, true, true, true, true, false, false, false, false, true, true, false, true, true, false, true, true, true, true, false, false, false, true, true, true, true, true, false, true, true, false, true, true, false, true, true, true, false, false, false, true, false, true, true, false, true, false, true, false, true, false, true, false, true, true, true, false, false, false, true, true, false, true, true, false, false, false, true, true, false, false, true, true, true, false, true, true, true, true, false, true, false, true, false, true, false, false, false, true, false, true, true, true, false, true, false, false, true, false, false, true, true, true, false, false, false, true, true, true, true, false, false, false, false, false, true, false, true, true, false, false, true, false, false, false, false, true, true, true, true, true, false, true, false, true, true, false, true, true, false, false, true, true, true, true, false, true, false, false, true, false, false, false, false, true, false, false, true, true, false, false, true, true, false, false, true, true, true, true, true, true, true, true, true, false, true, false, false, true, true, true, true, false, false, true, true, false, false, false, true, false, true, false, false, false, false, true, false, true, false, false, false, false, true, true, false, false, false, true, false, false, true, true, true, true, true, false, true, false, true, false, true, false, false, true, false, false, true, false, true, true, true, false, true, true, true, true, true, true, false, false, false, true, false, true, true, true, true, true, false, false, false, true, false, true, false, true, false, true, true, false, false, false, false, true, false, true, true, true, true, true, false, true, true, true, false, true, true, true, false, false, false, true, true, false, false, true, true, false, false, true, false, true, false, true, true, false, false, true, false, true, false, true, false, false, false, true, true, true, false, false, false]
|
assert(out == [false, false, false, false, false, false, true, true, true, true, true, true, false, false, true, true, true, true, true, true, false, true, true, false, false, false, true, false, true, false, false, false, true, true, true, false, false, false, false, false, false, true, true, false, false, true, true, true, false, true, false, true, false, false, true, false, false, false, false, false, true, true, false, true, true, false, false, true, true, false, true, false, false, false, true, true, false, true, true, false, true, true, true, true, false, true, true, true, false, false, false, true, false, true, false, false, true, false, true, false, false, true, false, true, true, false, true, true, true, false, true, false, true, false, false, false, false, true, true, false, true, true, false, false, true, true, false, true, false, false, true, false, true, true, false, true, true, false, true, true, true, true, false, false, true, false, true, false, true, true, true, false, false, false, false, true, true, true, false, true, false, false, true, true, false, true, true, true, true, true, true, false, false, false, false, false, false, false, true, true, false, true, false, false, true, false, true, true, false, false, true, true, true, false, false, false, false, true, false, false, false, true, true, true, true, false, false, false, false, true, true, false, true, true, false, true, true, true, true, false, false, false, true, true, true, true, true, false, true, true, false, true, true, false, true, true, true, false, false, false, true, false, true, true, false, true, false, true, false, true, false, true, false, true, true, true, false, false, false, true, true, false, true, true, false, false, false, true, true, false, false, true, true, true, false, true, true, true, true, false, true, false, true, false, true, false, false, false, true, false, true, true, true, false, true, false, false, true, false, false, true, true, true, false, false, false, true, true, true, true, false, false, false, false, false, true, false, true, true, false, false, true, false, false, false, false, true, true, true, true, true, false, true, false, true, true, false, true, true, false, false, true, true, true, true, false, true, false, false, true, false, false, false, false, true, false, false, true, true, false, false, true, true, false, false, true, true, true, true, true, true, true, true, true, false, true, false, false, true, true, true, true, false, false, true, true, false, false, false, true, false, true, false, false, false, false, true, false, true, false, false, false, false, true, true, false, false, false, true, false, false, true, true, true, true, true, false, true, false, true, false, true, false, false, true, false, false, true, false, true, true, true, false, true, true, true, true, true, true, false, false, false, true, false, true, true, true, true, true, false, false, false, true, false, true, false, true, false, true, true, false, false, false, false, true, false, true, true, true, true, true, false, true, true, true, false, true, true, true, false, false, false, true, true, false, false, true, true, false, false, true, false, true, false, true, true, false, false, true, false, true, false, true, false, false, false, true, true, true, false, false, false])
|
||||||
return 1
|
return true
|
||||||
|
|
||||||
def main() -> (field):
|
def main() -> ():
|
||||||
|
|
||||||
left() == 1
|
assert(left())
|
||||||
right() == 1
|
assert(right())
|
||||||
|
|
||||||
return 1
|
return
|
|
@ -8,7 +8,7 @@
|
||||||
},
|
},
|
||||||
"output": {
|
"output": {
|
||||||
"Ok": {
|
"Ok": {
|
||||||
"values": ["1"]
|
"values": []
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,7 +4,7 @@ from "ecc/babyjubjubParams" import BabyJubJubParams
|
||||||
|
|
||||||
// Code to create test case:
|
// Code to create test case:
|
||||||
// https://github.com/Zokrates/pycrypto
|
// https://github.com/Zokrates/pycrypto
|
||||||
def main() -> (field):
|
def main() -> ():
|
||||||
|
|
||||||
BabyJubJubParams context = context()
|
BabyJubJubParams context = context()
|
||||||
|
|
||||||
|
@ -18,6 +18,6 @@ def main() -> (field):
|
||||||
bool[256] M1 = [false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, true]
|
bool[256] M1 = [false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, true]
|
||||||
|
|
||||||
bool isVerified = verifyEddsa(R, S, A, M0, M1, context)
|
bool isVerified = verifyEddsa(R, S, A, M0, M1, context)
|
||||||
isVerified == true
|
assert(isVerified)
|
||||||
|
|
||||||
return 1
|
return
|
|
@ -8,7 +8,7 @@
|
||||||
},
|
},
|
||||||
"output": {
|
"output": {
|
||||||
"Ok": {
|
"Ok": {
|
||||||
"values": ["1"]
|
"values": []
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
import "utils/multiplexer/256bit" as multiplex
|
import "utils/multiplexer/256bit" as multiplex
|
||||||
|
|
||||||
def left() -> (field):
|
def left() -> (bool):
|
||||||
bool bit = false //left
|
bool bit = false //left
|
||||||
|
|
||||||
bool[256] a = [false, false, false, true, true, false, true, true, false, false, false, true, true, false, false, true, true, true, false, true, true, true, true, false, true, false, true, false, true, false, false, false, true, false, true, true, true, false, true, false, false, true, false, false, true, true, true, false, false, false, true, true, true, true, false, false, false, false, false, true, false, true, true, false, false, true, false, false, false, false, true, true, true, true, true, false, true, false, true, true, false, true, true, false, false, true, true, true, true, false, true, false, false, true, false, false, false, false, true, false, false, true, true, false, false, true, true, false, false, true, true, true, true, true, true, true, true, true, false, true, false, false, true, true, true, true, false, false, true, true, false, false, false, true, false, true, false, false, false, false, true, false, true, false, false, false, false, true, true, false, false, false, true, false, false, true, true, true, true, true, false, true, false, true, false, true, false, false, true, false, false, true, false, true, true, true, false, true, true, true, true, true, true, false, false, false, true, false, true, true, true, true, true, false, false, false, true, false, true, false, true, false, true, true, false, false, false, false, true, false, true, true, true, true, true, false, true, true, true, false, true, true, true, false, false, false, true, true, false, false, true, true, false, false, true, false, true, false, true, true, false, false, true, false, true, false, true, false, false, false, true, true, true, false, false, false]
|
bool[256] a = [false, false, false, true, true, false, true, true, false, false, false, true, true, false, false, true, true, true, false, true, true, true, true, false, true, false, true, false, true, false, false, false, true, false, true, true, true, false, true, false, false, true, false, false, true, true, true, false, false, false, true, true, true, true, false, false, false, false, false, true, false, true, true, false, false, true, false, false, false, false, true, true, true, true, true, false, true, false, true, true, false, true, true, false, false, true, true, true, true, false, true, false, false, true, false, false, false, false, true, false, false, true, true, false, false, true, true, false, false, true, true, true, true, true, true, true, true, true, false, true, false, false, true, true, true, true, false, false, true, true, false, false, false, true, false, true, false, false, false, false, true, false, true, false, false, false, false, true, true, false, false, false, true, false, false, true, true, true, true, true, false, true, false, true, false, true, false, false, true, false, false, true, false, true, true, true, false, true, true, true, true, true, true, false, false, false, true, false, true, true, true, true, true, false, false, false, true, false, true, false, true, false, true, true, false, false, false, false, true, false, true, true, true, true, true, false, true, true, true, false, true, true, true, false, false, false, true, true, false, false, true, true, false, false, true, false, true, false, true, true, false, false, true, false, true, false, true, false, false, false, true, true, true, false, false, false]
|
||||||
|
@ -8,11 +8,11 @@ def left() -> (field):
|
||||||
bool[256] b = [false, false, false, false, false, false, true, true, true, true, true, true, false, false, true, true, true, true, true, true, false, true, true, false, false, false, true, false, true, false, false, false, true, true, true, false, false, false, false, false, false, true, true, false, false, true, true, true, false, true, false, true, false, false, true, false, false, false, false, false, true, true, false, true, true, false, false, true, true, false, true, false, false, false, true, true, false, true, true, false, true, true, true, true, false, true, true, true, false, false, false, true, false, true, false, false, true, false, true, false, false, true, false, true, true, false, true, true, true, false, true, false, true, false, false, false, false, true, true, false, true, true, false, false, true, true, false, true, false, false, true, false, true, true, false, true, true, false, true, true, true, true, false, false, true, false, true, false, true, true, true, false, false, false, false, true, true, true, false, true, false, false, true, true, false, true, true, true, true, true, true, false, false, false, false, false, false, false, true, true, false, true, false, false, true, false, true, true, false, false, true, true, true, false, false, false, false, true, false, false, false, true, true, true, true, false, false, false, false, true, true, false, true, true, false, true, true, true, true, false, false, false, true, true, true, true, true, false, true, true, false, true, true, false, true, true, true, false, false, false, true, false, true, true, false, true, false, true, false, true, false, true, false, true, true, true]
|
bool[256] b = [false, false, false, false, false, false, true, true, true, true, true, true, false, false, true, true, true, true, true, true, false, true, true, false, false, false, true, false, true, false, false, false, true, true, true, false, false, false, false, false, false, true, true, false, false, true, true, true, false, true, false, true, false, false, true, false, false, false, false, false, true, true, false, true, true, false, false, true, true, false, true, false, false, false, true, true, false, true, true, false, true, true, true, true, false, true, true, true, false, false, false, true, false, true, false, false, true, false, true, false, false, true, false, true, true, false, true, true, true, false, true, false, true, false, false, false, false, true, true, false, true, true, false, false, true, true, false, true, false, false, true, false, true, true, false, true, true, false, true, true, true, true, false, false, true, false, true, false, true, true, true, false, false, false, false, true, true, true, false, true, false, false, true, true, false, true, true, true, true, true, true, false, false, false, false, false, false, false, true, true, false, true, false, false, true, false, true, true, false, false, true, true, true, false, false, false, false, true, false, false, false, true, true, true, true, false, false, false, false, true, true, false, true, true, false, true, true, true, true, false, false, false, true, true, true, true, true, false, true, true, false, true, true, false, true, true, true, false, false, false, true, false, true, true, false, true, false, true, false, true, false, true, false, true, true, true]
|
||||||
|
|
||||||
bool[256] output = [false, false, false, true, true, false, true, true, false, false, false, true, true, false, false, true, true, true, false, true, true, true, true, false, true, false, true, false, true, false, false, false, true, false, true, true, true, false, true, false, false, true, false, false, true, true, true, false, false, false, true, true, true, true, false, false, false, false, false, true, false, true, true, false, false, true, false, false, false, false, true, true, true, true, true, false, true, false, true, true, false, true, true, false, false, true, true, true, true, false, true, false, false, true, false, false, false, false, true, false, false, true, true, false, false, true, true, false, false, true, true, true, true, true, true, true, true, true, false, true, false, false, true, true, true, true, false, false, true, true, false, false, false, true, false, true, false, false, false, false, true, false, true, false, false, false, false, true, true, false, false, false, true, false, false, true, true, true, true, true, false, true, false, true, false, true, false, false, true, false, false, true, false, true, true, true, false, true, true, true, true, true, true, false, false, false, true, false, true, true, true, true, true, false, false, false, true, false, true, false, true, false, true, true, false, false, false, false, true, false, true, true, true, true, true, false, true, true, true, false, true, true, true, false, false, false, true, true, false, false, true, true, false, false, true, false, true, false, true, true, false, false, true, false, true, false, true, false, false, false, true, true, true, false, false, false]
|
bool[256] output = [false, false, false, true, true, false, true, true, false, false, false, true, true, false, false, true, true, true, false, true, true, true, true, false, true, false, true, false, true, false, false, false, true, false, true, true, true, false, true, false, false, true, false, false, true, true, true, false, false, false, true, true, true, true, false, false, false, false, false, true, false, true, true, false, false, true, false, false, false, false, true, true, true, true, true, false, true, false, true, true, false, true, true, false, false, true, true, true, true, false, true, false, false, true, false, false, false, false, true, false, false, true, true, false, false, true, true, false, false, true, true, true, true, true, true, true, true, true, false, true, false, false, true, true, true, true, false, false, true, true, false, false, false, true, false, true, false, false, false, false, true, false, true, false, false, false, false, true, true, false, false, false, true, false, false, true, true, true, true, true, false, true, false, true, false, true, false, false, true, false, false, true, false, true, true, true, false, true, true, true, true, true, true, false, false, false, true, false, true, true, true, true, true, false, false, false, true, false, true, false, true, false, true, true, false, false, false, false, true, false, true, true, true, true, true, false, true, true, true, false, true, true, true, false, false, false, true, true, false, false, true, true, false, false, true, false, true, false, true, true, false, false, true, false, true, false, true, false, false, false, true, true, true, false, false, false]
|
||||||
output == multiplex(bit, a, b)
|
assert(output == multiplex(bit, a, b))
|
||||||
|
|
||||||
return 1
|
return true
|
||||||
|
|
||||||
def right() -> (field):
|
def right() -> (bool):
|
||||||
bool bit = true //right
|
bool bit = true //right
|
||||||
|
|
||||||
bool[256] a = [false, false, false, true, true, false, true, true, false, false, false, true, true, false, false, true, true, true, false, true, true, true, true, false, true, false, true, false, true, false, false, false, true, false, true, true, true, false, true, false, false, true, false, false, true, true, true, false, false, false, true, true, true, true, false, false, false, false, false, true, false, true, true, false, false, true, false, false, false, false, true, true, true, true, true, false, true, false, true, true, false, true, true, false, false, true, true, true, true, false, true, false, false, true, false, false, false, false, true, false, false, true, true, false, false, true, true, false, false, true, true, true, true, true, true, true, true, true, false, true, false, false, true, true, true, true, false, false, true, true, false, false, false, true, false, true, false, false, false, false, true, false, true, false, false, false, false, true, true, false, false, false, true, false, false, true, true, true, true, true, false, true, false, true, false, true, false, false, true, false, false, true, false, true, true, true, false, true, true, true, true, true, true, false, false, false, true, false, true, true, true, true, true, false, false, false, true, false, true, false, true, false, true, true, false, false, false, false, true, false, true, true, true, true, true, false, true, true, true, false, true, true, true, false, false, false, true, true, false, false, true, true, false, false, true, false, true, false, true, true, false, false, true, false, true, false, true, false, false, false, true, true, true, false, false, false]
|
bool[256] a = [false, false, false, true, true, false, true, true, false, false, false, true, true, false, false, true, true, true, false, true, true, true, true, false, true, false, true, false, true, false, false, false, true, false, true, true, true, false, true, false, false, true, false, false, true, true, true, false, false, false, true, true, true, true, false, false, false, false, false, true, false, true, true, false, false, true, false, false, false, false, true, true, true, true, true, false, true, false, true, true, false, true, true, false, false, true, true, true, true, false, true, false, false, true, false, false, false, false, true, false, false, true, true, false, false, true, true, false, false, true, true, true, true, true, true, true, true, true, false, true, false, false, true, true, true, true, false, false, true, true, false, false, false, true, false, true, false, false, false, false, true, false, true, false, false, false, false, true, true, false, false, false, true, false, false, true, true, true, true, true, false, true, false, true, false, true, false, false, true, false, false, true, false, true, true, true, false, true, true, true, true, true, true, false, false, false, true, false, true, true, true, true, true, false, false, false, true, false, true, false, true, false, true, true, false, false, false, false, true, false, true, true, true, true, true, false, true, true, true, false, true, true, true, false, false, false, true, true, false, false, true, true, false, false, true, false, true, false, true, true, false, false, true, false, true, false, true, false, false, false, true, true, true, false, false, false]
|
||||||
|
@ -20,13 +20,13 @@ def right() -> (field):
|
||||||
bool[256] b = [false, false, false, false, false, false, true, true, true, true, true, true, false, false, true, true, true, true, true, true, false, true, true, false, false, false, true, false, true, false, false, false, true, true, true, false, false, false, false, false, false, true, true, false, false, true, true, true, false, true, false, true, false, false, true, false, false, false, false, false, true, true, false, true, true, false, false, true, true, false, true, false, false, false, true, true, false, true, true, false, true, true, true, true, false, true, true, true, false, false, false, true, false, true, false, false, true, false, true, false, false, true, false, true, true, false, true, true, true, false, true, false, true, false, false, false, false, true, true, false, true, true, false, false, true, true, false, true, false, false, true, false, true, true, false, true, true, false, true, true, true, true, false, false, true, false, true, false, true, true, true, false, false, false, false, true, true, true, false, true, false, false, true, true, false, true, true, true, true, true, true, false, false, false, false, false, false, false, true, true, false, true, false, false, true, false, true, true, false, false, true, true, true, false, false, false, false, true, false, false, false, true, true, true, true, false, false, false, false, true, true, false, true, true, false, true, true, true, true, false, false, false, true, true, true, true, true, false, true, true, false, true, true, false, true, true, true, false, false, false, true, false, true, true, false, true, false, true, false, true, false, true, false, true, true, true]
|
bool[256] b = [false, false, false, false, false, false, true, true, true, true, true, true, false, false, true, true, true, true, true, true, false, true, true, false, false, false, true, false, true, false, false, false, true, true, true, false, false, false, false, false, false, true, true, false, false, true, true, true, false, true, false, true, false, false, true, false, false, false, false, false, true, true, false, true, true, false, false, true, true, false, true, false, false, false, true, true, false, true, true, false, true, true, true, true, false, true, true, true, false, false, false, true, false, true, false, false, true, false, true, false, false, true, false, true, true, false, true, true, true, false, true, false, true, false, false, false, false, true, true, false, true, true, false, false, true, true, false, true, false, false, true, false, true, true, false, true, true, false, true, true, true, true, false, false, true, false, true, false, true, true, true, false, false, false, false, true, true, true, false, true, false, false, true, true, false, true, true, true, true, true, true, false, false, false, false, false, false, false, true, true, false, true, false, false, true, false, true, true, false, false, true, true, true, false, false, false, false, true, false, false, false, true, true, true, true, false, false, false, false, true, true, false, true, true, false, true, true, true, true, false, false, false, true, true, true, true, true, false, true, true, false, true, true, false, true, true, true, false, false, false, true, false, true, true, false, true, false, true, false, true, false, true, false, true, true, true]
|
||||||
|
|
||||||
bool[256] output = [false, false, false, false, false, false, true, true, true, true, true, true, false, false, true, true, true, true, true, true, false, true, true, false, false, false, true, false, true, false, false, false, true, true, true, false, false, false, false, false, false, true, true, false, false, true, true, true, false, true, false, true, false, false, true, false, false, false, false, false, true, true, false, true, true, false, false, true, true, false, true, false, false, false, true, true, false, true, true, false, true, true, true, true, false, true, true, true, false, false, false, true, false, true, false, false, true, false, true, false, false, true, false, true, true, false, true, true, true, false, true, false, true, false, false, false, false, true, true, false, true, true, false, false, true, true, false, true, false, false, true, false, true, true, false, true, true, false, true, true, true, true, false, false, true, false, true, false, true, true, true, false, false, false, false, true, true, true, false, true, false, false, true, true, false, true, true, true, true, true, true, false, false, false, false, false, false, false, true, true, false, true, false, false, true, false, true, true, false, false, true, true, true, false, false, false, false, true, false, false, false, true, true, true, true, false, false, false, false, true, true, false, true, true, false, true, true, true, true, false, false, false, true, true, true, true, true, false, true, true, false, true, true, false, true, true, true, false, false, false, true, false, true, true, false, true, false, true, false, true, false, true, false, true, true, true]
|
bool[256] output = [false, false, false, false, false, false, true, true, true, true, true, true, false, false, true, true, true, true, true, true, false, true, true, false, false, false, true, false, true, false, false, false, true, true, true, false, false, false, false, false, false, true, true, false, false, true, true, true, false, true, false, true, false, false, true, false, false, false, false, false, true, true, false, true, true, false, false, true, true, false, true, false, false, false, true, true, false, true, true, false, true, true, true, true, false, true, true, true, false, false, false, true, false, true, false, false, true, false, true, false, false, true, false, true, true, false, true, true, true, false, true, false, true, false, false, false, false, true, true, false, true, true, false, false, true, true, false, true, false, false, true, false, true, true, false, true, true, false, true, true, true, true, false, false, true, false, true, false, true, true, true, false, false, false, false, true, true, true, false, true, false, false, true, true, false, true, true, true, true, true, true, false, false, false, false, false, false, false, true, true, false, true, false, false, true, false, true, true, false, false, true, true, true, false, false, false, false, true, false, false, false, true, true, true, true, false, false, false, false, true, true, false, true, true, false, true, true, true, true, false, false, false, true, true, true, true, true, false, true, true, false, true, true, false, true, true, true, false, false, false, true, false, true, true, false, true, false, true, false, true, false, true, false, true, true, true]
|
||||||
output == multiplex(bit, a, b)
|
assert(output == multiplex(bit, a, b))
|
||||||
|
|
||||||
return 1
|
return true
|
||||||
|
|
||||||
def main() -> (field):
|
def main() -> ():
|
||||||
|
|
||||||
1 == left()
|
assert(left())
|
||||||
1 == right()
|
assert(right())
|
||||||
|
|
||||||
return 1
|
return
|
|
@ -8,7 +8,7 @@
|
||||||
},
|
},
|
||||||
"output": {
|
"output": {
|
||||||
"Ok": {
|
"Ok": {
|
||||||
"values": ["1"]
|
"values": []
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,28 +1,28 @@
|
||||||
import "utils/multiplexer/2bit" as multiplex
|
import "utils/multiplexer/2bit" as multiplex
|
||||||
|
|
||||||
def left() -> (field):
|
def left() -> (bool):
|
||||||
bool bit = false //left
|
bool bit = false //left
|
||||||
bool[2] a = [false, true]
|
bool[2] a = [false, true]
|
||||||
bool[2] b = [true, false]
|
bool[2] b = [true, false]
|
||||||
|
|
||||||
bool[2] output = [false, true]
|
bool[2] output = [false, true]
|
||||||
output == multiplex(bit, a, b)
|
assert(output == multiplex(bit, a, b))
|
||||||
|
|
||||||
return 1
|
return true
|
||||||
|
|
||||||
def right() -> (field):
|
def right() -> (bool):
|
||||||
bool bit = true //right
|
bool bit = true //right
|
||||||
bool[2] a = [false, true]
|
bool[2] a = [false, true]
|
||||||
bool[2] b = [true, false]
|
bool[2] b = [true, false]
|
||||||
|
|
||||||
bool[2] output = [true, false]
|
bool[2] output = [true, false]
|
||||||
output == multiplex(bit, a, b)
|
assert(output == multiplex(bit, a, b))
|
||||||
|
|
||||||
return 1
|
return true
|
||||||
|
|
||||||
def main() -> (field):
|
def main() -> ():
|
||||||
|
|
||||||
1 == left()
|
assert(left())
|
||||||
1 == right()
|
assert(right())
|
||||||
|
|
||||||
return 1
|
return
|
|
@ -8,7 +8,7 @@
|
||||||
},
|
},
|
||||||
"output": {
|
"output": {
|
||||||
"Ok": {
|
"Ok": {
|
||||||
"values": ["1"]
|
"values": []
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,24 +1,24 @@
|
||||||
import "utils/multiplexer/lookup1bit" as lookup
|
import "utils/multiplexer/lookup1bit" as lookup
|
||||||
|
|
||||||
def left() -> (field):
|
def left() -> (bool):
|
||||||
bool sel = false //left
|
bool sel = false //left
|
||||||
field[2] t = [0, 1]
|
field[2] t = [0, 1]
|
||||||
|
|
||||||
0 == lookup(sel, t)
|
assert(0 == lookup(sel, t))
|
||||||
|
|
||||||
return 1
|
return true
|
||||||
|
|
||||||
def right() -> (field):
|
def right() -> (bool):
|
||||||
bool sel = true //right
|
bool sel = true //right
|
||||||
field[2] t = [0, 1]
|
field[2] t = [0, 1]
|
||||||
|
|
||||||
1 == lookup(sel, t)
|
assert(1 == lookup(sel, t))
|
||||||
|
|
||||||
return 1
|
return true
|
||||||
|
|
||||||
def main() -> (field):
|
def main() -> ():
|
||||||
|
|
||||||
1 == left()
|
assert(left())
|
||||||
1 == right()
|
assert(right())
|
||||||
|
|
||||||
return 1
|
return
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue