From dfefd0025e7fbe70f654aba0871f6de37dbcc959 Mon Sep 17 00:00:00 2001 From: folex <0xdxdy@gmail.com> Date: Wed, 20 Oct 2021 12:11:53 +0300 Subject: [PATCH] Fix price-oracle/client-peer (#31) --- aqua-examples/price-oracle/README.md | 88 ++++++++++--------- .../aqua-scripts/get_crypto_prices.aqua | 6 +- .../client-peer/package-lock.json | 75 +++++++++++++--- .../price-oracle/client-peer/package.json | 8 +- .../price-oracle/client-peer/src/index.ts | 49 ++++++----- .../price-oracle/data/deployed_services.json | 8 +- 6 files changed, 151 insertions(+), 83 deletions(-) diff --git a/aqua-examples/price-oracle/README.md b/aqua-examples/price-oracle/README.md index ef4f66f..f5ebb01 100644 --- a/aqua-examples/price-oracle/README.md +++ b/aqua-examples/price-oracle/README.md @@ -36,7 +36,7 @@ As outlined in Figure 1, we use one or more services distributed across the Flue Let's get right to it: -```text +```bash % cd web % npm install % npm start @@ -52,7 +52,7 @@ Please note that the coin name must the full name, e.g., ethereum or bitcoin ins If you like things a little closer to metal, see the [client-peer](./client-peer) directory for a peer-client based on the Fluence JS-SDK. To run the headless client: -```text +```bash % cd client-peer % npm instal % npm start run @@ -71,9 +71,9 @@ As evident from our results, we are executing two different workflows to get our ```typescript // client-peer/index.ts -import { createClient, setLogLevel, FluenceClient } from "@fluencelabs/fluence"; +import { Fluence } from "@fluencelabs/fluence"; import { krasnodar, Node } from "@fluencelabs/fluence-network-environment"; -import { get_price, get_price_par } from "./get_crypto_prices"; +import { get_price, get_price_par } from "./_aqua/get_crypto_prices"; interface NodeServicePair { node: string; @@ -82,37 +82,47 @@ interface NodeServicePair { // (node, service) tuples, json-style, for price getter services let getter_topo: Array; - -// and a mean service let mean_topo: NodeServicePair; -getter_topo = Array({ "node": "12D3KooWCMr9mU894i8JXAFqpgoFtx6qnV1LFPSfVc3Y34N4h4LS", "service_id": "c315073d-4311-4db3-be57-8f154f032d28" }, { "node": "12D3KooWFEwNWcHqi9rtsmDhsYcDbRUCDXH84RC4FW6UfsFWaoHi", "service_id": "25f9123a-f386-4cb2-9c1e-bb7c247c9c09" }); -mean_topo = { "node": "12D3KooWCMr9mU894i8JXAFqpgoFtx6qnV1LFPSfVc3Y34N4h4LS", "service_id": "dd47389f-25d9-4870-a2a9-909359e73580" }; +// description of the services' locations, copypaste from data/deployed_services.json +getter_topo = [ + { + node: "12D3KooWCMr9mU894i8JXAFqpgoFtx6qnV1LFPSfVc3Y34N4h4LS", + service_id: "b67586f7-e96f-49ee-914e-9eabe1a0b83d", + }, + { + node: "12D3KooWFEwNWcHqi9rtsmDhsYcDbRUCDXH84RC4FW6UfsFWaoHi", + service_id: "f5b456fa-ee18-4df1-b18b-84fe7ebc7ad0", + } +]; +mean_topo = [ + { + node: "12D3KooWCMr9mU894i8JXAFqpgoFtx6qnV1LFPSfVc3Y34N4h4LS", + service_id: "79b8ddb9-e2e6-4924-9293-c5d55c94af6b", + }, + { + node: "12D3KooWFEwNWcHqi9rtsmDhsYcDbRUCDXH84RC4FW6UfsFWaoHi", + service_id: "debecd02-ba7d-40a2-92ab-08a9321da2cf" + } +]; async function main() { + // create the Fluence client for the Krasnodar testnet + await Fluence.start({ connectTo: krasnodar[5] }); - // create the Fluence client for the Krasnodar testnet - const fluence = await createClient(krasnodar[2]); - console.log("created a fluence client %s with relay %s", fluence.selfPeerId, fluence.relayPeerId); + // call the get_price function -- sequential processing + const network_result = await get_price( + "ethereum", "usd", + getter_topo[1].node, getter_topo[1].service_id, mean_topo[1].service_id + ); + console.log("seq result: ", network_result); - // call the get_price function -- sequential processing - const network_result = await get_price(fluence, "ethereum", "usd", "12D3KooWFEwNWcHqi9rtsmDhsYcDbRUCDXH84RC4FW6UfsFWaoHi", "25f9123a-f386-4cb2-9c1e-bb7c247c9c09", "b2790307-055e-41ca-9640-3c41856d464b"); - console.log("seq result: ", network_result); + // call the get_price_par function -- parallel processing + const network_result_par = await get_price_par("ethereum", "usd", getter_topo, mean_topo[0]); + console.log("par result: ", network_result_par); - // call the get_price_par function -- parallel processing - const network_result_par = await get_price_par(fluence, "ethereum", "usd", getter_topo, mean_topo); - console.log("par result: ", network_result_par); - - return; + await Fluence.stop(); } - -main() - .then(() => process.exit(0)) - .catch(error => { - console.error(error); - process.exit(1); - }); - ``` where the Aqua script can be found in the `aqua-scripts` dirctory and the compiled Aqua code is found in the `get_crypto_prices.ts` file. For more on the Aqua script, see below. @@ -134,7 +144,7 @@ As seen in Figure 3, we link the price_getter module and curl adapter module int We now have our code in place and area ready to compile and our compilation instructions are contain in the `scripts/build.sh` script, which basically instructs the the code is compiled with `marine` and that the resulting Wasm modules are copied to the `artifacts` directory. In the project directory: -```text +```bash ./scripts/build.sh ``` @@ -142,7 +152,7 @@ which gives you the updated Wasm modules in the `artifacts` directory. The next step is to deploy the two services to one or more peers and we use the `fldist` tool to get this done. First, we need to now what peers are available and we can get an enumeration from: -```text +```bash fldist env ``` @@ -150,24 +160,22 @@ fldist env Pick any of the peer ids from the listed peers to deploy your services. Let's say we use peer id `12D3KooWFEwNWcHqi9rtsmDhsYcDbRUCDXH84RC4FW6UfsFWaoHi`: -```text -fldist --node-id 12D3KooWFEwNWcHqi9rtsmDhsYcDbRUCDXH84RC4FW6UfsFWaoHi new_service --ms artifacts/curl_adapter.wasm:configs/curl_adapter_cfg.json artifacts/price_getter_service.wasm:configs/price_getter_service_cfg.json --name price-getter-service-0 +```bash +$ fldist --node-id 12D3KooWFEwNWcHqi9rtsmDhsYcDbRUCDXH84RC4FW6UfsFWaoHi new_service --ms artifacts/curl_adapter.wasm:configs/curl_adapter_cfg.json artifacts/price_getter_service.wasm:configs/price_getter_service_cfg.json --name price-getter-service-0 +service id: f5b456fa-ee18-4df1-b18b-84fe7ebc7ad0 # <--- REMEMBER service id !! +service created successfully ``` to deploy a price-getter service and -```text -fldist --node-id 12D3KooWFEwNWcHqi9rtsmDhsYcDbRUCDXH84RC4FW6UfsFWaoHi new_service --ms artifacts/mean_service.wasm:configs/mean_service_cfg.json --name mean-service-0 -``` - -to deploy a mean service. Please take note of the service-id you get back for each fo the deployments, which are needed to locate the service in the future. For example - -```text -fldist --node-id 12D3KooWFEwNWcHqi9rtsmDhsYcDbRUCDXH84RC4FW6UfsFWaoHi new_service --ms artifacts/mean_service.wasm:configs/mean_service_cfg.json --name mean-service-0 -service id: b2790307-055e-41ca-9640-3c41856d464b <-- REMEMBER ME !! +```bash +$ fldist --node-id 12D3KooWFEwNWcHqi9rtsmDhsYcDbRUCDXH84RC4FW6UfsFWaoHi new_service --ms artifacts/mean_service.wasm:configs/mean_service_cfg.json --name mean-service-0 +service id: debecd02-ba7d-40a2-92ab-08a9321da2cf # <--- REMEMBER service id !! service created successfully ``` +to deploy a mean service. Please take note of the service-id you get back for each fo the deployments, which are needed to locate the service in the future. + That's it for service development and deployment! ## Application Composition with Aqua diff --git a/aqua-examples/price-oracle/aqua-scripts/get_crypto_prices.aqua b/aqua-examples/price-oracle/aqua-scripts/get_crypto_prices.aqua index ebd683f..10198d0 100644 --- a/aqua-examples/price-oracle/aqua-scripts/get_crypto_prices.aqua +++ b/aqua-examples/price-oracle/aqua-scripts/get_crypto_prices.aqua @@ -50,16 +50,14 @@ func get_price(coin: string, currency: string, node: string, pg_sid: string, mea func get_price_par(coin: string, currency: string, getter_topo: []NodeServicePair, mean_topo: NodeServicePair) -> Result: prices: *f64 for topo <- getter_topo par: - on topo.node: - k <- Op.string_to_b58(topo.node) - + on topo.node: PriceGetterService topo.service_id ts_ms <- Peer.timestamp_ms() res <- PriceGetterService.price_getter(coin, currency, ts_ms) prices <- F64Op.identity(res.result) - F64Op.identity(prices!2) on mean_topo.node: + F64Op.identity(prices!1) MeanService mean_topo.service_id result <- MeanService.mean(prices) <- result diff --git a/aqua-examples/price-oracle/client-peer/package-lock.json b/aqua-examples/price-oracle/client-peer/package-lock.json index 0182b0d..38bfbd3 100644 --- a/aqua-examples/price-oracle/client-peer/package-lock.json +++ b/aqua-examples/price-oracle/client-peer/package-lock.json @@ -15,7 +15,7 @@ "it-all": "^1.0.5" }, "devDependencies": { - "@fluencelabs/aqua": "^0.3.0-226", + "@fluencelabs/aqua": "0.3.2-233", "typescript": "^3.9.5" } }, @@ -51,14 +51,16 @@ } }, "node_modules/@fluencelabs/aqua": { - "version": "0.3.0-226", - "resolved": "https://registry.npmjs.org/@fluencelabs/aqua/-/aqua-0.3.0-226.tgz", - "integrity": "sha512-9o0TdgsVNcBvifqo7VqIkN62P9EReE0LUxgWG1rGHi9yxJiGElvEBvrVUzqShffF66Ene7VGEe85lhFIGCfDgg==", + "version": "0.3.2-233", + "resolved": "https://registry.npmjs.org/@fluencelabs/aqua/-/aqua-0.3.2-233.tgz", + "integrity": "sha512-LxwNt/O2ijHA2bG7+qdmnFT//kpIVj7mACBp28LxRpb2kJYMcVDNb9VfyWDiDdoX10PAT96OpkiYvVJPs0mpEw==", "dev": true, + "dependencies": { + "@fluencelabs/fluence": "0.12.1" + }, "bin": { "aqua": "index.js", - "aqua-cli": "error.js", - "aqua-j": "index-java.js" + "aqua-cli": "error.js" } }, "node_modules/@fluencelabs/aqua-lib": { @@ -66,6 +68,30 @@ "resolved": "https://registry.npmjs.org/@fluencelabs/aqua-lib/-/aqua-lib-0.1.14.tgz", "integrity": "sha512-H2Q4gIvociUxc4J2mwmH0D+mrU2N2Z+enKCHgBCanMVEE2wZDsZ80GTbDKsQjEq+gpqbnJIk8lJBYW6lyvLJTg==" }, + "node_modules/@fluencelabs/aqua/node_modules/@fluencelabs/fluence": { + "version": "0.12.1", + "resolved": "https://registry.npmjs.org/@fluencelabs/fluence/-/fluence-0.12.1.tgz", + "integrity": "sha512-JrMKMHjYILAHQsLLd5H0fLt/UMZv+/PQYxJYe6h9HFyJlZrN1bUV+EcZnUw1u3DZE5k/RXBx0udfmkahggwrqA==", + "dev": true, + "dependencies": { + "@chainsafe/libp2p-noise": "4.0.0", + "@fluencelabs/avm": "0.14.4", + "async": "3.2.0", + "base64-js": "1.5.1", + "bs58": "4.0.1", + "cids": "0.8.1", + "it-length-prefixed": "3.0.1", + "it-pipe": "1.1.0", + "libp2p": "0.32.3", + "libp2p-crypto": "0.19.7", + "libp2p-mplex": "0.10.4", + "libp2p-websockets": "0.16.1", + "loglevel": "1.7.0", + "multiaddr": "10.0.0", + "peer-id": "0.15.3", + "uuid": "8.3.0" + } + }, "node_modules/@fluencelabs/avm": { "version": "0.14.4", "resolved": "https://registry.npmjs.org/@fluencelabs/avm/-/avm-0.14.4.tgz", @@ -2628,10 +2654,39 @@ } }, "@fluencelabs/aqua": { - "version": "0.3.0-226", - "resolved": "https://registry.npmjs.org/@fluencelabs/aqua/-/aqua-0.3.0-226.tgz", - "integrity": "sha512-9o0TdgsVNcBvifqo7VqIkN62P9EReE0LUxgWG1rGHi9yxJiGElvEBvrVUzqShffF66Ene7VGEe85lhFIGCfDgg==", - "dev": true + "version": "0.3.2-233", + "resolved": "https://registry.npmjs.org/@fluencelabs/aqua/-/aqua-0.3.2-233.tgz", + "integrity": "sha512-LxwNt/O2ijHA2bG7+qdmnFT//kpIVj7mACBp28LxRpb2kJYMcVDNb9VfyWDiDdoX10PAT96OpkiYvVJPs0mpEw==", + "dev": true, + "requires": { + "@fluencelabs/fluence": "0.12.1" + }, + "dependencies": { + "@fluencelabs/fluence": { + "version": "0.12.1", + "resolved": "https://registry.npmjs.org/@fluencelabs/fluence/-/fluence-0.12.1.tgz", + "integrity": "sha512-JrMKMHjYILAHQsLLd5H0fLt/UMZv+/PQYxJYe6h9HFyJlZrN1bUV+EcZnUw1u3DZE5k/RXBx0udfmkahggwrqA==", + "dev": true, + "requires": { + "@chainsafe/libp2p-noise": "4.0.0", + "@fluencelabs/avm": "0.14.4", + "async": "3.2.0", + "base64-js": "1.5.1", + "bs58": "4.0.1", + "cids": "0.8.1", + "it-length-prefixed": "3.0.1", + "it-pipe": "1.1.0", + "libp2p": "0.32.3", + "libp2p-crypto": "0.19.7", + "libp2p-mplex": "0.10.4", + "libp2p-websockets": "0.16.1", + "loglevel": "1.7.0", + "multiaddr": "10.0.0", + "peer-id": "0.15.3", + "uuid": "8.3.0" + } + } + } }, "@fluencelabs/aqua-lib": { "version": "0.1.14", diff --git a/aqua-examples/price-oracle/client-peer/package.json b/aqua-examples/price-oracle/client-peer/package.json index 728f5dc..18789da 100644 --- a/aqua-examples/price-oracle/client-peer/package.json +++ b/aqua-examples/price-oracle/client-peer/package.json @@ -13,9 +13,9 @@ "package-lock.json" ], "dependencies": { - "@fluencelabs/aqua-lib": "^0.1.9", - "@fluencelabs/fluence": "^0.13.0", - "@fluencelabs/fluence-network-environment": "^1.0.10", + "@fluencelabs/aqua-lib": "0.1.14", + "@fluencelabs/fluence": "0.13.0", + "@fluencelabs/fluence-network-environment": "1.0.10", "it-all": "^1.0.5" }, "scripts": { @@ -43,7 +43,7 @@ }, "homepage": "git+https://github.com/fluencelabs/examples/aqua-examples/price-oracle#readme", "devDependencies": { - "@fluencelabs/aqua": "^0.3.0-226", + "@fluencelabs/aqua": "0.3.2-233", "typescript": "^3.9.5" } } diff --git a/aqua-examples/price-oracle/client-peer/src/index.ts b/aqua-examples/price-oracle/client-peer/src/index.ts index 5428242..06bc26c 100644 --- a/aqua-examples/price-oracle/client-peer/src/index.ts +++ b/aqua-examples/price-oracle/client-peer/src/index.ts @@ -1,5 +1,5 @@ /* - * Copyright 2021 Fluence Labs Limited +* Copyright 2021 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. @@ -24,53 +24,60 @@ interface NodeServicePair { } let getter_topo: Array; -let mean_topo: NodeServicePair; +let mean_topo: Array; -getter_topo = Array( +// description of the services' locations, copypaste from data/deployed_services.json +getter_topo = [ { node: "12D3KooWCMr9mU894i8JXAFqpgoFtx6qnV1LFPSfVc3Y34N4h4LS", - service_id: "c315073d-4311-4db3-be57-8f154f032d28", + service_id: "b67586f7-e96f-49ee-914e-9eabe1a0b83d", }, { node: "12D3KooWFEwNWcHqi9rtsmDhsYcDbRUCDXH84RC4FW6UfsFWaoHi", - service_id: "25f9123a-f386-4cb2-9c1e-bb7c247c9c09", + service_id: "f5b456fa-ee18-4df1-b18b-84fe7ebc7ad0", } -); -mean_topo = { - node: "12D3KooWCMr9mU894i8JXAFqpgoFtx6qnV1LFPSfVc3Y34N4h4LS", - service_id: "dd47389f-25d9-4870-a2a9-909359e73580", -}; +]; +mean_topo = [ + { + node: "12D3KooWCMr9mU894i8JXAFqpgoFtx6qnV1LFPSfVc3Y34N4h4LS", + service_id: "79b8ddb9-e2e6-4924-9293-c5d55c94af6b", + }, + { + node: "12D3KooWFEwNWcHqi9rtsmDhsYcDbRUCDXH84RC4FW6UfsFWaoHi", + service_id: "debecd02-ba7d-40a2-92ab-08a9321da2cf" + } +]; async function main() { console.log("hello crypto investors"); + + // Uncomment to enable debug logs: // setLogLevel('DEBUG'); - await Fluence.start({ connectTo: krasnodar[2] }); + + // create the Fluence client for the Krasnodar testnet + await Fluence.start({ connectTo: krasnodar[5] }); console.log( "created a fluence client %s with relay %s", Fluence.getStatus().peerId, Fluence.getStatus().relayPeerId ); + // call the get_price function -- sequential processing const network_result = await get_price( "ethereum", "usd", - "12D3KooWFEwNWcHqi9rtsmDhsYcDbRUCDXH84RC4FW6UfsFWaoHi", - "25f9123a-f386-4cb2-9c1e-bb7c247c9c09", - "b2790307-055e-41ca-9640-3c41856d464b" + getter_topo[1].node, + getter_topo[1].service_id, + mean_topo[1].service_id ); console.log("seq result: ", network_result); - const network_result_par = await get_price_par( - "ethereum", - "usd", - getter_topo, - mean_topo + // call the get_price_par function -- parallel processing + const network_result_par = await get_price_par("ethereum", "usd", getter_topo, mean_topo[0] ); console.log("par result: ", network_result_par); await Fluence.stop(); - - return; } main() diff --git a/aqua-examples/price-oracle/data/deployed_services.json b/aqua-examples/price-oracle/data/deployed_services.json index 7c5311f..b7a1989 100644 --- a/aqua-examples/price-oracle/data/deployed_services.json +++ b/aqua-examples/price-oracle/data/deployed_services.json @@ -2,21 +2,21 @@ "price_getter": [ { "node": "12D3KooWCMr9mU894i8JXAFqpgoFtx6qnV1LFPSfVc3Y34N4h4LS", - "service_id": "c315073d-4311-4db3-be57-8f154f032d28" + "service_id": "b67586f7-e96f-49ee-914e-9eabe1a0b83d" }, { "node": "12D3KooWFEwNWcHqi9rtsmDhsYcDbRUCDXH84RC4FW6UfsFWaoHi", - "service_id": "25f9123a-f386-4cb2-9c1e-bb7c247c9c09" + "service_id": "f5b456fa-ee18-4df1-b18b-84fe7ebc7ad0" } ], "mean": [ { "node": "12D3KooWCMr9mU894i8JXAFqpgoFtx6qnV1LFPSfVc3Y34N4h4LS", - "service_id": "dd47389f-25d9-4870-a2a9-909359e73580" + "service_id": "79b8ddb9-e2e6-4924-9293-c5d55c94af6b" }, { "node": "12D3KooWFEwNWcHqi9rtsmDhsYcDbRUCDXH84RC4FW6UfsFWaoHi", - "service_id": "b2790307-055e-41ca-9640-3c41856d464b" + "service_id": "debecd02-ba7d-40a2-92ab-08a9321da2cf" } ] } \ No newline at end of file