diff --git a/greeting/Cargo.toml b/greeting/Cargo.toml index 5159f29..20abcd9 100644 --- a/greeting/Cargo.toml +++ b/greeting/Cargo.toml @@ -12,4 +12,4 @@ name = "greeting" path = "src/main.rs" [dependencies] -fluence = "0.5.0" +fluence = "0.6.2" diff --git a/web3-examples/web3-examples/Readme.md b/web3-examples/web3-examples/Readme.md index 54fc2f3..0a179b7 100644 --- a/web3-examples/web3-examples/Readme.md +++ b/web3-examples/web3-examples/Readme.md @@ -91,7 +91,7 @@ pub fn eth_get_balance(url: String, account: String, block_number: String) -> Js let params: Vec = vec![account, block_identifier]; let curl_args: String = Request::new(method, params, id).as_sys_string(&url); - let response: String = unsafe { curl_request(curl_args) }; + let response: String = curl_request(vec![curl_args]); check_response_string(response, &id) } ``` diff --git a/web3-examples/web3-examples/curl_adapter/Cargo.lock b/web3-examples/web3-examples/curl_adapter/Cargo.lock index 829ce93..3463dfb 100644 --- a/web3-examples/web3-examples/curl_adapter/Cargo.lock +++ b/web3-examples/web3-examples/curl_adapter/Cargo.lock @@ -1,11 +1,30 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. +[[package]] +name = "autocfg" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a" + [[package]] name = "cfg-if" version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +[[package]] +name = "chrono" +version = "0.4.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "670ad68c9088c2a963aaa298cb369688cf3f9465ce5e2d4ca10e6e0098a1ce73" +dependencies = [ + "libc", + "num-integer", + "num-traits", + "time", + "winapi", +] + [[package]] name = "curl_adapter" version = "0.1.0" @@ -15,29 +34,41 @@ dependencies = [ ] [[package]] -name = "fluence" -version = "0.2.18" +name = "fce-timestamp-macro" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27d9a5e4292d7bbd809a0e968e3c3aacac91cbc5acab3e26ee1e1d726f0aab24" +checksum = "3c59a6302902583b2c84e87de9d72b949da4396a369baf0aaa49e97021600bb0" dependencies = [ + "chrono", + "quote", +] + +[[package]] +name = "fluence" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b731bd4a69a3945186f2ff96ff753908939c8a2debd60e1f0e8edb6a28757f8" +dependencies = [ + "fce-timestamp-macro", "fluence-sdk-macro", "fluence-sdk-main", + "serde", ] [[package]] name = "fluence-sdk-macro" -version = "0.2.18" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea1a7c75a617f827d1ba9a17b4d84e1565ab239915c63f5a85c41f89a9f1d4ba" +checksum = "cb43d2f51f1becb70e2125ef8ca9759597900f95cc22ce7dca981a7d6ccd7dde" dependencies = [ "fluence-sdk-wit", ] [[package]] name = "fluence-sdk-main" -version = "0.2.18" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6edcc983f9517c1b6bf9f851ef27f2894a3159aaa4a2fb6c9deb2ae8ecb603fa" +checksum = "a78910d85e3cdcb9c2baf56144f20a99925c67ac445d4156220c005bfd2f9604" dependencies = [ "fluence-sdk-macro", "log", @@ -46,9 +77,9 @@ dependencies = [ [[package]] name = "fluence-sdk-wit" -version = "0.2.18" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b75dbdd0275160f3818db3218563d791e6c612b616cd3c5d6e66283f207f648d" +checksum = "eab3ed39703b72e0e52bce9e1760746c73f65a5694c8da4dec751d3bfdec15b8" dependencies = [ "proc-macro2", "quote", @@ -90,6 +121,25 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "num-integer" +version = "0.1.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2cc698a63b549a70bc047073d2949cce27cd1c7b0a4a862d08a8031bc2801db" +dependencies = [ + "autocfg", + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a64b1ec5cda2586e284722486d802acf1f7dbdc623e2bfc57e65ca1cd099290" +dependencies = [ + "autocfg", +] + [[package]] name = "proc-macro2" version = "1.0.24" @@ -101,9 +151,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.8" +version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "991431c3519a3f36861882da93630ce66b52918dcf1b8e2fd66b397fc96f28df" +checksum = "c3d0b9745dc2debf507c8422de05d7226cc1f0644216dfdfead988f9b1ab32a7" dependencies = [ "proc-macro2", ] @@ -147,15 +197,26 @@ dependencies = [ [[package]] name = "syn" -version = "1.0.60" +version = "1.0.67" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c700597eca8a5a762beb35753ef6b94df201c81cca676604f547495a0d7f0081" +checksum = "6498a9efc342871f91cc2d0d694c674368b4ceb40f62b65a7a08c3792935e702" dependencies = [ "proc-macro2", "quote", "unicode-xid", ] +[[package]] +name = "time" +version = "0.1.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6db9e6914ab8b1ae1c260a4ae7a49b6c5611b40328a735b21862567685e73255" +dependencies = [ + "libc", + "wasi", + "winapi", +] + [[package]] name = "unicode-xid" version = "0.2.1" @@ -173,6 +234,28 @@ dependencies = [ [[package]] name = "wasi" -version = "0.10.2+wasi-snapshot-preview1" +version = "0.10.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6" +checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f" + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" diff --git a/web3-examples/web3-examples/curl_adapter/Cargo.toml b/web3-examples/web3-examples/curl_adapter/Cargo.toml index b183740..ae2a394 100644 --- a/web3-examples/web3-examples/curl_adapter/Cargo.toml +++ b/web3-examples/web3-examples/curl_adapter/Cargo.toml @@ -10,5 +10,5 @@ path = "src/main.rs" name = "curl_adapter" [dependencies] -fluence = { version = "=0.2.18", features = ["logger"]} +fluence = { version = "=0.6.2", features = ["logger"]} log = "0.4.8" diff --git a/web3-examples/web3-examples/curl_adapter/src/main.rs b/web3-examples/web3-examples/curl_adapter/src/main.rs index 65406ba..ed0c375 100644 --- a/web3-examples/web3-examples/curl_adapter/src/main.rs +++ b/web3-examples/web3-examples/curl_adapter/src/main.rs @@ -14,26 +14,30 @@ * limitations under the License. */ +#![allow(improper_ctypes)] + use fluence::fce; +use fluence::module_manifest; +use fluence::MountedBinaryResult; use fluence::WasmLoggerBuilder; -/// Log level can be changed by `RUST_LOG` env as well. -pub fn main() { +module_manifest!(); + +fn main() { WasmLoggerBuilder::new().build().unwrap(); } #[fce] -pub fn curl_request(url: String) -> String { - // log::info!("get called with url {}", url); - - unsafe { curl(url) } +pub fn curl_request(curl_cmd: Vec) -> MountedBinaryResult { + let response = curl(curl_cmd); + response } -/// Permissions in `Config.toml` should exist to use host functions. +// mounted_binaries are available to import like this: #[fce] #[link(wasm_import_module = "host")] extern "C" { - fn curl(cmd: String) -> String; + pub fn curl(cmd: Vec) -> MountedBinaryResult; } #[cfg(test)] @@ -48,7 +52,7 @@ mod test { let cmd = format!("{} {}", args, url); println!("cmd: {}", cmd); - let res = curl_request(cmd); + let res = curl_request(vec![cmd]); println!("res: {}", res); assert!(true); } diff --git a/web3-examples/web3-examples/facade/Cargo.lock b/web3-examples/web3-examples/facade/Cargo.lock index fadbbb2..a086445 100644 --- a/web3-examples/web3-examples/facade/Cargo.lock +++ b/web3-examples/web3-examples/facade/Cargo.lock @@ -108,6 +108,16 @@ dependencies = [ "tiny-keccak", ] +[[package]] +name = "fce-timestamp-macro" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c59a6302902583b2c84e87de9d72b949da4396a369baf0aaa49e97021600bb0" +dependencies = [ + "chrono", + "quote", +] + [[package]] name = "fixed-hash" version = "0.7.0" @@ -122,28 +132,30 @@ dependencies = [ [[package]] name = "fluence" -version = "0.2.18" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27d9a5e4292d7bbd809a0e968e3c3aacac91cbc5acab3e26ee1e1d726f0aab24" +checksum = "5b731bd4a69a3945186f2ff96ff753908939c8a2debd60e1f0e8edb6a28757f8" dependencies = [ + "fce-timestamp-macro", "fluence-sdk-macro", "fluence-sdk-main", + "serde", ] [[package]] name = "fluence-sdk-macro" -version = "0.2.18" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea1a7c75a617f827d1ba9a17b4d84e1565ab239915c63f5a85c41f89a9f1d4ba" +checksum = "cb43d2f51f1becb70e2125ef8ca9759597900f95cc22ce7dca981a7d6ccd7dde" dependencies = [ "fluence-sdk-wit", ] [[package]] name = "fluence-sdk-main" -version = "0.2.18" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6edcc983f9517c1b6bf9f851ef27f2894a3159aaa4a2fb6c9deb2ae8ecb603fa" +checksum = "a78910d85e3cdcb9c2baf56144f20a99925c67ac445d4156220c005bfd2f9604" dependencies = [ "fluence-sdk-macro", "log", @@ -152,9 +164,9 @@ dependencies = [ [[package]] name = "fluence-sdk-wit" -version = "0.2.18" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b75dbdd0275160f3818db3218563d791e6c612b616cd3c5d6e66283f207f648d" +checksum = "eab3ed39703b72e0e52bce9e1760746c73f65a5694c8da4dec751d3bfdec15b8" dependencies = [ "proc-macro2", "quote", @@ -183,9 +195,9 @@ dependencies = [ [[package]] name = "hex" -version = "0.4.2" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "644f9158b2f133fd50f5fb3242878846d9eb792e445c893805ff0e3824006e35" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" [[package]] name = "impl-codec" @@ -296,9 +308,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.8" +version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "991431c3519a3f36861882da93630ce66b52918dcf1b8e2fd66b397fc96f28df" +checksum = "c3d0b9745dc2debf507c8422de05d7226cc1f0644216dfdfead988f9b1ab32a7" dependencies = [ "proc-macro2", ] @@ -383,9 +395,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.61" +version = "1.0.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fceb2595057b6891a4ee808f70054bd2d12f0e97f1cbb78689b59f676df325a" +checksum = "799e97dc9fdae36a5c8b8f2cae9ce2ee9fdce2058c57a93e6099d919fd982f79" dependencies = [ "itoa", "ryu", @@ -400,9 +412,9 @@ checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" [[package]] name = "syn" -version = "1.0.60" +version = "1.0.67" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c700597eca8a5a762beb35753ef6b94df201c81cca676604f547495a0d7f0081" +checksum = "6498a9efc342871f91cc2d0d694c674368b4ceb40f62b65a7a08c3792935e702" dependencies = [ "proc-macro2", "quote", diff --git a/web3-examples/web3-examples/facade/Cargo.toml b/web3-examples/web3-examples/facade/Cargo.toml index f4a6ef2..22cb1f0 100644 --- a/web3-examples/web3-examples/facade/Cargo.toml +++ b/web3-examples/web3-examples/facade/Cargo.toml @@ -12,11 +12,11 @@ name = "facade" path = "src/main.rs" [dependencies] -serde = {version = "1.0", features = ["derive"] } -serde_json = "1.0" -fluence = { version = "=0.2.18", features = ["logger"]} +serde = {version = "1.0.118", features = ["derive"] } +serde_json = "1.0.64" +fluence = { version = "=0.6.2", features = ["logger"]} log = "0.4.8" chrono = "0.4.19" ethereum-types = "0.11.0" -hex = "0.4.2" +hex = "0.4.3" tiny-keccak = {version = "2.0.2", features = ["keccak", "sha3"]} \ No newline at end of file diff --git a/web3-examples/web3-examples/facade/src/eth_calls.rs b/web3-examples/web3-examples/facade/src/eth_calls.rs index b2b31a2..6c8d76a 100644 --- a/web3-examples/web3-examples/facade/src/eth_calls.rs +++ b/web3-examples/web3-examples/facade/src/eth_calls.rs @@ -17,10 +17,10 @@ use crate::curl_request; use crate::eth_utils::{check_response_string, get_nonce, BLOCK_NUMBER_TAGS}; use crate::fce_results::JsonRpcResult; -use crate::jsonrpc_helpers::{Request, batch}; +use crate::jsonrpc_helpers::{batch, Request}; use chrono::Utc; use fluence::fce; -use serde::{Deserialize, Serialize, Deserializer}; +use serde::{Deserialize, Deserializer, Serialize}; use serde_json; use serde_json::Value; use std::sync::atomic::{AtomicUsize, Ordering}; @@ -42,7 +42,8 @@ pub fn eth_get_balance(url: String, account: String, block_number: String) -> Js let params: Vec = vec![account, block_identifier]; let curl_args: String = Request::new(method, params, id).as_sys_string(&url); - let response: String = unsafe { curl_request(curl_args) }; + let response = curl_request(vec![curl_args]); + let response = String::from_utf8(response.stdout).unwrap(); check_response_string(response, &id) } @@ -53,7 +54,8 @@ pub fn eth_get_block_height(url: String) -> JsonRpcResult { let id = get_nonce(); let curl_args: String = Request::new(method, params, id).as_sys_string(&url); - let response: String = unsafe { curl_request(curl_args) }; + let response = curl_request(vec![curl_args]); + let response = String::from_utf8(response.stdout).unwrap(); check_response_string(response, &id) } @@ -64,7 +66,8 @@ pub fn eth_get_tx_by_hash(url: String, tx_hash: String) -> String { let id = get_nonce(); let curl_args: String = Request::new(method, params, id).as_sys_string(&url); - let response: String = unsafe { curl_request(curl_args) }; + let response = curl_request(vec![curl_args]); + let response = String::from_utf8(response.stdout).unwrap(); response } @@ -95,9 +98,9 @@ pub struct TxSerde { } fn null_to_default<'de, D, T>(d: D) -> Result - where - D: Deserializer<'de>, - T: Default + Deserialize<'de>, +where + D: Deserializer<'de>, + T: Default + Deserialize<'de>, { let opt = Option::deserialize(d)?; let val = opt.unwrap_or_else(T::default); @@ -107,7 +110,7 @@ fn null_to_default<'de, D, T>(d: D) -> Result #[derive(serde::Deserialize)] struct GetTxResponse { #[serde(deserialize_with = "null_to_default")] - result: Option + result: Option, } #[fce] @@ -138,7 +141,7 @@ impl From for Tx { nonce: ser.nonce.unwrap_or_default(), to: ser.to.unwrap_or_default(), transactionIndex: ser.transactionIndex.unwrap_or_default(), - value: ser.value.unwrap_or_default() + value: ser.value.unwrap_or_default(), } } } @@ -149,19 +152,22 @@ pub fn eth_get_txs_by_hashes(url: String, tx_hashes: Vec) -> Vec { let params: Vec<_> = tx_hashes.into_iter().map(|h| vec![h]).collect(); let requests = batch(url, method, params, get_nonce()); match requests { - Ok(requests) => { - requests.into_iter().flat_map(|req| { - let response: String = unsafe { curl_request(req) }; - let responses: Vec = serde_json::from_str(response.as_str()).unwrap_or_else(|err| { - log::error!("failed to deserialize batch response: {}", err); - panic!("failed to deserialize batch response: {}", err); - }); + Ok(requests) => requests + .into_iter() + .flat_map(|req| { + let response = curl_request(vec![req]); + let response = String::from_utf8(response.stdout).unwrap(); + let responses: Vec = serde_json::from_str(response.as_str()) + .unwrap_or_else(|err| { + log::error!("failed to deserialize batch response: {}", err); + panic!("failed to deserialize batch response: {}", err); + }); responses.into_iter().flat_map(|r| Some(r.result?.into())) - }).collect() - }, + }) + .collect(), Err(err) => { log::error!("failed to create batch request: {}", err); vec![] } } -} \ No newline at end of file +} diff --git a/web3-examples/web3-examples/facade/src/eth_filters.rs b/web3-examples/web3-examples/facade/src/eth_filters.rs index 6ca3ff0..ac9c83e 100644 --- a/web3-examples/web3-examples/facade/src/eth_filters.rs +++ b/web3-examples/web3-examples/facade/src/eth_filters.rs @@ -14,8 +14,8 @@ * limitations under the License. */ use crate::curl_request; +use crate::eth_calls::{eth_get_tx_by_hash, eth_get_txs_by_hashes, Tx}; use crate::eth_utils::{check_response_string, get_nonce}; -use crate::eth_calls::{eth_get_tx_by_hash, Tx, eth_get_txs_by_hashes}; use crate::fce_results::JsonRpcResult; use crate::jsonrpc_helpers::Request; use crate::jsonrpc_helpers::JSON_RPC; @@ -35,7 +35,8 @@ pub fn uninstall_filter(url: String, filter_id: String) -> bool { // let request = Request::new(method, params, id); let curl_args = Request::new(method, params, id).as_sys_string(&url); - let response: String = unsafe { curl_request(curl_args) }; + let response = curl_request(vec![curl_args]); + let response = String::from_utf8(response.stdout).unwrap(); /* if response.len() == 0 || response.contains("error") { @@ -71,7 +72,8 @@ pub fn new_pending_tx_filter(url: String) -> String { let id = get_nonce(); let curl_args = Request::new(method, params, id).as_sys_string(&url); - let response: String = unsafe { curl_request(curl_args) }; + let response = curl_request(vec![curl_args]); + let response = String::from_utf8(response.stdout).unwrap(); let result_obj: Value = serde_json::from_str(&response).unwrap(); let result: String = serde_json::from_value(result_obj["result"].clone()).unwrap(); @@ -89,11 +91,11 @@ pub fn get_filter_changes(url: String, filter_id: String) -> String { let curl_args = Request::new(method, params, id).as_sys_string(&url); - let response: String = unsafe { curl_request(curl_args) }; + let response = curl_request(vec![curl_args]); + let response = String::from_utf8(response.stdout).unwrap(); response } - #[fce] pub fn get_filter_changes_list(url: String, filter_id: String) -> Vec { let method = String::from("eth_getFilterChanges"); @@ -102,7 +104,8 @@ pub fn get_filter_changes_list(url: String, filter_id: String) -> Vec { let curl_args = Request::new(method, params, id).as_sys_string(&url); - let response = unsafe { curl_request(curl_args) }; + let response = curl_request(vec![curl_args]); + let response = String::from_utf8(response.stdout).unwrap(); log::info!("response: {}", response); let mut response: Value = serde_json::from_str(&response).unwrap_or_else(|_| { log::error!("failed to parse ETH RPC response as json"); @@ -113,10 +116,13 @@ pub fn get_filter_changes_list(url: String, filter_id: String) -> Vec { panic!("no 'result' field found in ETH RPC response"); }); if let Value::Array(results) = result.take() { - let tx_hashes: Vec<_> = results.into_iter().flat_map(|r| { - let hash = r.as_str()?; - Some(hash.to_string()) - }).collect(); + let tx_hashes: Vec<_> = results + .into_iter() + .flat_map(|r| { + let hash = r.as_str()?; + Some(hash.to_string()) + }) + .collect(); log::info!("got {} tx hashes", tx_hashes.len()); tx_hashes } else { diff --git a/web3-examples/web3-examples/facade/src/main.rs b/web3-examples/web3-examples/facade/src/main.rs index 3edfb00..8fac484 100644 --- a/web3-examples/web3-examples/facade/src/main.rs +++ b/web3-examples/web3-examples/facade/src/main.rs @@ -14,9 +14,17 @@ * limitations under the License. */ -#![allow(non_snake_case, unused_variables, unused_imports, unused_parens, unused_mut)] +#![allow( + non_snake_case, + unused_variables, + unused_imports, + unused_parens, + unused_mut +)] use fluence::fce; +use fluence::module_manifest; +use fluence::MountedBinaryResult; use fluence::WasmLoggerBuilder; mod data_processing; @@ -31,6 +39,8 @@ mod jsonrpc_helpers; pub(crate) type Result = std::result::Result; +module_manifest!(); + pub fn main() { WasmLoggerBuilder::new().build().ok(); } @@ -38,5 +48,5 @@ pub fn main() { #[fce] #[link(wasm_import_module = "curl_adapter")] extern "C" { - pub fn curl_request(url: String) -> String; + pub fn curl_request(url: Vec) -> MountedBinaryResult; }