From 7b09cfaa02bf9099c64fb24b60d12acd0d9b0a15 Mon Sep 17 00:00:00 2001 From: Abdel Sallam Date: Wed, 12 Oct 2022 15:49:42 -0700 Subject: [PATCH 1/2] First implementation of background worker generator for addresses --- main/app/handlers/addressGenerator.js | 17 +++++++++++++++++ main/app/handlers/wallet.js | 12 +++++++++++- main/common/util/handlers.js | 2 ++ main/preload/wallet.js | 8 +++++++- renderer/components/modal/modals/address.js | 2 +- renderer/components/util/addresses.js | 9 +++------ 6 files changed, 41 insertions(+), 9 deletions(-) create mode 100644 main/app/handlers/addressGenerator.js diff --git a/main/app/handlers/addressGenerator.js b/main/app/handlers/addressGenerator.js new file mode 100644 index 0000000..b3985f2 --- /dev/null +++ b/main/app/handlers/addressGenerator.js @@ -0,0 +1,17 @@ +const {mnemonicToSeedSync} = require("bip39"); +const {fromSeed} = require("bip32"); +const {ECPair} = require("@bitcoin-dot-com/bitcoincashjs2-lib"); +const {isMainThread, parentPort} = require("worker_threads"); +if (isMainThread) { + throw new Error('Its not a worker'); +} + +parentPort.on("message", async (seedPhrase) => { + const seed = mnemonicToSeedSync(seedPhrase) + const node = fromSeed(seed) + for (let i = 0; i < 20; i++) { + const child = node.derivePath("m/44'/0'/0'/0/" + i) + parentPort.postMessage(ECPair.fromWIF(child.toWIF()).getAddress()) + } +}); + diff --git a/main/app/handlers/wallet.js b/main/app/handlers/wallet.js index 71979ce..46e2a94 100644 --- a/main/app/handlers/wallet.js +++ b/main/app/handlers/wallet.js @@ -1,13 +1,23 @@ const {ipcMain} = require("electron"); const path = require("path"); -const {Handlers} = require("../../common/util"); +const {Handlers, Listeners} = require("../../common/util"); const {GetWalletInfo} = require("../../data/tables"); const menu = require("../../menu"); const {SetWallet, GetWallet, SetMenu, GetWindow, CreateWindow, eConf} = require("../window"); +const {Worker} = require("worker_threads"); const WalletHandlers = () => { ipcMain.handle(Handlers.GetWallet, async (e) => GetWallet(e.sender.id)) ipcMain.handle(Handlers.GetWalletInfo, async (e, addresses) => GetWalletInfo(eConf(e), addresses)) + ipcMain.on(Handlers.GenerateAddresses, (e, seedPhrase) => { + let w = new Worker(path.resolve(__dirname,"addressGenerator.js")) + w.postMessage(seedPhrase) + w.on("message", (e) => { + console.log(e.data) + e.sender.send(Listeners.AddressGenerated, e.data) + //addressList.push(e.data) + }) + }) ipcMain.on(Handlers.StoreWallet, (e, wallet, filename, password) => { SetWallet(e.sender.id, {wallet, filename, password}) }) diff --git a/main/common/util/handlers.js b/main/common/util/handlers.js index 8521bd1..11e71d3 100644 --- a/main/common/util/handlers.js +++ b/main/common/util/handlers.js @@ -29,6 +29,7 @@ const Handlers = { GetWallet: "get-wallet", WalletLoaded: "wallet-loaded", GetWalletInfo: "get-wallet-info", + GenerateAddresses: "generate-addresses", GraphQL: "graphql", GraphQLSubscribe: "graphql-subscribe", GraphQLSubscribeClose: "graphql-subscribe-close", @@ -57,6 +58,7 @@ const Listeners = { GraphQLClosePrefix: "graphql-close-", GraphQLDataPrefix: "graphql-data-", GraphQLOpenPrefix: "graphql-open-", + AddressGenerated: "address-generated", } module.exports = { diff --git a/main/preload/wallet.js b/main/preload/wallet.js index 6cfa477..b719a71 100644 --- a/main/preload/wallet.js +++ b/main/preload/wallet.js @@ -1,7 +1,7 @@ const fs = require("fs/promises") const CryptoJS = require("crypto-js"); const {ipcRenderer} = require("electron"); -const {Handlers, Dir} = require("../common/util"); +const {Handlers, Dir, Listeners} = require("../common/util"); const {decryptWallet, getPathForWallet, fileExists} = require("./common"); const path = require("path"); const fsOriginal = require("fs"); @@ -83,6 +83,12 @@ module.exports = { }, getPassword: async () => (await ipcRenderer.invoke(Handlers.GetWallet)).password, getWalletInfo: async (addresses) => ipcRenderer.invoke(Handlers.GetWalletInfo, addresses), + getAddresses: (seedPhrase) => { + ipcRenderer.on(Listeners.AddressGenerated, (evt, data) => { + console.log("getAddressesData", data) + }) + ipcRenderer.send(Handlers.GenerateAddresses, seedPhrase) + }, getWallet: async () => (await ipcRenderer.invoke(Handlers.GetWallet)).wallet, getWalletFile: async (walletName) => await fs.readFile(getPathForWallet(walletName), {encoding: "utf8"}), setWallet: async (wallet, filename, password) => diff --git a/renderer/components/modal/modals/address.js b/renderer/components/modal/modals/address.js index ffec382..9a83964 100644 --- a/renderer/components/modal/modals/address.js +++ b/renderer/components/modal/modals/address.js @@ -25,7 +25,7 @@ const AddressModal = ({onClose, setLastUpdate}) => { setLastUpdate((new Date()).toISOString()) onClose() } - + return (
diff --git a/renderer/components/util/addresses.js b/renderer/components/util/addresses.js index f4849f5..025114e 100644 --- a/renderer/components/util/addresses.js +++ b/renderer/components/util/addresses.js @@ -1,3 +1,5 @@ +import * as path from "path"; + const {mnemonicToSeedSync} = require("bip39"); const {fromSeed} = require("bip32"); const {ECPair} = require("@bitcoin-dot-com/bitcoincashjs2-lib"); @@ -5,12 +7,7 @@ const {ECPair} = require("@bitcoin-dot-com/bitcoincashjs2-lib"); const GetAddresses = (seedPhrase, keyList) => { let addressList = [] if (seedPhrase && seedPhrase.length) { - const seed = mnemonicToSeedSync(seedPhrase) - const node = fromSeed(seed) - for (let i = 0; i < 20; i++) { - const child = node.derivePath("m/44'/0'/0'/0/" + i) - addressList.push(ECPair.fromWIF(child.toWIF()).getAddress()) - } + window.electron.getAddresses(seedPhrase) } if (keyList && keyList.length) { for (let i = 0; i < keyList.length; i++) { From ddd5d4525e436fce72245f15ca10b03a9a201f9a Mon Sep 17 00:00:00 2001 From: Abdel Sallam Date: Wed, 12 Oct 2022 16:12:42 -0700 Subject: [PATCH 2/2] Working structure for passing generated addresses --- main/app/handlers/addressGenerator.js | 3 ++- main/app/handlers/wallet.js | 6 ++---- main/preload/wallet.js | 12 +++++++++--- renderer/components/modal/modals/address.js | 2 +- renderer/components/util/addresses.js | 5 +++-- renderer/components/util/wallet.js | 2 +- 6 files changed, 18 insertions(+), 12 deletions(-) diff --git a/main/app/handlers/addressGenerator.js b/main/app/handlers/addressGenerator.js index b3985f2..d5679d0 100644 --- a/main/app/handlers/addressGenerator.js +++ b/main/app/handlers/addressGenerator.js @@ -11,7 +11,8 @@ parentPort.on("message", async (seedPhrase) => { const node = fromSeed(seed) for (let i = 0; i < 20; i++) { const child = node.derivePath("m/44'/0'/0'/0/" + i) - parentPort.postMessage(ECPair.fromWIF(child.toWIF()).getAddress()) + parentPort.postMessage((child)) + //parentPort.postMessage(ECPair.fromWIF(child.toWIF()).getAddress()) } }); diff --git a/main/app/handlers/wallet.js b/main/app/handlers/wallet.js index 46e2a94..6243585 100644 --- a/main/app/handlers/wallet.js +++ b/main/app/handlers/wallet.js @@ -12,10 +12,8 @@ const WalletHandlers = () => { ipcMain.on(Handlers.GenerateAddresses, (e, seedPhrase) => { let w = new Worker(path.resolve(__dirname,"addressGenerator.js")) w.postMessage(seedPhrase) - w.on("message", (e) => { - console.log(e.data) - e.sender.send(Listeners.AddressGenerated, e.data) - //addressList.push(e.data) + w.on("message", (event) => { + e.sender.send(Listeners.AddressGenerated, event.data) }) }) ipcMain.on(Handlers.StoreWallet, (e, wallet, filename, password) => { diff --git a/main/preload/wallet.js b/main/preload/wallet.js index b719a71..6dae9c8 100644 --- a/main/preload/wallet.js +++ b/main/preload/wallet.js @@ -84,10 +84,16 @@ module.exports = { getPassword: async () => (await ipcRenderer.invoke(Handlers.GetWallet)).password, getWalletInfo: async (addresses) => ipcRenderer.invoke(Handlers.GetWalletInfo, addresses), getAddresses: (seedPhrase) => { - ipcRenderer.on(Listeners.AddressGenerated, (evt, data) => { - console.log("getAddressesData", data) + return new Promise((resolve, reject) => { + let addressList = [] + ipcRenderer.on(Listeners.AddressGenerated, (evt, data) => { + addressList.push(data) + if (addressList.length === 20) { + resolve(addressList) + } + }) + ipcRenderer.send(Handlers.GenerateAddresses, seedPhrase) }) - ipcRenderer.send(Handlers.GenerateAddresses, seedPhrase) }, getWallet: async () => (await ipcRenderer.invoke(Handlers.GetWallet)).wallet, getWalletFile: async (walletName) => await fs.readFile(getPathForWallet(walletName), {encoding: "utf8"}), diff --git a/renderer/components/modal/modals/address.js b/renderer/components/modal/modals/address.js index 9a83964..9f0f563 100644 --- a/renderer/components/modal/modals/address.js +++ b/renderer/components/modal/modals/address.js @@ -16,7 +16,7 @@ const AddressModal = ({onClose, setLastUpdate}) => { setError("Error, cannot add addresses directly to a wallet with keys") return } else if(wallet.keys.length > 0){ - const convertedKeys = GetAddresses("", keys) + const convertedKeys = await GetAddresses("", keys) await window.electron.addAddresses(convertedKeys) await window.electron.addKeys(keys) } else{ diff --git a/renderer/components/util/addresses.js b/renderer/components/util/addresses.js index 025114e..c1956c1 100644 --- a/renderer/components/util/addresses.js +++ b/renderer/components/util/addresses.js @@ -4,10 +4,11 @@ const {mnemonicToSeedSync} = require("bip39"); const {fromSeed} = require("bip32"); const {ECPair} = require("@bitcoin-dot-com/bitcoincashjs2-lib"); -const GetAddresses = (seedPhrase, keyList) => { +const GetAddresses = async (seedPhrase, keyList) => { let addressList = [] if (seedPhrase && seedPhrase.length) { - window.electron.getAddresses(seedPhrase) + addressList = await window.electron.getAddresses(seedPhrase) + console.log(addressList) } if (keyList && keyList.length) { for (let i = 0; i < keyList.length; i++) { diff --git a/renderer/components/util/wallet.js b/renderer/components/util/wallet.js index 299c6f5..4cf866c 100644 --- a/renderer/components/util/wallet.js +++ b/renderer/components/util/wallet.js @@ -3,7 +3,7 @@ import GetAddresses from "./addresses"; const GetWallet = async () => { let wallet = await window.electron.getWallet() if (!wallet.addresses || !wallet.addresses.length) { - const addressList = GetAddresses(wallet.seed, wallet.keys) + const addressList = await GetAddresses(wallet.seed, wallet.keys) await window.electron.addAddresses(addressList) wallet = await window.electron.getWallet() }