Crates.io | cairo-felt |
lib.rs | cairo-felt |
version | 0.8.2-hotfix1 |
source | src |
created_at | 2023-01-11 11:35:54.988449 |
updated_at | 2023-12-07 20:48:13.812395 |
description | Field elements representation for the Cairo VM |
homepage | |
repository | https://github.com/lambdaclass/cairo-vm/ |
max_upload_size | |
id | 756351 |
size | 172,285 |
🚧 cairo-vm
is still being built therefore breaking changes might happen often so use it at your own risk. 🚧
Cargo doesn't comply with semver, so we advise to pin the version to 0.1.0. This can be done adding cairo-vm = "0.1.0"
to your Cargo.toml
Cairo VM is the virtual machine for the Cairo language.
There's an older version of Cairo VM written in Python, which is currently in production.
This repository contains the newer version, written in Rust. It's faster and has safer and more expressive typing. Once completed, it will replace the older one as the sole Cairo VM.
Cairo is the first production-grade platform for generating STARK proofs for general computation.
It's Turing-complete and it was created by Starkware as part of the Starknet ecosystem.
These are needed in order to compile and use the project.
These dependencies are only necessary in order to run the original VM, compile Cairo programs, and run tests.
You can install all of the required and optional dependencies by running the script install.sh
while in the repository root.
You can add the following to your rust project's Cargo.toml
:
cairo-vm = { version = '0.7.0', features = ["lambdaworks-felt"] }
The features = ["lambdaworks-felt"]
part adds usage of lambdaworks-math
as the backend for Felt252
. This improves performance by more than 20%, and will be the default in the future.
To run programs from the command line, first compile the repository from the cairo-vm-cli folder:
cd cairo-vm-cli; cargo build --release -F lambdaworks-felt; cd ..
The -F lambdaworks-felt
part adds usage of lambdaworks-math
as the backend for Felt252
. This improves performance by more than 20%, and will be the default in the future.
Once the binary is built, it can be found in target/release/
under the name cairo-rvm-cli
.
To compile a program, use cairo-compile [path_to_the_.cairo_file] --output [desired_path_of_the_compiled_.json_file]
. For example:
cairo-compile cairo_programs/abs_value_array.cairo --output cairo_programs/abs_value_array_compiled.json
To run a compiled .json program through the VM, call the executable giving it the path and name of the file to be executed. For example:
target/release/cairo-vm-cli cairo_programs/abs_value_array_compiled.json --layout all_cairo
The flag --layout
determines which builtins can be used. More info about layouts here.
To sum up, the following code will get you from zero to running a Cairo program:
git clone https://github.com/lambdaclass/cairo-vm.git
cd cairo-vm
cargo build --release
cairo-compile cairo_programs/abs_value_array.cairo --output cairo_programs/abs_value_array_compiled.json
target/release/cairo-vm-run cairo_programs/abs_value_array_compiled.json --layout all_cairo
Currently, as this VM is under construction, it's missing some of the features of the original VM. Notably, this VM only implements a limited number of Python hints at the moment, while the Python Cairo VM allows users to run any Python code.
There are two ways to use non-standard hints in this VM:
When running a Cairo program directly using the Cairo-vm repository you would first need to prepare a couple of things.
let program =
Program::from_file(Path::new(&file_path), None);
let mut vm = VirtualMachine::new(false);
let mut cairo_runner = CairoRunner::new(&program, "all_cairo", false);
let mut hint_processor = BuiltinHintProcessor::new_empty();
let entrypoint = program
.identifiers
.get(&format!("__main__.{}", &func_name))?
.pc;
cairo_runner.initialize_builtins(&mut vm)?;
cairo_runner.initialize_segments(&mut vm, None);
When using cairo-vm with the Starknet devnet there are additional parameters that are part of the OS context passed on to the run_from_entrypoint
method that we do not have here when using it directly. These parameters are, for example, initial stacks of the builtins, which are the base of each of them and are needed as they are the implicit arguments of the function.
let _var = cairo_runner.run_from_entrypoint(
entrypoint,
vec![
&MaybeRelocatable::from(2).into(), //this is the entry point selector
&MaybeRelocatable::from((2,0)).into() //this would be the output_ptr for example if our cairo function uses it
],
false,
&mut vm,
&mut hint_processor,
);
A demo on how to use cairo-vm
with WebAssembly can be found
here.
To run the test suite you'll need cargo-llvm-cov
dependency so make sure to run this command beforehand:
make deps
Now that you have the dependencies necessary to run the test suite you can run:
make test
Running a Cairo program that gets the 1.5 millionth Fibonacci number we got the following benchmarks:
Note before running the benchmark suite: the benchmark named iai_benchmark depends on Valgrind. Please make sure it is installed prior to running the iai_benchmark
benchmark.
Run the complete benchmark suite with cargo:
cargo bench
Run only the criterion_benchmark
benchmark suite with cargo:
cargo bench --bench criterion_benchmark
Run only the iai_benchmark
benchmark suite with cargo:
cargo bench --bench iai_benchmark
Keeps track of the latest changes here.
The open-source community is a fantastic place for learning, inspiration, and creation, and this is all thanks to contributions from people like you. Your contributions are greatly appreciated.
If you have any suggestions for how to improve the project, please feel free to fork the repo and create a pull request, or open an issue with the tag 'enhancement'.
git checkout -b feat/AmazingFeature
)git commit -m 'feat: add some AmazingFeature'
)git push origin feat/AmazingFeature
)And don't forget to give the project a star! ⭐ Thank you again for your support.
You can find more detailed instructions in the CONTRIBUTING.md document.
We wrote a document explaining how the Cairo VM works. It can be found here.
This is a list of recommended books to learn how to implement a compiler or an interpreter.
Introduction:
Vitalik Buterin's blog series on zk-STARKs:
Alan Szepieniec's STARK tutorial:
StarkWare's STARK Math blog series:
This project is licensed under the Apache 2.0 license.
See LICENSE for more information.