17 个版本 (9 个破坏性更新)
新 0.10.5 | 2024 年 8 月 21 日 |
---|---|
0.9.2 | 2024 年 4 月 25 日 |
0.8.0 | 2024 年 2 月 27 日 |
0.7.0 | 2023 年 10 月 11 日 |
0.1.0 | 2021 年 11 月 16 日 |
#837 in 魔法豆
8,670 每月下载量
在 17 个crate中使用 (9 个直接使用)
1.5MB
25K SLoC
Miden 处理器
该crate包含Miden虚拟机处理器的实现。处理器的作用是执行程序并生成程序执行跟踪。该跟踪随后由Miden虚拟机用于生成程序正确执行的证明。
用法
处理器公开了两个用于执行程序的函数:execute()
和 execute_iter()
。函数 execute()
接受以下参数
program: &Program
- 要执行的Miden程序的引用。stack_inputs: StackInputs
- 执行程序时使用的一组公共输入。host: Host
- 一个Host
实例,可用于向虚拟机提供非确定性输入并从虚拟机接收消息。options: ExecutionOptions
- 执行指定程序的一组选项(例如,允许的最大周期数)。
该函数返回一个 Result<ExecutionTrace, ExecutionError>
,如果执行成功,它将包含程序的执行跟踪,如果执行失败,则包含错误。内部,虚拟机将此执行跟踪传递给证明器以生成程序正确执行的证明。
execute_iter()
函数接受类似的参数(但没有 options
),并返回一个 VmStateIterator
。此迭代器可用于遍历执行程序的周期,以进行调试。实际上,当我们使用此函数执行程序时,会保留大量调试信息,我们可以获得任何周期的虚拟机状态的精确图像。此外,如果执行导致错误,VmStateIterator
仍可用于检查错误发生周期的虚拟机状态。
例如
use miden_assembly::Assembler;
use miden_processor::{execute, execute_iter, ExecutionOptions, DefaultHost, StackInputs, };
// instantiate the assembler
let assembler = Assembler::default();
// compile Miden assembly source code into a program
let program = assembler.compile("begin push.3 push.5 add end").unwrap();
// use an empty list as initial stack
let stack_inputs = StackInputs::default();
// instantiate a default host (with no advice inputs)
let mut host = DefaultHost::default();
// instantiate default execution options
let exec_options = ExecutionOptions::default();
// execute the program with no inputs
let trace = execute(&program, stack_inputs.clone(), &mut host, exec_options).unwrap();
// now, execute the same program in debug mode and iterate over VM states
for vm_state in execute_iter(&program, stack_inputs, host, exec_options) {
match vm_state {
Ok(vm_state) => println!("{:?}", vm_state),
Err(_) => println!("something went terribly wrong!"),
}
}
处理器组件
处理器由几个组件组织
- 解码器,负责解码指令和管理控制流。
- 栈,负责在栈上执行指令。
- 范围检查器,负责检查值是否可以放入16位。
- 芯片模块,包含处理复杂计算(例如,哈希)以及随机访问内存的特殊化芯片。
这些组件通过两个总线连接
- 范围检查器总线,将栈和芯片模块与范围检查器连接。
- 芯片总线,将栈和解码器与芯片模块连接。
有关 Miden VM 设计的更深入描述,请参见此处。
箱子功能
Miden 处理器可以编译以下功能
std
- 默认启用并依赖于 Rust 标准库。no_std
不依赖于 Rust 标准库,并允许编译到 WebAssembly。
要使用 no_std
编译,请通过 --no-default-features
标志禁用默认功能。
许可
该项目受 MIT 许可 许可。
依赖关系
~7–33MB
~484K SLoC