Local Variables and Built-in Variables
This section describes the syntax for declaring local variables and built-in variables.
Variables
In AirScript, variables can be declared in boundary_constraints
and integrity_constraints
sections and can contain any expression that would be valid within that source section. Variables can be of type scalar, vector or matrix. In the example below, x
is a variable of type scalar
, y
is a variable of type vector
and z
is a variable of type matrix
.
def VariablesExample
const A = 1;
const B = 2;
trace_columns {
main: [a, b, c, d],
aux: [e, f],
}
public_inputs {
stack_inputs: [16],
}
random_values {
rand: [16],
}
boundary_constraints {
let x = stack_inputs[0] + stack_inputs[1] ;
let y = [$rand[0], $rand[1]] ;
enf e.first = x + y[0] + y[1];
}
integrity_constraints {
let z = [
[a + b, c + d],
[A * a, B * b]
];
enf a' = z[0][0] + z[0][1] + z[1][0] + z[1][1];
}
Syntax restriction for local variables
Currently, it is not possible to:
-
Create matrices containing both arrays and references to arrays.
Example:
... boundary_constraints { let a = [[1,2], [3,4]]; # <-- this is allowed let b = [1, 2]; let c = [a[1], b]; # <-- this is allowed let d = [b, [3, 4]]; # <-- this is not allowed, because `d` consists of array `[3, 4]` and reference to array `b` enf ... ... }
-
Create variables with list comprehension for which the source array is a inlined vector, a matrix row, or a range in matrix row.
Example:
... integrity_constraints { let a = [[1, 2], [3, 4]]; let b = [5, 6]; let c = 7; let d = [e for e in [8, 9, 10]]; # <-- source array is an inlined vector let f = [g for g in a[1]]; # <-- source is a matrix row let h = [i for i in a[0][0..2]]; # <-- source is a range in matrix row enf ... ... }
Built-in variables
Built-in variables are identified by the starting character $
. There are two built-in variables:
$main
$main
is used to access columns in the main execution trace.
These columns may be accessed by using the indexing operator on $main
. For example, $main[i]
provides the (i+1)th
column in the main execution trace.
Columns using the $main
built-in may only be accessed within source sections for integrity constraints, i.e. the integrity_constraints
section.
$aux
$aux
is used to access columns in the auxiliary execution trace.
These columns may be accessed by using the indexing operator on $aux
. For example, $aux[i]
provides the (i+1)th
column in the auxiliary execution trace.
Columns using the $aux
built-in may only be accessed within source sections for integrity constraints, i.e. the integrity_constraints
section.