1个不稳定版本
0.1.0 | 2024年6月28日 |
---|
#312 in WebAssembly
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.so
、libaspect_wasm_instrument.dylib
、libaspect_wasm_instrument.dll
- Rust库:
aspect_wasm_instrument.rlib
当前限制
由于底层wasm-instrument
库的限制,一些功能尚不支持,包括但不限于
- 批量内存操作
- 引用类型
- ...
请继续关注未来的更新,我们将继续增强这个库的功能和兼容性。
依赖项
~3MB
~63K SLoC