From 1c5e61e0208eaa683cc65de32c1f75004d76086f Mon Sep 17 00:00:00 2001 From: Kieran Date: Fri, 18 Aug 2023 17:56:50 +0100 Subject: [PATCH] POW everything --- packages/app/src/Feed/EventPublisher.ts | 6 ++++- packages/app/src/Login/Preferences.ts | 5 ++++ .../app/src/Pages/settings/Preferences.tsx | 18 +++++++++++++++ packages/app/src/chat/nip24.ts | 23 ++++--------------- packages/app/src/index.tsx | 7 +++++- packages/app/src/service-worker.ts | 1 - packages/system/src/event-publisher.ts | 13 +++++++++-- 7 files changed, 49 insertions(+), 24 deletions(-) diff --git a/packages/app/src/Feed/EventPublisher.ts b/packages/app/src/Feed/EventPublisher.ts index f1076e8e9..c6351274c 100644 --- a/packages/app/src/Feed/EventPublisher.ts +++ b/packages/app/src/Feed/EventPublisher.ts @@ -1,6 +1,10 @@ import useLogin from "Hooks/useLogin"; +import { DefaultPowWorker } from "index"; export default function useEventPublisher() { - const { publisher } = useLogin(); + const { publisher, preferences } = useLogin(); + if (preferences.pow) { + publisher?.pow(preferences.pow, DefaultPowWorker); + } return publisher; } diff --git a/packages/app/src/Login/Preferences.ts b/packages/app/src/Login/Preferences.ts index 0c9e39c25..4d1fc35d7 100644 --- a/packages/app/src/Login/Preferences.ts +++ b/packages/app/src/Login/Preferences.ts @@ -66,6 +66,11 @@ export interface UserPreferences { * Auto-zap every post */ autoZap: boolean; + + /** + * Proof-of-Work to apply to all events + */ + pow?: number; } export const DefaultPreferences = { diff --git a/packages/app/src/Pages/settings/Preferences.tsx b/packages/app/src/Pages/settings/Preferences.tsx index 83506717d..6ea3faa95 100644 --- a/packages/app/src/Pages/settings/Preferences.tsx +++ b/packages/app/src/Pages/settings/Preferences.tsx @@ -157,6 +157,24 @@ const PreferencesPage = () => { +
+
+
+ +
+ + + +
+
+ updatePreferences(login, { ...perf, pow: parseInt(e.target.value || "0") })} + /> +
+
diff --git a/packages/app/src/chat/nip24.ts b/packages/app/src/chat/nip24.ts index ac25a3593..c90f63cfc 100644 --- a/packages/app/src/chat/nip24.ts +++ b/packages/app/src/chat/nip24.ts @@ -1,17 +1,9 @@ import { ExternalStore, dedupe } from "@snort/shared"; -import { - EventKind, - NostrPrefix, - encodeTLVEntries, - TLVEntryType, - TLVEntry, - decodeTLV, - PowWorker, - NostrEvent, -} from "@snort/system"; +import { EventKind, NostrPrefix, encodeTLVEntries, TLVEntryType, TLVEntry, decodeTLV, NostrEvent } from "@snort/system"; import { GiftWrapCache } from "Cache/GiftWrapCache"; import { UnwrappedGift } from "Db"; import { Chat, ChatSystem, ChatType, lastReadInChat } from "chat"; +import { DefaultPowWorker } from "index"; export class Nip24ChatSystem extends ExternalStore> implements ChatSystem { #cache: GiftWrapCache; @@ -107,17 +99,10 @@ export class Nip24ChatSystem extends ExternalStore> implements ChatS const messages: Array> = []; const powTarget = 4 * 4; // 4-char zero for (const pt of participants) { - const recvSealedN = pub.giftWrap( - await pub.sealRumor(gossip, pt.id), - pt.id, - powTarget, - new PowWorker("/pow.js") - ); + const recvSealedN = pub.giftWrap(await pub.sealRumor(gossip, pt.id), pt.id, powTarget); messages.push(recvSealedN); } - messages.push( - pub.giftWrap(await pub.sealRumor(gossip, pub.pubKey), pub.pubKey, powTarget, new PowWorker("/pow.js")) - ); + messages.push(pub.giftWrap(await pub.sealRumor(gossip, pub.pubKey), pub.pubKey, powTarget, DefaultPowWorker)); return await Promise.all(messages); }, sendMessage: (ev, system) => { diff --git a/packages/app/src/index.tsx b/packages/app/src/index.tsx index 12348382b..9ec174eb7 100644 --- a/packages/app/src/index.tsx +++ b/packages/app/src/index.tsx @@ -6,7 +6,7 @@ import { StrictMode } from "react"; import * as ReactDOM from "react-dom/client"; import { Provider } from "react-redux"; import { createBrowserRouter, RouterProvider } from "react-router-dom"; -import { EventPublisher, NostrSystem, ProfileLoaderService, Nip7Signer } from "@snort/system"; +import { EventPublisher, NostrSystem, ProfileLoaderService, Nip7Signer, PowWorker } from "@snort/system"; import * as serviceWorkerRegistration from "serviceWorkerRegistration"; import { IntlProvider } from "IntlProvider"; @@ -60,6 +60,11 @@ export const System = new NostrSystem({ */ export const ProfileLoader = new ProfileLoaderService(System, UserCache); +/** + * Singleton POW worker + */ +export const DefaultPowWorker = new PowWorker("/pow.js"); + // @ts-expect-error Setting webpack nonce window.__webpack_nonce__ = "ZmlhdGphZiBzYWlkIHNub3J0LnNvY2lhbCBpcyBwcmV0dHkgZ29vZCwgd2UgbWFkZSBpdCE="; diff --git a/packages/app/src/service-worker.ts b/packages/app/src/service-worker.ts index 6c2c1d911..39599ab42 100644 --- a/packages/app/src/service-worker.ts +++ b/packages/app/src/service-worker.ts @@ -1,5 +1,4 @@ /// -import {} from "."; declare const self: ServiceWorkerGlobalScope; import { clientsClaim } from "workbox-core"; diff --git a/packages/system/src/event-publisher.ts b/packages/system/src/event-publisher.ts index af2c605f5..5f8d01ef1 100644 --- a/packages/system/src/event-publisher.ts +++ b/packages/system/src/event-publisher.ts @@ -28,6 +28,8 @@ type EventBuilderHook = (ev: EventBuilder) => EventBuilder; export class EventPublisher { #pubKey: string; #signer: EventSigner; + #pow?: number; + #miner?: PowMiner; constructor(signer: EventSigner, pubKey: string) { this.#signer = signer; @@ -59,14 +61,21 @@ export class EventPublisher { return this.#pubKey; } + /** + * Apply POW to every event + */ + pow(target:number, miner?: PowMiner) { + this.#pow = target; + this.#miner = miner; + } + #eb(k: EventKind) { const eb = new EventBuilder(); return eb.pubKey(this.#pubKey).kind(k); } async #sign(eb: EventBuilder) { - const ev = eb.build(); - return await this.#signer.sign(ev); + return await (this.#pow ? eb.pow(this.#pow, this.#miner) : eb).buildAndSign(this.#signer); } async nip4Encrypt(content: string, otherKey: string) {