157个版本 (51个稳定版)

2.1.3 2024年8月8日
2.1.1 2024年7月30日
2.1.0-rc.12024年6月25日
2.0.6 2024年8月8日
0.5.1 2019年11月29日

#859 in 神奇豆

Download history 958/week @ 2024-04-26 476/week @ 2024-05-03 1477/week @ 2024-05-10 613/week @ 2024-05-17 629/week @ 2024-05-24 1493/week @ 2024-05-31 1180/week @ 2024-06-07 1028/week @ 2024-06-14 1234/week @ 2024-06-21 621/week @ 2024-06-28 1048/week @ 2024-07-05 1226/week @ 2024-07-12 850/week @ 2024-07-19 1039/week @ 2024-07-26 1090/week @ 2024-08-02 873/week @ 2024-08-09

3,998 每月下载量
用于 21 个crate(20个直接使用)

Apache-2.0

4.5MB
45K SLoC

CosmWasm VM

cosmwasm-vm on crates.io

这是围绕wasmer VM的一个抽象层,以高级方式运行cosmwasm合约。这不仅是为了高效编写单元测试,也是为了提供一个公开的API来运行合约,例如在wasmvm中。因此,它包括执行典型操作所需的所有粘合代码,如fs缓存。

兼容性

VM可以支持一个或多个合约-VM接口版本。接口版本通过合约通过Wasm导入进行通信。这是当前的兼容性列表

cosmwasm-vm 支持的接口版本 cosmwasm-std
1.0 interface_version_8 1.0
0.16 interface_version_7 0.16
0.15 interface_version_6 0.15
0.14 interface_version_5 0.14
0.13 cosmwasm_vm_version_4 0.11-0.13
0.12 cosmwasm_vm_version_4 0.11-0.13
0.11 cosmwasm_vm_version_4 0.11-0.13
0.10 cosmwasm_vm_version_3 0.10
0.9 cosmwasm_vm_version_2 0.9
0.8 cosmwasm_vm_version_1 0.8

接口版本之间的变化

interface_version_5 -> interface_version_6

  • send字段重命名为fundsWasmMsg:: InstantiateWasmMsg:: Execute中。
  • 合并消息和子消息。
  • 更改IBC确认的JSON表示(#975)。

设置

testdata/*.wasm 中有演示文件。这些是通过 contracts/* 并通过 cosmwasm/optimizer 编译和优化的版本。

要重新构建测试合约,请进入存储库根目录并执行

docker run --rm -v "$(pwd)":/code \
  --mount type=volume,source="devcontract_cache_cyberpunk",target=/target \
  --mount type=volume,source=registry_cache,target=/usr/local/cargo/registry \
  cosmwasm/optimizer:0.15.0 ./contracts/cyberpunk \
  && cp artifacts/cyberpunk.wasm packages/vm/testdata/cyberpunk.wasm

docker run --rm -v "$(pwd)":/code \
  --mount type=volume,source="devcontract_cache_hackatom",target=/target \
  --mount type=volume,source=registry_cache,target=/usr/local/cargo/registry \
  cosmwasm/optimizer:0.15.0 ./contracts/hackatom \
  && cp artifacts/hackatom.wasm packages/vm/testdata/hackatom_1.2.wasm

docker run --rm -v "$(pwd)":/code \
  --mount type=volume,source="devcontract_cache_ibc_reflect",target=/target \
  --mount type=volume,source=registry_cache,target=/usr/local/cargo/registry \
  cosmwasm/optimizer:0.15.0 ./contracts/ibc-reflect \
  && cp artifacts/ibc_reflect.wasm packages/vm/testdata/ibc_reflect_1.2.wasm

docker run --rm -v "$(pwd)":/code \
  --mount type=volume,source="devcontract_cache_empty",target=/target \
  --mount type=volume,source=registry_cache,target=/usr/local/cargo/registry \
  cosmwasm/optimizer:0.15.0 ./contracts/empty \
  && cp artifacts/empty.wasm packages/vm/testdata/empty.wasm

docker run --rm -v "$(pwd)":/code \
  --mount type=volume,source="devcontract_cache_ibc_callback",target=/target \
  --mount type=volume,source=registry_cache,target=/usr/local/cargo/registry \
  cosmwasm/optimizer:0.15.0 ./contracts/ibc-callbacks \
  && cp artifacts/ibc_callbacks.wasm packages/vm/testdata/ibc_callbacks.wasm

https://github.com/CosmWasm/cosmwasm/issues/1727 中的 cyberpunk_rust170.wasm,构建方式如下(无法重现)

cd contracts/cyberpunk
rm -r target
RUSTFLAGS='-C link-arg=-s' cargo build --release --lib --target wasm32-unknown-unknown --locked
cp target/wasm32-unknown-unknown/release/cyberpunk.wasm ../../packages/vm/testdata/cyberpunk_rust170.wasm

floaty_2.0.wasm 使用 Rust 夜间版本构建如下(无法重现)

cd contracts/floaty
RUSTFLAGS="-C link-arg=-s -C target-feature=+nontrapping-fptoint" cargo wasm
cp target/wasm32-unknown-unknown/release/floaty.wasm ../../packages/vm/testdata/floaty_2.0.wasm

测试

默认情况下,此存储库使用单遍后端进行构建和测试。您可以通过启用 cranelift 功能用 Cranelift 覆盖默认后端

cd packages/vm
cargo test --features iterator
cargo test --features cranelift,iterator

基准测试

使用 Singlepass

cd packages/vm
cargo bench --no-default-features

使用 Cranelift

cd packages/vm
cargo bench --no-default-features --features cranelift

工具

module_sizemodule_size.sh

编译模块的内存分析。 module_size.sh 执行 module_size,并使用 valgrind 的内存分析工具(massif)来计算编译模块使用的堆内存量。

cd packages/vm
RUSTFLAGS="-g" cargo build --release --example module_size
./examples/module_size.sh ./testdata/hackatom.wasm

许可

此软件包是 cosmwasm 存储库的一部分,在 Apache License 2.0 许可下发布(见 NOTICELICENSE)。

依赖项

~24–37MB
~676K SLoC