From b768cd3dd0c4ab4dd2aeeeaed5de9ff39425aca7 Mon Sep 17 00:00:00 2001 From: Liam Fitzgerald Date: Thu, 29 Oct 2020 14:07:47 +1000 Subject: [PATCH] graph-store: normalize @da in indices As links is the only application currently using graph-store, we migrate all indices to @da instead of a @da or a unix timestamp. Rolls over current graphs and update log to rectify this. Additionally, applies the link validator mark to graphs, as this was missing. Fixes a latent bug in graph-store where the removal of a graph that triggered a mark build would prevent the mark from being rebuilt. Fixes mark input and index formatting from the frontend as well. --- pkg/arvo/app/graph-store.hoon | 103 ++++++++++++++++++++++++--- pkg/interface/src/logic/api/graph.ts | 20 ++++-- pkg/interface/src/logic/lib/util.js | 18 +++++ 3 files changed, 126 insertions(+), 15 deletions(-) diff --git a/pkg/arvo/app/graph-store.hoon b/pkg/arvo/app/graph-store.hoon index f619939b9..516abd003 100644 --- a/pkg/arvo/app/graph-store.hoon +++ b/pkg/arvo/app/graph-store.hoon @@ -34,23 +34,104 @@ ^- (quip card _this) =+ !<(old=versioned-state old-vase) =| cards=(list card) - |- + |^ ?- -.old %0 %_ $ -.old %1 + :: + validators.old + (~(put in validators.old) %graph-validator-link) + :: + cards + %+ weld cards + %+ turn + ~(tap in (~(put in validators.old) %graph-validator-link)) + |= validator=@t + ^- card + =/ =wire /validator/[validator] + =/ =rave:clay [%sing %b [%da now.bowl] /[validator]] + [%pass wire %arvo %c %warp our.bowl [%home `rave]] :: graphs.old %- ~(run by graphs.old) |= [=graph:store q=(unit mark)] ^- [graph:store (unit mark)] - :- graph + :- (convert-unix-timestamped-graph graph) ?^ q q `%graph-validator-link + :: + update-logs.old + %- ~(run by update-logs.old) + convert-unix-timestamped-log == :: %1 [cards this(state old)] == + :: + ++ convert-unix-timestamped-log + |= =update-log:store + ^- update-log:store + %+ gas:orm-log *update-log:store + %+ turn + (tap:orm-log update-log) + |= [=time =logged-update:store] + :- time + |^ ^- logged-update:store + :+ %0 p.logged-update + ?+ -.q.logged-update q.logged-update + %add-nodes (add-nodes +.q.logged-update) + %remove-nodes (remove-nodes +.q.logged-update) + == + :: + ++ add-nodes + |= [rid=res nodes=(map index:store node:store)] + ^- logged-update-0:store + :+ %add-nodes rid + %- ~(gas by *(map index:store node:store)) + %+ turn + ~(tap by nodes) + |= [=index:store =node:store] + ^- [index:store node:store] + :- (turn index maybe-unix-to-da) + (convert-unix-timestamped-node node) + :: + ++ remove-nodes + |= [rid=res indices=(set index:store)] + ^- logged-update-0:store + :+ %remove-nodes rid + %- ~(gas in *(set index:store)) + %+ turn + ~(tap in indices) + |=(=index:store (turn index maybe-unix-to-da)) + -- + :: + ++ maybe-unix-to-da + |= =atom + ^- @ + :: (bex 127) is roughly 226AD + ?. (lte atom (bex 127)) + atom + (add ~1970.1.1 (div (mul ~s1 atom) 1.000)) + :: + ++ convert-unix-timestamped-node + |= =node:store + ^- node:store + ?. ?=(%graph -.children.node) + node + :+ post.node %graph + (convert-unix-timestamped-graph p.children.node) + :: + ++ convert-unix-timestamped-graph + |= =graph:store + %+ gas:orm *graph:store + %+ turn + (tap:orm graph) + |= [=atom =node:store] + ^- [^atom node:store] + :- (maybe-unix-to-da atom) + (convert-unix-timestamped-node node) + -- :: ++ on-watch ~/ %graph-store-watch @@ -124,7 +205,7 @@ :~ (give [/updates /keys ~] [%add-graph resource graph mark]) ?~ mark ~ ?: (~(has in validators) u.mark) ~ - =/ wire (weld /graph (en-path:res resource)) + =/ wire /validator/[u.mark] =/ =rave:clay [%sing %b [%da now.bowl] /[u.mark]] [%pass wire %arvo %c %warp our.bowl [%home `rave]]~ == @@ -622,15 +703,15 @@ ++ on-arvo |= [=wire =sign-arvo] ^- (quip card _this) - ?+ -.sign-arvo (on-arvo:def wire sign-arvo) - %c + ?+ wire (on-arvo:def wire sign-arvo) + :: + :: old wire, do nothing + [%graph *] [~ this] + :: + [%validator @ ~] :_ this - ?> ?=([%graph @ *] wire) - =/ =resource:store (de-path:res t.wire) - =/ gra=(unit marked-graph:store) (~(get by graphs) resource) - ?~ gra ~ - ?~ q.u.gra ~ - =/ =rave:clay [%next %b [%da now.bowl] /[u.q.u.gra]] + =* validator i.t.wire + =/ =rave:clay [%sing %b [%da now.bowl] /[validator]] [%pass wire %arvo %c %warp our.bowl [%home `rave]]~ == :: diff --git a/pkg/interface/src/logic/api/graph.ts b/pkg/interface/src/logic/api/graph.ts index 725ca7006..fe73cac0b 100644 --- a/pkg/interface/src/logic/api/graph.ts +++ b/pkg/interface/src/logic/api/graph.ts @@ -4,12 +4,12 @@ import { Patp, Path, PatpNoSig } from '~/types/noun'; import _ from 'lodash'; import {makeResource, resourceFromPath} from '../lib/group'; import {GroupPolicy, Enc, Post, NodeMap} from '~/types'; -import { numToUd } from '~/logic/lib/util'; +import { numToUd, unixToDa } from '~/logic/lib/util'; export const createPost = (contents: Object[], parentIndex: string = '') => { return { author: `~${window.ship}`, - index: parentIndex + '/' + Date.now(), + index: parentIndex + '/' + unixToDa(Date.now()).toString(), 'time-sent': Date.now(), contents, hash: null, @@ -17,6 +17,16 @@ export const createPost = (contents: Object[], parentIndex: string = '') => { }; }; +function moduleToMark(mod: string): string | undefined { + if(mod === 'link') { + return 'graph-validator-link'; + } + if(mod === 'publish') { + return 'graph-validator-publish'; + } + return undefined; +} + export default class GraphApi extends BaseApi { private storeAction(action: any): Promise { @@ -47,7 +57,8 @@ export default class GraphApi extends BaseApi { title, description, associated, - "module": mod + "module": mod, + mark: moduleToMark(mod) } }); } @@ -67,7 +78,8 @@ export default class GraphApi extends BaseApi { title, description, associated: { policy }, - "module": mod + "module": mod, + mark: moduleToMark(mod) } }); } diff --git a/pkg/interface/src/logic/lib/util.js b/pkg/interface/src/logic/lib/util.js index 9fda4c6e8..8edeae38a 100644 --- a/pkg/interface/src/logic/lib/util.js +++ b/pkg/interface/src/logic/lib/util.js @@ -1,8 +1,26 @@ import _ from 'lodash'; import f from 'lodash/fp'; +import bigInt from 'big-integer'; export const MOBILE_BROWSER_REGEX = /Android|webOS|iPhone|iPad|iPod|BlackBerry/i; +const DA_UNIX_EPOCH = bigInt("170141184475152167957503069145530368000"); // `@ud` ~1970.1.1 +const DA_SECOND = bigInt("18446744073709551616"); // `@ud` ~s1 +export function daToUnix(da) { + // ported from +time:enjs:format in hoon.hoon + const offset = DA_SECOND.divide(bigInt(2000)); + const epochAdjusted = offset.add(da.subtract(DA_UNIX_EPOCH)); + + return Math.round( + epochAdjusted.multiply(bigInt(1000)).divide(DA_SECOND).toJSNumber() + ); +} + +export function unixToDa(unix) { + const timeSinceEpoch = bigInt(unix).multiply(DA_SECOND).divide(bigInt(1000)); + return DA_UNIX_EPOCH.add(timeSinceEpoch); +} + export function appIsGraph(app) { return app === 'link' || app === 'publish'; }