From c2d807b9e02812cfa40ea28c58870f63602002cd Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Tue, 8 Feb 2022 07:17:10 +0100 Subject: [PATCH 1/2] Create test: file_system_cache_store_uses_expected_path --- packages/vm/src/modules/file_system_cache.rs | 37 ++++++++++++++------ 1 file changed, 27 insertions(+), 10 deletions(-) diff --git a/packages/vm/src/modules/file_system_cache.rs b/packages/vm/src/modules/file_system_cache.rs index 4103d118d2..4b75fe3e4c 100644 --- a/packages/vm/src/modules/file_system_cache.rs +++ b/packages/vm/src/modules/file_system_cache.rs @@ -116,22 +116,21 @@ mod tests { const TESTING_MEMORY_LIMIT: Option = Some(Size::mebi(16)); const TESTING_GAS_LIMIT: u64 = 500_000_000; + const SOME_WAT: &str = r#"(module + (type $t0 (func (param i32) (result i32))) + (func $add_one (export "add_one") (type $t0) (param $p0 i32) (result i32) + get_local $p0 + i32.const 1 + i32.add)) + "#; + #[test] fn file_system_cache_run() { let tmp_dir = TempDir::new().unwrap(); let mut cache = unsafe { FileSystemCache::new(tmp_dir.path()).unwrap() }; // Create module - let wasm = wat::parse_str( - r#"(module - (type $t0 (func (param i32) (result i32))) - (func $add_one (export "add_one") (type $t0) (param $p0 i32) (result i32) - get_local $p0 - i32.const 1 - i32.add)) - "#, - ) - .unwrap(); + let wasm = wat::parse_str(SOME_WAT).unwrap(); let checksum = Checksum::generate(&wasm); // Module does not exist @@ -160,4 +159,22 @@ mod tests { assert_eq!(result[0].unwrap_i32(), 43); } } + + #[test] + fn file_system_cache_store_uses_expected_path() { + let tmp_dir = TempDir::new().unwrap(); + let mut cache = unsafe { FileSystemCache::new(tmp_dir.path()).unwrap() }; + + // Create module + let wasm = wat::parse_str(SOME_WAT).unwrap(); + let checksum = Checksum::generate(&wasm); + + // Store module + let module = compile(&wasm, None, &[]).unwrap(); + cache.store(&checksum, &module).unwrap(); + + let file_path = format!("{}/v1/{}", tmp_dir.path().to_string_lossy(), checksum); + let serialized_module = fs::read(file_path).unwrap(); + assert_eq!(serialized_module.len(), 1040); + } } From 4ffa110f7b980b69200095afcfe4c24d07a601b1 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Tue, 8 Feb 2022 07:26:06 +0100 Subject: [PATCH 2/2] Bump module serialization format to v2 --- CHANGELOG.md | 2 ++ packages/vm/src/modules/file_system_cache.rs | 20 ++++++++++++++++++-- 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index accbad2176..ecde8168d2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -21,6 +21,8 @@ and this project adheres to ### Fixed - cosmwasm-vm: Fix `AddAssign` implementation of `GasInfo`. +- cosmwasm-vm: Bump `MODULE_SERIALIZATION_VERSION` to "v2" because the module + serialization format changed between Wasmer 2.0.0 and 2.1.x. ## [1.0.0-beta4] - 2021-12-23 diff --git a/packages/vm/src/modules/file_system_cache.rs b/packages/vm/src/modules/file_system_cache.rs index 4b75fe3e4c..886af4ecb7 100644 --- a/packages/vm/src/modules/file_system_cache.rs +++ b/packages/vm/src/modules/file_system_cache.rs @@ -14,7 +14,23 @@ use crate::errors::{VmError, VmResult}; /// The string is used as a folder and should be named in a way that is /// easy to interprete for system admins. It should allow easy clearing /// of old versions. -const MODULE_SERIALIZATION_VERSION: &str = "v1"; +/// +/// See https://github.com/wasmerio/wasmer/issues/2781 for more information +/// on Wasmer's module stability concept. +/// +/// ## Version history: +/// - **v1**:
+/// cosmwasm_vm < 1.0.0-beta5. This is working well up to Wasmer 2.0.0 as +/// [in wasmvm 1.0.0-beta2](https://github.com/CosmWasm/wasmvm/blob/v1.0.0-beta2/libwasmvm/Cargo.lock#L1412-L1413) +/// and [wasmvm 0.16.3](https://github.com/CosmWasm/wasmvm/blob/v0.16.3/libwasmvm/Cargo.lock#L1408-L1409). +/// Versions that ship with Wasmer 2.1.x such [as wasmvm 1.0.0-beta3](https://github.com/CosmWasm/wasmvm/blob/v1.0.0-beta3/libwasmvm/Cargo.lock#L1534-L1535) +/// to [wasmvm 1.0.0-beta5](https://github.com/CosmWasm/wasmvm/blob/v1.0.0-beta5/libwasmvm/Cargo.lock#L1530-L1531) +/// are broken, i.e. they will crash when reading older v1 modules. +/// - **v2**:
+/// Version for cosmwasm_vm 1.0.0-beta5 / wasmvm 1.0.0-beta6 that ships with Wasmer 2.1.1. +/// - **v3**:
+/// Version for Wasmer 2.2.0 which contains a [module breaking change to 2.1.x](https://github.com/wasmerio/wasmer/pull/2747). +const MODULE_SERIALIZATION_VERSION: &str = "v2"; /// Representation of a directory that contains compiled Wasm artifacts. pub struct FileSystemCache { @@ -173,7 +189,7 @@ mod tests { let module = compile(&wasm, None, &[]).unwrap(); cache.store(&checksum, &module).unwrap(); - let file_path = format!("{}/v1/{}", tmp_dir.path().to_string_lossy(), checksum); + let file_path = format!("{}/v2/{}", tmp_dir.path().to_string_lossy(), checksum); let serialized_module = fs::read(file_path).unwrap(); assert_eq!(serialized_module.len(), 1040); }