diff --git a/.github/workflows/doc.yml b/.github/workflows/doc.yml index 3555b3e4a..01255c6a5 100644 --- a/.github/workflows/doc.yml +++ b/.github/workflows/doc.yml @@ -16,7 +16,7 @@ jobs: nix_path: nixpkgs=channel:nixos-21.05-small - name: Build Documentation - run: nix-shell --run "cargo doc -p sewup -p sewup-derive --features=kv" + run: nix-shell --run "cargo doc -p sewup -p sewup-derive --features=kv,rdb" - name: Deploy Documentation env: diff --git a/README.md b/README.md index 2de544603..08e87fb70 100644 --- a/README.md +++ b/README.md @@ -34,7 +34,7 @@ crate-type = ["cdylib"] [dependencies] sewup = { version = "*", features = ['kv'] } -sewup-derive = { version = "*" } +sewup-derive = { version = "*", features = ['kv'] } anyhow = "1.0" diff --git a/examples/default-contract/Cargo.toml b/examples/default-contract/Cargo.toml index 8deb1dad2..cf45fb72f 100644 --- a/examples/default-contract/Cargo.toml +++ b/examples/default-contract/Cargo.toml @@ -10,8 +10,8 @@ path = "src/lib.rs" crate-type = ["cdylib"] [dependencies] -sewup ={ version = "0.0.4", path = "../../sewup" } -sewup-derive = { version = "0.0.4", path = "../../sewup-derive" } +sewup ={ version = "*", path = "../../sewup" } +sewup-derive = { version = "*", path = "../../sewup-derive" } anyhow = "1.0.40" thiserror = "1.0.24" serde = "1.0" diff --git a/examples/default-contract/src/errors.rs b/examples/default-contract/src/errors.rs index 0c56b34f5..4a1b826a5 100644 --- a/examples/default-contract/src/errors.rs +++ b/examples/default-contract/src/errors.rs @@ -1,5 +1,6 @@ use thiserror::Error; +#[allow(dead_code)] #[derive(Error, Debug, PartialEq)] pub enum Error { #[error("not trust input")] diff --git a/examples/default-contract/src/lib.rs b/examples/default-contract/src/lib.rs index 1c4f01d28..9dda05414 100644 --- a/examples/default-contract/src/lib.rs +++ b/examples/default-contract/src/lib.rs @@ -1,8 +1,5 @@ -use anyhow::Result; use serde_derive::{Deserialize, Serialize}; - -use sewup::primitives::Contract; -use sewup_derive::{ewasm_fn, ewasm_fn_sig, ewasm_input_from, ewasm_main, ewasm_test}; +use sewup_derive::{ewasm_fn, ewasm_fn_sig, ewasm_main, ewasm_test}; mod errors; use errors::Error; @@ -14,7 +11,7 @@ struct SimpleStruct { } #[ewasm_fn] -fn check_input_object(s: SimpleStruct) -> Result<()> { +fn check_input_object(s: SimpleStruct) -> anyhow::Result<()> { if !s.trust { return Err(Error::NotTrustedInput.into()); } @@ -22,7 +19,10 @@ fn check_input_object(s: SimpleStruct) -> Result<()> { } #[ewasm_main] -fn main() -> Result<()> { +fn main() -> anyhow::Result<()> { + use sewup::primitives::Contract; + use sewup_derive::ewasm_input_from; + let contract = Contract::new()?; match contract.get_function_selector()? { ewasm_fn_sig!(check_input_object) => ewasm_input_from!(contract, check_input_object)?, diff --git a/examples/erc20-contract/Cargo.toml b/examples/erc20-contract/Cargo.toml index df4dfa184..3f8264be9 100644 --- a/examples/erc20-contract/Cargo.toml +++ b/examples/erc20-contract/Cargo.toml @@ -10,8 +10,8 @@ path = "src/token.rs" crate-type = ["cdylib"] [dependencies] -sewup ={ version = "0.0.4", path = "../../sewup", features = [ "token" ] } -sewup-derive = { version = "0.0.4", path = "../../sewup-derive" } +sewup ={ version = "*", path = "../../sewup", features = [ "token" ] } +sewup-derive = { version = "*", path = "../../sewup-derive" } anyhow = "1.0.40" ewasm_api = { version = "0.11.0", default-features = false, features = ["std", "qimalloc"], package = "ss_ewasm_api" } diff --git a/examples/erc20-contract/src/token.rs b/examples/erc20-contract/src/token.rs index 8d13fcb96..648018502 100644 --- a/examples/erc20-contract/src/token.rs +++ b/examples/erc20-contract/src/token.rs @@ -1,40 +1,28 @@ -use anyhow::Result; -use sewup::primitives::Contract; -use sewup::token::{ - erc20::{ - allowance as erc20_allowance, approve as erc20_approve, decimals, - do_balance as erc20_do_balance, do_transfer as erc20_do_transfer, mint as erc20_mint, name, - symbol, total_supply, transfer_from as erc20_transfer_from, DECIMALS_SIG, NAME_SIG, - SYMBOL_SIG, TOTAL_SUPPLY_SIG, - }, - helpers::{copy_into_address, copy_into_array, copy_into_storage_value}, -}; use sewup_derive::{ewasm_fn, ewasm_fn_sig, ewasm_main, ewasm_test}; #[cfg(target_arch = "wasm32")] use ewasm_api::types::*; #[ewasm_fn] -fn do_balance(contract: &Contract) { +fn do_balance(contract: &sewup::primitives::Contract) { if contract.data_size != 24 { ewasm_api::revert(); } let address_data = contract.input_data[4..].to_vec(); - let address = copy_into_address(&address_data[0..20]); - - erc20_do_balance(address); + let address = sewup::token::helpers::copy_into_address(&address_data[0..20]); + sewup::token::erc20::do_balance(address); } #[ewasm_fn] -fn do_transfer(contract: &Contract) { +fn do_transfer(contract: &sewup::primitives::Contract) { if contract.input_data.len() != 32 { ewasm_api::revert(); } let recipient_data = contract.input_data[4..24].to_vec(); - let recipient = copy_into_address(&recipient_data[0..20]); + let recipient = sewup::token::helpers::copy_into_address(&recipient_data[0..20]); - let value_data: [u8; 8] = copy_into_array(&contract.input_data[24..]); + let value_data: [u8; 8] = sewup::token::helpers::copy_into_array(&contract.input_data[24..]); let mut value = StorageValue::default(); let value_len = value_data.len(); let start = 32 - value_len; @@ -42,72 +30,71 @@ fn do_transfer(contract: &Contract) { value.bytes[start..(value_len + start)] .clone_from_slice(&value_data[..((value_len + start) - start)]); - erc20_do_transfer(recipient, value); + sewup::token::erc20::do_transfer(recipient, value); } #[ewasm_fn] -fn approve(contract: &Contract) { +fn approve(contract: &sewup::primitives::Contract) { let spender_data = contract.input_data[4..24].to_vec(); - let spender = copy_into_address(&spender_data[0..20]); + let spender = sewup::token::helpers::copy_into_address(&spender_data[0..20]); let value = contract.input_data[24..32].to_vec(); - let storage_value = copy_into_storage_value(&value[0..8]); - - erc20_approve(spender, storage_value); + let storage_value = sewup::token::helpers::copy_into_storage_value(&value[0..8]); + sewup::token::erc20::approve(spender, storage_value); } #[ewasm_fn] -fn allowance(contract: &Contract) { +fn allowance(contract: &sewup::primitives::Contract) { if contract.data_size != 44 { ewasm_api::revert(); } let from_data = contract.input_data[4..24].to_vec(); - let from = copy_into_address(&from_data[0..20]); + let from = sewup::token::helpers::copy_into_address(&from_data[0..20]); let spender_data = contract.input_data[24..44].to_vec(); - let spender = copy_into_address(&spender_data[0..20]); + let spender = sewup::token::helpers::copy_into_address(&spender_data[0..20]); - erc20_allowance(from, spender); + sewup::token::erc20::allowance(from, spender); } #[ewasm_fn] -fn transfer_from(contract: &Contract) { +fn transfer_from(contract: &sewup::primitives::Contract) { if contract.data_size != 52 { ewasm_api::revert(); } - let owner = copy_into_address(&contract.input_data[4..24]); + let owner = sewup::token::helpers::copy_into_address(&contract.input_data[4..24]); - let recipient = copy_into_address(&contract.input_data[24..44]); + let recipient = sewup::token::helpers::copy_into_address(&contract.input_data[24..44]); - let value_data: [u8; 8] = copy_into_array(&contract.input_data[44..52]); + let value_data: [u8; 8] = sewup::token::helpers::copy_into_array(&contract.input_data[44..52]); let value = u64::from_be_bytes(value_data); - erc20_transfer_from(owner, recipient, value); + sewup::token::erc20::transfer_from(owner, recipient, value); } #[ewasm_fn] -fn mint(contract: &Contract) { - let adddress = copy_into_address(&contract.input_data[4..24]); +fn mint(contract: &sewup::primitives::Contract) { + let adddress = sewup::token::helpers::copy_into_address(&contract.input_data[4..24]); - let value_data: [u8; 8] = copy_into_array(&contract.input_data[24..32]); + let value_data: [u8; 8] = sewup::token::helpers::copy_into_array(&contract.input_data[24..32]); let value = u64::from_be_bytes(value_data); - erc20_mint(adddress, value); + sewup::token::erc20::mint(adddress, value); } #[ewasm_main] -fn main() -> Result<()> { - let contract = Contract::new()?; +fn main() -> anyhow::Result<()> { + let contract = sewup::primitives::Contract::new()?; match contract.get_function_selector()? { ewasm_fn_sig!(do_balance) => do_balance(&contract), ewasm_fn_sig!(do_transfer) => do_transfer(&contract), - NAME_SIG => name(), - SYMBOL_SIG => symbol("ETD"), - DECIMALS_SIG => decimals(), - TOTAL_SUPPLY_SIG => total_supply(), + sewup::token::erc20::NAME_SIG => sewup::token::erc20::name(), + sewup::token::erc20::SYMBOL_SIG => sewup::token::erc20::symbol("ETD"), + sewup::token::erc20::DECIMALS_SIG => sewup::token::erc20::decimals(), + sewup::token::erc20::TOTAL_SUPPLY_SIG => sewup::token::erc20::total_supply(), ewasm_fn_sig!(approve) => approve(&contract), ewasm_fn_sig!(allowance) => allowance(&contract), ewasm_fn_sig!(transfer_from) => transfer_from(&contract), @@ -121,6 +108,7 @@ fn main() -> Result<()> { mod tests { use super::*; use hex_literal::hex; + use sewup::erc20::{DECIMALS_SIG, NAME_SIG, SYMBOL_SIG, TOTAL_SUPPLY_SIG}; use sewup_derive::ewasm_assert_eq; #[ewasm_test] diff --git a/examples/hello-contract/Cargo.toml b/examples/hello-contract/Cargo.toml index 0016adfd7..ea17b5413 100644 --- a/examples/hello-contract/Cargo.toml +++ b/examples/hello-contract/Cargo.toml @@ -10,8 +10,8 @@ path = "src/lib.rs" crate-type = ["cdylib"] [dependencies] -sewup ={ version = "0.0.4", path = "../../sewup" } -sewup-derive = { version = "0.0.4", path = "../../sewup-derive" } +sewup ={ version = "*", path = "../../sewup" } +sewup-derive = { version = "*", path = "../../sewup-derive" } anyhow = "1.0.40" [profile.release] diff --git a/examples/hello-contract/src/lib.rs b/examples/hello-contract/src/lib.rs index 510aab1bf..a157a379e 100644 --- a/examples/hello-contract/src/lib.rs +++ b/examples/hello-contract/src/lib.rs @@ -1,16 +1,13 @@ -use anyhow::Result; - -use sewup::primitives::Contract; use sewup_derive::{ewasm_fn, ewasm_fn_sig, ewasm_main, ewasm_test}; #[ewasm_fn] -fn hello() -> Result { +fn hello() -> anyhow::Result { Ok("hello world".to_string()) } #[ewasm_main(auto)] -fn main() -> Result { - let contract = Contract::new()?; +fn main() -> anyhow::Result { + let contract = sewup::primitives::Contract::new()?; let greeting = match contract.get_function_selector()? { ewasm_fn_sig!(hello) => hello()?, _ => panic!("unknown handle"), diff --git a/examples/kv-contract/Cargo.toml b/examples/kv-contract/Cargo.toml index 00e36d0e3..51d3fca10 100644 --- a/examples/kv-contract/Cargo.toml +++ b/examples/kv-contract/Cargo.toml @@ -10,8 +10,8 @@ path = "src/lib.rs" crate-type = ["cdylib"] [dependencies] -sewup ={ version = "0.0.4", path = "../../sewup", features = [ "kv" ] } -sewup-derive = { version = "0.0.4", path = "../../sewup-derive", features = [ "kv" ] } +sewup ={ version = "*", path = "../../sewup", features = [ "kv" ] } +sewup-derive = { version = "*", path = "../../sewup-derive", features = [ "kv" ] } anyhow = "1.0.40" thiserror = "1.0.24" serde = "1.0" diff --git a/examples/kv-contract/src/errors.rs b/examples/kv-contract/src/errors.rs index ce26ea851..a1d33ac25 100644 --- a/examples/kv-contract/src/errors.rs +++ b/examples/kv-contract/src/errors.rs @@ -1,6 +1,7 @@ use sewup::kv::Feature; use thiserror::Error; +#[allow(dead_code)] #[derive(Error, Debug, PartialEq)] pub enum KVError { #[error("the DB version `{0}` is unexpected.")] diff --git a/examples/kv-contract/src/lib.rs b/examples/kv-contract/src/lib.rs index 0e5e973c2..b1f274bb0 100644 --- a/examples/kv-contract/src/lib.rs +++ b/examples/kv-contract/src/lib.rs @@ -1,16 +1,11 @@ -use anyhow::Result; use serde_derive::{Deserialize, Serialize}; -use sewup::kv::{Feature, Store}; -use sewup::primitives::Contract; -use sewup::types::{Raw, Row}; +use sewup::kv::Feature; use sewup_derive::{ewasm_fn, ewasm_fn_sig, ewasm_main, ewasm_test, Value}; mod errors; use errors::KVError; -const EMPTY_DB_SIZE: u32 = 8; - #[derive(Default, Clone, Serialize, Deserialize, Debug, PartialEq, Value)] struct SimpleStruct { trust: bool, @@ -18,18 +13,18 @@ struct SimpleStruct { } #[ewasm_fn] -fn empty_commit() -> Result<()> { - let storage = Store::new()?; +fn empty_commit() -> anyhow::Result<()> { + let storage = sewup::kv::Store::new()?; let size = storage.commit()?; - if size != EMPTY_DB_SIZE { + if size != 8u32 { return Err(KVError::UnexpectedDBSize(size).into()); } Ok(()) } #[ewasm_fn] -fn check_version_and_features(version: u8, features: Vec) -> Result<()> { - let storage = Store::load(None)?; +fn check_version_and_features(version: u8, features: Vec) -> anyhow::Result<()> { + let storage = sewup::kv::Store::load(None)?; if storage.version() != version { return Err(KVError::UnexpectVersion(storage.version()).into()); }; @@ -42,8 +37,8 @@ fn check_version_and_features(version: u8, features: Vec) -> Result<()> } #[ewasm_fn] -fn check_empty_storage_size(size: u32) -> Result<()> { - let storage = Store::load(None)?; +fn check_empty_storage_size(size: u32) -> anyhow::Result<()> { + let storage = sewup::kv::Store::load(None)?; let load_size = storage.load_size(); if load_size != size { return Err(KVError::UnexpectedDBSize(load_size).into()); @@ -52,8 +47,10 @@ fn check_empty_storage_size(size: u32) -> Result<()> { } #[ewasm_fn] -fn add_buckets() -> Result<()> { - let mut storage = Store::load(None)?; +fn add_buckets() -> anyhow::Result<()> { + use sewup::types::{Raw, Row}; + + let mut storage = sewup::kv::Store::load(None)?; let bucket1 = storage.bucket::("bucket1")?; let bucket2 = storage.bucket::("bucket2")?; if !bucket1.is_empty() { @@ -71,8 +68,8 @@ fn add_buckets() -> Result<()> { } #[ewasm_fn] -fn check_buckets(buckets: Vec) -> Result<()> { - let mut storage = Store::load(None)?; +fn check_buckets(buckets: Vec) -> anyhow::Result<()> { + let mut storage = sewup::kv::Store::load(None)?; let mut current_buckets = storage.buckets(); current_buckets.sort(); if current_buckets != buckets { @@ -82,12 +79,12 @@ fn check_buckets(buckets: Vec) -> Result<()> { } #[ewasm_fn] -fn drop_bucket_than_check(name: &str, remine_buckets: Vec) -> Result<()> { - let mut storage = Store::load(None)?; +fn drop_bucket_than_check(name: &str, remine_buckets: Vec) -> anyhow::Result<()> { + let mut storage = sewup::kv::Store::load(None)?; storage.drop_bucket(name)?; storage.commit()?; - let s = Store::load(None)?; + let s = sewup::kv::Store::load(None)?; let mut current_buckets = s.buckets(); current_buckets.sort(); if current_buckets != remine_buckets { @@ -97,8 +94,10 @@ fn drop_bucket_than_check(name: &str, remine_buckets: Vec) -> Result<()> } #[ewasm_fn] -fn new_bucket_with_specific_struct() -> Result<()> { - let mut storage = Store::new()?; +fn new_bucket_with_specific_struct() -> anyhow::Result<()> { + use sewup::types::{Raw, Row}; + + let mut storage = sewup::kv::Store::new()?; let mut bucket1 = storage.bucket::("bucket1")?; let mut bucket2 = storage.bucket::("bucket2")?; @@ -120,8 +119,10 @@ fn new_bucket_with_specific_struct() -> Result<()> { } #[ewasm_fn] -fn check_objects_in_bucket() -> Result<()> { - let mut storage = Store::load(None)?; +fn check_objects_in_bucket() -> anyhow::Result<()> { + use sewup::types::{Raw, Row}; + + let mut storage = sewup::kv::Store::load(None)?; let mut bucket1 = storage.bucket::("bucket1")?; let mut bucket2 = storage.bucket::("bucket2")?; @@ -155,8 +156,10 @@ fn check_objects_in_bucket() -> Result<()> { } #[ewasm_fn] -fn delete_object_in_bucket() -> Result<()> { - let mut storage = Store::load(None)?; +fn delete_object_in_bucket() -> anyhow::Result<()> { + use sewup::types::{Raw, Row}; + + let mut storage = sewup::kv::Store::load(None)?; let mut bucket2 = storage.bucket::("bucket2")?; if bucket2.get(b"bug".into())?.is_none() { @@ -175,21 +178,21 @@ fn delete_object_in_bucket() -> Result<()> { } #[ewasm_fn] -fn non_regist_function() -> Result<()> { +fn non_regist_function() -> anyhow::Result<()> { // A function forget to regist Ok(()) } #[ewasm_main] -fn main() -> Result<()> { - let contract = Contract::new()?; +fn main() -> anyhow::Result<()> { + let contract = sewup::primitives::Contract::new()?; match contract.get_function_selector()? { ewasm_fn_sig!(empty_commit) => empty_commit()?, ewasm_fn_sig!(check_version_and_features) => { check_version_and_features(0, vec![Feature::Default])? } - ewasm_fn_sig!(check_empty_storage_size) => check_empty_storage_size(EMPTY_DB_SIZE)?, + ewasm_fn_sig!(check_empty_storage_size) => check_empty_storage_size(8u32)?, ewasm_fn_sig!(add_buckets) => add_buckets()?, ewasm_fn_sig!(check_buckets) => { check_buckets(vec!["bucket1".to_string(), "bucket2".to_string()])? diff --git a/examples/rdb-contract/Cargo.toml b/examples/rdb-contract/Cargo.toml index 6c12365ca..9a6b71c4c 100644 --- a/examples/rdb-contract/Cargo.toml +++ b/examples/rdb-contract/Cargo.toml @@ -10,8 +10,8 @@ path = "src/lib.rs" crate-type = ["cdylib"] [dependencies] -sewup ={ version = "0.0.4", path = "../../sewup", features = [ "rdb" ] } -sewup-derive = { version = "0.0.4", path = "../../sewup-derive", features = [ "rdb" ] } +sewup ={ version = "*", path = "../../sewup", features = [ "rdb" ] } +sewup-derive = { version = "*", path = "../../sewup-derive", features = [ "rdb" ] } anyhow = "1.0.40" thiserror = "1.0.24" serde = "1.0" diff --git a/examples/rdb-contract/src/lib.rs b/examples/rdb-contract/src/lib.rs index d603eec19..756d26ba8 100644 --- a/examples/rdb-contract/src/lib.rs +++ b/examples/rdb-contract/src/lib.rs @@ -15,7 +15,7 @@ use errors::RDBError; // to communicate with these handler, you will need protocol. // The protocol is easy to build by the `{struct_name}::protocol`, `{struct_name}::Protocol`, // please check out the test case in the end of this document -#[derive(Table, Default, sewup::rdb::Serialize, sewup::rdb::Deserialize)] +#[derive(Table, Default, Serialize, Deserialize)] pub struct Person { trusted: bool, age: u8, diff --git a/examples/rusty-contract/Cargo.toml b/examples/rusty-contract/Cargo.toml index ddc043aa3..2077b4e14 100644 --- a/examples/rusty-contract/Cargo.toml +++ b/examples/rusty-contract/Cargo.toml @@ -10,10 +10,8 @@ path = "src/lib.rs" crate-type = ["cdylib"] [dependencies] -sewup ={ version = "0.0.4", path = "../../sewup" } -sewup-derive = { version = "0.0.4", path = "../../sewup-derive" } -anyhow = "1.0.40" -thiserror = "1.0.24" +sewup ={ version = "*", path = "../../sewup" } +sewup-derive = { version = "*", path = "../../sewup-derive" } serde = "1.0" serde_derive = "1.0" diff --git a/examples/rusty-contract/src/lib.rs b/examples/rusty-contract/src/lib.rs index a6a2de5a6..a3cada427 100644 --- a/examples/rusty-contract/src/lib.rs +++ b/examples/rusty-contract/src/lib.rs @@ -1,7 +1,5 @@ use serde_derive::{Deserialize, Serialize}; -use sewup::primitives::Contract; - -use sewup_derive::{ewasm_fn, ewasm_fn_sig, ewasm_input_from, ewasm_main, ewasm_test}; +use sewup_derive::{ewasm_fn, ewasm_fn_sig, ewasm_main, ewasm_test}; #[derive(Default, Serialize, Deserialize)] struct SimpleStruct { @@ -19,6 +17,9 @@ fn check_input_object(s: SimpleStruct) -> Result<(), &'static str> { #[ewasm_main(rusty)] fn main() -> Result<(), &'static str> { + use sewup::primitives::Contract; + use sewup_derive::ewasm_input_from; + let contract = Contract::new().map_err(|_| "NewContractError")?; match contract .get_function_selector() diff --git a/sewup-derive/src/lib.rs b/sewup-derive/src/lib.rs index 70eb9eb75..1da27d8ec 100644 --- a/sewup-derive/src/lib.rs +++ b/sewup-derive/src/lib.rs @@ -519,7 +519,7 @@ pub fn derive_value(item: TokenStream) -> TokenStream { /// let default_input = person::Protocol::default(); /// let default_person_input: person::Protocol = Person::default().into(); /// assert!(default_input != default_person_input) -/// '``` +/// ``` #[cfg(feature = "rdb")] #[proc_macro_derive(Table)] pub fn derive_table(item: TokenStream) -> TokenStream { @@ -537,7 +537,7 @@ pub fn derive_table(item: TokenStream) -> TokenStream { r#" impl sewup::rdb::traits::Record for {} {{}} - #[derive(Default, Clone, sewup::rdb::Serialize, sewup::rdb::Deserialize)] + #[derive(Default, Clone, sewup::Serialize, sewup::Deserialize)] pub struct {}Wrapper {{ id: Option, {} diff --git a/sewup/src/kv/bucket.rs b/sewup/src/kv/bucket.rs index 09f3b37ec..085ff0d3c 100644 --- a/sewup/src/kv/bucket.rs +++ b/sewup/src/kv/bucket.rs @@ -55,14 +55,14 @@ impl<'a, K: Key, V: Value> Iterator for Iter<'a, K, V> { ); key_row.make_buffer(); - let key = K::from_raw_key(&key_row).expect("parse key from raw fail"); + let key = K::from_row_key(&key_row).expect("parse key from raw fail"); let mut value_row = Row::from( &self.raw_bucket.1 [(self.item_idx + k_size) as usize..(self.item_idx + k_size + v_size) as usize], ); value_row.make_buffer(); - let value = V::from_raw_value(&value_row).expect("parse value from raw fail"); + let value = V::from_row_value(&value_row).expect("parse value from raw fail"); self.item_idx = self.item_idx + k_size + v_size; @@ -110,7 +110,7 @@ impl<'a, K: Key, V: Clone + Value> Bucket { &self.raw_bucket.1[(idx + k_size) as usize..(idx + k_size + v_size) as usize], ); row.make_buffer(); - let instance = V::from_raw_value(&row)?; + let instance = V::from_row_value(&row)?; return Ok(Some(instance)); } idx = idx + k_size + v_size; @@ -120,15 +120,15 @@ impl<'a, K: Key, V: Clone + Value> Bucket { /// Set an item into the bucket pub fn set(&mut self, key: K, value: V) -> Result<()> { - let mut value: Vec = value.to_raw_value()?.into(); - let mut raw_key: Vec = key.to_raw_key()?.into(); + let mut value: Vec = value.to_row_value()?.into(); + let mut row_key: Vec = key.to_row_key()?.into(); - let hash_key = key.gen_hash_key(raw_key.len() as u32, value.len() as u32)?; + let hash_key = key.gen_hash_key(row_key.len() as u32, value.len() as u32)?; // TODO: handle key duplicate here self.raw_bucket.0.push(hash_key); - self.raw_bucket.1.append(&mut raw_key); + self.raw_bucket.1.append(&mut row_key); self.raw_bucket.1.append(&mut value); Ok(()) diff --git a/sewup/src/kv/traits/key.rs b/sewup/src/kv/traits/key.rs index 86f461807..660c3a9a0 100644 --- a/sewup/src/kv/traits/key.rs +++ b/sewup/src/kv/traits/key.rs @@ -1,3 +1,4 @@ +//! helps serialized key object into raw and also deserialize the raw back to object use std::borrow::Borrow; use std::convert::{TryFrom, TryInto}; @@ -9,19 +10,23 @@ use serde::Serialize; use crate::types::{Raw, Row}; -//TODO make Header bigger for big object storage +/// helps to serialize struct as Key to row or deserialized from row +/// ```compile_fail +/// | 1st bytes | ... | padding | +/// |-----------|--------|---------------------------| +/// | Header | Binary | padding to n times Byte32 | +/// ``` +/// Header is the number of bytes for binary pub trait Key: Sized + Serialize + DeserializeOwned { - // XXX: typo raw - fn from_raw_key(r: &Row) -> Result { + fn from_row_key(r: &Row) -> Result { let buffer: &[u8] = r.borrow(); let header = buffer[0] as usize; - // XXX fix expect msg let instance: Self = bincode::deserialize(&buffer[1..buffer.len() - header + 1]) - .expect("load db binary fail"); + .expect("load binary to key fail"); Ok(instance) } - fn to_raw_key(&self) -> Result { + fn to_row_key(&self) -> Result { let mut bin = bincode::serialize(&self).expect("serialize a key fail"); let length = bin.len(); let header = ((length + 1) & 31) as u8; // padding bytes @@ -32,7 +37,6 @@ pub trait Key: Sized + Serialize + DeserializeOwned { fn gen_hash_key(&self, key_len: u32, value_len: u32) -> Result { let mut bytes: [u8; 32] = [0; 32]; - // XXX fix expect msg let bin = bincode::serialize(&self).expect("serialize a key fail"); let mut b = Blake2s::new(24); @@ -49,7 +53,6 @@ pub trait Key: Sized + Serialize + DeserializeOwned { fn gen_hash(&self) -> Result<[u8; 24]> { let mut hash: [u8; 24] = [0; 24]; - // XXX fix expect msg let bin = bincode::serialize(&self).expect("serialize a key fail"); let mut b = Blake2s::new(24); @@ -80,18 +83,16 @@ impl AsHashKey for Raw { } impl Key for Raw { - // XXX: typo raw - fn from_raw_key(x: &Row) -> Result { + fn from_row_key(x: &Row) -> Result { Ok(Raw::try_from(x).expect("Data loose from Row to Raw")) } - fn to_raw_key(&self) -> Result { + fn to_row_key(&self) -> Result { Ok(self.into()) } } impl Key for Row { - // XXX: typo raw - fn from_raw_key(x: &Row) -> Result { + fn from_row_key(x: &Row) -> Result { Ok(x.clone()) } } diff --git a/sewup/src/kv/traits/mod.rs b/sewup/src/kv/traits/mod.rs index b787aab7c..e0d527d73 100644 --- a/sewup/src/kv/traits/mod.rs +++ b/sewup/src/kv/traits/mod.rs @@ -1,3 +1,4 @@ +//! traits for Key and Value pub mod key; pub use key::Key; diff --git a/sewup/src/kv/traits/value.rs b/sewup/src/kv/traits/value.rs index 57ca329dd..24b818a20 100644 --- a/sewup/src/kv/traits/value.rs +++ b/sewup/src/kv/traits/value.rs @@ -1,3 +1,4 @@ +//! helps serialized value object into raw and also deserialize the raw back to object use std::borrow::Borrow; use std::convert::TryFrom; @@ -7,10 +8,16 @@ use serde::Serialize; use crate::types::{Raw, Row}; -//TODO make Header bigger for big object storage +/// helps to serialize struct as Value to row or deserialized from row +/// ```compile_fail +/// | 1st bytes | ... | padding | +/// |-----------|--------|---------------------------| +/// | Header | Binary | padding to n times Byte32 | +/// ``` +/// Header is the number of bytes for binary +//TODO make Header bigger for big value object storage pub trait Value: Sized + Serialize + DeserializeOwned { - // XXX: typo raw - fn to_raw_value(&self) -> Result { + fn to_row_value(&self) -> Result { let mut bin = bincode::serialize(&self).expect("serialize a value fail"); let length = bin.len(); let header = ((length + 1) & 31) as u8; // padding bytes @@ -18,34 +25,31 @@ pub trait Value: Sized + Serialize + DeserializeOwned { vec.append(&mut bin); Ok(vec.into()) } - fn from_raw_value(r: &Row) -> Result { + fn from_row_value(r: &Row) -> Result { let buffer: &[u8] = r.borrow(); let header = buffer[0] as usize; - // XXX: fix expect msg let instance: Self = bincode::deserialize(&buffer[1..buffer.len() - header + 1]) - .expect("load db binary fail"); + .expect("load binary to row fail fail"); Ok(instance) } } impl Value for Raw { - // XXX: typo raw - fn to_raw_value(&self) -> Result { + fn to_row_value(&self) -> Result { Ok(self.into()) } - fn from_raw_value(r: &Row) -> Result { + fn from_row_value(r: &Row) -> Result { Ok(Raw::try_from(r).expect("Data loose from Row to Raw")) } } impl Value for Row { - // XXX: typo raw - fn to_raw_value(&self) -> Result { + fn to_row_value(&self) -> Result { Ok(self.clone()) } - fn from_raw_value(r: &Row) -> Result { + fn from_row_value(r: &Row) -> Result { Ok(r.clone()) } } diff --git a/sewup/src/lib.rs b/sewup/src/lib.rs index d34679664..50cd2fb8d 100644 --- a/sewup/src/lib.rs +++ b/sewup/src/lib.rs @@ -14,16 +14,19 @@ //! sewup-derive = { version = "*", features = ['rdb'] } //! ``` +/// help you build up you contract to handle tokens (experimental) #[cfg(feature = "token")] pub mod token; #[cfg(feature = "token")] pub use token::*; +/// help you storage thing as key value object pair #[cfg(feature = "kv")] pub mod kv; #[cfg(feature = "kv")] pub use kv::*; +/// help you storage thing as records in tables #[cfg(feature = "rdb")] pub mod rdb; #[cfg(feature = "rdb")] @@ -31,22 +34,25 @@ pub use rdb::*; pub mod errors; -#[allow(dead_code)] +/// The primitvie used in contract #[cfg(not(test))] pub mod primitives; #[allow(dead_code)] pub mod utils; +/// The run time helps user to setup the contract testing environment #[cfg(not(target_arch = "wasm32"))] pub mod runtimes; -#[allow(unused_variables)] +/// The basic types for storage in low level, and also easiler to used for bytes and string. pub mod types; -pub use bincode; - -/// Re export the ewasm_api +/// Re-export the ewasm_api /// these api is low level apis, it is better to keep in a library not in the contract file #[cfg(target_arch = "wasm32")] pub use ewasm_api; + +pub use bincode; +pub use serde::{Deserialize as DeserializeTrait, Serialize as SerializeTrait}; +pub use serde_derive::{Deserialize, Serialize}; diff --git a/sewup/src/rdb/db.rs b/sewup/src/rdb/db.rs index 447243c79..8b3a7a8eb 100644 --- a/sewup/src/rdb/db.rs +++ b/sewup/src/rdb/db.rs @@ -2,10 +2,12 @@ use std::convert::TryInto; use std::marker::PhantomData; use std::ops::Range; +use crate::rdb::errors::Error; use crate::rdb::table::Table; use crate::rdb::traits::{Record, HEADER_SIZE}; -use crate::rdb::{errors::Error, Deserialize, Feature, Serialize, SerializeTrait}; +use crate::rdb::Feature; use crate::utils::storage_index_to_addr; +use crate::{Deserialize, Serialize, SerializeTrait}; use anyhow::Result; #[cfg(target_arch = "wasm32")] @@ -18,7 +20,7 @@ const VERSION: u8 = 0; #[cfg(target_arch = "wasm32")] const CONFIG_ADDR: [u8; 32] = [0; 32]; -pub type TableSig = [u8; 4]; +pub(crate) type TableSig = [u8; 4]; /// Metadata of table #[derive(Serialize, Deserialize, Clone, Default, Debug, PartialEq)] @@ -33,16 +35,20 @@ pub struct TableInfo { /// into the latest block. /// /// ## Storage map +/// ```compile_fail /// | 0th ~ 31th bytes | dynamic size | dynamic size | dynamic size | /// |------------------|--------------|---------------------------|--------------| /// | DB header | Table info | Table data of first table | ... | +/// ``` /// /// ### DB Header /// The fist 32 bytes are reserved as header of the store, /// +/// ```compile_fail /// | 0th | 1st | 2nd ~ 3rd | ... | 28th ~ 31st | /// |----------------|--------------|-------------------|-----|--------------------------| /// | Sewup Features | version (BE) | RDB Features (LE) | - | length of TableInfo (BE) | +/// ``` /// /// Base on the features, the storage may have different encoding in to binary #[derive(Serialize)] @@ -179,7 +185,7 @@ impl Db { } if VERSION != config[1] { - // TODO + // TODO data migrate from different version panic!("migration not implement") } diff --git a/sewup/src/rdb/mod.rs b/sewup/src/rdb/mod.rs index e2de6b4c2..8c6a21b10 100644 --- a/sewup/src/rdb/mod.rs +++ b/sewup/src/rdb/mod.rs @@ -1,5 +1,6 @@ //! `rdb` feature provides a simple way to store things with relations into ethereum runtime. +/// DB feature flag to enable the different feature for db #[derive(Debug, PartialEq)] pub enum Feature { Default = 1, @@ -14,6 +15,3 @@ pub use table::*; pub mod traits; pub mod errors; - -pub use serde::Serialize as SerializeTrait; -pub use serde_derive::{Deserialize, Serialize}; diff --git a/sewup/src/rdb/traits.rs b/sewup/src/rdb/traits.rs index 24c343d98..7894057c0 100644 --- a/sewup/src/rdb/traits.rs +++ b/sewup/src/rdb/traits.rs @@ -1,3 +1,4 @@ +//! traits for Record, which the item in an table use std::borrow::Borrow; use anyhow::Result; @@ -7,13 +8,15 @@ use serde::Serialize; use crate::rdb::errors::Error; use crate::types::{Raw, Row}; -//XXX make Header bigger for big object storage +//TODO make Header bigger for big object storage pub const HEADER_SIZE: u32 = 1; /// helps to serialize struct to row or deserialized from row +/// ```compile_fail /// | 1st bytes | ... | padding | /// |-----------|--------|---------------------------| /// | Header | Binary | padding to n times Byte32 | +/// ``` /// Header is the number of bytes for binary, /// Record can be delete by simple mark the header zero pub trait Record: Sized + Serialize + DeserializeOwned { diff --git a/sewup/src/token/helpers.rs b/sewup/src/token/helpers.rs index 9f1f1d3d2..2ba4ffe6e 100644 --- a/sewup/src/token/helpers.rs +++ b/sewup/src/token/helpers.rs @@ -22,7 +22,7 @@ pub fn calculate_balance_hash(address: &[u8; 20]) -> Vec { } #[cfg(not(target_arch = "wasm32"))] -pub fn get_balance(address: &Address) -> StorageValue { +pub fn get_balance(_address: &Address) -> StorageValue { StorageValue {} } #[cfg(target_arch = "wasm32")] @@ -36,7 +36,7 @@ pub fn get_balance(address: &Address) -> StorageValue { } #[cfg(not(target_arch = "wasm32"))] -pub fn set_balance(address: &Address, value: &StorageValue) {} +pub fn set_balance(_address: &Address, _value: &StorageValue) {} #[cfg(target_arch = "wasm32")] pub fn set_balance(address: &Address, value: &StorageValue) { let hash = calculate_balance_hash(&address.bytes); @@ -47,7 +47,7 @@ pub fn set_balance(address: &Address, value: &StorageValue) { } #[cfg(not(target_arch = "wasm32"))] -pub fn get_allowance(sender: &Address, spender: &Address) -> StorageValue { +pub fn get_allowance(_sender: &Address, _spender: &Address) -> StorageValue { StorageValue {} } #[cfg(target_arch = "wasm32")] @@ -60,7 +60,7 @@ pub fn get_allowance(sender: &Address, spender: &Address) -> StorageValue { } #[cfg(not(target_arch = "wasm32"))] -pub fn set_allowance(sender: &Address, spender: &Address, value: &StorageValue) {} +pub fn set_allowance(_sender: &Address, _spender: &Address, _value: &StorageValue) {} #[cfg(target_arch = "wasm32")] pub fn set_allowance(sender: &Address, spender: &Address, value: &StorageValue) { let hash = calculate_allowance_hash(&sender.bytes, &spender.bytes); @@ -71,7 +71,7 @@ pub fn set_allowance(sender: &Address, spender: &Address, value: &StorageValue) } #[cfg(not(target_arch = "wasm32"))] -pub fn copy_into_storage_value(slice: &[u8]) -> StorageValue { +pub fn copy_into_storage_value(_slice: &[u8]) -> StorageValue { StorageValue {} } #[cfg(target_arch = "wasm32")] @@ -82,7 +82,7 @@ pub fn copy_into_storage_value(slice: &[u8]) -> StorageValue { } #[cfg(not(target_arch = "wasm32"))] -pub fn copy_into_address(slice: &[u8]) -> Address { +pub fn copy_into_address(_slice: &[u8]) -> Address { Address {} } #[cfg(target_arch = "wasm32")]