#gas #unc #contracts #run-time #smart-contracts #execution #blockchain

unc-vm-runner

该包实现了 unc 区块链向智能合约暴露的接口规范

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

Download history 154/week @ 2024-05-06 199/week @ 2024-05-13 194/week @ 2024-05-20 421/week @ 2024-05-27 151/week @ 2024-06-03 92/week @ 2024-06-10 49/week @ 2024-06-17 37/week @ 2024-06-24 32/week @ 2024-07-01 12/week @ 2024-07-08 51/week @ 2024-07-15 25/week @ 2024-07-22 34/week @ 2024-07-29 20/week @ 2024-08-05 30/week @ 2024-08-12

115 每月下载量
用于 18 个包 (2 直接)

GPL-2.0-or-later

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