1 unstable release
0.2.2 | Jul 30, 2024 |
---|
#734 in Database interfaces
Used in mavryk-smart-rollup
340KB
7K
SLoC
Transactional storage for Mavryk Smart Rollup kernels.
This crate supports dealing with objects for updating storage. All objects are stored in durable storage.
To use this crate, provide a definition of an object. The object structure should follow these guidelines:
- it can be created from an OwnedPath, ie, it implements
From<OwnedPath>
- it has getters and setters that operate directly on durable storage, each
getter and setter should take a Runtime as argument to do so (
mut
in case of setters).
NB an object must only look in durable storage prefixed by its
OwnedPath
.
To use this crate, create the wanted value struct and storage object like so:
use mavryk_smart_rollup_host::runtime::Runtime;
use mavryk_smart_rollup_host::path::{concat, RefPath, OwnedPath};
use mavryk_smart_rollup_storage::storage::Storage;
use mavryk_smart_rollup_mock::MockHost;
struct MyValue {
path: OwnedPath,
}
const VALUE_PATH: RefPath = RefPath::assert_from(b"/value");
impl MyValue {
pub fn setter(&mut self, host: &mut impl Runtime, v: &str) {
let value_path = concat(&self.path, &VALUE_PATH)
.expect("Could not get path for value");
host.store_write(&value_path, v.as_bytes(), 0)
.expect("Could not set value");
}
pub fn getter(
&mut self,
host: &impl Runtime,
) -> Vec<u8> {
let value_path = concat(&self.path, &VALUE_PATH)
.expect("Could not get path for value");
host.store_read(&value_path, 0, 1024)
.expect("Could not read value")
}
}
impl From<OwnedPath> for MyValue {
fn from(path: OwnedPath) -> Self {
Self { path }
}
}
const VALUES_PATH: RefPath = RefPath::assert_from(b"/values");
let mut host = MockHost::default();
let mut storage = Storage::<MyValue>::init(&VALUES_PATH)
.expect("Could not create storage interface");
storage.begin_transaction(&mut host)
.expect("Could not begin transaction");
let value_id = RefPath::assert_from(b"/my.value.id");
let mut value = storage.create_new(&mut host, &value_id)
.expect("Could not create new value")
.expect("Value already exists");
value.setter(&mut host, "some value");
storage.commit_transaction(&mut host)
.expect("Could not commit transaction");
Dependencies
~15MB
~288K SLoC