Skip to content
This repository was archived by the owner on Nov 15, 2023. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 7 additions & 7 deletions core/executor/src/wasm_executor.rs
Original file line number Diff line number Diff line change
Expand Up @@ -629,9 +629,9 @@ impl_wasm_host_interface! {
)?;

if let Some(value) = maybe_value {
let value = &value[value_offset as usize..];
let written = std::cmp::min(value_len as usize, value.len());
context.write_memory(value_data, &value[..written])
let data = &value[value.len().min(value_offset as usize)..];
let written = std::cmp::min(value_len as usize, data.len());
context.write_memory(value_data, &data[..written])
.map_err(|_| "Invalid attempt to set value in ext_get_storage_into")?;
Ok(value.len() as u32)
} else {
Expand All @@ -658,10 +658,10 @@ impl_wasm_host_interface! {
)?;

if let Some(value) = maybe_value {
let value = &value[value_offset as usize..];
let written = std::cmp::min(value_len as usize, value.len());
context.write_memory(value_data, &value[..written])
.map_err(|_| "Invalid attempt to set value in ext_get_child_storage_into")?;
let data = &value[value.len().min(value_offset as usize)..];
let written = std::cmp::min(value_len as usize, data.len());
context.write_memory(value_data, &data[..written])
.map_err(|_| "Invalid attempt to get value in ext_get_child_storage_into")?;
Ok(value.len() as u32)
} else {
Ok(u32::max_value())
Expand Down
12 changes: 6 additions & 6 deletions core/sr-io/with_std.rs
Original file line number Diff line number Diff line change
Expand Up @@ -54,9 +54,9 @@ impl StorageApi for () {

fn read_storage(key: &[u8], value_out: &mut [u8], value_offset: usize) -> Option<usize> {
ext::with(|ext| ext.storage(key).map(|value| {
let value = &value[value_offset..];
let written = std::cmp::min(value.len(), value_out.len());
value_out[..written].copy_from_slice(&value[..written]);
let data = &value[value_offset.min(value.len())..];
let written = std::cmp::min(data.len(), value_out.len());
value_out[..written].copy_from_slice(&data[..written]);
value.len()
})).expect("read_storage cannot be called outside of an Externalities-provided environment.")
}
Expand Down Expand Up @@ -85,9 +85,9 @@ impl StorageApi for () {
let storage_key = child_storage_key_or_panic(storage_key);
ext.child_storage(storage_key, key)
.map(|value| {
let value = &value[value_offset..];
let written = std::cmp::min(value.len(), value_out.len());
value_out[..written].copy_from_slice(&value[..written]);
let data = &value[value_offset.min(value.len())..];
let written = std::cmp::min(data.len(), value_out.len());
value_out[..written].copy_from_slice(&data[..written]);
value.len()
})
})
Expand Down
65 changes: 65 additions & 0 deletions core/test-runtime/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -280,6 +280,8 @@ cfg_if! {
///
/// Returns the signature generated for the message `sr25519`.
fn test_sr25519_crypto() -> (sr25519::AppSignature, sr25519::AppPublic);
/// Run various tests against storage.
fn test_storage();
}
}
} else {
Expand Down Expand Up @@ -322,6 +324,8 @@ cfg_if! {
///
/// Returns the signature generated for the message `sr25519`.
fn test_sr25519_crypto() -> (sr25519::AppSignature, sr25519::AppPublic);
/// Run various tests against storage.
fn test_storage();
}
}
}
Expand Down Expand Up @@ -590,6 +594,11 @@ cfg_if! {
fn test_sr25519_crypto() -> (sr25519::AppSignature, sr25519::AppPublic) {
test_sr25519_crypto()
}

fn test_storage() {
test_read_storage();
test_read_child_storage();
}
}

impl aura_primitives::AuraApi<Block, AuraId> for Runtime {
Expand Down Expand Up @@ -805,6 +814,11 @@ cfg_if! {
fn test_sr25519_crypto() -> (sr25519::AppSignature, sr25519::AppPublic) {
test_sr25519_crypto()
}

fn test_storage() {
test_read_storage();
test_read_child_storage();
}
}

impl aura_primitives::AuraApi<Block, AuraId> for Runtime {
Expand Down Expand Up @@ -887,6 +901,46 @@ fn test_sr25519_crypto() -> (sr25519::AppSignature, sr25519::AppPublic) {
(signature, public0)
}

fn test_read_storage() {
const KEY: &[u8] = b":read_storage";
runtime_io::set_storage(KEY, b"test");

let mut v = [0u8; 4];
let r = runtime_io::read_storage(
KEY,
&mut v,
0
);
assert_eq!(r, Some(4));
assert_eq!(&v, b"test");

let mut v = [0u8; 4];
let r = runtime_io::read_storage(KEY, &mut v, 8);
assert_eq!(r, Some(4));
assert_eq!(&v, &[0, 0, 0, 0]);
}

fn test_read_child_storage() {
const CHILD_KEY: &[u8] = b":child_storage:default:read_child_storage";
const KEY: &[u8] = b":read_child_storage";
runtime_io::set_child_storage(CHILD_KEY, KEY, b"test");

let mut v = [0u8; 4];
let r = runtime_io::read_child_storage(
CHILD_KEY,
KEY,
&mut v,
0
);
assert_eq!(r, Some(4));
assert_eq!(&v, b"test");

let mut v = [0u8; 4];
let r = runtime_io::read_child_storage(CHILD_KEY, KEY, &mut v, 8);
assert_eq!(r, Some(4));
assert_eq!(&v, &[0, 0, 0, 0]);
}

#[cfg(test)]
mod tests {
use substrate_test_runtime_client::{
Expand Down Expand Up @@ -981,4 +1035,15 @@ mod tests {
let ret = runtime_api.vec_with_capacity(&new_block_id, 1048576);
assert!(ret.is_ok());
}

#[test]
fn test_storage() {
let client = TestClientBuilder::new()
.set_execution_strategy(ExecutionStrategy::Both)
.build();
let runtime_api = client.runtime_api();
let block_id = BlockId::Number(client.info().chain.best_number);

runtime_api.test_storage(&block_id).unwrap();
}
}
2 changes: 1 addition & 1 deletion node/runtime/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion {
// implementation changes and behavior does not, then leave spec_version as
// is and increment impl_version.
spec_version: 156,
impl_version: 156,
impl_version: 157,
apis: RUNTIME_API_VERSIONS,
};

Expand Down