36个版本 (16个破坏性)
4.0.0-pre.1 |
|
---|---|
2.2.0 |
|
2.0.0 |
|
1.2.0 |
|
0.4.2 | 2019年11月21日 |
#162 in 魔法豆
8,242 每月下载量
用于 13 个库(3个直接)
2MB
29K SLoC
near-vm-runner
一个运行编译为Wasm的智能合约的引擎。这是nearcore的“合约运行时”部分的主要库。
“运行智能合约”是
- Wasm的gas计量和安全检查的仪器(
prepare.rs
)。 - 将Wasm编译成特定的VM表示(
cache.rs
)。 - 向Wasm代码公开区块链特定的功能。也就是说,为
near-vm-logic
中的每个函数定义一个相应的宿主函数(imports.rs
)。 - 实际的代码执行(
wasmer_runner.rs
)。
用于Wasm执行的具体运行时是实现细节。目前我们支持Wasmer 0.x、Wasmer 2.0和Wasmtime,其中Wasmer 2.0是默认的。
Wasm执行服务的首要客户是区块链本身。第二个客户是合约SDK工具。vm-runner为合约开发者提供额外的API,例如,获取gas费用分解。
参见[常见问题解答][./faq.md]文档,讨论高级设计约束。
入口点
入口点是 runner::run
函数。
测试
这个crate中有许多单元测试。你可以用以下方式运行它们
$ cargo t -p near-vm-runner --features wasmer0_vm,wasmer2_vm,wasmtime_vm,near_vm
测试使用内联指定的简短wasm片段,或者来自 near-test-contracts
crate的几个较大的测试合约。
我们还有一个模糊测试设置
$ cd runtime/near-vm-runner && RUSTC_BOOTSTRAP=1 cargo fuzz run runner
性能分析
tracing
crate用于通过手动标记收集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
依赖关系
~17–36MB
~624K SLoC