Merge remote-tracking branch 'origin/main' into misc-fixes-10.19.21

This commit is contained in:
Pavel Murygin
2021-10-20 21:41:40 +03:00
14 changed files with 165 additions and 206 deletions

View File

@ -5,6 +5,7 @@
"main": "dist/index.js", "main": "dist/index.js",
"scripts": { "scripts": {
"build": "tsc", "build": "tsc",
"prestart": "npm run build",
"start:local": "node dist/demo.js local", "start:local": "node dist/demo.js local",
"start:remote": "node dist/demo.js krasnodar", "start:remote": "node dist/demo.js krasnodar",
"start": "npm run start:remote" "start": "npm run start:remote"

View File

@ -34,7 +34,10 @@ import { globSource, urlSource } from "ipfs-http-client";
async function main(environment: Node[]) { async function main(environment: Node[]) {
// setLogLevel('DEBUG'); // setLogLevel('DEBUG');
let providerHost = environment[0]; let providerHost = environment[4];
let relay = environment[3];
let serviceHost = environment[2];
let providerClient = new FluencePeer(); let providerClient = new FluencePeer();
await providerClient.start({ connectTo: providerHost }); await providerClient.start({ connectTo: providerHost });
console.log("📘 uploading .wasm to node %s", providerHost.multiaddr); console.log("📘 uploading .wasm to node %s", providerHost.multiaddr);
@ -43,7 +46,7 @@ async function main(environment: Node[]) {
console.log("📗 swarmAddr", swarmAddr); console.log("📗 swarmAddr", swarmAddr);
console.log("📗 rpcAddr", rpcAddr); console.log("📗 rpcAddr", rpcAddr);
await Fluence.start({ connectTo: environment[1] }); await Fluence.start({ connectTo: relay });
console.log( console.log(
"📗 created a fluence client %s with relay %s", "📗 created a fluence client %s with relay %s",
Fluence.getStatus().peerId, Fluence.getStatus().peerId,
@ -51,11 +54,11 @@ async function main(environment: Node[]) {
); );
// default IPFS timeout is 1 sec, set to 10 secs to retrieve file from remote node // default IPFS timeout is 1 sec, set to 10 secs to retrieve file from remote node
await set_timeout(environment[2].peerId, 10); await set_timeout(serviceHost.peerId, 10);
console.log("\n\n📘 Will deploy ProcessFiles service"); console.log("\n\n📘 Will deploy ProcessFiles service");
var service_id = await deploy_service( var service_id = await deploy_service(
environment[2].peerId, serviceHost.peerId,
file.cid.toString(), file.cid.toString(),
rpcAddr, rpcAddr,
(label, error) => { (label, error) => {
@ -79,7 +82,7 @@ async function main(environment: Node[]) {
providerClient providerClient
); );
var putResult = await put_file_size( var putResult = await put_file_size(
environment[2].peerId, serviceHost.peerId,
newFile.cid.toString(), newFile.cid.toString(),
rpcAddr, rpcAddr,
service_id, service_id,
@ -94,7 +97,7 @@ async function main(environment: Node[]) {
console.log("📗 File size is saved to IPFS:", putResult); console.log("📗 File size is saved to IPFS:", putResult);
} }
let result = await remove_service(environment[2].peerId, service_id); let result = await remove_service(serviceHost.peerId, service_id);
console.log("📗 ProcessFiles service removed", result); console.log("📗 ProcessFiles service removed", result);
return; return;
} }

View File

@ -20,7 +20,7 @@ import {
} from "./appState"; } from "./appState";
import { decapsulateP2P, fromOption } from "./util"; import { decapsulateP2P, fromOption } from "./util";
export const relayNodes = [krasnodar[0], krasnodar[1], krasnodar[2]]; export const relayNodes = [krasnodar[2], krasnodar[3], krasnodar[4]];
const requestRpcAddr = async () => { const requestRpcAddr = async () => {
let result = await get_external_api_multiaddr( let result = await get_external_api_multiaddr(
@ -122,13 +122,15 @@ export const useRemoveService = () => {
const setFileSizeCID = useSetRecoilState(fileSizeCIDState); const setFileSizeCID = useSetRecoilState(fileSizeCIDState);
return async () => { return async () => {
if (isConnected || serviceId === null) { console.dir(isConnected, serviceId);
if (!isConnected || serviceId === null) {
return; return;
} }
await remove_service(relay!, serviceId, { await remove_service(relay!, serviceId, {
ttl: 10000, ttl: 10000,
}); });
console.log(`Service ${serviceId} was removed`);
setServiceId(null); setServiceId(null);
setFileCID(null); setFileCID(null);
setFileSize(null); setFileSize(null);

View File

@ -22,7 +22,7 @@ export const serviceIdState = atom<string | null>({
export const wasmState = atom<string>({ export const wasmState = atom<string>({
key: "serviceState", key: "serviceState",
default: "Qmf8fH2cDZXGKS9uDGBcHxv5uQ51ChrigdZKe3QxS2C1AF", default: "QmSvjkzXbXYwFXcWuFWqFdksvQDgpCeADNxkgkfzCLA4rk",
}); });
export const rpcAddrState = atom<string | null>({ export const rpcAddrState = atom<string | null>({
@ -32,7 +32,7 @@ export const rpcAddrState = atom<string | null>({
export const fileCIDState = atom<string | null>({ export const fileCIDState = atom<string | null>({
key: "fileCIDState", key: "fileCIDState",
default: "Qmf8fH2cDZXGKS9uDGBcHxv5uQ51ChrigdZKe3QxS2C1AF", default: "QmSvjkzXbXYwFXcWuFWqFdksvQDgpCeADNxkgkfzCLA4rk",
}); });
export const fileSizeState = atom<string | null>({ export const fileSizeState = atom<string | null>({

View File

@ -292,21 +292,21 @@ Since we want to compose services deployed on different nodes, we express this r
Again, we can execute our workflow with the `fldist` tool: Again, we can execute our workflow with the `fldist` tool:
```text ```shell
fldist run_air \ fldist run_air \
-p aqua-compiled/echo_greeter.echo_greeting_seq_2.air \ -p aqua-compiled/echo_greeter.echo_greeting_seq_2.air \
-d '{"names":["jim", "john", "james"], -d '{"names":["jim", "john", "james"],
"greet": true, "greet": true,
"greeting_topo":{"node":"12D3KooWJd3HaMJ1rpLY1kQvcjRPEvnDwcXrH8mJvk7ypcZXqXGE", "greeting_topo":{"node":"12D3KooWJd3HaMJ1rpLY1kQvcjRPEvnDwcXrH8mJvk7ypcZXqXGE",
"service_id":"5a03906b-3217-40a2-93fb-7e83be735408"}, "service_id":"5a03906b-3217-40a2-93fb-7e83be735408"},
"echo_topo": {"node": "12D3KooWFtf3rfCDAfWwt6oLZYZbDfn9Vn7bv7g6QjjQxUUEFVBt", "echo_topo": {"node": "12D3KooWFtf3rfCDAfWwt6oLZYZbDfn9Vn7bv7g6QjjQxUUEFVBt",
"service_id": "fb5f7126-e1ee-4ecf-81e7-20804cb7203b"}}' "service_id": "fb5f7126-e1ee-4ecf-81e7-20804cb7203b"}}' \
--generated --generated
``` ```
Regardless of the difference in service hosts, we of course get the expected result: Regardless of the difference in service hosts, we of course get the expected result:
```text ```json
[ [
[ [
"Hi, jim", "Hi, jim",
@ -346,23 +346,23 @@ In this implementation version, we call the echo-service, just as before, and in
Our updated `fldist` reads: Our updated `fldist` reads:
```text ```bash
fldist run_air \ fldist run_air \
-p aqua-compiled/echo_greeter.echo_greeting_par.air \ -p aqua-compiled/echo_greeter.echo_greeting_par.air \
-d '{"echo_service":{"names":["jim", "john", "james"],\ -d '{"echo_service":{"names":["jim", "john", "james"],
"node": "12D3KooWFtf3rfCDAfWwt6oLZYZbDfn9Vn7bv7g6QjjQxUUEFVBt", \ "node": "12D3KooWFtf3rfCDAfWwt6oLZYZbDfn9Vn7bv7g6QjjQxUUEFVBt",
"service_id": "fb5f7126-e1ee-4ecf-81e7-20804cb7203b"}, \ "service_id": "fb5f7126-e1ee-4ecf-81e7-20804cb7203b"},
"greeting_services":[{"node":"12D3KooWJd3HaMJ1rpLY1kQvcjRPEvnDwcXrH8mJvk7ypcZXqXGE", \ "greeting_services":[{"node":"12D3KooWJd3HaMJ1rpLY1kQvcjRPEvnDwcXrH8mJvk7ypcZXqXGE",
"service_id":"5a03906b-3217-40a2-93fb-7e83be735408"}, \ "service_id":"5a03906b-3217-40a2-93fb-7e83be735408"},
{"node":"12D3KooWFtf3rfCDAfWwt6oLZYZbDfn9Vn7bv7g6QjjQxUUEFVBt", \ {"node":"12D3KooWFtf3rfCDAfWwt6oLZYZbDfn9Vn7bv7g6QjjQxUUEFVBt",
"service_id":"5cf520ff-dd65-47d7-a51a-2bf08dfe2ede"}], \ "service_id":"5cf520ff-dd65-47d7-a51a-2bf08dfe2ede"}],
"greet": true}' \ "greet": true}' \
--generated --generated
``` ```
And our result is: And our result is:
```text ```json
[ [
"Hi, jim", "Hi, jim",
@ -396,9 +396,9 @@ func echo_greeting_par_alternative(greet: bool, echo_service: EchoServiceInput,
And running the workflow with the updated data: And running the workflow with the updated data:
```text ```bash
fldist run_air \ fldist run_air \
-p aqua-compiled/echo_greeter.echo_greeting_par_inverse.air \ -p aqua-compiled/echo_greeter.echo_greeting_par_alternative.air \
-d '{"echo_service":{"names":["jim", "john", "james"], -d '{"echo_service":{"names":["jim", "john", "james"],
"node": "12D3KooWFtf3rfCDAfWwt6oLZYZbDfn9Vn7bv7g6QjjQxUUEFVBt", "node": "12D3KooWFtf3rfCDAfWwt6oLZYZbDfn9Vn7bv7g6QjjQxUUEFVBt",
"service_id": "fb5f7126-e1ee-4ecf-81e7-20804cb7203b"}, "service_id": "fb5f7126-e1ee-4ecf-81e7-20804cb7203b"},
@ -412,7 +412,7 @@ fldist run_air \
gives us the updated result: gives us the updated result:
```text ```json
[ [
[ [
"Hi, jim", "Hi, jim",
@ -452,8 +452,8 @@ func echo_greeting_par_improved(echo_service: EchoServiceInput, greeting_service
Run the workflow with the updated json string: Run the workflow with the updated json string:
```test ```bash
fldist run_air fldist run_air \
-p aqua-compiled/echo_greeter.echo_greeting_par_improved.air \ -p aqua-compiled/echo_greeter.echo_greeting_par_improved.air \
-d '{"echo_service":{"names":["jim", "john", "james"], -d '{"echo_service":{"names":["jim", "john", "james"],
"node": "12D3KooWFtf3rfCDAfWwt6oLZYZbDfn9Vn7bv7g6QjjQxUUEFVBt", "node": "12D3KooWFtf3rfCDAfWwt6oLZYZbDfn9Vn7bv7g6QjjQxUUEFVBt",
@ -469,7 +469,7 @@ fldist run_air
Which gives us: Which gives us:
```text ```json
[ [
[ [
"Hi, jim", "Hi, jim",

View File

@ -15,7 +15,7 @@
"it-all": "^1.0.5" "it-all": "^1.0.5"
}, },
"devDependencies": { "devDependencies": {
"@fluencelabs/aqua": "^0.3.0-226", "@fluencelabs/aqua": "0.3.2-233",
"typescript": "^3.9.5" "typescript": "^3.9.5"
} }
}, },
@ -51,14 +51,16 @@
} }
}, },
"node_modules/@fluencelabs/aqua": { "node_modules/@fluencelabs/aqua": {
"version": "0.3.0-226", "version": "0.3.2-233",
"resolved": "https://registry.npmjs.org/@fluencelabs/aqua/-/aqua-0.3.0-226.tgz", "resolved": "https://registry.npmjs.org/@fluencelabs/aqua/-/aqua-0.3.2-233.tgz",
"integrity": "sha512-9o0TdgsVNcBvifqo7VqIkN62P9EReE0LUxgWG1rGHi9yxJiGElvEBvrVUzqShffF66Ene7VGEe85lhFIGCfDgg==", "integrity": "sha512-LxwNt/O2ijHA2bG7+qdmnFT//kpIVj7mACBp28LxRpb2kJYMcVDNb9VfyWDiDdoX10PAT96OpkiYvVJPs0mpEw==",
"dev": true, "dev": true,
"dependencies": {
"@fluencelabs/fluence": "0.12.1"
},
"bin": { "bin": {
"aqua": "index.js", "aqua": "index.js",
"aqua-cli": "error.js", "aqua-cli": "error.js"
"aqua-j": "index-java.js"
} }
}, },
"node_modules/@fluencelabs/aqua-lib": { "node_modules/@fluencelabs/aqua-lib": {
@ -75,9 +77,9 @@
} }
}, },
"node_modules/@fluencelabs/fluence": { "node_modules/@fluencelabs/fluence": {
"version": "0.12.0", "version": "0.12.1",
"resolved": "https://registry.npmjs.org/@fluencelabs/fluence/-/fluence-0.12.0.tgz", "resolved": "https://registry.npmjs.org/@fluencelabs/fluence/-/fluence-0.12.1.tgz",
"integrity": "sha512-eYg3CflqeqlWUoaXXXUBxls7Pzjytp1nkHZWoe39bL7poF20T1BuTovNWo/jTWma5HS4L1FaAGGRNaMcN0wFHQ==", "integrity": "sha512-JrMKMHjYILAHQsLLd5H0fLt/UMZv+/PQYxJYe6h9HFyJlZrN1bUV+EcZnUw1u3DZE5k/RXBx0udfmkahggwrqA==",
"dependencies": { "dependencies": {
"@chainsafe/libp2p-noise": "4.0.0", "@chainsafe/libp2p-noise": "4.0.0",
"@fluencelabs/avm": "0.14.4", "@fluencelabs/avm": "0.14.4",
@ -93,7 +95,6 @@
"libp2p-websockets": "0.16.1", "libp2p-websockets": "0.16.1",
"loglevel": "1.7.0", "loglevel": "1.7.0",
"multiaddr": "10.0.0", "multiaddr": "10.0.0",
"noble-ed25519": "^1.2.5",
"peer-id": "0.15.3", "peer-id": "0.15.3",
"uuid": "8.3.0" "uuid": "8.3.0"
} }
@ -1879,11 +1880,6 @@
"node": ">= 0.4.0" "node": ">= 0.4.0"
} }
}, },
"node_modules/noble-ed25519": {
"version": "1.2.5",
"resolved": "https://registry.npmjs.org/noble-ed25519/-/noble-ed25519-1.2.5.tgz",
"integrity": "sha512-7vst+4UhM5QU3jJ3pUqPMKBCOePrxBojmoQa59qcSnYvjFF/T4jqb4WISlfslcWyBw7G5H9V/acpcAxMd8DzUQ=="
},
"node_modules/node-addon-api": { "node_modules/node-addon-api": {
"version": "2.0.2", "version": "2.0.2",
"resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz", "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz",
@ -2634,10 +2630,13 @@
} }
}, },
"@fluencelabs/aqua": { "@fluencelabs/aqua": {
"version": "0.3.0-226", "version": "0.3.2-233",
"resolved": "https://registry.npmjs.org/@fluencelabs/aqua/-/aqua-0.3.0-226.tgz", "resolved": "https://registry.npmjs.org/@fluencelabs/aqua/-/aqua-0.3.2-233.tgz",
"integrity": "sha512-9o0TdgsVNcBvifqo7VqIkN62P9EReE0LUxgWG1rGHi9yxJiGElvEBvrVUzqShffF66Ene7VGEe85lhFIGCfDgg==", "integrity": "sha512-LxwNt/O2ijHA2bG7+qdmnFT//kpIVj7mACBp28LxRpb2kJYMcVDNb9VfyWDiDdoX10PAT96OpkiYvVJPs0mpEw==",
"dev": true "dev": true,
"requires": {
"@fluencelabs/fluence": "0.12.1"
}
}, },
"@fluencelabs/aqua-lib": { "@fluencelabs/aqua-lib": {
"version": "0.1.14", "version": "0.1.14",
@ -2653,9 +2652,9 @@
} }
}, },
"@fluencelabs/fluence": { "@fluencelabs/fluence": {
"version": "0.12.0", "version": "0.12.1",
"resolved": "https://registry.npmjs.org/@fluencelabs/fluence/-/fluence-0.12.0.tgz", "resolved": "https://registry.npmjs.org/@fluencelabs/fluence/-/fluence-0.12.1.tgz",
"integrity": "sha512-eYg3CflqeqlWUoaXXXUBxls7Pzjytp1nkHZWoe39bL7poF20T1BuTovNWo/jTWma5HS4L1FaAGGRNaMcN0wFHQ==", "integrity": "sha512-JrMKMHjYILAHQsLLd5H0fLt/UMZv+/PQYxJYe6h9HFyJlZrN1bUV+EcZnUw1u3DZE5k/RXBx0udfmkahggwrqA==",
"requires": { "requires": {
"@chainsafe/libp2p-noise": "4.0.0", "@chainsafe/libp2p-noise": "4.0.0",
"@fluencelabs/avm": "0.14.4", "@fluencelabs/avm": "0.14.4",
@ -2671,7 +2670,6 @@
"libp2p-websockets": "0.16.1", "libp2p-websockets": "0.16.1",
"loglevel": "1.7.0", "loglevel": "1.7.0",
"multiaddr": "10.0.0", "multiaddr": "10.0.0",
"noble-ed25519": "^1.2.5",
"peer-id": "0.15.3", "peer-id": "0.15.3",
"uuid": "8.3.0" "uuid": "8.3.0"
} }
@ -4175,11 +4173,6 @@
"resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz",
"integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==" "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg=="
}, },
"noble-ed25519": {
"version": "1.2.5",
"resolved": "https://registry.npmjs.org/noble-ed25519/-/noble-ed25519-1.2.5.tgz",
"integrity": "sha512-7vst+4UhM5QU3jJ3pUqPMKBCOePrxBojmoQa59qcSnYvjFF/T4jqb4WISlfslcWyBw7G5H9V/acpcAxMd8DzUQ=="
},
"node-addon-api": { "node-addon-api": {
"version": "2.0.2", "version": "2.0.2",
"resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz", "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz",

View File

@ -43,7 +43,7 @@
}, },
"homepage": "git+https://github.com/fluencelabs/examples/aqua-examples/echo-greeter#readme", "homepage": "git+https://github.com/fluencelabs/examples/aqua-examples/echo-greeter#readme",
"devDependencies": { "devDependencies": {
"@fluencelabs/aqua": "^0.3.0-226", "@fluencelabs/aqua": "0.3.2-233",
"typescript": "^3.9.5" "typescript": "^3.9.5"
} }
} }

View File

@ -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: Let's get right to it:
```text ```bash
% cd web % cd web
% npm install % npm install
% npm start % 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: 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 % cd client-peer
% npm instal % npm instal
% npm start run % npm start run
@ -71,9 +71,9 @@ As evident from our results, we are executing two different workflows to get our
```typescript ```typescript
// client-peer/index.ts // 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 { 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 { interface NodeServicePair {
node: string; node: string;
@ -82,37 +82,47 @@ interface NodeServicePair {
// (node, service) tuples, json-style, for price getter services // (node, service) tuples, json-style, for price getter services
let getter_topo: Array<NodeServicePair>; let getter_topo: Array<NodeServicePair>;
// and a mean service
let mean_topo: NodeServicePair; 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" }); // description of the services' locations, copypaste from data/deployed_services.json
mean_topo = { "node": "12D3KooWCMr9mU894i8JXAFqpgoFtx6qnV1LFPSfVc3Y34N4h4LS", "service_id": "dd47389f-25d9-4870-a2a9-909359e73580" }; 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() { async function main() {
// create the Fluence client for the Krasnodar testnet // create the Fluence client for the Krasnodar testnet
const fluence = await createClient(krasnodar[2]); await Fluence.start({ connectTo: krasnodar[5] });
console.log("created a fluence client %s with relay %s", fluence.selfPeerId, fluence.relayPeerId);
// call the get_price function -- sequential processing // 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"); 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); console.log("seq result: ", network_result);
// call the get_price_par function -- parallel processing // call the get_price_par function -- parallel processing
const network_result_par = await get_price_par(fluence, "ethereum", "usd", getter_topo, mean_topo); const network_result_par = await get_price_par("ethereum", "usd", getter_topo, mean_topo[0]);
console.log("par result: ", network_result_par); 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. 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: 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 ./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: 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 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`: Pick any of the peer ids from the listed peers to deploy your services. Let's say we use peer id `12D3KooWFEwNWcHqi9rtsmDhsYcDbRUCDXH84RC4FW6UfsFWaoHi`:
```text ```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 $ 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 to deploy a price-getter service and
```text ```bash
fldist --node-id 12D3KooWFEwNWcHqi9rtsmDhsYcDbRUCDXH84RC4FW6UfsFWaoHi new_service --ms artifacts/mean_service.wasm:configs/mean_service_cfg.json --name mean-service-0 $ 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 !!
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 !!
service created successfully 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! That's it for service development and deployment!
## Application Composition with Aqua ## Application Composition with Aqua

View File

@ -51,15 +51,13 @@ func get_price_par(coin: string, currency: string, getter_topo: []NodeServicePai
prices: *f64 prices: *f64
for topo <- getter_topo par: for topo <- getter_topo par:
on topo.node: on topo.node:
k <- Op.string_to_b58(topo.node)
PriceGetterService topo.service_id PriceGetterService topo.service_id
ts_ms <- Peer.timestamp_ms() ts_ms <- Peer.timestamp_ms()
res <- PriceGetterService.price_getter(coin, currency, ts_ms) res <- PriceGetterService.price_getter(coin, currency, ts_ms)
prices <- F64Op.identity(res.result) prices <- F64Op.identity(res.result)
F64Op.identity(prices!2)
on mean_topo.node: on mean_topo.node:
F64Op.identity(prices!1)
MeanService mean_topo.service_id MeanService mean_topo.service_id
result <- MeanService.mean(prices) result <- MeanService.mean(prices)
<- result <- result

View File

@ -15,7 +15,7 @@
"it-all": "^1.0.5" "it-all": "^1.0.5"
}, },
"devDependencies": { "devDependencies": {
"@fluencelabs/aqua": "^0.3.2-233", "@fluencelabs/aqua": "0.3.2-233",
"typescript": "^3.9.5" "typescript": "^3.9.5"
} }
}, },

View File

@ -13,9 +13,9 @@
"package-lock.json" "package-lock.json"
], ],
"dependencies": { "dependencies": {
"@fluencelabs/aqua-lib": "^0.1.9", "@fluencelabs/aqua-lib": "0.1.14",
"@fluencelabs/fluence": "^0.13.0", "@fluencelabs/fluence": "0.13.0",
"@fluencelabs/fluence-network-environment": "^1.0.10", "@fluencelabs/fluence-network-environment": "1.0.10",
"it-all": "^1.0.5" "it-all": "^1.0.5"
}, },
"scripts": { "scripts": {
@ -43,7 +43,7 @@
}, },
"homepage": "git+https://github.com/fluencelabs/examples/aqua-examples/price-oracle#readme", "homepage": "git+https://github.com/fluencelabs/examples/aqua-examples/price-oracle#readme",
"devDependencies": { "devDependencies": {
"@fluencelabs/aqua": "^0.3.2-233", "@fluencelabs/aqua": "0.3.2-233",
"typescript": "^3.9.5" "typescript": "^3.9.5"
} }
} }

View File

@ -1,5 +1,5 @@
/* /*
* Copyright 2021 Fluence Labs Limited * Copyright 2021 Fluence Labs Limited
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -24,53 +24,60 @@ interface NodeServicePair {
} }
let getter_topo: Array<NodeServicePair>; let getter_topo: Array<NodeServicePair>;
let mean_topo: NodeServicePair; let mean_topo: Array<NodeServicePair>;
getter_topo = Array( // description of the services' locations, copypaste from data/deployed_services.json
getter_topo = [
{ {
node: "12D3KooWCMr9mU894i8JXAFqpgoFtx6qnV1LFPSfVc3Y34N4h4LS", node: "12D3KooWCMr9mU894i8JXAFqpgoFtx6qnV1LFPSfVc3Y34N4h4LS",
service_id: "c315073d-4311-4db3-be57-8f154f032d28", service_id: "b67586f7-e96f-49ee-914e-9eabe1a0b83d",
}, },
{ {
node: "12D3KooWFEwNWcHqi9rtsmDhsYcDbRUCDXH84RC4FW6UfsFWaoHi", node: "12D3KooWFEwNWcHqi9rtsmDhsYcDbRUCDXH84RC4FW6UfsFWaoHi",
service_id: "25f9123a-f386-4cb2-9c1e-bb7c247c9c09", service_id: "f5b456fa-ee18-4df1-b18b-84fe7ebc7ad0",
} }
); ];
mean_topo = { mean_topo = [
{
node: "12D3KooWCMr9mU894i8JXAFqpgoFtx6qnV1LFPSfVc3Y34N4h4LS", node: "12D3KooWCMr9mU894i8JXAFqpgoFtx6qnV1LFPSfVc3Y34N4h4LS",
service_id: "dd47389f-25d9-4870-a2a9-909359e73580", service_id: "79b8ddb9-e2e6-4924-9293-c5d55c94af6b",
}; },
{
node: "12D3KooWFEwNWcHqi9rtsmDhsYcDbRUCDXH84RC4FW6UfsFWaoHi",
service_id: "debecd02-ba7d-40a2-92ab-08a9321da2cf"
}
];
async function main() { async function main() {
console.log("hello crypto investors"); console.log("hello crypto investors");
// Uncomment to enable debug logs:
// setLogLevel('DEBUG'); // setLogLevel('DEBUG');
await Fluence.start({ connectTo: krasnodar[2] });
// create the Fluence client for the Krasnodar testnet
await Fluence.start({ connectTo: krasnodar[5] });
console.log( console.log(
"created a fluence client %s with relay %s", "created a fluence client %s with relay %s",
Fluence.getStatus().peerId, Fluence.getStatus().peerId,
Fluence.getStatus().relayPeerId Fluence.getStatus().relayPeerId
); );
// call the get_price function -- sequential processing
const network_result = await get_price( const network_result = await get_price(
"ethereum", "ethereum",
"usd", "usd",
"12D3KooWFEwNWcHqi9rtsmDhsYcDbRUCDXH84RC4FW6UfsFWaoHi", getter_topo[1].node,
"25f9123a-f386-4cb2-9c1e-bb7c247c9c09", getter_topo[1].service_id,
"b2790307-055e-41ca-9640-3c41856d464b" mean_topo[1].service_id
); );
console.log("seq result: ", network_result); console.log("seq result: ", network_result);
const network_result_par = await get_price_par( // call the get_price_par function -- parallel processing
"ethereum", const network_result_par = await get_price_par("ethereum", "usd", getter_topo, mean_topo[0]
"usd",
getter_topo,
mean_topo
); );
console.log("par result: ", network_result_par); console.log("par result: ", network_result_par);
await Fluence.stop(); await Fluence.stop();
return;
} }
main() main()

View File

@ -2,21 +2,21 @@
"price_getter": [ "price_getter": [
{ {
"node": "12D3KooWCMr9mU894i8JXAFqpgoFtx6qnV1LFPSfVc3Y34N4h4LS", "node": "12D3KooWCMr9mU894i8JXAFqpgoFtx6qnV1LFPSfVc3Y34N4h4LS",
"service_id": "c315073d-4311-4db3-be57-8f154f032d28" "service_id": "b67586f7-e96f-49ee-914e-9eabe1a0b83d"
}, },
{ {
"node": "12D3KooWFEwNWcHqi9rtsmDhsYcDbRUCDXH84RC4FW6UfsFWaoHi", "node": "12D3KooWFEwNWcHqi9rtsmDhsYcDbRUCDXH84RC4FW6UfsFWaoHi",
"service_id": "25f9123a-f386-4cb2-9c1e-bb7c247c9c09" "service_id": "f5b456fa-ee18-4df1-b18b-84fe7ebc7ad0"
} }
], ],
"mean": [ "mean": [
{ {
"node": "12D3KooWCMr9mU894i8JXAFqpgoFtx6qnV1LFPSfVc3Y34N4h4LS", "node": "12D3KooWCMr9mU894i8JXAFqpgoFtx6qnV1LFPSfVc3Y34N4h4LS",
"service_id": "dd47389f-25d9-4870-a2a9-909359e73580" "service_id": "79b8ddb9-e2e6-4924-9293-c5d55c94af6b"
}, },
{ {
"node": "12D3KooWFEwNWcHqi9rtsmDhsYcDbRUCDXH84RC4FW6UfsFWaoHi", "node": "12D3KooWFEwNWcHqi9rtsmDhsYcDbRUCDXH84RC4FW6UfsFWaoHi",
"service_id": "b2790307-055e-41ca-9640-3c41856d464b" "service_id": "debecd02-ba7d-40a2-92ab-08a9321da2cf"
} }
] ]
} }

View File

@ -8,7 +8,7 @@
"name": "price-oracle", "name": "price-oracle",
"version": "0.1.0", "version": "0.1.0",
"dependencies": { "dependencies": {
"@fluencelabs/fluence": "^0.13.0", "@fluencelabs/fluence": "0.10.1",
"@testing-library/jest-dom": "^5.14.1", "@testing-library/jest-dom": "^5.14.1",
"@testing-library/react": "^11.2.7", "@testing-library/react": "^11.2.7",
"@testing-library/user-event": "^12.8.3", "@testing-library/user-event": "^12.8.3",
@ -23,7 +23,7 @@
"web-vitals": "^1.1.2" "web-vitals": "^1.1.2"
}, },
"devDependencies": { "devDependencies": {
"@fluencelabs/aqua": "^0.3.2-233", "@fluencelabs/aqua": "0.2.2-221",
"@fluencelabs/fluence-network-environment": "1.0.10", "@fluencelabs/fluence-network-environment": "1.0.10",
"chokidar-cli": "^2.1.0", "chokidar-cli": "^2.1.0",
"node-sass": "^6.0.1" "node-sass": "^6.0.1"
@ -1903,87 +1903,33 @@
} }
}, },
"node_modules/@fluencelabs/aqua": { "node_modules/@fluencelabs/aqua": {
"version": "0.3.2-233", "version": "0.2.2-221",
"resolved": "https://registry.npmjs.org/@fluencelabs/aqua/-/aqua-0.3.2-233.tgz", "resolved": "https://registry.npmjs.org/@fluencelabs/aqua/-/aqua-0.2.2-221.tgz",
"integrity": "sha512-LxwNt/O2ijHA2bG7+qdmnFT//kpIVj7mACBp28LxRpb2kJYMcVDNb9VfyWDiDdoX10PAT96OpkiYvVJPs0mpEw==", "integrity": "sha512-npFPyIs95uEDfkxKytvjj88NFS2z147+WebnRMp9aHbnGrzmKqLBG6eyoxPuTh9qTQbPL9DfX5rbl/iPfr4Sxw==",
"dev": true, "dev": true,
"dependencies": {
"@fluencelabs/fluence": "0.12.1"
},
"bin": { "bin": {
"aqua": "index.js", "aqua": "index.js",
"aqua-cli": "error.js" "aqua-cli": "index.js",
} "aqua-js": "index-experimental.js"
},
"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/aqua/node_modules/async": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/async/-/async-3.2.0.tgz",
"integrity": "sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw==",
"dev": true
},
"node_modules/@fluencelabs/aqua/node_modules/loglevel": {
"version": "1.7.0",
"resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.7.0.tgz",
"integrity": "sha512-i2sY04nal5jDcagM3FMfG++T69GEEM8CYuOfeOIvmXzOIcwE9a/CJPR0MFM97pYMj/u10lzz7/zd7+qwhrBTqQ==",
"dev": true,
"engines": {
"node": ">= 0.6.0"
},
"funding": {
"type": "tidelift",
"url": "https://tidelift.com/subscription/pkg/npm-loglevel?utm_medium=referral&utm_source=npm_fund"
}
},
"node_modules/@fluencelabs/aqua/node_modules/uuid": {
"version": "8.3.0",
"resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.0.tgz",
"integrity": "sha512-fX6Z5o4m6XsXBdli9g7DtWgAx+osMsRRZFKma1mIUsLCz6vRvv+pz5VNbyu9UEDzpMWulZfvpgb/cmDXVulYFQ==",
"dev": true,
"bin": {
"uuid": "dist/bin/uuid"
} }
}, },
"node_modules/@fluencelabs/avm": { "node_modules/@fluencelabs/avm": {
"version": "0.14.4", "version": "0.14.3",
"resolved": "https://registry.npmjs.org/@fluencelabs/avm/-/avm-0.14.4.tgz", "resolved": "https://registry.npmjs.org/@fluencelabs/avm/-/avm-0.14.3.tgz",
"integrity": "sha512-XyR+1H5k0CAc+mDHOkl81viX8XeW1Yqbw793xbsfUfju5bUb/hqk+gHv3q8lAFdbrCG5P45gdOT08a5RNODZaQ==", "integrity": "sha512-HCRIn8WHshHDkZmoW9ITnEzdr+XcZBo9SjlcbKHd8+ls1LkX4SiGe2tKh3QQwtmJ6xFh9TypTwjWeDYCGIw7JA==",
"dependencies": { "dependencies": {
"base64-js": "1.5.1" "base64-js": "1.5.1"
} }
}, },
"node_modules/@fluencelabs/fluence": { "node_modules/@fluencelabs/fluence": {
"version": "0.13.0", "version": "0.10.1",
"resolved": "https://registry.npmjs.org/@fluencelabs/fluence/-/fluence-0.13.0.tgz", "resolved": "https://registry.npmjs.org/@fluencelabs/fluence/-/fluence-0.10.1.tgz",
"integrity": "sha512-Dqhr7CAYeAO8Z5jR+mbGu0cVZjkE06cM2L8n9bQWe4T4y2B83ZxUmrs/OTWlYnsLd1Sr2YdDlnyZeUvWLEEmrQ==", "integrity": "sha512-xAtZh6B9IIQiDflwNhf4dIvjNX6vFddDvU27fGiDuhiXs92k/dQ6ks3yWL0tqsceSbkz4w7r2vQMfDq6gWkdgg==",
"dependencies": { "dependencies": {
"@chainsafe/libp2p-noise": "4.0.0", "@chainsafe/libp2p-noise": "4.0.0",
"@fluencelabs/avm": "0.14.4", "@fluencelabs/avm": "0.14.3",
"async": "3.2.0", "async": "3.2.0",
"base64-js": "1.5.1", "base64-js": "1.3.1",
"bs58": "4.0.1", "bs58": "4.0.1",
"cids": "0.8.1", "cids": "0.8.1",
"it-length-prefixed": "3.0.1", "it-length-prefixed": "3.0.1",
@ -2009,6 +1955,11 @@
"resolved": "https://registry.npmjs.org/async/-/async-3.2.0.tgz", "resolved": "https://registry.npmjs.org/async/-/async-3.2.0.tgz",
"integrity": "sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw==" "integrity": "sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw=="
}, },
"node_modules/@fluencelabs/fluence/node_modules/base64-js": {
"version": "1.3.1",
"resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz",
"integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g=="
},
"node_modules/@fluencelabs/fluence/node_modules/loglevel": { "node_modules/@fluencelabs/fluence/node_modules/loglevel": {
"version": "1.7.0", "version": "1.7.0",
"resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.7.0.tgz", "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.7.0.tgz",
@ -5678,7 +5629,6 @@
"version": "2.2.0", "version": "2.2.0",
"resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
"integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
"devOptional": true,
"engines": { "engines": {
"node": ">=8" "node": ">=8"
} }
@ -6254,7 +6204,6 @@
"version": "3.5.2", "version": "3.5.2",
"resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz",
"integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==", "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==",
"devOptional": true,
"dependencies": { "dependencies": {
"anymatch": "~3.1.2", "anymatch": "~3.1.2",
"braces": "~3.0.2", "braces": "~3.0.2",
@ -11515,7 +11464,6 @@
"version": "2.1.0", "version": "2.1.0",
"resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
"integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
"devOptional": true,
"dependencies": { "dependencies": {
"binary-extensions": "^2.0.0" "binary-extensions": "^2.0.0"
}, },
@ -19516,7 +19464,6 @@
"version": "3.6.0", "version": "3.6.0",
"resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
"integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
"devOptional": true,
"dependencies": { "dependencies": {
"picomatch": "^2.2.1" "picomatch": "^2.2.1"
}, },