13 个版本 (6 个重大更新)
0.12.2 | 2024 年 5 月 30 日 |
---|---|
0.10.2 | 2024 年 5 月 15 日 |
0.7.3 | 2024 年 4 月 12 日 |
0.7.0 | 2024 年 3 月 29 日 |
0.1.0 | 2024 年 3 月 6 日 |
#5 在 #unc
115 每月下载量
用于 18 个包 (2 直接)
1.5MB
26K SLoC
unc-vm-runner
一个运行编译为 Wasm 的智能合约的引擎。这是 unc-infra 的 "合约运行时" 部分的主要包。
“运行智能合约”是
- Wasm 仪表化用于计费和多种安全检查(
prepare.rs
)。 - 将 Wasm 编译为特定的 VM 表示形式(
cache.rs
)。 - 将特定于区块链的功能暴露给 Wasm 代码。即,为
unc-vm-logic
中的每个函数定义相应的宿主函数(imports.rs
)。 - 实际的代码执行(
wasmer_runner.rs
)。
用于 Wasm 执行的特定运行时是一个实现细节。目前我们支持 Wasmer 0.x、Wasmer 2.0 和 Wasmtime,其中 Wasmer 2.0 是默认值。
Wasm 执行服务的首要客户端是区块链本身。第二个客户端是合约 SDK 工具。vm-runner 为合约开发者提供额外的 API,例如,获取气费细分。
有关高级设计约束的讨论,请参阅 [FAQ][./faq.md] 文档。
入口点
入口点是 runner::run
函数。
测试
该包中有一系列单元测试。您可以使用以下方式运行它们
cargo t -p unc-vm-runner --features wasmer0_vm,wasmer2_vm,wasmtime_vm,unc_vm
测试使用内联指定的简短 Wasm 片段或 unc-test-contracts
包中的几个较大的测试合约。
我们还有一个模糊设置
cd runtime/unc-vm-runner && RUSTC_BOOTSTRAP=1 cargo fuzz run runner
性能分析
tracing
包用于通过手动仪表化收集 Rust 代码性能数据。如果您想了解特定函数的执行时间,请使用以下模式
fn compute_thing() {
let _span = tracing::debug_span!(target: "vm", "compute_thing").entered();
for i in 0..99 {
do_work()
}
}
这将记录 _span
对象创建和销毁的时间,包括两个事件之间的时间差。
要获取这些事件的可读输出,您可以使用内置的跟踪订阅者
tracing_subscriber::fmt::Subscriber::builder()
.with_max_level(tracing::level_filters::LevelFilter::DEBUG)
.with_span_events(tracing_subscriber::fmt::format::FmtSpan::CLOSE)
.init();
code_to_profile_here();
或者,还有一种替代的分层分析器
tracing_span_tree::span_tree().enable();
code_to_profile_here();
结果看起来像这样
112.33ms deserialize_wasmer
2.64ms run_wasmer/instantiate
96.34µs run_wasmer/call
123.15ms run_wasmer
123.17ms run_vm
依赖项
~21–37MB
~612K SLoC