update consensus

This commit is contained in:
boneyard93501
2021-11-07 18:38:20 -06:00
parent 48f4ca3106
commit e600e4d870
6 changed files with 379 additions and 31 deletions

View File

@ -146,6 +146,48 @@ export function registerDataProvider(...args: any) {
);
}
export interface ConsensusServiceDef {
consensus: (validations: boolean[], threshold: number, callParams: CallParams<'validations' | 'threshold'>) => { stderr: string; stdout: { consensus: boolean; invalid: number; n: number; threshold: number; valid: number; }[]; } | Promise<{ stderr: string; stdout: { consensus: boolean; invalid: number; n: number; threshold: number; valid: number; }[]; }>;
}
export function registerConsensusService(service: ConsensusServiceDef): void;
export function registerConsensusService(serviceId: string, service: ConsensusServiceDef): void;
export function registerConsensusService(peer: FluencePeer, service: ConsensusServiceDef): void;
export function registerConsensusService(peer: FluencePeer, serviceId: string, service: ConsensusServiceDef): void;
export function registerConsensusService(...args: any) {
registerService(
args,
{
"defaultServiceId" : "ConsensusService",
"functions" : [
{
"functionName" : "consensus",
"argDefs" : [
{
"name" : "validations",
"argType" : {
"tag" : "primitive"
}
},
{
"name" : "threshold",
"argType" : {
"tag" : "primitive"
}
}
],
"returnType" : {
"tag" : "primitive"
}
}
]
}
);
}
// Functions
export type Get_recordResult = { stderr: string; stdout: { eip712_doc: string; eip_validation: boolean; event_address: string; peer_id: string; signature: string; signed_response: string; timestamp: number; ts_validation: boolean; }[]; }
@ -338,6 +380,127 @@ export function delete_records(...args: any) {
}
export function eip_consensus_halfway(signature: string, locations: { node_id: string; relay_id: string; }[], service_node: string, consensus_service: string, threshold: number, config?: {ttl?: number}): Promise<boolean>;
export function eip_consensus_halfway(peer: FluencePeer, signature: string, locations: { node_id: string; relay_id: string; }[], service_node: string, consensus_service: string, threshold: number, config?: {ttl?: number}): Promise<boolean>;
export function eip_consensus_halfway(...args: any) {
let script = `
(xor
(seq
(seq
(seq
(seq
(seq
(seq
(seq
(call %init_peer_id% ("getDataSrv" "-relay-") [] -relay-)
(call %init_peer_id% ("getDataSrv" "signature") [] signature)
)
(call %init_peer_id% ("getDataSrv" "locations") [] locations)
)
(call %init_peer_id% ("getDataSrv" "service_node") [] service_node)
)
(call %init_peer_id% ("getDataSrv" "consensus_service") [] consensus_service)
)
(call %init_peer_id% ("getDataSrv" "threshold") [] threshold)
)
(fold locations loc
(seq
(seq
(seq
(seq
(seq
(call -relay- ("op" "noop") [])
(call loc.$.relay_id! ("op" "noop") [])
)
(xor
(seq
(call loc.$.node_id! ("DataProvider" "get_record") [signature] res)
(ap res.$.stdout.[0].ts_validation! $result)
)
(seq
(seq
(seq
(call loc.$.relay_id! ("op" "noop") [])
(call -relay- ("op" "noop") [])
)
(call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 1])
)
(call -relay- ("op" "noop") [])
)
)
)
(call loc.$.relay_id! ("op" "noop") [])
)
(call -relay- ("op" "noop") [])
)
(next loc)
)
)
)
(xor
(call %init_peer_id% ("callbackSrv" "response") [$result.$.[0]!])
(call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 2])
)
)
(call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 3])
)
`
return callFunction(
args,
{
"functionName" : "eip_consensus_halfway",
"returnType" : {
"tag" : "primitive"
},
"argDefs" : [
{
"name" : "signature",
"argType" : {
"tag" : "primitive"
}
},
{
"name" : "locations",
"argType" : {
"tag" : "primitive"
}
},
{
"name" : "service_node",
"argType" : {
"tag" : "primitive"
}
},
{
"name" : "consensus_service",
"argType" : {
"tag" : "primitive"
}
},
{
"name" : "threshold",
"argType" : {
"tag" : "primitive"
}
}
],
"names" : {
"relay" : "-relay-",
"getDataSrv" : "getDataSrv",
"callbackSrv" : "callbackSrv",
"responseSrv" : "callbackSrv",
"responseFnName" : "response",
"errorHandlingSrv" : "errorHandlingSrv",
"errorFnName" : "error"
}
},
script
)
}
export type ValidateResult = { stderr: string; stdout: { signature: string; validation: { eip_validation: boolean; peer_id: string; timestamp: number; ts_validation: boolean; }; }; }
export function validate(eip712_url: string, node: string, relay: string, config?: {ttl?: number}): Promise<ValidateResult>;
export function validate(peer: FluencePeer, eip712_url: string, node: string, relay: string, config?: {ttl?: number}): Promise<ValidateResult>;
@ -603,3 +766,145 @@ export function get_records(...args: any) {
script
)
}
export type Eip_consensusResult = { stderr: string; stdout: { consensus: boolean; invalid: number; n: number; threshold: number; valid: number; }[]; }
export function eip_consensus(signature: string, locations: { node_id: string; relay_id: string; }[], service_node: string, consensus_service: string, threshold: number, config?: {ttl?: number}): Promise<Eip_consensusResult>;
export function eip_consensus(peer: FluencePeer, signature: string, locations: { node_id: string; relay_id: string; }[], service_node: string, consensus_service: string, threshold: number, config?: {ttl?: number}): Promise<Eip_consensusResult>;
export function eip_consensus(...args: any) {
let script = `
(xor
(seq
(seq
(seq
(seq
(seq
(seq
(seq
(seq
(seq
(seq
(call %init_peer_id% ("getDataSrv" "-relay-") [] -relay-)
(call %init_peer_id% ("getDataSrv" "signature") [] signature)
)
(call %init_peer_id% ("getDataSrv" "locations") [] locations)
)
(call %init_peer_id% ("getDataSrv" "service_node") [] service_node)
)
(call %init_peer_id% ("getDataSrv" "consensus_service") [] consensus_service)
)
(call %init_peer_id% ("getDataSrv" "threshold") [] threshold)
)
(fold locations loc
(par
(seq
(seq
(seq
(seq
(call -relay- ("op" "noop") [])
(call loc.$.relay_id! ("op" "noop") [])
)
(xor
(seq
(call loc.$.node_id! ("DataProvider" "get_record") [signature] res)
(ap res.$.stdout.[0].ts_validation! $result)
)
(seq
(seq
(seq
(seq
(call loc.$.relay_id! ("op" "noop") [])
(call -relay- ("op" "noop") [])
)
(call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 1])
)
(call -relay- ("op" "noop") [])
)
(call loc.$.relay_id! ("op" "noop") [])
)
)
)
(call loc.$.relay_id! ("op" "noop") [])
)
(call service_node ("op" "noop") [])
)
(next loc)
)
)
)
(call -relay- ("op" "noop") [])
)
(xor
(seq
(call -relay- ("op" "noop") [])
(call service_node (consensus_service "consensus") [$result threshold] consensus)
)
(seq
(call -relay- ("op" "noop") [])
(call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 2])
)
)
)
(call -relay- ("op" "noop") [])
)
(xor
(call %init_peer_id% ("callbackSrv" "response") [consensus])
(call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 3])
)
)
(call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 4])
)
`
return callFunction(
args,
{
"functionName" : "eip_consensus",
"returnType" : {
"tag" : "primitive"
},
"argDefs" : [
{
"name" : "signature",
"argType" : {
"tag" : "primitive"
}
},
{
"name" : "locations",
"argType" : {
"tag" : "primitive"
}
},
{
"name" : "service_node",
"argType" : {
"tag" : "primitive"
}
},
{
"name" : "consensus_service",
"argType" : {
"tag" : "primitive"
}
},
{
"name" : "threshold",
"argType" : {
"tag" : "primitive"
}
}
],
"names" : {
"relay" : "-relay-",
"getDataSrv" : "getDataSrv",
"callbackSrv" : "callbackSrv",
"responseSrv" : "callbackSrv",
"responseFnName" : "response",
"errorHandlingSrv" : "errorHandlingSrv",
"errorFnName" : "error"
}
},
script
)
}

View File

@ -17,6 +17,7 @@
import { Fluence, setLogLevel, FluencePeer } from "@fluencelabs/fluence";
import { krasnodar, Node } from "@fluencelabs/fluence-network-environment";
import { validate, get_record, get_records, get_record_count, delete_records } from "./_aqua/demo_validation";
import { eip_consensus, eip_consensus_halfway } from "./_aqua/demo_validation";
const NODE_DB_PWD = "bad really bad"; const PWD_HASH = "bad really bad";
@ -24,7 +25,7 @@ const EIP712_URL = "https://ipfs.fleek.co/ipfs/QmWGzSQFm57ohEq2ATw4UNHWmYU2HkMjt
interface NodeTuple {
node_id: string;
relay_id: string
relay_id: string;
}
// PoC node parameters
@ -35,6 +36,29 @@ let poc_topologies: Array<NodeTuple> = [
},
];
interface ServiceTuple {
node_id: string;
service_id: string;
}
let service_topology: ServiceTuple = {
"node_id": "12D3KooWHLxVhUQyAuZe6AHMB29P7wkvTNMn7eDMcsqimJYLKREf",
"service_id": "932e002f-12b9-48cd-9616-7f15bb1e4ef3"
}
interface Consensus {
n: number;
threshold: number;
valid: number;
invalid: number;
consensus: boolean;
}
interface CResult {
stderr: string;
stdout: Array<Consensus>; // always length 0 or 1
}
async function main() {
@ -78,6 +102,18 @@ async function main() {
console.log("result for call with 0xc0a90a0bf43c0b774570608bf0279143b366b7880798112b678b416a7500576b41e19f7b4eb457d58de29be3a201f700fafab1f02179da0faae653b7e8ecf82b1c: ", good_record);
console.log("result for call with bad 0xc0a90a0bf43c0b774570608bf0279143b366b7880798112b678b416a7500576b41e19f7b4eb457d58de29be3a201f700fafab1f02179da0faae653b7e8ecf82b1cX: ", bad_record);
let threshold: number = 0.666;
let sig = "0xc0a90a0bf43c0b774570608bf0279143b366b7880798112b678b416a7500576b41e19f7b4eb457d58de29be3a201f700fafab1f02179da0faae653b7e8ecf82b1c";
console.log("\n\nsimple consensus calculation for one (1) node result with threshold ", threshold);
let half_way = await eip_consensus_halfway(sig, poc_topologies, service_topology.node_id, service_topology.service_id, threshold);
console.log("just for testing half_way: ", half_way);
let consensus = await eip_consensus(sig, poc_topologies, service_topology.node_id, service_topology.service_id, threshold);
console.log("consensus: ", consensus);
return;
}