reorg into node and client

This commit is contained in:
boneyard93501
2021-10-24 13:51:02 -05:00
parent d34b934677
commit bfc1a7d425
31 changed files with 700 additions and 19 deletions

View File

@ -1,26 +1,49 @@
{
"name": "snapshot-client",
"name": "snapshot-demo-client",
"version": "0.1.0",
"description": "",
"main": "index.js",
"scripts": {
"start": "node -r ts-node/register src/index.ts",
"compile-aqua": "aqua -i ../aqua/demo_validation.aqua -o ./src/_aqua",
"watch-aqua": "chokidar \"**/*.aqua\" -c \"npm run compile-aqua\""
"description": "Demo for JS PoC peer node",
"main": "./dist/src/index.js",
"typings": "./dist/src/index.d.ts",
"files": [
"dist/*"
],
"bic": [
"client-peer/*",
"*.aqua",
"package-lock.json"
],
"dependencies": {
"@fluencelabs/aqua-lib": "^0.1.14",
"@fluencelabs/fluence": "^0.14.2",
"@fluencelabs/fluence-network-environment": "^1.0.10",
"it-all": "^1.0.5"
},
"author": "",
"scripts": {
"compile-aqua": "aqua -i ../aqua-scripts -o src/_aqua/",
"prebuild": "npm run compile-aqua",
"build": "tsc",
"prestart:local": "npm run build",
"start:local": "node dist/src/index.js local",
"prestart:remote": "npm run build",
"start:remote": "node dist/src/index.js krasnodar",
"start": "npm run start:remote"
},
"repository": {
"type": "git",
"url": "git+https://github.com/fluencelabs/eip712-validation-node/tree/main/client-peer"
},
"keywords": [
"aqua",
"fluence"
],
"author": "Fluence Labs",
"license": "MIT",
"bugs": {
"url": "git+https://github.com/fluencelabs/eip712-validation-node/issues"
},
"homepage": "git+https://github.com/fluencelabs/eip712-validation-node/blob/main/README.md",
"devDependencies": {
"@fluencelabs/aqua": "^0.4.0-235",
"chokidar-cli": "^3.0.0",
"ts-node": "^10.2.1",
"typescript": "^4.4.2"
},
"dependencies": {
"@fluencelabs/fluence": "^0.14.2",
"@fluencelabs/fluence-network-environment": "1.0.10",
"@types/sqlite3": "^3.1.7",
"base64-js": "^1.5.1",
"got": "^11.8.2"
"typescript": "^4.0.0"
}
}

View File

@ -0,0 +1,26 @@
{
"name": "snapshot-client",
"version": "0.1.0",
"description": "",
"main": "index.js",
"scripts": {
"start": "node -r ts-node/register src/index.ts",
"compile-aqua": "aqua -i ../aqua/demo_validation.aqua -o ./src/_aqua",
"watch-aqua": "chokidar \"**/*.aqua\" -c \"npm run compile-aqua\""
},
"author": "",
"license": "MIT",
"devDependencies": {
"@fluencelabs/aqua": "^0.4.0-235",
"chokidar-cli": "^3.0.0",
"ts-node": "^10.2.1",
"typescript": "^4.4.2"
},
"dependencies": {
"@fluencelabs/fluence": "^0.14.2",
"@fluencelabs/fluence-network-environment": "1.0.10",
"@types/sqlite3": "^3.1.7",
"base64-js": "^1.5.1",
"got": "^11.8.2"
}
}

View File

View File

@ -12,7 +12,7 @@
"license": "ISC",
"devDependencies": {
"@fluencelabs/aqua": "^0.4.0-235",
"chokidar-cli": "^3.0.0",
"chokidar-cli": "^1.2.0",
"ts-node": "^10.2.1",
"typescript": "^4.4.2"
},

View File

@ -0,0 +1,495 @@
/**
*
* This file is auto-generated. Do not edit manually: changes may be erased.
* Generated by Aqua compiler: https://github.com/fluencelabs/aqua/.
* If you find any bugs, please write an issue on GitHub: https://github.com/fluencelabs/aqua/issues
* Aqua version: 0.4.0-235
*
*/
import { Fluence, FluencePeer } from '@fluencelabs/fluence';
import {
CallParams,
callFunction,
registerService,
} from '@fluencelabs/fluence/dist/internal/compilerSupport/v2';
// Services
export interface ProVoValidationDef {
eip712_validation_string: (eip_str: string, peer_id: string, callParams: CallParams<'eip_str' | 'peer_id'>) => string | Promise<string>;
eip712_validation_url: (eip_str: string, peer_id: string, callParams: CallParams<'eip_str' | 'peer_id'>) => string | Promise<string>;
}
export function registerProVoValidation(service: ProVoValidationDef): void;
export function registerProVoValidation(serviceId: string, service: ProVoValidationDef): void;
export function registerProVoValidation(peer: FluencePeer, service: ProVoValidationDef): void;
export function registerProVoValidation(peer: FluencePeer, serviceId: string, service: ProVoValidationDef): void;
export function registerProVoValidation(...args: any) {
registerService(
args,
{
"defaultServiceId" : "snapshot",
"functions" : [
{
"functionName" : "eip712_validation_string",
"argDefs" : [
{
"name" : "eip_str",
"argType" : {
"tag" : "primitive"
}
},
{
"name" : "peer_id",
"argType" : {
"tag" : "primitive"
}
}
],
"returnType" : {
"tag" : "primitive"
}
},
{
"functionName" : "eip712_validation_url",
"argDefs" : [
{
"name" : "eip_str",
"argType" : {
"tag" : "primitive"
}
},
{
"name" : "peer_id",
"argType" : {
"tag" : "primitive"
}
}
],
"returnType" : {
"tag" : "primitive"
}
}
]
}
);
}
export interface DataProviderDef {
get_record: (snapshot_id: number, callParams: CallParams<'snapshot_id'>) => { snapshot_id: number; } | Promise<{ snapshot_id: number; }>;
get_records: (callParams: CallParams<null>) => { snapshot_id: number; }[] | Promise<{ snapshot_id: number; }[]>;
}
export function registerDataProvider(service: DataProviderDef): void;
export function registerDataProvider(serviceId: string, service: DataProviderDef): void;
export function registerDataProvider(peer: FluencePeer, service: DataProviderDef): void;
export function registerDataProvider(peer: FluencePeer, serviceId: string, service: DataProviderDef): void;
export function registerDataProvider(...args: any) {
registerService(
args,
{
"defaultServiceId" : "snapshot",
"functions" : [
{
"functionName" : "get_record",
"argDefs" : [
{
"name" : "snapshot_id",
"argType" : {
"tag" : "primitive"
}
}
],
"returnType" : {
"tag" : "primitive"
}
},
{
"functionName" : "get_records",
"argDefs" : [
],
"returnType" : {
"tag" : "primitive"
}
}
]
}
);
}
// Functions
export function validate(relay: string, peer_: string, eip712_json: string, config?: {ttl?: number}): Promise<string>;
export function validate(peer: FluencePeer, relay: string, peer_: string, eip712_json: string, config?: {ttl?: number}): Promise<string>;
export function validate(...args: any) {
let script = `
(xor
(seq
(seq
(seq
(seq
(seq
(seq
(seq
(seq
(seq
(call %init_peer_id% ("getDataSrv" "-relay-") [] -relay-)
(call %init_peer_id% ("getDataSrv" "relay") [] relay)
)
(call %init_peer_id% ("getDataSrv" "peer") [] peer)
)
(call %init_peer_id% ("getDataSrv" "eip712_json") [] eip712_json)
)
(call -relay- ("op" "noop") [])
)
(call relay ("op" "noop") [])
)
(xor
(call peer ("snapshot" "eip712_validation_string") [eip712_json peer] result)
(seq
(seq
(seq
(call relay ("op" "noop") [])
(call -relay- ("op" "noop") [])
)
(call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 1])
)
(call -relay- ("op" "noop") [])
)
)
)
(call relay ("op" "noop") [])
)
(call -relay- ("op" "noop") [])
)
(xor
(call %init_peer_id% ("callbackSrv" "response") [result])
(call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 2])
)
)
(call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 3])
)
`
return callFunction(
args,
{
"functionName" : "validate",
"returnType" : {
"tag" : "primitive"
},
"argDefs" : [
{
"name" : "relay",
"argType" : {
"tag" : "primitive"
}
},
{
"name" : "peer",
"argType" : {
"tag" : "primitive"
}
},
{
"name" : "eip712_json",
"argType" : {
"tag" : "primitive"
}
}
],
"names" : {
"relay" : "-relay-",
"getDataSrv" : "getDataSrv",
"callbackSrv" : "callbackSrv",
"responseSrv" : "callbackSrv",
"responseFnName" : "response",
"errorHandlingSrv" : "errorHandlingSrv",
"errorFnName" : "error"
}
},
script
)
}
export function validate_from_url(relay: string, peer_: string, eip712_url: string, config?: {ttl?: number}): Promise<string>;
export function validate_from_url(peer: FluencePeer, relay: string, peer_: string, eip712_url: string, config?: {ttl?: number}): Promise<string>;
export function validate_from_url(...args: any) {
let script = `
(xor
(seq
(seq
(seq
(seq
(seq
(seq
(seq
(seq
(seq
(call %init_peer_id% ("getDataSrv" "-relay-") [] -relay-)
(call %init_peer_id% ("getDataSrv" "relay") [] relay)
)
(call %init_peer_id% ("getDataSrv" "peer") [] peer)
)
(call %init_peer_id% ("getDataSrv" "eip712_url") [] eip712_url)
)
(call -relay- ("op" "noop") [])
)
(call relay ("op" "noop") [])
)
(xor
(call peer ("snapshot" "eip712_validation_url") [eip712_url peer] result)
(seq
(seq
(seq
(call relay ("op" "noop") [])
(call -relay- ("op" "noop") [])
)
(call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 1])
)
(call -relay- ("op" "noop") [])
)
)
)
(call relay ("op" "noop") [])
)
(call -relay- ("op" "noop") [])
)
(xor
(call %init_peer_id% ("callbackSrv" "response") [result])
(call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 2])
)
)
(call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 3])
)
`
return callFunction(
args,
{
"functionName" : "validate_from_url",
"returnType" : {
"tag" : "primitive"
},
"argDefs" : [
{
"name" : "relay",
"argType" : {
"tag" : "primitive"
}
},
{
"name" : "peer",
"argType" : {
"tag" : "primitive"
}
},
{
"name" : "eip712_url",
"argType" : {
"tag" : "primitive"
}
}
],
"names" : {
"relay" : "-relay-",
"getDataSrv" : "getDataSrv",
"callbackSrv" : "callbackSrv",
"responseSrv" : "callbackSrv",
"responseFnName" : "response",
"errorHandlingSrv" : "errorHandlingSrv",
"errorFnName" : "error"
}
},
script
)
}
export type Get_recordResult = { snapshot_id: number; }
export function get_record(relay: string, peer_: string, snapshot_id: number, config?: {ttl?: number}): Promise<Get_recordResult>;
export function get_record(peer: FluencePeer, relay: string, peer_: string, snapshot_id: number, config?: {ttl?: number}): Promise<Get_recordResult>;
export function get_record(...args: any) {
let script = `
(xor
(seq
(seq
(seq
(seq
(seq
(seq
(seq
(seq
(seq
(call %init_peer_id% ("getDataSrv" "-relay-") [] -relay-)
(call %init_peer_id% ("getDataSrv" "relay") [] relay)
)
(call %init_peer_id% ("getDataSrv" "peer") [] peer)
)
(call %init_peer_id% ("getDataSrv" "snapshot_id") [] snapshot_id)
)
(call -relay- ("op" "noop") [])
)
(call relay ("op" "noop") [])
)
(xor
(call peer ("snapshot" "get_record") [snapshot_id] result)
(seq
(seq
(seq
(call relay ("op" "noop") [])
(call -relay- ("op" "noop") [])
)
(call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 1])
)
(call -relay- ("op" "noop") [])
)
)
)
(call relay ("op" "noop") [])
)
(call -relay- ("op" "noop") [])
)
(xor
(call %init_peer_id% ("callbackSrv" "response") [result])
(call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 2])
)
)
(call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 3])
)
`
return callFunction(
args,
{
"functionName" : "get_record",
"returnType" : {
"tag" : "primitive"
},
"argDefs" : [
{
"name" : "relay",
"argType" : {
"tag" : "primitive"
}
},
{
"name" : "peer",
"argType" : {
"tag" : "primitive"
}
},
{
"name" : "snapshot_id",
"argType" : {
"tag" : "primitive"
}
}
],
"names" : {
"relay" : "-relay-",
"getDataSrv" : "getDataSrv",
"callbackSrv" : "callbackSrv",
"responseSrv" : "callbackSrv",
"responseFnName" : "response",
"errorHandlingSrv" : "errorHandlingSrv",
"errorFnName" : "error"
}
},
script
)
}
export function get_records(relay: string, peer_: string, config?: {ttl?: number}): Promise<{ snapshot_id: number; }[]>;
export function get_records(peer: FluencePeer, relay: string, peer_: string, config?: {ttl?: number}): Promise<{ snapshot_id: number; }[]>;
export function get_records(...args: any) {
let script = `
(xor
(seq
(seq
(seq
(seq
(seq
(seq
(seq
(seq
(call %init_peer_id% ("getDataSrv" "-relay-") [] -relay-)
(call %init_peer_id% ("getDataSrv" "relay") [] relay)
)
(call %init_peer_id% ("getDataSrv" "peer") [] peer)
)
(call -relay- ("op" "noop") [])
)
(call relay ("op" "noop") [])
)
(xor
(call peer ("snapshot" "get_records") [] result)
(seq
(seq
(seq
(call relay ("op" "noop") [])
(call -relay- ("op" "noop") [])
)
(call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 1])
)
(call -relay- ("op" "noop") [])
)
)
)
(call relay ("op" "noop") [])
)
(call -relay- ("op" "noop") [])
)
(xor
(call %init_peer_id% ("callbackSrv" "response") [result])
(call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 2])
)
)
(call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 3])
)
`
return callFunction(
args,
{
"functionName" : "get_records",
"returnType" : {
"tag" : "primitive"
},
"argDefs" : [
{
"name" : "relay",
"argType" : {
"tag" : "primitive"
}
},
{
"name" : "peer",
"argType" : {
"tag" : "primitive"
}
}
],
"names" : {
"relay" : "-relay-",
"getDataSrv" : "getDataSrv",
"callbackSrv" : "callbackSrv",
"responseSrv" : "callbackSrv",
"responseFnName" : "response",
"errorHandlingSrv" : "errorHandlingSrv",
"errorFnName" : "error"
}
},
script
)
}

137
peer-node/src/index.ts.bk Normal file
View File

@ -0,0 +1,137 @@
import { Fluence, KeyPair } from "@fluencelabs/fluence";
import { krasnodar } from "@fluencelabs/fluence-network-environment";
import { registerEIPValidator, EIPValidatorDef, registerDataProvider, DataProviderDef } from "./_aqua/snapshot";
import { ethers } from "ethers";
import { TypedDataUtils } from 'ethers-eip712'; // https://github.com/0xsequence/ethers-eip712
import { eip_validation, Response } from "./eip_processor";
import { get_db, create_table, insert_event, DBRecord, DBResult, select_events, select_event } from './local_db';
import got from 'got';
import { base64 } from "ethers/lib/utils";
// Arbitrary secret key that could be read from file, CLI arg or db
// We derive both the PeerId and the (ethers) wallet from this key
const SecretKey = "0x0123456789012345678901234567890123456789012345678901234567890123";
const DB_PATH = "./data/snapshot.db";
function create_wallet(sk: string): ethers.Wallet {
return new ethers.Wallet(sk);
}
function sign_response(wallet: ethers.Wallet, response: Response): Promise<string> {
const signed_msg = wallet.signMessage(JSON.stringify(response));
return signed_msg;
}
// class exposed as service `EIPValidation` in snapshot.aqua
class EIPValidator implements EIPValidatorDef {
async eip712_validation_string(eip712_json: string): Promise<string> {
// todo: need to fix this to use local peer key
const wallet = create_wallet(SecretKey);
let response = eip_validation(eip712_json, wallet.address);
const resp_str = JSON.stringify(response);
console.log("eip validation response: ", resp_str);
const signed_response = await wallet.signMessage(resp_str);
console.log("signed response: ", signed_response);
// verify test
// const address = ethers.utils.verifyMessage(resp_str, signed_response);
// console.log("verify signature. peer_id: ", peer_id, " verified addr: ", address, " equal: ", peer_id === address);
// console.log(resp_str);
let obj = { "signature": signed_response, "validation": response };
return JSON.stringify(obj);
}
async eip712_validation_url(eip712_url: string): Promise<string> {
const eip = await got.get('https://ipfs.fleek.co/ipfs/QmWGzSQFm57ohEq2ATw4UNHWmYU2HkMjtedcNLodYywpmS');
const eip_json = eip.body;
// todo: need to fix this to use local peer key
const wallet = create_wallet(SecretKey);
let response = eip_validation(eip_json, wallet.address);
const resp_str = JSON.stringify(response);
const signed_response = await wallet.signMessage(resp_str);
// verify test
// const address = ethers.utils.verifyMessage(resp_str, signed_response);
// console.log("verify signature. peer_id: ", peer_id, " verified addr: ", address, " equal: ", peer_id === address);
// console.log(resp_str);
let obj = { "signature": signed_response, "validation": response };
// commit to local sqlite
let db = get_db(DB_PATH);
await create_table(db);
await insert_event(db, JSON.parse(eip_json), response, signed_response);
return JSON.stringify(obj);
}
}
// class exposed as service `DataProviderDef` in snapshot.aqua
class DataProvider implements DataProviderDef {
async get_record(snapshot_id: number): Promise<any> {
return select_event(snapshot_id);
}
async get_records(): Promise<any> {
// todo: add pagination
const result = await select_events();
console.log("get records: ", result);
return result;
}
}
async function startFluencePeer(skBytes: Uint8Array): Promise<void> {
await Fluence.start({
connectTo: krasnodar[0],
KeyPair: await KeyPair.fromEd25519SK(skBytes)
});
}
async function main() {
let wallet = new ethers.Wallet(SecretKey);
console.log("wallet from sk: ", wallet.address);
console.log("wallet pk: ", wallet.publicKey);
const skBytes: Uint8Array = ethers.utils.arrayify(SecretKey);
console.log("arrayify: ", skBytes);
await startFluencePeer(skBytes);
console.log("PeerId: ", Fluence.getStatus().peerId);
console.log("Relay id: ", Fluence.getStatus().relayPeerId);
// let peer = Fluence.getPeer();
// console.log(peer);
// console.log(Fluence.KeyPair);
registerEIPValidator("EIPValidator", new EIPValidator());
registerDataProvider("DataProvider", new DataProvider);
// const eip_doc: any = await got('https://ipfs.fleek.co/ipfs/QmWGzSQFm57ohEq2ATw4UNHWmYU2HkMjtedcNLodYywpmS').json();
// console.log("eip json obj: ", eip_doc);
// let obj = new EIPValidator();
// let result = obj.eip712_validation_url(JSON.stringify(eip_doc));
// console.log("result: ", result);
// await Fluence.stop();
}
main();