From 6901467d0e3c81cc5a6dc6a926fbc86981e79976 Mon Sep 17 00:00:00 2001 From: vms Date: Sat, 5 Feb 2022 00:24:28 +0300 Subject: [PATCH] add ipfs-node service --- README.md | 31 ++ build.sh | 16 + {hello_world => hello-world}/Cargo.lock | 0 {hello_world => hello-world}/Cargo.toml | 0 {hello_world => hello-world}/Config.toml | 0 .../artifacts/greeting.wasm | Bin 69629 -> 69629 bytes {hello_world => hello-world}/build.sh | 0 {hello_world => hello-world}/src/main.rs | 0 ipfs-node/Config.toml | 17 ++ ipfs-node/artifacts/ipfs_effector.wasm | Bin 0 -> 106146 bytes ipfs-node/artifacts/ipfs_pure.wasm | Bin 0 -> 112040 bytes ipfs-node/build.sh | 19 ++ ipfs-node/effector/Cargo.lock | 275 ++++++++++++++++++ ipfs-node/effector/Cargo.toml | 14 + ipfs-node/effector/src/main.rs | 101 +++++++ ipfs-node/effector/src/path.rs | 52 ++++ ipfs-node/pure/Cargo.lock | 275 ++++++++++++++++++ ipfs-node/pure/Cargo.toml | 14 + ipfs-node/pure/src/main.rs | 74 +++++ 19 files changed, 888 insertions(+) create mode 100644 README.md create mode 100755 build.sh rename {hello_world => hello-world}/Cargo.lock (100%) rename {hello_world => hello-world}/Cargo.toml (100%) rename {hello_world => hello-world}/Config.toml (100%) rename {hello_world => hello-world}/artifacts/greeting.wasm (99%) rename {hello_world => hello-world}/build.sh (100%) rename {hello_world => hello-world}/src/main.rs (100%) create mode 100644 ipfs-node/Config.toml create mode 100755 ipfs-node/artifacts/ipfs_effector.wasm create mode 100755 ipfs-node/artifacts/ipfs_pure.wasm create mode 100755 ipfs-node/build.sh create mode 100644 ipfs-node/effector/Cargo.lock create mode 100644 ipfs-node/effector/Cargo.toml create mode 100644 ipfs-node/effector/src/main.rs create mode 100644 ipfs-node/effector/src/path.rs create mode 100644 ipfs-node/pure/Cargo.lock create mode 100644 ipfs-node/pure/Cargo.toml create mode 100644 ipfs-node/pure/src/main.rs diff --git a/README.md b/README.md new file mode 100644 index 0000000..9f339a8 --- /dev/null +++ b/README.md @@ -0,0 +1,31 @@ +## Moscow blockchain hackathon tutorial + +### Installation + +To compile and run these example you need to install + - rust with wasm32-wasi target +```bash +curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh +rustup install nightly +rustup target add wasm32-wasi +``` +- Marine tools +```bash +cargo install marine +cargo +nightly install mrepl +``` +- Fluence deploying tools +```bash +npm -g install @fluencelabs/fldist +``` + +### Building + +To build all the examples just run the following command +```bash +./build.sh +``` + +### Deploying and calling from Aqua + +TBD diff --git a/build.sh b/build.sh new file mode 100755 index 0000000..4ac71d6 --- /dev/null +++ b/build.sh @@ -0,0 +1,16 @@ +#!/bin/sh + +( + cd hello_world || exit; + ./build.sh +) + +( + cd url-downloader || exit; + ./build.sh +) + +( + cd ipfs-node || exit; + ./build.sh +) diff --git a/hello_world/Cargo.lock b/hello-world/Cargo.lock similarity index 100% rename from hello_world/Cargo.lock rename to hello-world/Cargo.lock diff --git a/hello_world/Cargo.toml b/hello-world/Cargo.toml similarity index 100% rename from hello_world/Cargo.toml rename to hello-world/Cargo.toml diff --git a/hello_world/Config.toml b/hello-world/Config.toml similarity index 100% rename from hello_world/Config.toml rename to hello-world/Config.toml diff --git a/hello_world/artifacts/greeting.wasm b/hello-world/artifacts/greeting.wasm similarity index 99% rename from hello_world/artifacts/greeting.wasm rename to hello-world/artifacts/greeting.wasm index e5703c5dc9288eece13503d30f78e66f22ebb1e3..843ed21fd14270977faa539263ae12d8fec846aa 100755 GIT binary patch delta 33 pcmex6pXKj-mWC~ixB2*u46IB|tW3=G3=J*J%`CUS;$swM1OU)?3P}I} delta 33 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 o$2-`*mDKD^dZ2$WH+xpC1Cc(I`s)2l?)dWB>pF literal 0 HcmV?d00001 diff --git a/ipfs-node/artifacts/ipfs_pure.wasm b/ipfs-node/artifacts/ipfs_pure.wasm new file mode 100755 index 0000000000000000000000000000000000000000..8046d1336837f20db8b42ffad5c67ec4e219b1b8 GIT binary patch literal 112040 zcmeFa3z%h9b?>{@T>DvTSJkfWMoYSlYj4}wt+ccWc9RyhW<`Mxc=Y5uCnxvZ+zTYO zktziGVQcasT|k3vf(ePnU_ull1~d}!Z6Y}q2~na%iH`&m)Q)l!h+sGo6LNfTfB!Mo zT6p0(?xFWvPs`!3j%UHFQ9N%M$j zKf8-(jh9`pci;4R7yRs5uh{p}lh4|_Z_l~s|7?;!?v>~4J@>4==bv-o-j`jl@2m^= z?Am|su2(*D`lT;9>!s(Ow`=ddbM~F3`mJLWY*TR0u5(_J^d6zW-d(#ElgAySK!+Ay zx#!${yN=mJ_ri1bz3i+DF5Go~vhEm-Ozb)5{Fhwt@<#+U-*x`}bN5_u{v#HesS52q z_vd%*eZ-;y{AbR)VDGLZI|fu!lmMfTio~^Jdvg` zOlK|r*UZD?TkSS)y3Np`c(WDAv|62(>a-@aR;Sqs{MT#*ezL6D?B;nl$yK}6>Lp#; z=_FY;m0N>(NB^VYPA8}pQdW>ZYg^5bAJ?`2h3>?}L>5A?+iNAgPLo$zqLO)`4@s+98%Xhu}f;~SMlKiZ*UbgF;3(xxLbN24a(uuRqddWHa&N*w> z`7dG2tjBZq>`Q(>w9Y+${{@S?l0OJjdw1<)Y3+T*c`VC)dy<>N^w<-TXY!t4>;0NA z#S$Ga`;jm`_QcBG95Sur-wKVFpL6c{$(uvxob%4R;AhTZ-MuAD@7Z{zdp)`u6bo^rrN$(!0`^ zT$R2t{j2bW@Y7q)_(1y1zYKSVkETEHW1kP73tvtD^D945`Mu{J@iw*k2r`8lTG2Sd*>#TnDqZBwMkwahWLeKrydP5FLBNN zbHj!n%pceuZn&RX^Gizyp^)Wdd$?BlB8{Dec;W7N=Q}_D&gR}>V_Tq7q{_B%Qkb& z0M9zlipIVe_yf=Yytrp~nb;iKVfkQrXaf_ zEDXV#QALB{w>3L$%~prPj`)G$=+1lR29%&oGp0pn->|dWr=#f5JabWmL5KM$0-z5% zdC?J3_n#UEXvTzaO}cVPAakYml|5 zttDc3)ou_nXcVmhQ=e&wK++#(pdyLutQ=$!@*=BCGuKRX(bzdm)>9Lt7bIFmHb{C& zo)@$`JD8v)61`!kXq{Ru5YZ|RnO)Y5TI?0A(~cLq%IO0^AcN(`?5~3|1g1ct5-`1B zQdH4j7$kWHoCAPjs>aK8>}}C0hmaQ_mbvatO+Fk@ zU1zZa)hhoax(M;%haYYmyu4ZZ?(-I6-zZ+ILr)Gr$(}&*T5q(yv@~r`p!sB9oZhcx zu%}4&ENUt26FZ8>E$oL2?1>u|2Du1=DX^7iG?uTJC1b>c4A`8)U|&yQSn2*n{yyo{ z_4@`b-r0MbK3n28tHWlIyok{@2TazWQ#5Uao^A}XUIzY(MmfpNqRFhb;uE!Y0pDi6 zaq4=CG}jL_$BmerMrQ>8*$ib6KP`qLuh~S=1__!az=3TXn}Q)0af{Yt=N99*8E6D7 z7*WF*c{1#sgO(;zWB|B;W0X8-L95m=B5*K zhbBuPp}=6Gdy^PS$)k7%i;I0;fa7r{$E-NVA>llT0@;EdT2U7kVq`q7B}Zl~zm^=5 zpC$iN0{%sDW4J6chYa}%s=^CJaHenwPRSo03N*=K$VvTDlmu)N;me#Lw2WbAqXxZ6 z)C*goo5FSXGf)$LkEEXT7DnpHF_aS)Y6Ftc>S2x~Fh7ovY%d_gfoO4f`!BgE-!%MIR z7=lB7s<<{w6�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 literal 0 HcmV?d00001 diff --git a/ipfs-node/build.sh b/ipfs-node/build.sh new file mode 100755 index 0000000..5bb1a73 --- /dev/null +++ b/ipfs-node/build.sh @@ -0,0 +1,19 @@ +#!/bin/sh + +( + cd effector || exit; + cargo update --aggressive; + marine build --release; +) + +( + cd pure || exit; + cargo update --aggressive; + marine build --release; +) + +rm artifacts/* || true +mkdir -p artifacts + +cp ./effector/target/wasm32-wasi/release/ipfs_effector.wasm artifacts/ +cp ./pure/target/wasm32-wasi/release/ipfs_pure.wasm artifacts/ diff --git a/ipfs-node/effector/Cargo.lock b/ipfs-node/effector/Cargo.lock new file mode 100644 index 0000000..b7d7150 --- /dev/null +++ b/ipfs-node/effector/Cargo.lock @@ -0,0 +1,275 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[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 = "getrandom" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "418d37c8b1d42553c93648be529cb70f920d3baf8ef469b74b9638df426e0b4c" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + +[[package]] +name = "ipfs-effector" +version = "0.1.0" +dependencies = [ + "log", + "marine-rs-sdk", +] + +[[package]] +name = "itoa" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1aab8fc367588b89dcee83ab0fd66b72b50b72fa1904d7095045ace2b0c81c35" + +[[package]] +name = "libc" +version = "0.2.117" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e74d72e0f9b65b5b4ca49a346af3976df0f9c61d550727f349ecd559f251a26c" + +[[package]] +name = "log" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51b9bbe6c47d51fc3e1a9b945965946b4c44142ab8792c50835a980d362c2710" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "marine-macro" +version = "0.6.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfc907943772cf966ebe2a2d462d09bc79e898ef102ed065ba3d3abcc93fbb71" +dependencies = [ + "marine-macro-impl", + "marine-rs-sdk-main", +] + +[[package]] +name = "marine-macro-impl" +version = "0.6.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfdbed3a10ae9b22df06bee8cd0023255358935aae8e8daf9d1a006cfaeeb11e" +dependencies = [ + "proc-macro2", + "quote", + "serde", + "serde_json", + "syn", + "uuid", +] + +[[package]] +name = "marine-rs-sdk" +version = "0.6.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d17d44016675abdf18caf3ac1bdd4437cc17ec0db019da141bb06a9ea991726" +dependencies = [ + "marine-macro", + "marine-rs-sdk-main", + "marine-timestamp-macro", + "polyplets", + "serde", +] + +[[package]] +name = "marine-rs-sdk-main" +version = "0.6.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ff262801664ce22f9d274504d6e8088c217034aba0ca431eca8d0258f3699c6" +dependencies = [ + "log", + "serde", +] + +[[package]] +name = "marine-timestamp-macro" +version = "0.6.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85a9f5b1adeff98ac5a14cfc5fa814185a807ba4a0d3849c9f9e9fd868b27d1f" +dependencies = [ + "chrono", + "quote", +] + +[[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 = "polyplets" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8cc56e7803860fa903c27675a17215e1cfb39fb26e111c0b93f6c049f9cf8d8e" +dependencies = [ + "marine-macro", + "marine-rs-sdk-main", + "serde", +] + +[[package]] +name = "proc-macro2" +version = "1.0.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7342d5883fbccae1cc37a2353b09c87c9b0f3afd73f5fb9bba687a1f733b029" +dependencies = [ + "unicode-xid", +] + +[[package]] +name = "quote" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "864d3e96a899863136fc6e99f3d7cae289dafe43bf2c5ac19b70df7210c0a145" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "ryu" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73b4b750c782965c211b42f022f59af1fbceabdd026623714f104152f1ec149f" + +[[package]] +name = "serde" +version = "1.0.136" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce31e24b01e1e524df96f1c2fdd054405f8d7376249a5110886fb4b658484789" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.136" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08597e7152fcd306f41838ed3e37be9eaeed2b61c42e2117266a554fab4662f9" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.78" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d23c1ba4cf0efd44be32017709280b32d1cea5c3f1275c3b6d9e8bc54f758085" +dependencies = [ + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "syn" +version = "1.0.86" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a65b3f4ffa0092e9887669db0eae07941f023991ab58ea44da8fe8e2d511c6b" +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.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3" + +[[package]] +name = "uuid" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7" +dependencies = [ + "getrandom", +] + +[[package]] +name = "wasi" +version = "0.10.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +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/ipfs-node/effector/Cargo.toml b/ipfs-node/effector/Cargo.toml new file mode 100644 index 0000000..6c53f93 --- /dev/null +++ b/ipfs-node/effector/Cargo.toml @@ -0,0 +1,14 @@ +[package] +name = "ipfs-effector" +version = "0.1.0" +authors = ["Fluence Labs"] +edition = "2018" +publish = false + +[[bin]] +name = "ipfs_effector" +path = "src/main.rs" + +[dependencies] +marine-rs-sdk ={ version = "0.6.13", features = ["logger"] } +log = "0.4.14" diff --git a/ipfs-node/effector/src/main.rs b/ipfs-node/effector/src/main.rs new file mode 100644 index 0000000..5cb314d --- /dev/null +++ b/ipfs-node/effector/src/main.rs @@ -0,0 +1,101 @@ +/* + * Copyright 2020 Fluence Labs Limited + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#![allow(improper_ctypes)] + +mod path; + +use crate::path::to_full_path; + +use marine_rs_sdk::marine; +use marine_rs_sdk::module_manifest; +use marine_rs_sdk::WasmLoggerBuilder; +use marine_rs_sdk::MountedBinaryResult; + +const RESULT_FILE_PATH: &str = "/tmp/ipfs_rpc_file"; +const IPFS_ADDR_ENV_NAME: &str = "IPFS_ADDR"; +const TIMEOUT_ENV_NAME: &str = "timeout"; + +module_manifest!(); + +pub fn main() { + WasmLoggerBuilder::new() + .with_log_level(log::LevelFilter::Info) + .build() + .unwrap(); +} + +/// Put file from specified path to IPFS and return its hash. +#[marine] +pub fn put(file_path: String) -> String { + log::info!("put called with file path {}", file_path); + + let file_path = to_full_path(file_path); + + let timeout = std::env::var(TIMEOUT_ENV_NAME).unwrap_or_else(|_| "1s".to_string()); + let cmd = vec![ + String::from("add"), + String::from("--timeout"), + timeout, + String::from("-Q"), + file_path, + ]; + + let ipfs_result = ipfs(cmd); + ipfs_result + .into_std() + .unwrap() + .unwrap_or_else(std::convert::identity) +} + +/// Get file by provided hash from IPFS, saves it to a temporary file and returns a path to it. +#[marine] +pub fn get(hash: String) -> String { + log::info!("get called with hash {}", hash); + + let result_file_path = to_full_path(RESULT_FILE_PATH); + + let timeout = std::env::var(TIMEOUT_ENV_NAME).unwrap_or_else(|_| "1s".to_string()); + let cmd = vec![ + String::from("get"), + String::from("--timeout"), + timeout, + String::from("-o"), + result_file_path, + hash, + ]; + + ipfs(cmd); + RESULT_FILE_PATH.to_string() +} + +#[marine] +pub fn get_address() -> String { + match std::env::var(IPFS_ADDR_ENV_NAME) { + Ok(addr) => addr, + Err(e) => format!( + "getting {} env variable failed with error {:?}", + IPFS_ADDR_ENV_NAME, e + ), + } +} + +#[marine] +#[link(wasm_import_module = "host")] +extern "C" { + /// Execute provided cmd as a parameters of ipfs cli, return result. + pub fn ipfs(cmd: Vec) -> MountedBinaryResult; +} diff --git a/ipfs-node/effector/src/path.rs b/ipfs-node/effector/src/path.rs new file mode 100644 index 0000000..4f7d0d5 --- /dev/null +++ b/ipfs-node/effector/src/path.rs @@ -0,0 +1,52 @@ +/* + * Copyright 2020 Fluence Labs Limited + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +pub(super) fn to_full_path(cmd: S) -> String +where + S: Into, +{ + use std::path::Path; + use std::path::Component; + + let cmd = cmd.into(); + let path = Path::new(&cmd); + + let mut components = path.components(); + let is_absolute = components.next() == Some(Component::RootDir); + + if !is_absolute { + return cmd; + } + + let parent = match components.next() { + Some(Component::Normal(path)) => path.to_str().unwrap(), + _ => return cmd, + }; + + match std::env::var(parent) { + Ok(to_dir) => { + let mut full_path = std::path::PathBuf::from(to_dir); + + // TODO: optimize this + #[allow(clippy::while_let_on_iterator)] + while let Some(component) = components.next() { + full_path.push(component); + } + full_path.to_string_lossy().into_owned() + } + Err(_) => cmd, + } +} diff --git a/ipfs-node/pure/Cargo.lock b/ipfs-node/pure/Cargo.lock new file mode 100644 index 0000000..7e0bc3b --- /dev/null +++ b/ipfs-node/pure/Cargo.lock @@ -0,0 +1,275 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[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 = "getrandom" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "418d37c8b1d42553c93648be529cb70f920d3baf8ef469b74b9638df426e0b4c" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + +[[package]] +name = "ipfs-pure" +version = "0.1.0" +dependencies = [ + "log", + "marine-rs-sdk", +] + +[[package]] +name = "itoa" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1aab8fc367588b89dcee83ab0fd66b72b50b72fa1904d7095045ace2b0c81c35" + +[[package]] +name = "libc" +version = "0.2.117" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e74d72e0f9b65b5b4ca49a346af3976df0f9c61d550727f349ecd559f251a26c" + +[[package]] +name = "log" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51b9bbe6c47d51fc3e1a9b945965946b4c44142ab8792c50835a980d362c2710" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "marine-macro" +version = "0.6.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfc907943772cf966ebe2a2d462d09bc79e898ef102ed065ba3d3abcc93fbb71" +dependencies = [ + "marine-macro-impl", + "marine-rs-sdk-main", +] + +[[package]] +name = "marine-macro-impl" +version = "0.6.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfdbed3a10ae9b22df06bee8cd0023255358935aae8e8daf9d1a006cfaeeb11e" +dependencies = [ + "proc-macro2", + "quote", + "serde", + "serde_json", + "syn", + "uuid", +] + +[[package]] +name = "marine-rs-sdk" +version = "0.6.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d17d44016675abdf18caf3ac1bdd4437cc17ec0db019da141bb06a9ea991726" +dependencies = [ + "marine-macro", + "marine-rs-sdk-main", + "marine-timestamp-macro", + "polyplets", + "serde", +] + +[[package]] +name = "marine-rs-sdk-main" +version = "0.6.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ff262801664ce22f9d274504d6e8088c217034aba0ca431eca8d0258f3699c6" +dependencies = [ + "log", + "serde", +] + +[[package]] +name = "marine-timestamp-macro" +version = "0.6.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85a9f5b1adeff98ac5a14cfc5fa814185a807ba4a0d3849c9f9e9fd868b27d1f" +dependencies = [ + "chrono", + "quote", +] + +[[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 = "polyplets" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8cc56e7803860fa903c27675a17215e1cfb39fb26e111c0b93f6c049f9cf8d8e" +dependencies = [ + "marine-macro", + "marine-rs-sdk-main", + "serde", +] + +[[package]] +name = "proc-macro2" +version = "1.0.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7342d5883fbccae1cc37a2353b09c87c9b0f3afd73f5fb9bba687a1f733b029" +dependencies = [ + "unicode-xid", +] + +[[package]] +name = "quote" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "864d3e96a899863136fc6e99f3d7cae289dafe43bf2c5ac19b70df7210c0a145" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "ryu" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73b4b750c782965c211b42f022f59af1fbceabdd026623714f104152f1ec149f" + +[[package]] +name = "serde" +version = "1.0.136" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce31e24b01e1e524df96f1c2fdd054405f8d7376249a5110886fb4b658484789" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.136" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08597e7152fcd306f41838ed3e37be9eaeed2b61c42e2117266a554fab4662f9" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.78" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d23c1ba4cf0efd44be32017709280b32d1cea5c3f1275c3b6d9e8bc54f758085" +dependencies = [ + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "syn" +version = "1.0.86" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a65b3f4ffa0092e9887669db0eae07941f023991ab58ea44da8fe8e2d511c6b" +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.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3" + +[[package]] +name = "uuid" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7" +dependencies = [ + "getrandom", +] + +[[package]] +name = "wasi" +version = "0.10.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +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/ipfs-node/pure/Cargo.toml b/ipfs-node/pure/Cargo.toml new file mode 100644 index 0000000..11db390 --- /dev/null +++ b/ipfs-node/pure/Cargo.toml @@ -0,0 +1,14 @@ +[package] +name = "ipfs-pure" +version = "0.1.0" +authors = ["Fluence Labs"] +edition = "2018" +publish = false + +[[bin]] +name = "ipfs_pure" +path = "src/main.rs" + +[dependencies] +marine-rs-sdk ={ version = "0.6.13", features = ["logger"] } +log = "0.4.14" diff --git a/ipfs-node/pure/src/main.rs b/ipfs-node/pure/src/main.rs new file mode 100644 index 0000000..7a28624 --- /dev/null +++ b/ipfs-node/pure/src/main.rs @@ -0,0 +1,74 @@ +/* + * Copyright 2020 Fluence Labs Limited + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#![allow(improper_ctypes)] + +use marine_rs_sdk::marine; +use marine_rs_sdk::module_manifest; +use marine_rs_sdk::WasmLoggerBuilder; + +use std::fs; +use std::path::PathBuf; + +const RPC_TMP_FILEPATH: &str = "/tmp/ipfs_rpc_file"; + +module_manifest!(); + +pub fn main() { + WasmLoggerBuilder::new() + .with_log_level(log::LevelFilter::Info) + .build() + .unwrap(); +} + +#[marine] +pub fn invoke() -> String { + "IPFS_RPC wasm example, it allows to:\ninvoke\nput\nget".to_string() +} + +#[marine] +pub fn put(file_content: Vec) -> String { + log::info!("put called with {:?}", file_content); + + let rpc_tmp_filepath = RPC_TMP_FILEPATH.to_string(); + + let r = fs::write(PathBuf::from(rpc_tmp_filepath.clone()), file_content); + if let Err(e) = r { + return format!("file can't be written: {}", e); + } + + ipfs_put(rpc_tmp_filepath) +} + +#[marine] +pub fn get(hash: String) -> Vec { + log::info!("get called with hash: {}", hash); + + let file_path = ipfs_get(hash); + fs::read(file_path).unwrap_or_else(|_| b"error while reading file".to_vec()) +} + +#[marine] +#[link(wasm_import_module = "ipfs_effector")] +extern "C" { + /// Put provided file to ipfs, return ipfs hash of the file. + #[link_name = "put"] + pub fn ipfs_put(file_path: String) -> String; + + /// Get file from ipfs by hash. + #[link_name = "get"] + pub fn ipfs_get(hash: String) -> String; +}