Skip to content
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
47 changes: 25 additions & 22 deletions src/emit/substrate.rs
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ impl SubstrateTarget {
"ext_scratch_write",
"ext_set_storage",
"ext_get_storage",
"ext_clear_storage",
"ext_return",
]);

Expand Down Expand Up @@ -153,7 +154,6 @@ impl SubstrateTarget {
.i8_type()
.ptr_type(AddressSpace::Generic)
.into(), // key_ptr
contract.context.i32_type().into(), // value_non_null
contract
.context
.i8_type()
Expand All @@ -166,6 +166,21 @@ impl SubstrateTarget {
Some(Linkage::External),
);

contract.module.add_function(
"ext_clear_storage",
contract.context.void_type().fn_type(
&[
contract
.context
.i8_type()
.ptr_type(AddressSpace::Generic)
.into(), // key_ptr
],
false,
),
Some(Linkage::External),
);

contract.module.add_function(
"ext_get_storage",
contract.context.i32_type().fn_type(
Expand Down Expand Up @@ -1074,25 +1089,15 @@ impl TargetRuntime for SubstrateTarget {
slot: PointerValue<'a>,
) {
contract.builder.build_call(
contract.module.get_function("ext_set_storage").unwrap(),
&[
contract
.builder
.build_pointer_cast(
slot,
contract.context.i8_type().ptr_type(AddressSpace::Generic),
"",
)
.into(),
contract.context.i32_type().const_zero().into(), // value_not_null, 0 for remove
contract
.context
.i8_type()
.ptr_type(AddressSpace::Generic)
.const_null()
.into(),
contract.context.i32_type().const_zero().into(),
],
contract.module.get_function("ext_clear_storage").unwrap(),
&[contract
.builder
.build_pointer_cast(
slot,
contract.context.i8_type().ptr_type(AddressSpace::Generic),
"",
)
.into()],
"",
);
}
Expand All @@ -1116,7 +1121,6 @@ impl TargetRuntime for SubstrateTarget {
"",
)
.into(),
contract.context.i32_type().const_int(1, false).into(),
contract
.builder
.build_pointer_cast(
Expand Down Expand Up @@ -1179,7 +1183,6 @@ impl TargetRuntime for SubstrateTarget {
"",
)
.into(),
contract.context.i32_type().const_int(1, false).into(),
contract
.builder
.build_pointer_cast(
Expand Down
Binary file modified stdlib/substrate.bc
Binary file not shown.
8 changes: 4 additions & 4 deletions stdlib/substrate.c
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
#include "stdlib.h"

extern uint32_t ext_get_storage(uint8_t *);
extern void ext_set_storage(uint8_t *, uint32_t value_non_null, uint8_t *, uint32_t);
extern void ext_set_storage(uint8_t *, uint8_t *, uint32_t);
extern uint32_t ext_scratch_size(void);
extern void ext_scratch_read(uint8_t *dest, uint32_t offset, uint32_t size);

Expand Down Expand Up @@ -71,7 +71,7 @@ void substrate_set_string_subscript(uint8_t *slot, uint32_t index, int8_t val)

data[index] = val;

ext_set_storage(slot, 1, data, size);
ext_set_storage(slot, data, size);
}

void substrate_bytes_push(uint8_t *slot, int8_t val)
Expand All @@ -90,7 +90,7 @@ void substrate_bytes_push(uint8_t *slot, int8_t val)

data[size] = val;

ext_set_storage(slot, 1, data, size + 1);
ext_set_storage(slot, data, size + 1);
}

uint8_t substrate_bytes_pop(uint8_t *slot)
Expand All @@ -113,7 +113,7 @@ uint8_t substrate_bytes_pop(uint8_t *slot)

ext_scratch_read(data, 0, size);

ext_set_storage(slot, 1, data, size - 1);
ext_set_storage(slot, data, size - 1);

return data[size - 1];
}
Expand Down
42 changes: 26 additions & 16 deletions tests/substrate.rs
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ enum SubstrateExternal {
ext_scratch_read,
ext_scratch_write,
ext_set_storage,
ext_clear_storage,
ext_get_storage,
ext_return,
}
Expand Down Expand Up @@ -120,34 +121,42 @@ impl Externals for ContractStorage {
Ok(Some(RuntimeValue::I32(1)))
}
}
Some(SubstrateExternal::ext_clear_storage) => {
let key_ptr: u32 = args.nth_checked(0)?;

let mut key: StorageKey = [0; 32];

if let Err(e) = self.memory.get_into(key_ptr, &mut key) {
panic!("ext_clear_storage: {}", e);
}

println!("ext_clear_storage: {:?}", key);
self.store.remove(&key);

Ok(None)
}
Some(SubstrateExternal::ext_set_storage) => {
assert_eq!(args.len(), 4);
assert_eq!(args.len(), 3);

let key_ptr: u32 = args.nth_checked(0)?;
let value_non_null: u32 = args.nth_checked(1)?;
let data_ptr: u32 = args.nth_checked(2)?;
let len: u32 = args.nth_checked(3)?;
let data_ptr: u32 = args.nth_checked(1)?;
let len: u32 = args.nth_checked(2)?;

let mut key: StorageKey = [0; 32];

if let Err(e) = self.memory.get_into(key_ptr, &mut key) {
panic!("ext_set_storage: {}", e);
}

if value_non_null != 0 {
let mut data = Vec::new();
data.resize(len as usize, 0u8);

if let Err(e) = self.memory.get_into(data_ptr, &mut data) {
panic!("ext_set_storage: {}", e);
}
println!("ext_set_storage: {:?} = {:?}", key, data);
let mut data = Vec::new();
data.resize(len as usize, 0u8);

self.store.insert(key, data);
} else {
println!("ext_set_storage: {:?} = removed", key);
self.store.remove(&key);
if let Err(e) = self.memory.get_into(data_ptr, &mut data) {
panic!("ext_set_storage: {}", e);
}
println!("ext_set_storage: {:?} = {:?}", key, data);

self.store.insert(key, data);

Ok(None)
}
Expand Down Expand Up @@ -176,6 +185,7 @@ impl ModuleImportResolver for ContractStorage {
"ext_scratch_write" => SubstrateExternal::ext_scratch_write,
"ext_get_storage" => SubstrateExternal::ext_get_storage,
"ext_set_storage" => SubstrateExternal::ext_set_storage,
"ext_clear_storage" => SubstrateExternal::ext_clear_storage,
"ext_return" => SubstrateExternal::ext_return,
_ => {
panic!("{} not implemented", field_name);
Expand Down