#gas #instrumentation #metering #execution #binaries #artela

aspect-wasm-instrument

Artela上用于对WebAssembly二进制文件进行仪表化的库

1个不稳定版本

0.1.0 2024年6月28日

#312 in WebAssembly

MIT许可证

15KB
235 代码行

Aspect WASM仪表化库

Aspect WASM仪表化库利用Parity的wasm-instrument,旨在对Artela Aspect WebAssembly (WASM)文件进行仪表化。它无缝地添加了gas计量功能,并确保相应的验证,从而提高WebAssembly应用的执行效率和可靠性。

支持的平台

该库目前与不同架构下的多个操作系统兼容

  • Linux: Arm64, x86_64
  • MacOS: Arm64, x86_64
  • Windows: x86_64

功能

该库仔细解析给定的WASM文件,将gas计数器作为全局变量注入。此外,它将gas计量代码集成到每个指定的代码部分,并将其放置在部分主体的开头。

此外,该库便于导出gas计数器和WASM字节的起始部分。分别导出为__gas_counter____aspect_start__。在执行起始部分之前初始化gas计数器至关重要,以避免执行失败。

仪表化前后的比较

  • 原始WASM代码片段
# Original wasm code
(func (;67;) (type 1) (param i32) (result i32)
    local.get 0
    local.get 0
    i64.extend_i32_u
    i64.const 50862630
    i64.mul
    call 66
    memory.grow
)
  • 仪表化后的代码片段
(func (;67;) (type 1) (param i32) (result i32)
    # Gas consumption for the section
    i64.const 11170
    # Consuming gas
    call 30
    # Executing original code
    local.get 0
    local.get 0
    i64.extend_i32_u
    i64.const 50862630
    i64.mul
    call 66
    memory.grow
)

# Gas metering logic
(func (;30;) (type 9) (param i64)
    global.get 5
    local.get 0
    i64.ge_u
    if
      global.get 5
      local.get 0
      i64.sub
      global.set 5
    else
      i64.const -1
      global.set 5
      unreachable
    end
)

# Global gas counter
(global (;5;) (mut i64) i64.const 0)
# Exported start section
(export "__aspect_start__" (func $~start))
# Gas counter alias
(export "__gas_counter__" (global 5))

构建库

要编译为当前平台,请运行

make build

为了跨所有支持的平台编译,请确保已安装相应的交叉编译器

make all

对于特定平台构建,例如Darwin Arm64,执行

make darwin-aarch64

构建工件位于target/{platform}/release目录,其中有一个专门用于当前平台构建的目录target/release

可用的库

构建过程生成三种类型的库,以适应各种项目需求

  • 静态库: libaspect_wasm_instrument.a
  • 动态库: libaspect_wasm_instrument.solibaspect_wasm_instrument.dyliblibaspect_wasm_instrument.dll
  • Rust库: aspect_wasm_instrument.rlib

当前限制

由于底层wasm-instrument库的限制,一些功能尚不支持,包括但不限于

  • 批量内存操作
  • 引用类型
  • ...

请继续关注未来的更新,我们将继续增强这个库的功能和兼容性。

依赖项

~3MB
~63K SLoC