28 个版本 (8 个破坏性更新)
0.9.1 | 2023 年 11 月 16 日 |
---|---|
0.8.7 | 2023 年 8 月 28 日 |
0.8.5 | 2023 年 7 月 31 日 |
0.8.2-hotfix1 | 2023 年 12 月 7 日 |
0.2.2 | 2023 年 3 月 28 日 |
#53 in 神奇豆
12,316 每月下载量
在 44 个crate中使用 (直接使用10个)
180KB
4K SLoC
目录
⚠️ 免责声明
🚧 cairo-vm
正在构建中,因此可能会经常发生破坏性变更,请自行承担风险。🚧 Cargo 不遵守 semver,因此我们建议将版本锁定在 0.1.0。这可以通过将 cairo-vm = "0.1.0"
添加到您的 Cargo.toml 文件中来实现。
📖 关于
Cairo 虚拟机是 Cairo 语言 的虚拟机。
有一个用 Python 编写的较老版本的 Cairo 虚拟机,目前仍在生产中。
此存储库包含一个较新的版本,用 Rust 编写。它更快、更安全,类型表达更丰富。一旦完成,它将取代旧的版本,成为唯一的 Cairo 虚拟机。
Cairo 语言
Cairo 是生成通用计算 STARK 证明的第一个生产级平台。
它是图灵完备的,由 Starkware 创建,作为 Starknet 生态系统的一部分。
🌅 开始使用
依赖项
必需品
为了编译和使用此项目,需要以下内容。
- Rust 1.70.0 或更高版本
- Cargo
可选
这些依赖项仅在运行原始虚拟机、编译 Cairo 程序和运行测试时是必要的。
- make
- PyEnv
安装脚本
您可以通过在存储库根目录下运行脚本 install.sh
来安装所有必需和可选的依赖项。
安装项目依赖项
为了编译程序,您需要安装 cairo-lang 包。
运行 make deps
(如果您在 MacOS 上运行,则为 make deps-macos
)命令将创建一个包含所有必需依赖项的虚拟环境。
然后您可以通过运行以下命令来激活此环境:
. cairo-vm-env/bin/activate
🚀 使用方法
将 cairo-vm 作为依赖项添加
您可以将以下内容添加到您的 rust 项目的 Cargo.toml
文件中
cairo-vm = { version = '0.7.0', features = ["lambdaworks-felt"] }
features = ["lambdaworks-felt"]
部分将使用 lambdaworks-math
作为 Felt252
的后端。这可以提高性能超过 20%,并将成为未来的默认选项。
从 CLI 运行 cairo-vm
要使用命令行运行程序,首先从 cairo-vm-cli 文件夹编译存储库
cd cairo-vm-cli; cargo build --release -F lambdaworks-felt; cd ..
-F lambdaworks-felt
部分将使用 lambdaworks-math
作为 Felt252
的后端。这可以提高性能超过 20%,并将成为未来的默认选项。
一旦构建了二进制文件,它可以在 target/release/
下找到,名称为 cairo-vm-cli
。
为了编译 Cairo 程序,您需要激活安装依赖项时创建的环境。要启动它,请运行
. cairo-vm-env/bin/activate
要编译程序,请使用 cairo-compile [路径_to_the_.cairo_file] --output [编译后的_json_file的期望路径]
。例如
cairo-compile cairo_programs/abs_value_array.cairo --output cairo_programs/abs_value_array_compiled.json
要运行编译后的.json程序通过虚拟机,请调用可执行文件,并给出要执行文件的路径和名称。例如
target/release/cairo-vm-cli cairo_programs/abs_value_array_compiled.json --layout all_cairo
标志 --layout
决定了可以使用哪些内置函数。更多关于布局的信息 在这里。
总结一下,以下代码可以帮助您从零开始运行Cairo程序
git clone https://github.com/lambdaclass/cairo-vm.git
cd cairo-vm
cargo build --release
. cairo-vm-env/bin/activate
cairo-compile cairo_programs/abs_value_array.cairo --output cairo_programs/abs_value_array_compiled.json
target/release/cairo-vm-cli cairo_programs/abs_value_array_compiled.json --layout all_cairo
其他CLI参数
cairo-vm-cli支持以下可选参数
-
--trace_file <TRACE_FILE>
:接收文件名,并将重定位的跟踪输出到该文件 -
--memory_file <MEMORY_FILE>
:接收文件名,并将重定位的内存输出到该文件 -
--print_output
:打印程序输出 -
--proof_mode
:以证明模式运行程序 -
--secure_run
:执行后运行安全检查。默认情况下在非证明模式下启用 -
--air_public_input <AIR_PUBLIC_INPUT>
:接收文件名,并将AIR公共输入输出到该文件。只能在启用证明模式时使用
例如,要从fibonacci程序运行中获取air公共输入,我们可以运行
target/release/cairo-vm-cli cairo_programs/proof_programs/fibonacci.json --layout all_cairo --proof_mode --air_public_input fibonacci_public_input.json
使用提示
目前,由于这个虚拟机正在建设中,它缺少原始虚拟机的一些功能。值得注意的是,这个虚拟机目前仅实现了有限的Python提示,而Python Cairo VM允许用户运行任何Python代码。
在这个虚拟机中使用非标准提示有两种方式
- 扩展cairo-vm代码,并使用HintProcessor接口构建自己的二进制文件。
- 使用cairo-vm-py,它支持在Python解释器中运行任何提示。
使用参数在 Cairo 程序中运行函数
当直接使用Cairo-vm仓库运行Cairo程序时,您首先需要准备一些事情。
- 指定您要运行的Cairo程序
let program =
Program::from_file(Path::new(&file_path), None);
- 实例化虚拟机、cairo_runner、提示处理器和入口点
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);
当使用与Starknet devnet一起使用的cairo-vm时,有额外的参数是作为OS上下文传递给run_from_entrypoint
方法的参数,当我们直接使用它时,这里没有这些参数。这些参数是,例如,内置函数的初始堆栈,它们是每个函数的基础,并且作为函数的隐含参数是必需的。
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,
);
运行cairo 1程序
要运行cairo 1程序,请进入文件夹cd cairo1-run
,并遵循cairo1-run
文档
WebAssembly 演示
关于如何使用cairo-vm
与WebAssembly的演示可以在examples/wasm-demo
中找到
测试
要运行测试套件,您需要cargo-llvm-cov
依赖项,因此请确保先运行此命令
make deps
现在,您已经拥有了运行测试套件所需的依赖项,您可以运行
make test
📊 基准测试
运行获取第1.5百万个斐波那契数的Cairo程序,我们得到了以下基准测试结果
在运行基准测试套件之前请注意:名为 iai_benchmark 的基准测试依赖于Valgrind。请确保在运行 iai_benchmark
基准测试之前已安装。
使用cargo运行完整的基准测试套件
cargo bench
使用cargo仅运行 criterion_benchmark
基准测试套件
cargo bench --bench criterion_benchmark
使用cargo仅运行 iai_benchmark
基准测试套件
cargo bench --bench iai_benchmark
📜 更新日志
最新更改的跟踪请参见 此处。
🛠 贡献
开源社区是一个学习、灵感和创造的好地方,这一切都归功于像你这样的人的贡献。你的贡献受到极大的赞赏。
如果你有关于如何改进项目的建议,请随时fork存储库并创建一个pull请求,或者 打开带有'enhancement'标签的问题。
- Fork 项目
- 创建你的功能分支(
git checkout -b feat/AmazingFeature
) - 提交你的更改(
git commit -m 'feat: add some AmazingFeature'
) - 将更改推送到分支(
git push origin feat/AmazingFeature
) - 打开Pull Request
别忘了给项目加星!⭐ 再次感谢你的支持。
更多详细说明请参阅 CONTRIBUTING.md 文档。
🌞 相关项目
- starknet_in_rust:在Rust中实现Starknet,由cairo-vm提供支持。
- cairo-vm-py:使用Python代码使用cairo-vm的绑定。
📚 文档
Cairo
- 来自Cairo文档: Cairo是如何工作的
- Cairo - 一种适用于STARK友好的图灵完备CPU架构
- Cairo程序执行的验证代数表示
- Cairo Verifier(Rust版)
原始 Cairo VM 内部结构
我们编写了一份关于Cairo VM工作原理的文档。它可以在 此处 找到。
编译器和解释器
这是一份推荐书籍列表,帮助你学习如何实现编译器或解释器。
- 我是如何编写自己的“真正的”编程语言的 - Mukul Rathi
- 编译器和语言设计导论 - Douglas Thain
- 美丽Racket - Matthew Flatt
- 编写解释器 - Robert Nystrom
- 编译器工程 - Keith D. Cooper,Linda Torczon
StarkNet
计算完整性和无知识证明
基础知识
ZK SNARKs
- 什么是zk-SNARKs?
- Vitalik对zk-SNARKs可能性的介绍
- Vitalik关于二次算术程序的帖子
- zk-SNARK是如何工作的 - Maksym Petkus
- 比较通用zk-SNARKs
- 暗森林简介 + 电路第1部分
- 暗森林简介 + 电路第2部分
STARKs
简介
- 密码学Stack Exchange答案
- Hasu获得STARK-pilled - 与Eli Ben-Sasson
- Cairo区块链开发者指南
- 为什么STARK是解锁区块链可扩展性的关键
- STARKs白皮书:可扩展、透明且后量子安全计算完整性
- STARKs与SNARKs:加密证明的寒武纪大爆发
Vitalik Buterin关于zk-STARKs的博客系列
Alan Szepieniec的STARK教程
StarkWare的STARK Math博客系列
⚖️许可证
本项目采用Apache 2.0许可证。
更多信息请见LICENSE。
依赖项
~1–2.3MB
~50K SLoC