mirror of
https://github.com/pezkuwichain/revive.git
synced 2026-06-14 12:11:02 +00:00
do not byte swap storage values
Signed-off-by: xermicus <cyrill@parity.io>
This commit is contained in:
@@ -2,9 +2,9 @@
|
|||||||
"Baseline": 934,
|
"Baseline": 934,
|
||||||
"Computation": 4360,
|
"Computation": 4360,
|
||||||
"DivisionArithmetics": 39448,
|
"DivisionArithmetics": 39448,
|
||||||
"ERC20": 52333,
|
"ERC20": 46512,
|
||||||
"Events": 1749,
|
"Events": 1749,
|
||||||
"FibonacciIterative": 2973,
|
"FibonacciIterative": 2973,
|
||||||
"Flipper": 3368,
|
"Flipper": 3549,
|
||||||
"SHA1": 32709
|
"SHA1": 32709
|
||||||
}
|
}
|
||||||
@@ -456,10 +456,12 @@ fn link_host_functions(engine: &Engine) -> Linker<Transaction> {
|
|||||||
let key = caller.read_memory_into_vec(key_ptr, key_len)?;
|
let key = caller.read_memory_into_vec(key_ptr, key_len)?;
|
||||||
let value = caller.read_memory_into_vec(value_ptr, value_len)?;
|
let value = caller.read_memory_into_vec(value_ptr, value_len)?;
|
||||||
|
|
||||||
transaction.top_account_mut().storage.insert(
|
let key = U256::from_le_bytes::<32>(key.try_into().unwrap());
|
||||||
U256::from_be_bytes::<32>(key.try_into().unwrap()),
|
let value = U256::from_le_bytes::<32>(value.try_into().unwrap());
|
||||||
U256::from_be_bytes::<32>(value.try_into().unwrap()),
|
|
||||||
);
|
log::info!("set storage {key} = {value}");
|
||||||
|
|
||||||
|
transaction.top_account_mut().storage.insert(key, value);
|
||||||
|
|
||||||
Ok(0)
|
Ok(0)
|
||||||
},
|
},
|
||||||
@@ -485,14 +487,17 @@ fn link_host_functions(engine: &Engine) -> Linker<Transaction> {
|
|||||||
"spurious output buffer size: {out_len}"
|
"spurious output buffer size: {out_len}"
|
||||||
);
|
);
|
||||||
|
|
||||||
|
let key = U256::from_le_bytes::<32>(key.try_into().unwrap());
|
||||||
let value = transaction
|
let value = transaction
|
||||||
.top_account_mut()
|
.top_account_mut()
|
||||||
.storage
|
.storage
|
||||||
.get(&U256::from_be_bytes::<32>(key.try_into().unwrap()))
|
.get(&key)
|
||||||
.map(U256::to_be_bytes::<32>)
|
.cloned()
|
||||||
.unwrap_or_default();
|
.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())?;
|
caller.write_memory(out_len_ptr, &32u32.to_le_bytes())?;
|
||||||
|
|
||||||
Ok(0)
|
Ok(0)
|
||||||
|
|||||||
@@ -689,8 +689,7 @@ where
|
|||||||
self.word_type(),
|
self.word_type(),
|
||||||
"storage_ptr_to_int",
|
"storage_ptr_to_int",
|
||||||
)?;
|
)?;
|
||||||
let storage_key_pointer =
|
let storage_key_pointer = self.build_alloca(self.word_type(), "storage_key");
|
||||||
self.build_alloca(storage_key_value.get_type(), "storage_key");
|
|
||||||
let storage_key_pointer_casted = self.builder().build_ptr_to_int(
|
let storage_key_pointer_casted = self.builder().build_ptr_to_int(
|
||||||
storage_key_pointer.value,
|
storage_key_pointer.value,
|
||||||
self.xlen_type(),
|
self.xlen_type(),
|
||||||
@@ -717,7 +716,6 @@ where
|
|||||||
// If a key doesn't exist the "zero" value is returned.
|
// If a key doesn't exist the "zero" value is returned.
|
||||||
|
|
||||||
self.build_load(storage_value_pointer, "storage_value_load")
|
self.build_load(storage_value_pointer, "storage_value_load")
|
||||||
.and_then(|value| self.build_byte_swap(value))
|
|
||||||
}
|
}
|
||||||
AddressSpace::Code | AddressSpace::HeapAuxiliary => todo!(),
|
AddressSpace::Code | AddressSpace::HeapAuxiliary => todo!(),
|
||||||
AddressSpace::Generic => Ok(self.build_byte_swap(self.build_load(
|
AddressSpace::Generic => Ok(self.build_byte_swap(self.build_load(
|
||||||
@@ -776,25 +774,24 @@ where
|
|||||||
}
|
}
|
||||||
AddressSpace::TransientStorage => todo!(),
|
AddressSpace::TransientStorage => todo!(),
|
||||||
AddressSpace::Storage => {
|
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(
|
let storage_key_value = self.builder().build_ptr_to_int(
|
||||||
pointer.value,
|
pointer.value,
|
||||||
self.word_type(),
|
self.word_type(),
|
||||||
"storage_ptr_to_int",
|
"storage_ptr_to_int",
|
||||||
)?;
|
)?;
|
||||||
let storage_key_pointer =
|
let storage_key_pointer = self.build_alloca(self.word_type(), "storage_key");
|
||||||
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_casted = self.builder().build_ptr_to_int(
|
let storage_key_pointer_casted = self.builder().build_ptr_to_int(
|
||||||
storage_key_pointer.value,
|
storage_key_pointer.value,
|
||||||
self.xlen_type(),
|
self.xlen_type(),
|
||||||
"storage_key_pointer_casted",
|
"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(
|
let storage_value_pointer_casted = self.builder().build_ptr_to_int(
|
||||||
storage_value_pointer.value,
|
storage_value_pointer.value,
|
||||||
self.xlen_type(),
|
self.xlen_type(),
|
||||||
@@ -804,7 +801,7 @@ where
|
|||||||
self.builder()
|
self.builder()
|
||||||
.build_store(storage_key_pointer.value, storage_key_value)?;
|
.build_store(storage_key_pointer.value, storage_key_value)?;
|
||||||
self.builder()
|
self.builder()
|
||||||
.build_store(storage_value_pointer.value, storage_value_value)?;
|
.build_store(storage_value_pointer.value, value)?;
|
||||||
|
|
||||||
self.build_runtime_call(
|
self.build_runtime_call(
|
||||||
runtime_api::imports::SET_STORAGE,
|
runtime_api::imports::SET_STORAGE,
|
||||||
|
|||||||
Reference in New Issue
Block a user