From 3ae65d12a3db10258dacb088625bf6bb9c31f3f0 Mon Sep 17 00:00:00 2001 From: Pavel Murygin <pavel@fluence.one> Date: Wed, 29 Dec 2021 15:22:01 +0000 Subject: [PATCH] GitBook: [#227] No subject --- .gitbook/assets/image (18).png | Bin 0 -> 60524 bytes .gitbook/assets/image (24).png | Bin 0 -> 36536 bytes SUMMARY.md | 38 +- knowledge_aquamarine/marine/marine-rs-sdk.md | 26 +- knowledge_tools.md | 13 +- quick-start/1.-browser-to-browser-1.md | 33 +- quick-start/2.-hosted-services.md | 35 +- ...service-composition-and-reuse-with-aqua.md | 55 +-- ...ntralized-oracles-with-fluence-and-aqua.md | 353 ++++++++++++++++++ tutorials_tutorials/recipes_setting_up.md | 24 +- .../tutorial_run_local_node.md | 107 +++--- 11 files changed, 517 insertions(+), 167 deletions(-) create mode 100644 .gitbook/assets/image (18).png create mode 100644 .gitbook/assets/image (24).png create mode 100644 quick-start/5.-decentralized-oracles-with-fluence-and-aqua.md diff --git a/.gitbook/assets/image (18).png b/.gitbook/assets/image (18).png new file mode 100644 index 0000000000000000000000000000000000000000..249a7876dc081c282100c667aa8f02ba3620360b GIT binary patch literal 60524 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 ZL<5uNvtssq5AJnBQBL(<@g38k{{wS-Uxokx literal 0 HcmV?d00001 diff --git a/.gitbook/assets/image (24).png b/.gitbook/assets/image (24).png new file mode 100644 index 0000000000000000000000000000000000000000..4f410083361ef50926039a4a053c4cfeb06e1c96 GIT binary patch literal 36536 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 C)ad;H literal 0 HcmV?d00001 diff --git a/SUMMARY.md b/SUMMARY.md index b74b71f..562071e 100644 --- a/SUMMARY.md +++ b/SUMMARY.md @@ -8,27 +8,27 @@ * [2. Hosted Services](quick-start/2.-hosted-services.md) * [3. Browser-to-Service](quick-start/3.-browser-to-service.md) * [4. Service Composition And Reuse With Aqua](quick-start/4.-service-composition-and-reuse-with-aqua.md) -* [Aquamarine](knowledge_aquamarine/README.md) - * [Aqua](knowledge_aquamarine/hll.md) - * [Marine](knowledge_aquamarine/marine/README.md) - * [Marine CLI](knowledge_aquamarine/marine/marine-cli.md) - * [Marine REPL](knowledge_aquamarine/marine/marine-repl.md) - * [Marine Rust SDK](knowledge_aquamarine/marine/marine-rs-sdk.md) -* [Tools](knowledge_tools.md) + * [5. Decentralized Oracles With Fluence And Aqua](quick-start/5.-decentralized-oracles-with-fluence-and-aqua.md) +* [Aquamarine](knowledge\_aquamarine/README.md) + * [Aqua](knowledge\_aquamarine/hll.md) + * [Marine](knowledge\_aquamarine/marine/README.md) + * [Marine CLI](knowledge\_aquamarine/marine/marine-cli.md) + * [Marine REPL](knowledge\_aquamarine/marine/marine-repl.md) + * [Marine Rust SDK](knowledge\_aquamarine/marine/marine-rs-sdk.md) +* [Tools](knowledge\_tools.md) * [Node](node.md) * [Fluence JS](fluence-js/README.md) - * [Concepts](fluence-js/1_concepts.md) - * [Basics](fluence-js/2_basics.md) - * [In-depth](fluence-js/3_in_depth.md) - * [Running app in nodejs](fluence-js/5_run_in_node.md) - * [Running app in browser](fluence-js/4_run_in_browser-1.md) + * [Concepts](fluence-js/1\_concepts.md) + * [Basics](fluence-js/2\_basics.md) + * [Running app in nodejs](fluence-js/5\_run\_in\_node.md) + * [Running app in browser](fluence-js/4\_run\_in\_browser-1.md) + * [In-depth](fluence-js/3\_in\_depth.md) * [API reference](fluence-js/6-reference.md) * [Changelog](fluence-js/changelog.md) -* [Security](knowledge_security.md) -* [Tutorials](tutorials_tutorials/README.md) - * [Setting Up Your Environment](tutorials_tutorials/recipes_setting_up.md) - * [Deploy A Local Fluence Node](tutorials_tutorials/tutorial_run_local_node.md) - * [cUrl As A Service](tutorials_tutorials/curl-as-a-service.md) - * [Add Your Own Builtins](tutorials_tutorials/add-your-own-builtin.md) +* [Security](knowledge\_security.md) +* [Tutorials](tutorials\_tutorials/README.md) + * [Setting Up Your Environment](tutorials\_tutorials/recipes\_setting\_up.md) + * [Deploy A Local Fluence Node](tutorials\_tutorials/tutorial\_run\_local\_node.md) + * [cUrl As A Service](tutorials\_tutorials/curl-as-a-service.md) + * [Add Your Own Builtins](tutorials\_tutorials/add-your-own-builtin.md) * [Research, Papers And References](research-papers-and-references.md) - diff --git a/knowledge_aquamarine/marine/marine-rs-sdk.md b/knowledge_aquamarine/marine/marine-rs-sdk.md index d63b442..6426c74 100644 --- a/knowledge_aquamarine/marine/marine-rs-sdk.md +++ b/knowledge_aquamarine/marine/marine-rs-sdk.md @@ -1,6 +1,6 @@ # Marine Rust SDK -The [marine-rs-sdk](https://github.com/fluencelabs/marine-rs-sdk) empowers developers to write services suitable for peer hosting in peer-to-peer networks using the Marine Virtual Machine by enabling the wasm32-wasi compile target for Marine. +The [marine-rs-sdk](https://github.com/fluencelabs/marine-rs-sdk) empowers developers to create services suitable for hosting on peers of the peer-to-peer network. Such services are constructed from one or more Wasm modules, which each are the result of Rust code compiled to the wasm32-wasi compile target, executable by the Marine runtime. ### API @@ -51,7 +51,7 @@ Function Export Requirements * wrap a target function with the `[marine]` macro * function arguments must by of `ftype` -* the function return type also must be of `ftype` +* the function return type also must be of `ftype`  {% endhint %} #### Function Import @@ -109,7 +109,7 @@ extern "C" { #### Structures -Finally, the `[marine]` macro can wrap a `struct` making possible to use it as a function argument or return type. Note that +Finally, the `[marine]` macro can wrap a `struct` making possible to use it as a function argument or return type. Note that  * only macro-wrapped structures can be used as function arguments and return types * all fields of the wrapped structure must be public and of the `ftype`. @@ -218,7 +218,7 @@ fn some_function() -> Data { #### Call Parameters -There is a special API function `fluence::get_call_parameters()` that returns an instance of the [`CallParameters`](https://github.com/fluencelabs/marine-rs-sdk/blob/master/src/call_parameters.rs#L35) structure defined as follows: +There is a special API function `fluence::get_call_parameters()` that returns an instance of the [`CallParameters`](https://github.com/fluencelabs/marine-rs-sdk/blob/master/src/call\_parameters.rs#L35) structure defined as follows: ```rust pub struct CallParameters { @@ -294,7 +294,7 @@ extern "C" { } ``` -The above code creates a "curl adapter", i.e., a Wasm module that allows other Wasm modules to use the the `curl_request` function, which calls the imported _curl_ binary in this case, to make http calls. Please note that we are wrapping the `extern` block with the `[marine]`macro and introduce a Marine-native data structure [`MountedBinaryResult`](https://github.com/fluencelabs/marine/blob/master/examples/url-downloader/curl_adapter/src/main.rs) as the linked-function return value. +The above code creates a "curl adapter", i.e., a Wasm module that allows other Wasm modules to use the the `curl_request` function, which calls the imported _curl_ binary in this case, to make http calls. Please note that we are wrapping the `extern` block with the `[marine]`macro and introduce a Marine-native data structure [`MountedBinaryResult`](https://github.com/fluencelabs/marine/blob/master/examples/url-downloader/curl\_adapter/src/main.rs) as the linked-function return value. Please not that if you want to use `curl_request` with testing, see below, the curl call needs to be marked unsafe, e.g.: @@ -338,7 +338,7 @@ To use the `[marine-test]` macro please add `marine-rs-sdk-test` crate to the `[ marine-rs-sdk-test = "0.2.0" ``` - Let's have a look at an implementation example: + Let's have a look at an implementation example: ```rust use marine_rs_sdk::marine; @@ -371,8 +371,8 @@ mod tests { } ``` -1. We wrap a basic _greeting _function with the `[marine]` macro which results in the greeting.wasm module -2. We wrap our tests as usual with `[cfg(test)]` and import the marine _test crate. _Do **not** import _super_ or the _local crate_. +1. We wrap a basic _greeting_ function with the `[marine]` macro which results in the greeting.wasm module +2. We wrap our tests as usual with `[cfg(test)]` and import the marine _test crate._ Do **not** import _super_ or the _local crate_.  3. Instead, we apply the `[marine_test]` macro to each of the test functions by providing the path to the config file, e.g., Config.toml, and the directory containing the Wasm module we obtained after compiling our project with `marine build`. Moreover, we add the type of the test as an argument in the function signature. It is imperative that project build precedes the test runner otherwise the required Wasm file will be missing. 4. The target of our tests is the `pub fn greeting` function. Since we are calling the function from the Wasm module we must prefix the function name with the module namespace -- `greeting` in this example case as specified in the function argument. @@ -502,13 +502,13 @@ mod tests_on_mod { 1. We wrap the `test` function with the `marine_test` macro by providing named service configurations with module locations. Based on its arguments the macro defines a `marine_test_env` module with an interface to the services. 2. We create new services. Each `ServiceInterface::new()` runs a new marine runtime with the service. -3. We prepare data to pass to a service using structure definition from `marine_test_env`. The macro finds all structures used in the service interface functions and defines them in the corresponding submodule of `marine_test_env` . +3. We prepare data to pass to a service using structure definition from `marine_test_env`. The macro finds all structures used in the service interface functions and defines them in the corresponding submodule of `marine_test_env` .  4. We call a service function through the `ServiceInterface` object. -5. It is possible to use the result of one service call as an argument for a different service call. The interface types with the same structure have the same rust type in `marine_test_env`. +5. It is possible to use the result of one service call as an argument for a different service call. The interface types with the same structure have the same rust type in `marine_test_env`.  In the `test_on_mod.rs` tab we can see another option — applying `marine_test` to a `mod`. The macro just defines the `marine_test_env` at the beginning of the module and then it can be used as usual everywhere inside the module. -The full example is [here](https://github.com/fluencelabs/marine/tree/master/examples/multiservice_marine_test). +The full example is [here](https://github.com/fluencelabs/marine/tree/master/examples/multiservice\_marine\_test). The `marine_test` macro also gives access to the interface of internal modules which may be useful for setting up a test environment. This feature is designed to be used in situations when it is simpler to set up a service for a test through internal functions than through the service interface. To illustrate this feature we have rewritten the previous example: @@ -546,7 +546,7 @@ mod tests { 1. We access the internal service interface to construct an interface structure. To do so, we use the following pattern: `marine_test_env::$service_name::modules::$module_name::$structure_name`. 2. We access the internal service interface and directly call a function from one of the modules of this service. To do so, we use the following pattern: `$service_object.modules.$module_name.$function_name` . -3. In the previous example, the same interface types had the same rust types. It is limited when using internal modules: the property is true only when structures are defined in internal modules of one service, or when structures are defined in service interfaces of different services. So, we need to construct the proper type to pass data to the internals of another module. +3. In the previous example, the same interface types had the same rust types. It is limited when using internal modules: the property is true only when structures are defined in internal modules of one service, or when structures are defined in service interfaces of different services. So, we need to construct the proper type to pass data to the internals of another module.  Testing sdk also has the interface for [Cargo build scripts](https://doc.rust-lang.org/cargo/reference/build-scripts.html). Some IDEs can analyze files generated in build scripts, providing code completion and error highlighting for code generated in build scripts. But using it may be a little bit tricky because build scripts are not designed for such things. @@ -644,7 +644,7 @@ marine-rs-sdk-test = "0.4.0" # <- 5 {% endtab %} {% endtabs %} -1. We create a vector of pairs (service_name, service_description) to pass to the generator. The structure is the same with multi-service `marine_test`. +1. We create a vector of pairs (service\_name, service\_description) to pass to the generator. The structure is the same with multi-service `marine_test`. 2. We check if we build for a non-wasm target. As we build this marine service only for `wasm32-wasi` and tests are built for native target, we can generate `marine_test_env` only for tests. This is needed because our generator depends on the artifacts from `wasm32-wasi` build. We suggest using a separate crate for using build scripts for testing purposes. It is here for simplicity. 3. We pass our services, a name of the file to generate, and a path to the build script file to the `marine_test_env` generator. Just always use `file!()` for the last argument. The generated file will be in the directory specified by the `OUT_DIR` variable, which is set by cargo. The build script must not change any files outside of this directory. 4. We set up condition to re-run the build script. It must be customized, a good choice is to re-run the build script when .wasm files or `Config.toml` are changed. diff --git a/knowledge_tools.md b/knowledge_tools.md index 6c489a2..604a918 100644 --- a/knowledge_tools.md +++ b/knowledge_tools.md @@ -2,9 +2,15 @@ ## Fluence Proto Distributor: FLDIST -[`fldist`](https://github.com/fluencelabs/proto-distributor) is a command line interface \(CLI\) to Fluence peers allowing for the lifecycle management of services and offers the fastest and most effective way to service deployment. +{% hint style="info" %} +Please note that we are in the process of deprecating `fldist` in favor of [Aqua CLI](https://github.com/fluencelabs/aqua/tree/main/cli). At the time of this writing, `fldist` remains fully functional **except** for the `run_air` command, which needs to be replace with `aqua run`.  -```text +We are currently in the process of updating the documentation to reflect these changes. If you run into an errant `fldist` reference, please let us now! +{% endhint %} + +[`fldist`](https://github.com/fluencelabs/proto-distributor) is a command line interface (CLI) to Fluence peers allowing for the lifecycle management of services and offers the fastest and most effective way to service deployment. + +``` mbp16~(:|✔) % fldist --help Usage: fldist <cmd> [options] @@ -45,5 +51,4 @@ The [Fluence JS](https://github.com/fluencelabs/fluence-js) supports developers ## Marine Tools -Marine offers multiple tools including the Marine CLI, REPL and SDK. Please see the [Marine section](knowledge_aquamarine/marine/) for more detail. - +Marine offers multiple tools including the Marine CLI, REPL and SDK. Please see the [Marine section](knowledge\_aquamarine/marine/) for more detail. diff --git a/quick-start/1.-browser-to-browser-1.md b/quick-start/1.-browser-to-browser-1.md index 12a28c7..625de05 100644 --- a/quick-start/1.-browser-to-browser-1.md +++ b/quick-start/1.-browser-to-browser-1.md @@ -4,14 +4,14 @@ The first example demonstrates how to communicate between two client peers, i.e. In your VSCode container terminal, make sure you are in the `examples/quickstart/1-browser-to-browser` directory to install the dependencies: -```text +``` cd examples/quickstart/1-browser-to-browser npm install ``` Run the app with `npm start` : -```text +``` npm start ``` @@ -19,48 +19,47 @@ Which opens a new tab in your browser at `http://localhost:3000`. Depending on y The browser tab, representing the client peer, wants you to pick a relay node the browser client can connect to and, of course, allows the peer to respond to the browser client. Select any one of the offered relays: - +.png>) The client peer is now connected to the relay and ready for business: - +.png>) -Let's follow the instructions, open another browser tab, i.e. client peer, using `http://localhost:3000` , select any one of the relays and copying the ensuing peer id and relay peer id to the first client peer, i.e. the first browser tab, and click the `say hello` button: +Let's follow the instructions, open another browser tab, i.e. client peer, using `http://localhost:3000` , select any one of the relays and copying the ensuing peer id and relay peer id to the first client peer, i.e. the first browser tab, and click the `say hello` button:\ - +.png>) Congratulations, you just sent messages between two browsers over the Fluence peer-to-peer network, which is pretty cool! Even cooler, however, is how we got here using Aqua, Fluence's distributed network and application composition language. In your VSCode workspace, navigate to the `aqua` directory and open the \``getting-started.aqua` file in VSCode: - +.png>) -And yes, fewer than ten lines \(!!\) are required for a client peer, like our browser, to connect to the network and start composing the local `HelloPeer` service to send messages. +And yes, fewer than ten lines (!!) are required for a client peer, like our browser, to connect to the network and start composing the local `HelloPeer` service to send messages. In broad strokes, the Aqua code breaks down as follows: -* Import the Aqua [standard library](https://github.com/fluencelabs/aqua-lib) into our application \(1\) -* Create a service interface binding to the local service \(see below\) with the `HelloPeer` namespace and `hello` function \(4-5\) -* Create the composition function `sayHello` that executes the `hello` call on the provided `targetPeerId` via the provided `targetRelayPeerId` and returns the result \(7-10\). Recall the copy and paste job you did earlier in the browser tab for the peer and relay id? Well, you just found the consumption place for these two parameters. +* Import the Aqua [standard library](https://github.com/fluencelabs/aqua-lib) into our application (1) +* Create a service interface binding to the local service (see below) with the `HelloPeer` namespace and `hello` function (4-5) +* Create the composition function `sayHello` that executes the `hello` call on the provided `targetPeerId` via the provided `targetRelayPeerId` and returns the result (7-10). Recall the copy and paste job you did earlier in the browser tab for the peer and relay id? Well, you just found the consumption place for these two parameters. Not only is Aqua rather succinct in allowing you to seamlessly program both network routes and distributed application workflows but also provides the ability to compile Aqua to Typescript stubs wrapping compiled Aqua, called AIR -- short for Aqua Intermediate Representation, into ready to use code blocks. Navigate to the `src/_aqua` directory and open the `getting-started.ts` file in VSCode: - +.png>) Which can now be imported into our `App.tsx` file: - +.png>) We wrote a little more than a handful of lines of code in Aqua and ended up with a deployment-ready code block that includes both the network routing and a compute logic to facilitate browser-to-browser messaging over a peer-to-peer network. -The local \(browser\) service `HelloPeer` is also implemented in the `App.tsx` file: +The local (browser) service `HelloPeer` is also implemented in the `App.tsx` file: - +.png>) -To summarize, we run an app that facilities messaging between two browsers over a peer-to-peer network. At the core of this capability is Aqua which allowed us in just a few lines of code to program both the network topology and the application workflow in barely more than a handful of lines of code. Hint: You should be excited. For more information on Aqua, see the [Aqua Book](https://app.gitbook.com/@fluence/s/aqua-book/). +To summarize, we run an app that facilities messaging between two browsers over a peer-to-peer network. At the core of this capability is Aqua which allowed us in just a few lines of code to program both the network topology and the application workflow in barely more than a handful of lines of code. Hint: You should be excited. For more information on Aqua, see the [Aqua Book](https://app.gitbook.com/@fluence/s/aqua-book/).  In the next section, we develop a WebAssembly module and deploy it as a hosted service to the Fluence peer-to-peer network. - diff --git a/quick-start/2.-hosted-services.md b/quick-start/2.-hosted-services.md index 60be6cf..11834d1 100644 --- a/quick-start/2.-hosted-services.md +++ b/quick-start/2.-hosted-services.md @@ -6,9 +6,9 @@ In the previous example, we used a local, browser-native service to facilitate t In this section, we develop a simple `HelloWorld` service and host it on a peer-to-peer node of the Fluence testnet. In your VSCode IDE, change to the `2-hosted-services` directory and open the `src/main.rs` file: - +.png>) -Fluence hosted services are comprised of WebAssembly modules implemented in Rust and compiled to [wasm32-wasi](https://doc.rust-lang.org/stable/nightly-rustc/rustc_target/spec/wasm32_wasi/index.html). Let's have look at our code: +Fluence hosted services are comprised of WebAssembly modules implemented in Rust and compiled to [wasm32-wasi](https://doc.rust-lang.org/stable/nightly-rustc/rustc\_target/spec/wasm32\_wasi/index.html). Let's have look at our code: ```rust // quickstart/2-hosted-services/src/main.rs @@ -36,7 +36,7 @@ pub fn hello(from: String) -> HelloWorld { At the core of our implementation is the `hello` function which takes a string parameter and returns the `HelloWorld` struct consisting of the `msg` and `reply` field, respectively. We can use the `build.sh` script in the `scripts` directory, `./scripts/build.sh` , to compile the code to the Wasm target from the VSCode terminal: - +.png>) Aside from some housekeeping, the `build.sh` script gives the compile instructions with [marine](https://crates.io/crates/marine), `marine build --release` , and copies the resulting Wasm module, `hello_world.wasm`, to the `artifacts` directory for easy access. @@ -70,22 +70,22 @@ mod tests { ``` - - To run our tests, we can use the familiar[`cargo test`](https://doc.rust-lang.org/cargo/commands/cargo-test.html) . However, we don't really care all that much about our native Rust functions being tested but want to test our WebAssembly functions. This is where the extra code in the test module comes into play. In short., we are running `cargo test` against the exposed interfaces of the `hello_world.wasm` module and in order to do that, we need the `marine_test` macro and provide it with both the modules directory, i.e., the `artifacts` directory, and the location of the `Config.toml` file. Note that the `Config.toml` file specifies the module metadata and optional module linking data. Moreover, we need to call our Wasm functions from the module namespace, i.e. `hello_world.hello` instead of the standard `hello` -- see lines 13 and 19 above, which we specify as an argument in the test function signature \(lines 11 and 17, respectively\). +\ + To run our tests, we can use the familiar[`cargo test`](https://doc.rust-lang.org/cargo/commands/cargo-test.html) . However, we don't really care all that much about our native Rust functions being tested but want to test our WebAssembly functions. This is where the extra code in the test module comes into play. In short., we are running `cargo test` against the exposed interfaces of the `hello_world.wasm` module and in order to do that, we need the `marine_test` macro and provide it with both the modules directory, i.e., the `artifacts` directory, and the location of the `Config.toml` file. Note that the `Config.toml` file specifies the module metadata and optional module linking data. Moreover, we need to call our Wasm functions from the module namespace, i.e. `hello_world.hello` instead of the standard `hello` -- see lines 13 and 19 above, which we specify as an argument in the test function signature (lines 11 and 17, respectively). {% hint style="info" %} In order to able able to use the macro, install the [`marine-rs-sdk-test`](https://crates.io/crates/marine-rs-sdk-test) crate as a dev dependency: -`[dev-dependencies] marine-rs-sdk-test = "`<version>`"` +`[dev-dependencies] marine-rs-sdk-test = "`\<version>`"` {% endhint %} From the VSCode terminal, we now run our tests with the`cargo +nightly test --release` command. Please note that if `nightly` is your default, you don't need it in your `cargo test` command. - +.png>) Well done -- our tests check out. Before we deploy our service to the network, we can interact with it locally using the [Marine REPL](https://crates.io/crates/mrepl). In your VSCode terminal the `2-hosted-services` directory run: -```text +``` mrepl configs/Config.toml ``` @@ -121,9 +121,9 @@ We can explore the available interfaces with the `i` command and see that the in ### Exporting WebAssembly Interfaces To Aqua -In anticipation of future needs, note that `marine` allows us to export the Wasm interfaces ready for use in Aqua. In your VSCode terminal, navigate to the \`\` directory +In anticipation of future needs, note that `marine` allows us to export the Wasm interfaces ready for use in Aqua. In your VSCode terminal, navigate to the \`\` directory  -```text +``` marine aqua artifacts/hello_world.wasm ``` @@ -138,19 +138,19 @@ service HelloWorld: hello(from: string) -> HelloWorld ``` -That can be piped directly into an aqua file , e.g., \``marine aqua my_wasm.wasm >> my_aqua.aqua`. +That can be piped directly into an aqua file , e.g., \``marine aqua my_wasm.wasm >> my_aqua.aqua`.  ### Deploying A Wasm Module To The Network -Looks like all is in order with our module and we are ready to deploy our `HelloWorld` service to the world by means of the Fluence peer-to-peer network. For this to happen, we need two things: the peer id of our target node\(s\) and a way to deploy the service. The latter can be accomplished with the `fldist` command line tool and with respect to the former, we can get a peer from one of the Fluence testnets also with `fldist` . In your VSCode terminal: +Looks like all is in order with our module and we are ready to deploy our `HelloWorld` service to the world by means of the Fluence peer-to-peer network. For this to happen, we need two things: the peer id of our target node(s) and a way to deploy the service. The latter can be accomplished with the `fldist` command line tool and with respect to the former, we can get a peer from one of the Fluence testnets also with `fldist` . In your VSCode terminal: -```text +``` fldist env ``` Which gets us a list of network peers: -```text +``` /dns4/kras-00.fluence.dev/tcp/19990/wss/p2p/12D3KooWSD5PToNiLQwKDXsu8JSysCwUt8BVUJEqCHcDe7P5h45e /dns4/kras-00.fluence.dev/tcp/19001/wss/p2p/12D3KooWR4cv1a8tv7pps4HH6wePNaK6gf1Hww5wcCMzeWxyNw51 /dns4/kras-01.fluence.dev/tcp/19001/wss/p2p/12D3KooWKnEqMfYo9zvfHmqTLpLdiHXPe4SVqUWcWHDJdFGrSmcA @@ -175,16 +175,15 @@ fldist --node-id 12D3KooWFEwNWcHqi9rtsmDhsYcDbRUCDXH84RC4FW6UfsFWaoHi \ Which gives us a unique service id: -```text +``` service id: 1e740ce4-81f6-4dd4-9bed-8d86e9c2fa50 service created successfully ``` Take note of the service id, `1e740ce4-81f6-4dd4-9bed-8d86e9c2fa50` in this example but different for you, as we need it to use the service with Aqua. -Congratulations, we just deployed our first reusable service to the Fluence network and we can admire our handiwork on the Fluence [Developer Hub](https://dash.fluence.dev/): +Congratulations, we just deployed our first reusable service to the Fluence network and we can admire our handiwork on the Fluence [Developer Hub](https://dash.fluence.dev): - +.png>) With our newly created service ready to roll, let's move on and put it to work. - diff --git a/quick-start/4.-service-composition-and-reuse-with-aqua.md b/quick-start/4.-service-composition-and-reuse-with-aqua.md index 9fe3fe3..bc205a3 100644 --- a/quick-start/4.-service-composition-and-reuse-with-aqua.md +++ b/quick-start/4.-service-composition-and-reuse-with-aqua.md @@ -2,17 +2,17 @@ In the previous three sections, you got a taste of using Aqua with browsers and how to create and deploy a service. In this section, we discuss how to compose an application from multiple distributed services using Aqua. In Fluence, we don't use JSON-RPC or REST endpoints to address and execute the service, we use [Aqua](https://github.com/fluencelabs/aqua). -Recall, Aqua is a purpose-built distributed systems and peer-to-peer programming language that resolves \(Peer Id, Service Id\) tuples to facilitate service execution on the host node without developers having to worry about transport or network routing. And with Aqua VM available on each Fluence peer-to-peer node, Aqua allows developers to ergonomically locate and execute distributed services. +Recall, Aqua is a purpose-built distributed systems and peer-to-peer programming language that resolves (Peer Id, Service Id) tuples to facilitate service execution on the host node without developers having to worry about transport or network routing. And with Aqua VM available on each Fluence peer-to-peer node, Aqua allows developers to ergonomically locate and execute distributed services. ### Composition With Aqua -A service is one or more linked WebAssembly \(Wasm\) modules that may be linked at runtime. Said dependencies are specified by a **blueprint** which is the basis for creating a unique service id after the deployment and initiation of the blueprint on our chosen host for deployment. See Figure 1. +A service is one or more linked WebAssembly (Wasm) modules that may be linked at runtime. Said dependencies are specified by a **blueprint** which is the basis for creating a unique service id after the deployment and initiation of the blueprint on our chosen host for deployment. See Figure 1. - +.png>) When we deploy our service, as demonstrated in section two, the service is "out there" on the network and we need a way to locate and execute the service if w want to utilize he service as part of our application. -Luckily, the \(Peer Id, Service Id\) tuple we obtain from the service deployment process contains all the information Aqua needs to locate and execute the specified service instance. +Luckily, the (Peer Id, Service Id) tuple we obtain from the service deployment process contains all the information Aqua needs to locate and execute the specified service instance. Let's create a Wasm module with a single function that adds one to an input in the `adder` directory: @@ -23,17 +23,17 @@ fn add_one(input: u64) -> u64 { } ``` -For our purposes, we deploy that module as a service to three hosts: Peer 1, Peer 2, and Peer 3. Use the instructions provided in section two to create the module and deploy the service to three peers of your choosing. See `4-composing-services-with-aqua/adder` for the code and `data/distributed_service.json` for the \(Peer Id, Service Id\) tuples already deployed to three network peers. +For our purposes, we deploy that module as a service to three hosts: Peer 1, Peer 2, and Peer 3. Use the instructions provided in section two to create the module and deploy the service to three peers of your choosing. See `4-composing-services-with-aqua/adder` for the code and `data/distributed_service.json` for the (Peer Id, Service Id) tuples already deployed to three network peers. -Once we got the services deployed to their respective hosts, we can use Aqua to compose an admittedly simple application by composing the use of each service into an workflow where the \(Peer Id, Service Id\) tuples facilitate the routing to and execution of each service. Also, recall that in the Fluence peer-to-peer programming model the client need not, and for the most part should not, be involved in managing intermediate results. Instead, results are "forward chained" to the next service as specified in the Aqua workflow. +Once we got the services deployed to their respective hosts, we can use Aqua to compose an admittedly simple application by composing the use of each service into an workflow where the (Peer Id, Service Id) tuples facilitate the routing to and execution of each service. Also, recall that in the Fluence peer-to-peer programming model the client need not, and for the most part should not, be involved in managing intermediate results. Instead, results are "forward chained" to the next service as specified in the Aqua workflow. Using our `add_one` service and starting with an input parameter value of one, utilizing all three services, we expect a final result of four given **seq**uential service execution: - +.png>) -The underlying Aqua script may look something like this \(see the `aqua-script` directory\): +The underlying Aqua script may look something like this (see the `aqua-script` directory): -```text +``` -- aqua-scripts/adder.aqua -- service interface for Wasm module @@ -62,13 +62,17 @@ func add_one_three_times(value: u64, ns_tuples: []NodeServiceTuple) -> u64: Let's give it a whirl! Using the already deployed services or your even better, your own deployed services, let's compile out Aqua script in the `4-composing-services-with-aqua` directory: -```text +``` aqua -i aqua-scripts -o compiled-aqua -a ``` We now can use `fldist` to run the above Aqua script compiled to the `compiled-aqua/adder.add_one_three_time.air`: -```text +{% hint style="info" %} +Note that the `fldist run_air` examples below are currently broken and the `aqua run` alternative is not quire ready. Until this situation is rectified, please use the Fluence JS client example further below. +{% endhint %} + +``` fldist run_air -p compiled-aqua/adder.add_one_three_times.air -d '{"value": 5, "ns_tuples":[{ "node_id": "12D3KooWFtf3rfCDAfWwt6oLZYZbDfn9Vn7bv7g6QjjQxUUEFVBt", @@ -87,7 +91,7 @@ fldist run_air -p compiled-aqua/adder.add_one_three_times.air -d '{"value": 5, Since we are starting with a value of 5 and increment it three times, we expect an 8 which we get: -```text +``` [ 8 ] @@ -97,7 +101,7 @@ Of course, we can drastically change our application logic by changing the execu Reusing our deployed services with a different execution flow may look like the following: -```text +```` ```aqua -- service interface for Wasm module @@ -118,13 +122,13 @@ func add_one_par(value: u64, ns_tuples: []NodeServiceTuple) -> []u64: res <- AddOne.add_one(value) MyOp.identity(res!2) --< flatten the stream variable <- res --< return the final results [value +1, value + 1, value + 1, ...] to the client -``` +```` -Unlike the sequential execution model, this example returns an array where each item is the incremented value, which is captured by the stream variable **res**. That is, for a starting value of five \(5\), we obtain \[6,6,6\] assuming our NodeServiceTuple array provided the three distinct \(Peer Id, Service Id\) tuples. +Unlike the sequential execution model, this example returns an array where each item is the incremented value, which is captured by the stream variable **res**. That is, for a starting value of five (5), we obtain \[6,6,6] assuming our NodeServiceTuple array provided the three distinct (Peer Id, Service Id) tuples. Running the script with `fldist`: -```text +``` fldist run_air -p compiled-aqua/adder.add_one_par.air -d '{"value": 5, "ns_tuples":[{ "node_id": "12D3KooWFtf3rfCDAfWwt6oLZYZbDfn9Vn7bv7g6QjjQxUUEFVBt", @@ -143,7 +147,7 @@ fldist run_air -p compiled-aqua/adder.add_one_par.air -d '{"value": 5, We get the expected result: -```text +``` [ [ 6, @@ -155,7 +159,7 @@ We get the expected result: We can improve on our business logic and change our input arguments to make parallelization a little more useful. Let's extend our data struct and update the workflow: -```text +``` -- aqua-scripts/adder.aqua data ValueNodeService: @@ -175,7 +179,7 @@ func add_one_par_alt(payload: []ValueNodeService) -> []u64: And we can run the `fldist` command line: -```text +``` fldist run_air -p compiled-aqua/adder.add_one_par_alt.air -d '{"payload": [{"value": 5, "node_id": "12D3KooWFtf3rfCDAfWwt6oLZYZbDfn9Vn7bv7g6QjjQxUUEFVBt", @@ -192,9 +196,9 @@ fldist run_air -p compiled-aqua/adder.add_one_par_alt.air -d '{"payload": }' --generated ``` -Given our input values \[5, 10, 15\], we get the expected output array of \[6, 11, 16\]: +Given our input values \[5, 10, 15], we get the expected output array of \[6, 11, 16]: -```text +``` [ [ 11, @@ -205,14 +209,14 @@ Given our input values \[5, 10, 15\], we get the expected output array of \[6, 1 Alternatively, we can run our Aqua scripts with a Typescript client. In the `client-peer` directory: -```text +``` npm i -npm run start +npm start ``` Which of course gives us the expected results: -```text +``` created a Fluence client 12D3KooWGve35kvMQ8USbmtRoMCzxaBPXSbqsZxfo6T8gBAV6bzy with relay 12D3KooWKnEqMfYo9zvfHmqTLpLdiHXPe4SVqUWcWHDJdFGrSmcA add_one to 5 equals 6 add_one sequentially equals 8 @@ -222,7 +226,6 @@ add_one parallel alt equals [ 11, 6, 16 ] ### Summary -This section illustrates how Aqua allows developers to locate and execute distributed services on by merely providing a \(Peer Id, Service Id\) tuple and the associated data. From an Aqua user perspective, there are no JSON-RPC or REST endpoints just topology tuples that are resolved on peers of the network. Moreover, we saw how the Fluence peer-to-peer workflow model facilitates a different request-response model than commonly encountered in traditional client-server applications. That is, instead of returning each service result to the client, Aqua allows us to forward the \(intermittent\) result to the next service, peer-to-peer style. +This section illustrates how Aqua allows developers to locate and execute distributed services on by merely providing a (Peer Id, Service Id) tuple and the associated data. From an Aqua user perspective, there are no JSON-RPC or REST endpoints just topology tuples that are resolved on peers of the network. Moreover, we saw how the Fluence peer-to-peer workflow model facilitates a different request-response model than commonly encountered in traditional client-server applications. That is, instead of returning each service result to the client, Aqua allows us to forward the (intermittent) result to the next service, peer-to-peer style. Furthermore, we explored how different Aqua execution flows, e.g. **seq**uential vs. **par**allel, and data models allow developers to compose drastically different workflows and application re-using already deployed services. For more information on Aqua, please see the [Aqua book](https://doc.fluence.dev/aqua-book/) and for more information on Fluence development, see the [developer docs](https://doc.fluence.dev/docs/). - diff --git a/quick-start/5.-decentralized-oracles-with-fluence-and-aqua.md b/quick-start/5.-decentralized-oracles-with-fluence-and-aqua.md new file mode 100644 index 0000000..960ce29 --- /dev/null +++ b/quick-start/5.-decentralized-oracles-with-fluence-and-aqua.md @@ -0,0 +1,353 @@ +# 5. Decentralized Oracles With Fluence And Aqua + +### Overview + +An oracle is some device that provides real-world, off-chain data to deterministic on-chain consumers such as a smart contract. A decentralized oracle draws from multiple, purportedly (roughly) equal input sources to minimize or even eliminate single source pitfalls such as [man-in-the-middle attacks](https://en.wikipedia.org/wiki/Man-in-the-middle\_attack)(MITM) or provider manipulation. For example, a decentralized price oracle for, say, ETH/USD, could poll several DEXs for ETH/USD prices. Since smart contracts, especially those deployed on EVMs, can't directly call off-chain resources, oracles play a critical "middleware" role in the decentralized, trustless ecosystem. See Figure 1. + +.png>) + +Unlike single source oracles, multi-source oracles require some consensus mechanism to convert multiple input sources over the same target parameter into reliable point or range data suitable for third party, e.g., smart contract, consumption. Such "consensus over inputs" may take the form of simple [summary statistics](https://en.wikipedia.org/wiki/Summary\_statistics), e.g., mean, or one of many [other methods](https://en.wikipedia.org/wiki/Consensus\_\(computer\_science\)). + +Given the importance of oracles to the Web3 ecosystem, it's not surprising to see a variety of third party solutions supporting various blockchain protocols. Fluence does not provide an oracle solution _per se_ but provides a peer-to-peer platform, tools and components for developers to quickly and easily program and compose reusable distributed data acquisition, processing and delivery services into decentralized oracle applications. + +For the remainder of this section, we work through the process of developing a decentralized, multi-source timestamp oracle comprised of data acquisition, processing and delivery. + +### Creating A Decentralized Timestamp Oracle + +Time, often in form of timestamps, plays a critical role in a large number of Web2 and Web3 applications including off-chain voting applications and on-chain clocks. Our goal is to provide a consensus timestamp sourced from multiple input sources and implement an acceptable input aggregation and processing service to arrive at either a timestamp point or range value(s). + +#### Timestamp Acquisition + +Each Fluence peer, i.e. node in the Fluence peer-to-peer network, has the ability to provide a timestamp from a [builtin service](https://github.com/fluencelabs/aqua-lib/blob/b90f2dddc335c155995a74d8d97de8dbe6a029d2/builtin.aqua#L127). In Aqua, we can call a [timestamp function](https://github.com/fluencelabs/fluence/blob/527e26e08f3905e53208b575792712eeaee5deca/particle-closures/src/host\_closures.rs#L124) with the desired granularity, i.e., seconds or milliseconds for further processing: + +```python + -- aqua timestamp sourcing + on peer: + ts_ms_result <- peer.timestamp_ms() + -- or + ts_sec_result <- peer.timestamp_sec() + -- ... +``` + +In order to decentralize our timestamp oracle, we want to poll multiple peers in the Fluence network: + +```python + -- multi-peer timestamp sourcing + -- ... + results: *u64 + for peer <- many_peers_list par: + on peer: + results <- peer.timestamp_ms() + -- ... +``` + +In the above example, we have a list of peers and retrieve a timestamp value from each one. Note that we are polling nodes for timestamps in [parallel](https://doc.fluence.dev/aqua-book/language/flow/parallel) in order to optimize toward uniformity and to collect responses in the stream variable `results`. See Figure 2. + +.png>) + +The last thing to pin down concerning our timestamp acquisition is which peers to query. One possibility is to specify the peer ids of a set of desired peers to query. Alternatively, we can tap into the [Kademlia neighborhood](https://en.wikipedia.org/wiki/Kademlia) of a peer, which is a set of peers that are closest to our peer based on the XOR distance of the peer ids. Luckily, there is a [builtin service](https://github.com/fluencelabs/aqua-lib/blob/b90f2dddc335c155995a74d8d97de8dbe6a029d2/builtin.aqua#L140) we can call from Aqua that returns up to 20 neighboring peers: + +```python + -- timestamps from Kademlia neighborhood + results: *u64 + on node: + k <- Op.string_to_b58(node) + nodes <- Kademlia.neighborhood(k, nil, nil) + for node <- nodes par: + on node: + try: + results <- node.timestamp_ms() + -- ... +``` + +#### Timestamp Processing + +Once we have our multiple timestamp values, we need to process them into a point or range value(s) to be useful. Whatever our processing/consensus algorithm is, we can implement it in Marine as one or more reusable, distributed services. + +Fpyor example, we can rely on [summary statistics](https://en.wikipedia.org/wiki/Summary\_statistics) and implement basic averaging to arrive at a point estimate: + +```rust + // ... + + #[marine] + pub fn ts_avg(timestamps: Vec<u64>) -> f64 { + timestamps.iter().sum::<u64>() as f64 / timestamps.len() as f64 +} + // ... +``` + +Using the average to arrive at a point-estimate is simply a stake in the ground to illustrate what's possible. Actual processing algorithms may vary and, depending on a developers target audience, different algorithms may be used for different delivery targets. And Aqua makes it easy to customize workflows while emphasizing reuse. + +#### Putting It All Together + +Let's put it all together by sourcing timestamps from the Kademlia neighborhood and processing the timestamps into a consensus value. Instead of one of the summary statistics, we employ a simple, consensus algorithm that randomly selects one of the provided timestamps and then calculates a consensus score from the remaining n -1 timestamps: + +```rust +// src.main.rs +// +// simple consensus from timestamps +// params: +// timestamps, u64, [0, u64_max] +// tolerance, u32, [0, u32_max] +// threshold, f64, [0.0, 1.0] +// 1. Remove a randomly selected timestamp from the array of timestamps, ts +// 2. Count the number of timestamps left in the array that are withn +/- tolerance (where tolerance may be zero) +// 3. compare the suporting number of times stamps divided by th enumber of remaining timestamps to the threshold. if >=, consensus for selected timestamp is true else false +// +[marine] +fn ts_frequency(mut timestamps: Vec<u64>, tolerance: u32, threshold: f64, err_value: u64) -> Consensus { + timestamps.retain(|&ts| ts != err_value); + if timestamps.len() == 0 { + return Consensus { + err_str: "Array must have at least one element".to_string(), + ..<_>::default() + }; + } + + if timestamps.len() == 1 { + return Consensus { + n: 1, + consensus_ts: timestamps[0], + consensus: true, + support: 1, + ..<_>::default() + }; + } + + if threshold < 0f64 || threshold > 1f64 { + return Consensus { + err_str: "Threshold needs to be between [0.0,1.0]".to_string(), + ..<_>::default() + }; + } + + let rnd_seed: u64 = timestamps.iter().sum(); + let mut rng = WyRand::new_seed(rnd_seed); + let rnd_idx = rng.generate_range(0..timestamps.len()); + let consensus_ts = timestamps.swap_remove(rnd_idx); + let mut support: u32 = 0; + for ts in timestamps.iter() { + if ts <= &(consensus_ts + tolerance as u64) && ts >= &(consensus_ts - tolerance as u64) { + support += 1; + } + } + + let mut consensus = false; + if (support as f64 / timestamps.len() as f64) >= threshold { + consensus = true; + } + + Consensus { + n: timestamps.len() as u32, + consensus_ts, + consensus, + support, + err_str: "".to_string(), + } +} +``` + +We compile our consensus module with `./scripts/build.sh`, which allows us to run the unit tests using the Wasm module with `cargo +nightly test`: + +```bash +# src.main.rs +running 10 tests +test tests::ts_validation_good_consensus_false ... ok +test tests::test_err_val ... ok +test tests::test_mean_fail ... ok +test tests::ts_validation_good_consensus ... ok +test tests::ts_validation_bad_empty ... ok +test tests::ts_validation_good_consensus_true ... ok +test tests::ts_validation_good_no_support ... ok +test tests::test_mean_good ... ok +test tests::ts_validation_good_no_consensus ... ok +test tests::ts_validation_good_one ... ok + +test result: ok. 10 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 18.75s +``` + +We can now interact with our module with the Marine REPL `mrepl configs/Config.toml`: + +```python +Welcome to the Marine REPL (version 0.9.1) +Minimal supported versions + sdk: 0.6.0 + interface-types: 0.20.0 + +app service was created with service id = 520a092b-85ef-43c1-9c12-444274ba2cb7 +elapsed time 62.893047ms + +1> i +Loaded modules interface: +data Consensus: + n: u32 + reference_ts: u64 + support: u32 + err_str: string +data Oracle: + n: u32 + avg: f64 + err_str: string + +ts_oracle: + fn ts_avg(timestamps: []u64, min_points: u32) -> Oracle + fn ts_frequency(timestamps: []u64, tolerance: u32) -> Consensus + +2> call ts_oracle ts_frequency [[1637182263,1637182264,1637182265,163718226,1637182266], 0, 0.66, 0] +result: Object({"consensus": Bool(false), "consensus_ts": Number(1637182264), "err_str": String(""), "n": Number(4), "support": Number(0)}) + elapsed time: 167.078µss + +3> call ts_oracle ts_frequency [[1637182263,1637182264,1637182265,163718226,1637182266], 5, 0.66, 0] +result: Object({"consensus": Bool(true), "consensus_ts": Number(1637182264), "err_str": String(""), "n": Number(4), "support": Number(3)}) + elapsed time: 63.291µs +``` + +In our first call at prompt `2>`, we set a tolerance of 0 and, given our array of timestamps, have no support for the chosen timestamps, whereas in the next call, `3>,`we increase the tolerance parameter and obtain a consensus result. + +All looks satisfactory and we are ready to deploy our module with `./scripts/deploy.sh`, which write-appends the deployment response data, including the service id, to a local file named `deployed_service.data`: + +```bash +client seed: 7UNmJPMWdLmrwAtGrpJXNrrcK7tEZHCjvKbGdSzEizEr +client peerId: 12D3KooWBeEsUnMV9MZ6QGMfaxcTvw8mGFEMGDe7rhKN8RQv1Gs8 +relay peerId: 12D3KooWFEwNWcHqi9rtsmDhsYcDbRUCDXH84RC4FW6UfsFWaoHi +service id: 61a86f67-ffc2-4dea-8746-fd4f04d9c75b +service created successfully +``` + +With the service in place, let's have a look at our Aqua script. Recall, we want to poll the Kademlia neighborhood for timestamps and then call the `ts_oracle` method of our service with the array of timestamps and tolerance parameters as well as the (peer id, service id) parameters of our deployed service: + +```python +-- aqua/ts_oracle.aqua +-- <snip> + +func ts_oracle_with_consensus(tolerance: u32, threshold: f64, err_value:u64, node:string, oracle_service_id:string)-> Consensus, []string: + rtt = 1000 + res: *u64 -- 4 + msg = "timeout" + dead_peers: *string + on node: + k <- Op.string_to_b58(node) + nodes <- Kademlia.neighborhood(k, nil, nil) -- 1 + for n <- nodes par: -- 3 + status: *string + on n: -- 7 + res <- Peer.timestamp_ms() -- 2 + status <<- "success" -- 9 + par status <- Peer.timeout(rtt, msg) -- 8 + if status! != "success": + res <<- err_value -- 10 + dead_peers <<- n -- 11 + + MyOp.identity(res!19) -- 5 + TSOracle oracle_service_id + consensus <- TSOracle.ts_frequency(res, tolerance, threshold, err_value) -- 6 + <- consensus, dead_peers -- 12 +``` + +That script is probably a little more involved than what you've seen so far. So let's work through the script: In order to get out set of timestamps, we determine the Kademlia neighbors (1) and then proceed to request a timestamp from each of those peers (2) in parallel (3). In an ideal world, each peers responds with a timestamp and the stream variable `res` (4) fills up with the 20 values from the twenty neighbors, which we then fold (5) and push to our consensus service (6). Alas, life in distributed isn't quite that simple since there are no guarantees that a peer is actually available to connect or provide a service response. Since we may never actually connect to a peer (7), we can't expect an error response meaning that we get a silent fail at (2) and no write to the stream `res`. Subsequently, this leads to the fail of the fold operation (5) since fewer than the expected twenty items are in the stream and the operation (5) ends up timing out waiting for a never-to-arrive timestamp. + +In order to deal with this issue, we introduce a sleep operation (8) with the builtin [Peer.timeout](https://github.com/fluencelabs/aqua-lib/blob/1193236fe733e75ed0954ed26e1234ab7a6e7c53/builtin.aqua#L135) and run that in parallel to the attempted connection for peer `n` (3) essentially setting up a race condition to write to the stream: if the peer (`on n`, 7) behaves, we write the timestamp to `res`(2) and make a note of that successful operation (9); else, we write a dummy value, i.e., `err_value`, into the stream (10) and make a note of the delinquent peer (11). Recall, we filter out the dummy `err_value` at the service level. + +Once we get our consensus result (6), we return it as well as the array of unavailable peers (12). And that's all there is. + +In order to execute our workflow, we can use Aqua's `aqua run` CLI without having to manually compile the script: + +```bash +aqua run \ + -a /dns4/kras-04.fluence.dev/tcp/19001/wss/p2p/12D3KooWFEwNWcHqi9rtsmDhsYcDbRUCDXH84RC4FW6UfsFWaoHi \ + -i aqua/ts_oracle.aqua \ + -f 'ts_oracle_with_consensus(10, 0.66, 0, "12D3KooWFEwNWcHqi9rtsmDhsYcDbRUCDXH84RC4FW6UfsFWaoHi", "61a86f67-ffc2-4dea-8746-fd4f04d9c75b")' +``` + +If you are new to `aqua run`, the CLI functionality provided by the [`aqua` package](https://www.npmjs.com/package/@fluencelabs/aqua): + +* `aqua run --help` for all your immediate needs +* the `-i` flag denotes the location of our reference aqua file +* the `-a` flag denotes the multi-address of our connection peer/relay +* the `-f` flag handles the meat of the call: + * specify the aqua function name + * provide the parameter values matching the function signature + +Upon execution of our `aqua run` client, we get the following result which may be drastically different for you: + +```bash +Your peerId: 12D3KooWEAhnNDjnh7C9Jba4Yn3EPcK6FJYRMZmaEQuqDnkb9UQf +[ + { + "consensus": true, + "consensus_ts": 1637883531844, + "err_str": "", + "n": 15, + "support": 14 + }, + [ + "12D3KooWAKNos2KogexTXhrkMZzFYpLHuWJ4PgoAhurSAv7o5CWA", + "12D3KooWHCJbJKGDfCgHSoCuK9q4STyRnVveqLoXAPBbXHTZx9Cv", + "12D3KooWMigkP4jkVyufq5JnDJL6nXvyjeaDNpRfEZqQhsG3sYCU", + "12D3KooWDcpWuyrMTDinqNgmXAuRdfd2mTdY9VoXZSAet2pDzh6r" + ] +] +``` + +Recall, that the maximum number of peers pulling from a Kademlia is 20 -- the default value set by the Fluence team. As discussed above, not all nodes may be available at any given time and at the _time of this writing_, the following four nodes were indeed not providing a timestamp response: + +```bash +[ + "12D3KooWAKNos2KogexTXhrkMZzFYpLHuWJ4PgoAhurSAv7o5CWA", + "12D3KooWHCJbJKGDfCgHSoCuK9q4STyRnVveqLoXAPBbXHTZx9Cv", + "12D3KooWMigkP4jkVyufq5JnDJL6nXvyjeaDNpRfEZqQhsG3sYCU", + "12D3KooWDcpWuyrMTDinqNgmXAuRdfd2mTdY9VoXZSAet2pDzh6r" + ] +``` + +That leaves us with a smaller timestamp pool to run through our consensus algorithm than anticipated. Please note that it is up to the consensus algorithm design(er) to set the minimum acceptable number of inputs deemed necessary to produce a sensible and acceptable result. In our case, we run fast and loose as evident in our service implementation discussed above, and go with what we get as long as we get at least one timestamp. + +With a tolerance of ten (10) milli-seconds and a consensus threshold of 2/3 (0.66), we indeed attain a consensus for the _1637883531844_ value with support from 14 out of 15 timestamps: + +```bash + { + "consensus": true, + "consensus_ts": 1637883531844, + "err_str": "", + "n": 15, + "support": 14 + }, +``` + +We can make adjustments to the _tolerance_ parameter: + +```bash +aqua run \ + -a /dns4/kras-04.fluence.dev/tcp/19001/wss/p2p/12D3KooWFEwNWcHqi9rtsmDhsYcDbRUCDXH84RC4FW6UfsFWaoHi \ + -i aqua/ts_oracle.aqua \ + -f 'ts_oracle_with_consensus(0, 0.66, 0, "12D3KooWFEwNWcHqi9rtsmDhsYcDbRUCDXH84RC4FW6UfsFWaoHi", "61a86f67-ffc2-4dea-8746-fd4f04d9c75b")' +``` + +Which does _not_ result in a consensus timestamp given the same threshold value: + +```bash +Your peerId: 12D3KooWP7vAR462JgoagUzGA8s9YccQZ7wsuGigFof7sajiGThr +[ + { + "consensus": false, + "consensus_ts": 1637884102677, + "err_str": "", + "n": 15, + "support": 0 + }, + [ + "12D3KooWAKNos2KogexTXhrkMZzFYpLHuWJ4PgoAhurSAv7o5CWA", + "12D3KooWHCJbJKGDfCgHSoCuK9q4STyRnVveqLoXAPBbXHTZx9Cv", + "12D3KooWMigkP4jkVyufq5JnDJL6nXvyjeaDNpRfEZqQhsG3sYCU", + "12D3KooWDcpWuyrMTDinqNgmXAuRdfd2mTdY9VoXZSAet2pDzh6r" + ] +] +``` + +We encourage you to experiment and tweak the parameters both for the consensus algorithm and the timeout settings. Obviously, longer routes make for more timestamp variance even if each timestamp called is "true." + +### Summary + +Fluence and Aqua make it easy to create and implement decentralized oracle and consensus algorithms using Fluence's off-chain peer-to-peer network and tool set. + +To further your understanding of creating decentralized off-chain (compute) oracles with Fluence and Aqua, experiment with both the consensus methodology and, of course, the oracle sources. Instead of timestamps, try your hand on crypto price/pairs and associated liquidity data, election exit polls or sports scores. Enjoy! diff --git a/tutorials_tutorials/recipes_setting_up.md b/tutorials_tutorials/recipes_setting_up.md index fb16503..7281f3c 100644 --- a/tutorials_tutorials/recipes_setting_up.md +++ b/tutorials_tutorials/recipes_setting_up.md @@ -4,7 +4,7 @@ In order to develop within the Fluence solution, [Node](https://nodejs.org/en/), ### NodeJs -Download the \[installer\]\([https://nodejs.org/en/download/](https://nodejs.org/en/download/)\) for your platform and follow the instructions. +Download the \[installer]\([https://nodejs.org/en/download/](https://nodejs.org/en/download/)) for your platform and follow the instructions. ### Rust @@ -14,7 +14,7 @@ Install Rust: curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh ``` -Once Rust is installed, we need to expand the toolchain and include [nightly build](https://rust-lang.github.io/rustup/concepts/channels.html) and the [Wasm](https://doc.rust-lang.org/stable/nightly-rustc/rustc_target/spec/wasm32_wasi/index.html) compile target. +Once Rust is installed, we need to expand the toolchain and include [nightly build](https://rust-lang.github.io/rustup/concepts/channels.html) and the [Wasm](https://doc.rust-lang.org/stable/nightly-rustc/rustc\_target/spec/wasm32\_wasi/index.html) compile target. ```bash rustup install nightly @@ -28,13 +28,13 @@ rustup self update rustup update ``` -There are a number of good Rust installation and IDE integration tutorials available. [DuckDuckGo](https://duckduckgo.com/) is your friend but if that's too much effort, have a look at [koderhq](https://www.koderhq.com/tutorial/rust/environment-setup/). Please note, however, that currently only VSCode is supported with Aqua syntax support. +There are a number of good Rust installation and IDE integration tutorials available. [DuckDuckGo](https://duckduckgo.com) is your friend but if that's too much effort, have a look at [koderhq](https://www.koderhq.com/tutorial/rust/environment-setup/). Please note, however, that currently only VSCode is supported with Aqua syntax support. ### Aqua Tools The Aqua compiler and standard library and be installed via npm: -```text +``` npm -g install @fluencelabs/aqua npm -g install @fluencelabs/aqua-lib ``` @@ -43,11 +43,11 @@ npm -g install @fluencelabs/aqua-lib If you are a VSCode user, note that am Aqua syntax-highlighting extension is available. In VSCode, click on the Extensions button, search for `aqua`and install the extension. - + Moreover, the aqua-playground provides a ready to go Typescript template and Aqua example. In a directory of you choice: -```text +``` git clone git@github.com:fluencelabs/aqua-playground.git ``` @@ -68,13 +68,17 @@ In addition, Fluence provides the `fldist` tool for the lifecycle management of npm -g install @fluencelabs/fldist ``` -### Fluence SDK +{% hint style="info" %} +Please note that we are in the process of deprecating Fldist in favor of [Aqua CLI](https://github.com/fluencelabs/aqua/tree/main/cli). At the time of this writing, `fldist` is fully functional **except** for `run_air` which needs to be replaced with `aqua run`.  -For frontend development, the Fluence [JS-SDK](https://github.com/fluencelabs/fluence-js) is currently the favored, and only, tool. +We are currently in the process of updating the documentation to reflect these changes. If you run into an errant `fldist` reference, please let us now! +{% endhint %} + +### Fluence JS + +For frontend development, the Fluence [JS](https://github.com/fluencelabs/fluence-js) is currently the favored, and only, tool. ```bash npm install @fluencelabs/fluence ``` - - diff --git a/tutorials_tutorials/tutorial_run_local_node.md b/tutorials_tutorials/tutorial_run_local_node.md index 7948d5e..2d77f5a 100644 --- a/tutorials_tutorials/tutorial_run_local_node.md +++ b/tutorials_tutorials/tutorial_run_local_node.md @@ -10,16 +10,16 @@ docker run -d --name fluence -e RUST_LOG="info" -p 7777:7777 -p 9999:9999 -p 180 where the `-d` flag runs the container in detached mode, `-e` flag sets the environment variables, `-p` flag exposes the ports: 7777 is the tcp port, 9999 the websocket port, and, optionally, 18080 the Prometheus port. -Once the container is up and running, we can tail the log \(output\) with +Once the container is up and running, we can tail the log (output) with -```text +``` docker logs -f fluence ``` Which gives os the logged output: ```bash -[2021-03-11T01:31:17.574274Z INFO particle_node] +[2021-12-02T19:42:20.734559Z INFO particle_node] +-------------------------------------------------+ | Hello from the Fluence Team. If you encounter | | any troubles with node operation, please update | @@ -30,19 +30,23 @@ Which gives os the logged output: | github.com/fluencelabs/fluence/discussions | +-------------------------------------------------+ -[2021-03-11T01:31:17.575062Z INFO server_config::fluence_config] Loading config from "/.fluence/Config.toml" -[2021-03-11T01:31:17.575461Z INFO server_config::keys] generating a new key pair -[2021-03-11T01:31:17.575768Z WARN server_config::defaults] New management key generated. private in base64 = VE0jt68kqa2B/SMOd3VuuPd14O2WTmj6Dl//r6VM+Wc=; peer_id = 12D3KooWNGuGgQVUA6aJMGMGqkBCFmLZqMwmp6pzmv1WLYdi7gxN -[2021-03-11T01:31:17.575797Z INFO particle_node] AIR interpreter: "./aquamarine_0.7.3.wasm" -[2021-03-11T01:31:17.575864Z INFO particle_node::config::certificates] storing new certificate for the key pair -[2021-03-11T01:31:17.577028Z INFO particle_node] public key = BRqbUhVD2XQ6YcWqXW1D21n7gPg15STWTG8C7pMLfqg2 -[2021-03-11T01:31:17.577848Z INFO particle_node::node] server peer id = 12D3KooWLFCmDq4vDRfaxW2GA6kYnorxAiie78XzQrVDVoWEZnPx +[2021-12-02T19:42:20.734599Z INFO server_config::resolved_config] Loading config from "/.fluence/v1/Config.toml" +[2021-12-02T19:42:20.734842Z INFO server_config::keys] Generating a new key pair to "/.fluence/v1/builtins_secret_key.ed25519" +[2021-12-02T19:42:20.735133Z INFO server_config::keys] Generating a new key pair to "/.fluence/v1/secret_key.ed25519" +[2021-12-02T19:42:20.735409Z WARN server_config::defaults] New management key generated. ed25519 private key in base64 = M2sMsy5qguJIEttNct1+OBmbMhVELRUzBX9836A+yNE= +[2021-12-02T19:42:20.736364Z INFO particle_node] AIR interpreter: "/.fluence/v1/aquamarine_0.16.0-restriction-operator.9.wasm" +[2021-12-02T19:42:20.736403Z INFO particle_node::config::certificates] storing new certificate for the key pair +[2021-12-02T19:42:20.736589Z INFO particle_node] node public key = 3iMsSHKmtioSHoTudBAn5dTtUpKGnZeVGvRpEV1NvVLH +[2021-12-02T19:42:20.736616Z INFO particle_node] node server peer id = 12D3KooWCXj3BQuV5d4vhgyLFmv7rRYiy9MupFiyEWnqcUAGpS4D +[2021-12-02T19:42:20.739248Z INFO particle_node::node] Fluence listening on ["/ip4/0.0.0.0/tcp/7777", "/ip4/0.0.0.0/tcp/9999/ws"] <snip> ``` -For future interaction with the node, we need to retain the server peer id 12D3KooWLFCmDq4vDRfaxW2GA6kYnorxAiie78XzQrVDVoWEZnPx. And if you feel the need to snoop around the container: +For future interaction with the node, we need to retain the server peer id \`12D3KooWCXj3BQuV5d4vhgyLFmv7rRYiy9MupFiyEWnqcUAGpS4D\`, which may be different for you.  + +And if you feel the need to snoop around the container: ```bash docker exec -it fluence bash @@ -50,17 +54,16 @@ docker exec -it fluence bash will get you in. -Now that we have a local node, we can use the `fldist` tool to interact with it. From the Quick Start, you may recall that we need the node-id and node-addr: +Now that we have a local node, we can use the `fldist` tool and `aqua cli` to interact with it. From the Quick Start, you may recall that we need the node-id and node-addr: -* node-id: 12D3KooWLFCmDq4vDRfaxW2GA6kYnorxAiie78XzQrVDVoWEZnPx -* node-addr: /ip4/127.0.0.1/tcp/9999/ws/p2p/12D3KooWLFCmDq4vDRfaxW2GA6kYnorxAiie78XzQrVDVoWEZnPx +* node-id: `12D3KooWCXj3BQuV5d4vhgyLFmv7rRYiy9MupFiyEWnqcUAGpS4D` +* node-addr: `/ip4/127.0.0.1/tcp/9999/ws/p2p/112D3KooWCXj3BQuV5d4vhgyLFmv7rRYiy9MupFiyEWnqcUAGpS4D` Let's inspect our node and check for any available modules and interfaces: -```text +``` fldist get_modules \ - --node-id 12D3KooWLFCmDq4vDRfaxW2GA6kYnorxAiie78XzQrVDVoWEZnPx \ - --node-addr /ip4/127.0.0.1/tcp/9999/ws/p2p/12D3KooWLFCmDq4vDRfaxW2GA6kYnorxAiie78XzQrVDVoWEZnPx \ + --node-addr /ip4/127.0.0.1/tcp/9999/ws/p2p/12D3KooWCXj3BQuV5d4vhgyLFmv7rRYiy9MupFiyEWnqcUAGpS4D \ --pretty ``` @@ -72,16 +75,15 @@ Let's us check on available modules and gives us: And checking on available interfaces: -```text +``` fldist get_interfaces \ - --node-id 12D3KooWLFCmDq4vDRfaxW2GA6kYnorxAiie78XzQrVDVoWEZnPx \ - --node-addr /ip4/127.0.0.1/tcp/9999/ws/p2p/12D3KooWLFCmDq4vDRfaxW2GA6kYnorxAiie78XzQrVDVoWEZnPx + --node-addr /ip4/127.0.0.1/tcp/9999/ws/p2p/12D3KooWCXj3BQuV5d4vhgyLFmv7rRYiy9MupFiyEWnqcUAGpS4D \ --expand ``` Results in: -```text +``` 60000 [ [] ] ``` @@ -91,28 +93,28 @@ Since we just initiated the node, we expect no modules and no interfaces and the ```bash mkdir fluence-greeter cd fluence-greeeter -# download the greeting.wasm file into this directory -# https://github.com/fluencelabs/fce/blob/master/examples/greeting/artifacts/greeting.wasm -- Download button to the right +# download the greeting.wasm file into this directory: +# https://github.com/fluencelabs/marine/blob/master/examples/greeting/artifacts/greeting.wasm -- Download button to the right echo '{ "name":"greeting"}' > greeting_cfg.json ``` We just grabbed the greeting Wasm file from the Fluence repo and created a service configuration file, `greeting_cfg.json`, which allow us to create a new GreetingService: ```bash -fldist --node-id 12D3KooWLFCmDq4vDRfaxW2GA6kYnorxAiie78XzQrVDVoWEZnPx \ - --node-addr /ip4/127.0.0.1/tcp/9999/ws/p2p/12D3KooWLFCmDq4vDRfaxW2GA6kYnorxAiie78XzQrVDVoWEZnPx \ - new_service \ - --ms examples/greeting/artifacts/greeting.wasm:greeting_cfg.json \ - -n GreetingService +fldist \ + --node-addr /ip4/127.0.0.1/tcp/9999/ws/p2p/12D3KooWCXj3BQuV5d4vhgyLFmv7rRYiy9MupFiyEWnqcUAGpS4D new_service \ + --ms greeting.wasm:greeting_cfg.json \ + -n greeting-service \ + --verbose ``` Which gives us the service id: -```text -client seed: 7VtMT7dbdfuU2ewWHEo42Ysg5B9KTB5gAgM8oDEs4kJk -client peerId: 12D3KooWRSmoTL64JVXna34myzAuKWaGkjE6EBAb9gaR4hyyyQDM -node peerId: 12D3KooWLFCmDq4vDRfaxW2GA6kYnorxAiie78XzQrVDVoWEZnPx -service id: 64551400-6296-4701-8e82-daf0b4e02751 +``` +client seed: GofK8dD9kHFv27HGrQstMoQTWGiKeBteoXT1gGdXLzqc +client peerId: 12D3KooWAyyRcszmHTotttZNyTNhpUMxcrC7JesEurUZ4zKfvtyJ +relay peerId: 12D3KooWCXj3BQuV5d4vhgyLFmv7rRYiy9MupFiyEWnqcUAGpS4D +service id: 2bb578a1-f67e-4975-b952-b2979c63f0f0 service created successfully ``` @@ -120,14 +122,13 @@ We now have a greeting service running on our node. As always, take note of the ```bash fldist get_modules \ - --node-id 12D3KooWLFCmDq4vDRfaxW2GA6kYnorxAiie78XzQrVDVoWEZnPx \ - --node-addr /ip4/127.0.0.1/tcp/9999/ws/p2p/12D3KooWLFCmDq4vDRfaxW2GA6kYnorxAiie78XzQrVDVoWEZnPx \ + --node-addr /ip4/127.0.0.1/tcp/9999/ws/p2p/12D3KooWCXj3BQuV5d4vhgyLFmv7rRYiy9MupFiyEWnqcUAGpS4D \ --pretty ``` Which now lists our uploaded module: -```text +``` [ { "config": { "logger_enabled":true, @@ -145,9 +146,9 @@ Which now lists our uploaded module: ] ``` -Yep, checking once again for modules, the output confirms that the greeting service is available. Writing a small AIR script allows us to use the service: +Yep, checking once again for modules, the output confirms that the greeting service is available. Writing a small Aqua script allows us to use the service: -```text +```python service GreetingService("service-id"): greeting: string -> string @@ -158,33 +159,20 @@ func greeting(name:string, node:string, greeting_service_id: string) -> string: <- res ``` -Compile the script with [`aqua`](https://doc.fluence.dev/aqua-book/getting-started/quick-start) or `aqua-js` and use the resulting file with the`fldist` tool: +We run the script with [`aqua`](https://doc.fluence.dev/aqua-book/getting-started/quick-start) -```text -fldist --node-id 12D3KooWLFCmDq4vDRfaxW2GA6kYnorxAiie78XzQrVDVoWEZnPx \ - --node-addr /ip4/127.0.0.1/tcp/9999/ws/p2p/12D3KooWLFCmDq4vDRfaxW2GA6kYnorxAiie78XzQrVDVoWEZnPx \ - run_air \ - -p greeting.greeting.air \ - -d '{"service": "64551400-6296-4701-8e82-daf0b4e02751", "name":"Fluence", "node": "12D3KooWLFCmDq4vDRfaxW2GA6kYnorxAiie78XzQrVDVoWEZnPx"}' +``` +aqua run \ + -a /ip4/127.0.0.1/tcp/9999/ws/p2p/12D3KooWCXj3BQuV5d4vhgyLFmv7rRYiy9MupFiyEWnqcUAGpS4D \ + -i greeting.aqua \ + -f 'greeting("Fluence", "12D3KooWHLxVhUQyAuZe6AHMB29P7wkvTNMn7eDMcsqimJYLKREf", "04ef4459-474a-40b5-ba8d-1e9a697206ab")' ``` ```bash -<snip> -=================== +Your peerId: 12D3KooWAMTVBjHfEnSF54MT4wkXB1CvfDK3XqoGXt7birVsLFj6 [ "Hi, Fluence" ] -[ - [ - { - peer_pk: '12D3KooWLFCmDq4vDRfaxW2GA6kYnorxAiie78XzQrVDVoWEZnPx', - service_id: '64551400-6296-4701-8e82-daf0b4e02751', - function_name: 'greeting', - json_path: '' - } - ] -] -=================== ``` Yep, our node and the tools are working as expected. Going back to the logs, we can further verify the script execution: @@ -195,7 +183,7 @@ docker logs -f fluence And check from the bottom up: -```text +``` <snip> [2021-03-12T02:42:51.041267Z INFO aquamarine::particle_executor] Executing particle 14db3aff-b1a9-439e-8890-d0cdc9a0bacd [2021-03-12T02:42:51.041927Z INFO particle_closures::host_closures] Executed host call "64551400-6296-4701-8e82-daf0b4e02751" "greeting" (96us 700ns) @@ -205,4 +193,3 @@ And check from the bottom up: Looks like our node container and logging is up and running and ready for your development use. As the Fluence team is rapidly developing, make sure you stay up to date. Check the repo or [Docker hub](https://hub.docker.com/r/fluencelabs/fluence) and update with `docker pull fluencelabs/fluence:latest`. Happy composing! -