36个版本 (16个破坏性)

4.0.0-pre.1 2021年3月5日
2.2.0 2020年9月3日
2.0.0 2020年8月22日
1.2.0 2020年8月18日
0.4.2 2019年11月21日

#162 in 魔法豆

Download history 886/week @ 2024-05-04 1104/week @ 2024-05-11 1439/week @ 2024-05-18 1343/week @ 2024-05-25 1519/week @ 2024-06-01 1239/week @ 2024-06-08 1687/week @ 2024-06-15 1439/week @ 2024-06-22 1154/week @ 2024-06-29 971/week @ 2024-07-06 1281/week @ 2024-07-13 1290/week @ 2024-07-20 2329/week @ 2024-07-27 2600/week @ 2024-08-03 2136/week @ 2024-08-10 948/week @ 2024-08-17

8,242 每月下载量
用于 13 个库(3个直接)

MIT/Apache

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