diff --git a/Cargo.lock b/Cargo.lock index 893ba23a735c4..c04d24a888d18 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -13814,8 +13814,8 @@ dependencies = [ "pallet-utility", "parity-scale-codec", "paste", - "polkavm 0.31.0", - "polkavm-common 0.31.0", + "polkavm 0.33.1", + "polkavm-common 0.33.0", "pretty_assertions", "proptest", "rand 0.8.5", @@ -17941,16 +17941,16 @@ dependencies = [ [[package]] name = "polkavm" -version = "0.31.0" +version = "0.33.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34ddb26cbe473e21bf5c329723e72fdf9208b5f9674e54721bf436e2efdbb26f" +checksum = "d90ece49c68657299648e20469517e22c6ec38321307bb14a69c27a33927a491" dependencies = [ "libc", "log", "picosimd", - "polkavm-assembler 0.31.0", - "polkavm-common 0.31.0", - "polkavm-linux-raw 0.31.0", + "polkavm-assembler 0.33.0", + "polkavm-common 0.33.0", + "polkavm-linux-raw 0.33.0", ] [[package]] @@ -17964,9 +17964,9 @@ dependencies = [ [[package]] name = "polkavm-assembler" -version = "0.31.0" +version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f9006f0a135c6d035487fa88fa75b97b32a53d1d914c757f131c8e10a2af295" +checksum = "00010f7924647dbf6f468d85d0fcfe4c3587cfb4557ef13f3682dbece8fd57f0" dependencies = [ "log", ] @@ -17992,14 +17992,14 @@ dependencies = [ [[package]] name = "polkavm-common" -version = "0.31.0" +version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0a3e43fa1a54b955a2f9422b1690c3cc29252ac8828c02a99d2370b9f2a188e" +checksum = "9e44a9487003cf5b9fc4462bbcf105cc37d5d9b18b40edf5ed50dd20ed1fdb27" dependencies = [ "blake3", "log", "picosimd", - "polkavm-assembler 0.31.0", + "polkavm-assembler 0.33.0", ] [[package]] @@ -18022,11 +18022,11 @@ dependencies = [ [[package]] name = "polkavm-derive" -version = "0.31.0" +version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3d944b6b4e792c2a120232b52bd6f2c9dd3071d3f48462afb2b5d00cb9f7ac9" +checksum = "3ef966bc8518a66ce12d4edb73f2c4094cae72bb23258bc9e9b2802cc9d6cd79" dependencies = [ - "polkavm-derive-impl-macro 0.31.0", + "polkavm-derive-impl-macro 0.33.0", ] [[package]] @@ -18055,11 +18055,11 @@ dependencies = [ [[package]] name = "polkavm-derive-impl" -version = "0.31.0" +version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57c14b030150f81dfde110997b6fafc19741998130908fdab85f1a66bb735025" +checksum = "f0c2166ad71dd7f51dcdd0d91b70d408a8b3610fa6e94d8202dd4b7185607181" dependencies = [ - "polkavm-common 0.31.0", + "polkavm-common 0.33.0", "proc-macro2 1.0.95", "quote 1.0.40", "syn 2.0.98", @@ -18087,11 +18087,11 @@ dependencies = [ [[package]] name = "polkavm-derive-impl-macro" -version = "0.31.0" +version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3fcadb13edfcc3b4046fcd2d292597782f5b7a2af140e6363fbf71fe196b425" +checksum = "c7ac2ac8ec5b938e249fa97b5ebb1e6fa47000c81a25eba6bf0f13edb8d430e4" dependencies = [ - "polkavm-derive-impl 0.31.0", + "polkavm-derive-impl 0.33.0", "syn 2.0.98", ] @@ -18113,16 +18113,16 @@ dependencies = [ [[package]] name = "polkavm-linker" -version = "0.31.0" +version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1ae3f7aff1af110dcd0f105d783b10ff25cd2837abe411ea4d88ae5cd193b49" +checksum = "046d371182d27b707e116d1637ccdc8514e0e123130139ecff62bd78d987c622" dependencies = [ "dirs", "gimli 0.31.1", "hashbrown 0.14.5", "log", "object 0.36.7", - "polkavm-common 0.31.0", + "polkavm-common 0.33.0", "regalloc2 0.9.3", "rustc-demangle", ] @@ -18135,9 +18135,9 @@ checksum = "28919f542476f4158cc71e6c072b1051f38f4b514253594ac3ad80e3c0211fc8" [[package]] name = "polkavm-linux-raw" -version = "0.31.0" +version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cbcd9ed5f77c60f3878289001d3e789da301746249b622bfb2876e2d0fe32c0b" +checksum = "42063d4a1c52e569f7794df27dab3e19c9fa8946184023257bdbb43eb4a94be5" [[package]] name = "polling" @@ -21053,7 +21053,7 @@ dependencies = [ name = "sc-executor-common" version = "0.29.0" dependencies = [ - "polkavm 0.31.0", + "polkavm 0.33.1", "sc-allocator 23.0.0", "sp-maybe-compressed-blob 11.0.0", "sp-wasm-interface 20.0.0", @@ -21080,7 +21080,7 @@ name = "sc-executor-polkavm" version = "0.29.0" dependencies = [ "log", - "polkavm 0.31.0", + "polkavm 0.33.1", "sc-executor-common 0.29.0", "sp-runtime-interface 24.0.0", "sp-wasm-interface 20.0.0", @@ -24591,7 +24591,7 @@ dependencies = [ "libsecp256k1", "log", "parity-scale-codec", - "polkavm-derive 0.31.0", + "polkavm-derive 0.33.0", "rustversion", "secp256k1 0.28.2", "sp-core 28.0.0", @@ -24865,7 +24865,7 @@ dependencies = [ "bytes", "impl-trait-for-tuples", "parity-scale-codec", - "polkavm-derive 0.31.0", + "polkavm-derive 0.33.0", "rustversion", "sp-externalities 0.25.0", "sp-io 30.0.0", @@ -26294,7 +26294,7 @@ dependencies = [ "merkleized-metadata", "parity-scale-codec", "parity-wasm", - "polkavm-linker 0.31.0", + "polkavm-linker 0.33.0", "sc-executor 0.32.0", "shlex", "sp-core 28.0.0", diff --git a/Cargo.toml b/Cargo.toml index 5b5eee75f2de0..39dab918e3808 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1179,10 +1179,10 @@ polkadot-subsystem-bench = { path = "polkadot/node/subsystem-bench" } polkadot-test-client = { path = "polkadot/node/test/client" } polkadot-test-runtime = { path = "polkadot/runtime/test-runtime" } polkadot-test-service = { path = "polkadot/node/test/service" } -polkavm = { version = "0.31.0", default-features = false } -polkavm-common = { version = "0.31.0", default-features = false } -polkavm-derive = "0.31.0" -polkavm-linker = "0.31.0" +polkavm = { version = "0.33.0", default-features = false } +polkavm-common = { version = "0.33.0", default-features = false } +polkavm-derive = "0.33.0" +polkavm-linker = "0.33.0" portpicker = { version = "0.1.1" } pretty_assertions = { version = "1.3.0" } primitive-types = { version = "0.13.1", default-features = false, features = [ diff --git a/prdoc/pr_11650.prdoc b/prdoc/pr_11650.prdoc new file mode 100644 index 0000000000000..ded6330a6cf00 --- /dev/null +++ b/prdoc/pr_11650.prdoc @@ -0,0 +1,18 @@ +title: Update PolkaVM to latest version (0.31 → 0.33) + +doc: + - audience: [Runtime Dev, Node Dev] + description: | + Updates all PolkaVM dependencies from 0.31.0 to 0.33.0. + +crates: + - name: sp-wasm-interface + bump: major + - name: sc-executor-common + bump: major + - name: sc-executor-polkavm + bump: minor + - name: sc-executor-wasmtime + bump: patch + - name: pallet-revive + bump: major diff --git a/substrate/client/executor/common/src/error.rs b/substrate/client/executor/common/src/error.rs index a94c1d4931342..6e09177a1b181 100644 --- a/substrate/client/executor/common/src/error.rs +++ b/substrate/client/executor/common/src/error.rs @@ -129,8 +129,8 @@ pub enum WasmError { #[error("Failure to erase the wasm memory: {0}")] ErasingFailed(String), - #[error("Wasm code failed validation.")] - InvalidModule, + #[error("Code failed validation: {0}")] + InvalidModule(String), #[error("Wasm code could not be deserialized.")] CantDeserializeWasm, @@ -162,6 +162,15 @@ impl From for WasmError { } } +impl From for WasmError { + fn from(error: polkavm::CompileError) -> Self { + match error { + polkavm::CompileError::ValidationFailed(msg) => WasmError::InvalidModule(msg), + polkavm::CompileError::Error(err) => WasmError::Other(err.to_string()), + } + } +} + impl From for Error { fn from(error: polkavm::Error) -> Self { Error::Other(error.to_string()) diff --git a/substrate/client/executor/polkavm/src/lib.rs b/substrate/client/executor/polkavm/src/lib.rs index 365175d80ace6..1e97a95e22325 100644 --- a/substrate/client/executor/polkavm/src/lib.rs +++ b/substrate/client/executor/polkavm/src/lib.rs @@ -134,7 +134,7 @@ struct Context<'r, 'a>(&'r mut polkavm::Caller<'a, ()>); impl<'r, 'a> FunctionContext for Context<'r, 'a> { fn read_memory_into( - &self, + &mut self, address: Pointer, dest: &mut [u8], ) -> sp_wasm_interface::Result<()> { diff --git a/substrate/client/executor/wasmtime/src/host.rs b/substrate/client/executor/wasmtime/src/host.rs index f8c78cbb660ee..8cf247d4413ff 100644 --- a/substrate/client/executor/wasmtime/src/host.rs +++ b/substrate/client/executor/wasmtime/src/host.rs @@ -75,7 +75,7 @@ impl<'a> HostContext<'a> { impl<'a> sp_wasm_interface::FunctionContext for HostContext<'a> { fn read_memory_into( - &self, + &mut self, address: Pointer, dest: &mut [u8], ) -> sp_wasm_interface::Result<()> { diff --git a/substrate/frame/revive/src/vm/pvm.rs b/substrate/frame/revive/src/vm/pvm.rs index 30abc16eefab7..c995ea901e45c 100644 --- a/substrate/frame/revive/src/vm/pvm.rs +++ b/substrate/frame/revive/src/vm/pvm.rs @@ -58,7 +58,7 @@ pub trait Memory { /// Returns `Err` if one of the following conditions occurs: /// /// - requested buffer is not within the bounds of the sandbox memory. - fn read_into_buf(&self, ptr: u32, buf: &mut [u8]) -> Result<(), DispatchError>; + fn read_into_buf(&mut self, ptr: u32, buf: &mut [u8]) -> Result<(), DispatchError>; /// Write the given buffer to the designated location in the sandbox memory. /// @@ -86,40 +86,40 @@ pub trait Memory { /// Returns `Err` if one of the following conditions occurs: /// /// - requested buffer is not within the bounds of the sandbox memory. - fn read(&self, ptr: u32, len: u32) -> Result, DispatchError> { + fn read(&mut self, ptr: u32, len: u32) -> Result, DispatchError> { let mut buf = vec![0u8; len as usize]; self.read_into_buf(ptr, buf.as_mut_slice())?; Ok(buf) } /// Same as `read` but reads into a fixed size buffer. - fn read_array(&self, ptr: u32) -> Result<[u8; N], DispatchError> { + fn read_array(&mut self, ptr: u32) -> Result<[u8; N], DispatchError> { let mut buf = [0u8; N]; self.read_into_buf(ptr, &mut buf)?; Ok(buf) } /// Read a `u32` from the sandbox memory. - fn read_u32(&self, ptr: u32) -> Result { + fn read_u32(&mut self, ptr: u32) -> Result { let buf: [u8; 4] = self.read_array(ptr)?; Ok(u32::from_le_bytes(buf)) } /// Read a `U256` from the sandbox memory. - fn read_u256(&self, ptr: u32) -> Result { + fn read_u256(&mut self, ptr: u32) -> Result { let buf: [u8; 32] = self.read_array(ptr)?; Ok(U256::from_little_endian(&buf)) } /// Read a `H160` from the sandbox memory. - fn read_h160(&self, ptr: u32) -> Result { + fn read_h160(&mut self, ptr: u32) -> Result { let mut buf = H160::default(); self.read_into_buf(ptr, buf.as_bytes_mut())?; Ok(buf) } /// Read a `H256` from the sandbox memory. - fn read_h256(&self, ptr: u32) -> Result { + fn read_h256(&mut self, ptr: u32) -> Result { let mut code_hash = H256::default(); self.read_into_buf(ptr, code_hash.as_bytes_mut())?; Ok(code_hash) @@ -146,7 +146,7 @@ pub trait PolkaVmInstance: Memory { // in the streaming implementation while it could fail with a segfault in the copy implementation. #[cfg(feature = "runtime-benchmarks")] impl Memory for [u8] { - fn read_into_buf(&self, ptr: u32, buf: &mut [u8]) -> Result<(), DispatchError> { + fn read_into_buf(&mut self, ptr: u32, buf: &mut [u8]) -> Result<(), DispatchError> { let ptr = ptr as usize; let bound_checked = self.get(ptr..ptr + buf.len()).ok_or_else(|| Error::::OutOfBounds)?; @@ -170,7 +170,7 @@ impl Memory for [u8] { } impl Memory for polkavm::RawInstance { - fn read_into_buf(&self, ptr: u32, buf: &mut [u8]) -> Result<(), DispatchError> { + fn read_into_buf(&mut self, ptr: u32, buf: &mut [u8]) -> Result<(), DispatchError> { self.read_memory_into(ptr, buf) .map(|_| ()) .map_err(|_| Error::::OutOfBounds.into()) @@ -451,7 +451,7 @@ impl<'a, E: Ext, M: ?Sized + Memory> Runtime<'a, E, M> { Ok(()) } - fn decode_key(&self, memory: &M, key_ptr: u32, key_len: u32) -> Result { + fn decode_key(&self, memory: &mut M, key_ptr: u32, key_len: u32) -> Result { let res = match key_len { SENTINEL => { let mut buffer = [0u8; 32]; @@ -476,7 +476,7 @@ impl<'a, E: Ext, M: ?Sized + Memory> Runtime<'a, E, M> { fn set_storage( &mut self, - memory: &M, + memory: &mut M, flags: u32, key_ptr: u32, key_len: u32, @@ -521,7 +521,7 @@ impl<'a, E: Ext, M: ?Sized + Memory> Runtime<'a, E, M> { fn clear_storage( &mut self, - memory: &M, + memory: &mut M, flags: u32, key_ptr: u32, key_len: u32, diff --git a/substrate/primitives/wasm-interface/src/lib.rs b/substrate/primitives/wasm-interface/src/lib.rs index 5e2bd10c16853..0b01b41e3c615 100644 --- a/substrate/primitives/wasm-interface/src/lib.rs +++ b/substrate/primitives/wasm-interface/src/lib.rs @@ -297,13 +297,13 @@ impl PartialEq for dyn Function { /// Context used by `Function` to interact with the allocator and the memory of the wasm instance. pub trait FunctionContext { /// Read memory from `address` into a vector. - fn read_memory(&self, address: Pointer, size: WordSize) -> Result> { + fn read_memory(&mut self, address: Pointer, size: WordSize) -> Result> { let mut vec = vec![0; size as usize]; self.read_memory_into(address, &mut vec)?; Ok(vec) } /// Read memory into the given `dest` buffer from `address`. - fn read_memory_into(&self, address: Pointer, dest: &mut [u8]) -> Result<()>; + fn read_memory_into(&mut self, address: Pointer, dest: &mut [u8]) -> Result<()>; /// Write the given data at `address` into the memory. fn write_memory(&mut self, address: Pointer, data: &[u8]) -> Result<()>; /// Allocate a memory instance of `size` bytes.