From 354b1c8d79a11e594fbfdc9b3cd3126c373b21bd Mon Sep 17 00:00:00 2001 From: xermicus Date: Mon, 3 Jun 2024 17:16:49 +0200 Subject: [PATCH] do not byte swap storage values Signed-off-by: xermicus --- crates/integration/codesize.json | 4 ++-- crates/integration/src/mock_runtime.rs | 19 +++++++++------ .../llvm-context/src/polkavm/context/mod.rs | 23 ++++++++----------- 3 files changed, 24 insertions(+), 22 deletions(-) diff --git a/crates/integration/codesize.json b/crates/integration/codesize.json index 9e4f0fdb..cd688579 100644 --- a/crates/integration/codesize.json +++ b/crates/integration/codesize.json @@ -2,9 +2,9 @@ "Baseline": 934, "Computation": 4360, "DivisionArithmetics": 39448, - "ERC20": 52333, + "ERC20": 46512, "Events": 1749, "FibonacciIterative": 2973, - "Flipper": 3368, + "Flipper": 3549, "SHA1": 32709 } \ No newline at end of file diff --git a/crates/integration/src/mock_runtime.rs b/crates/integration/src/mock_runtime.rs index fb05f198..7aba1634 100644 --- a/crates/integration/src/mock_runtime.rs +++ b/crates/integration/src/mock_runtime.rs @@ -456,10 +456,12 @@ fn link_host_functions(engine: &Engine) -> Linker { let key = caller.read_memory_into_vec(key_ptr, key_len)?; let value = caller.read_memory_into_vec(value_ptr, value_len)?; - transaction.top_account_mut().storage.insert( - U256::from_be_bytes::<32>(key.try_into().unwrap()), - U256::from_be_bytes::<32>(value.try_into().unwrap()), - ); + let key = U256::from_le_bytes::<32>(key.try_into().unwrap()); + let value = U256::from_le_bytes::<32>(value.try_into().unwrap()); + + log::info!("set storage {key} = {value}"); + + transaction.top_account_mut().storage.insert(key, value); Ok(0) }, @@ -485,14 +487,17 @@ fn link_host_functions(engine: &Engine) -> Linker { "spurious output buffer size: {out_len}" ); + let key = U256::from_le_bytes::<32>(key.try_into().unwrap()); let value = transaction .top_account_mut() .storage - .get(&U256::from_be_bytes::<32>(key.try_into().unwrap())) - .map(U256::to_be_bytes::<32>) + .get(&key) + .cloned() .unwrap_or_default(); - caller.write_memory(out_ptr, &value[..])?; + log::info!("get storage {key} = {value}"); + + caller.write_memory(out_ptr, &value.to_le_bytes::<32>())?; caller.write_memory(out_len_ptr, &32u32.to_le_bytes())?; Ok(0) diff --git a/crates/llvm-context/src/polkavm/context/mod.rs b/crates/llvm-context/src/polkavm/context/mod.rs index b4aaacc9..adea2de0 100644 --- a/crates/llvm-context/src/polkavm/context/mod.rs +++ b/crates/llvm-context/src/polkavm/context/mod.rs @@ -689,8 +689,7 @@ where self.word_type(), "storage_ptr_to_int", )?; - let storage_key_pointer = - self.build_alloca(storage_key_value.get_type(), "storage_key"); + let storage_key_pointer = self.build_alloca(self.word_type(), "storage_key"); let storage_key_pointer_casted = self.builder().build_ptr_to_int( storage_key_pointer.value, self.xlen_type(), @@ -717,7 +716,6 @@ where // If a key doesn't exist the "zero" value is returned. self.build_load(storage_value_pointer, "storage_value_load") - .and_then(|value| self.build_byte_swap(value)) } AddressSpace::Code | AddressSpace::HeapAuxiliary => todo!(), AddressSpace::Generic => Ok(self.build_byte_swap(self.build_load( @@ -776,25 +774,24 @@ where } AddressSpace::TransientStorage => todo!(), AddressSpace::Storage => { + assert_eq!( + value.as_basic_value_enum().get_type(), + self.word_type().as_basic_type_enum() + ); + let storage_key_value = self.builder().build_ptr_to_int( pointer.value, self.word_type(), "storage_ptr_to_int", )?; - let storage_key_pointer = - self.build_alloca(storage_key_value.get_type(), "storage_key"); - - let storage_value_value = self - .build_byte_swap(value.as_basic_value_enum())? - .into_int_value(); - let storage_value_pointer = - self.build_alloca(storage_value_value.get_type(), "storage_value"); - + let storage_key_pointer = self.build_alloca(self.word_type(), "storage_key"); let storage_key_pointer_casted = self.builder().build_ptr_to_int( storage_key_pointer.value, self.xlen_type(), "storage_key_pointer_casted", )?; + + let storage_value_pointer = self.build_alloca(self.word_type(), "storage_value"); let storage_value_pointer_casted = self.builder().build_ptr_to_int( storage_value_pointer.value, self.xlen_type(), @@ -804,7 +801,7 @@ where self.builder() .build_store(storage_key_pointer.value, storage_key_value)?; self.builder() - .build_store(storage_value_pointer.value, storage_value_value)?; + .build_store(storage_value_pointer.value, value)?; self.build_runtime_call( runtime_api::imports::SET_STORAGE,