3 releases (breaking)
0.3.0 | Jul 12, 2023 |
---|---|
0.2.0 | Feb 23, 2023 |
0.1.0 | Nov 10, 2022 |
#2321 in Cryptography
Used in air-script
135KB
3.5K
SLoC
Winterfell Code Generator
This crate contains a code generator targeting the Winterfell prover Rust library.
The purpose of this code generator is to convert a provided AirIR
representation of an AIR into a custom Rust struct that implements Winterfell's Air
trait. The generated code can be used instead of writing a custom Winterfell Air
implementation directly in Rust.
Generating the Winterfell Rust Code
Generate Rust code from an AirIR
(AirScript's intermediate representation) by instantiating a new CodeGenerator
with an AirScript AST (the output of the AirScript parser) and then calling generate
. The generate
method will return the Rust code implementation as a String
.
Instantiating the CodeGenerator
will add the required Winterfell imports, create a custom struct
using the name defined for the AIR, then implement the Winterfell Air
trait for the custom struct
.
Example usage:
// parse the source string to a Result containing the AST or an Error
let ast = parse(source.as_str()).expect("Parsing failed");
// process the AST to get a Result containing the AirIR or an Error
let ir = AirIR::new(&ast).expect("AIR is invalid");
// generate Rust code targeting the Winterfell prover
let rust_code = CodeGenerator::new(&ir);
Generated Winterfell Rust Code
The following code is generated for the Winterfell Air
trait implementation:
- declaration and implementation of a
PublicInputs
struct. - custom struct declaration and implementation, using the defined name of the AIR from the original AirScript file
- implementation of Winterfell
Air
trait:- constraint-related declarations as part of the
AirContext
creation in thenew
method:- the number of boundary constraints for the main trace
- the number of boundary constraints for the auxiliary trace
- the order and degrees of the transition constraints for the main trace
- the order and degrees of the transition constraints for the auxiliary trace
- getters for:
- periodic column values (
get_periodic_column_values
) - main trace boundary constraints (
get_assertions
) - auxiliary trace boundary constraints (
get_aux_assertions
)
- periodic column values (
- transition constraint evaluation code for:
- main trace transition constraints (
evaluate_transition
) - auxiliary trace transition constraints (
evaluate_aux_transition
)
- main trace transition constraints (
- constraint-related declarations as part of the
Dependencies
~8–17MB
~231K SLoC