}
export function test (name, fn) {
+ console.log(`=> Test: ${name}`)
if (fn instanceof Promise) {
try {
return fn
- .then(() => log(`PASS: ${name}`))
- .catch((err) => { error(`FAIL: ${name}: ${err}`) })
+ .then(() => log(` -> PASS: ${name}`))
+ .catch((err) => { error(` -> FAIL: ${name}: ${err}`) })
} catch (err) {
- error(`FAIL: ${name}: ${err.message}`)
+ error(` -> FAIL: ${name}: ${err.message}`)
error(err)
}
} else if (fn?.constructor?.name === 'AsyncFunction') {
try {
return fn()
- .then(() => log(`PASS: ${name}`))
- .catch((err) => error(`FAIL: ${name}: ${err.message}`))
+ .then(() => log(` -> PASS: ${name}`))
+ .catch((err) => error(` -> FAIL: ${name}: ${err.message}`))
} catch (err) {
- error(`FAIL: ${name}: ${err.message}`)
+ error(` -> FAIL: ${name}: ${err.message}`)
error(err)
}
} else if (typeof fn === 'function') {
try {
fn()
- log(`PASS: ${name}`)
+ log(` -> PASS: ${name}`)
} catch (err) {
- error(`FAIL: ${name}: ${err.message}`)
+ error(` -> FAIL: ${name}: ${err.message}`)
error(err)
}
} else {
- error(`FAIL: ${name}: test cannot execute on ${typeof fn} ${fn}`)
+ error(` -> FAIL: ${name}: test cannot execute on ${typeof fn} ${fn}`)
}
}
import { Bip44Wallet, Blake2bWallet } from '#dist/main.js'
await test('creating BIP-44 wallets performance test', async () => {
- const wallets = []
+ const seeds = []
+ let now = performance.now()
for (let i = 0x80; i > 0; i--) {
- wallets.push(await Bip44Wallet.create(NANO_TEST_VECTORS.PASSWORD))
+ const wallet = await Bip44Wallet.create(NANO_TEST_VECTORS.PASSWORD)
+ seeds.push(wallet.seed)
}
- assert.equals(wallets.length, 0x80)
+ console.log(`${performance.now() - now} ms`)
+ assert.equals(seeds.length, 0x80)
})
await test('creating BLAKE2b wallets performance test', async () => {
- const wallets = []
+ const seeds = []
+ let now = performance.now()
for (let i = 0x80; i > 0; i--) {
- wallets.push(await Blake2bWallet.create(NANO_TEST_VECTORS.PASSWORD))
+ const wallet = await Blake2bWallet.create(NANO_TEST_VECTORS.PASSWORD)
+ seeds.push(wallet.seed)
}
- assert.equals(wallets.length, 0x80)
+ console.log(`${performance.now() - now} ms`)
+ assert.equals(seeds.length, 0x80)
})
#id: Entropy\r
#locked: boolean = true\r
#mnemonic: Bip39Mnemonic | null\r
- #pool: Pool\r
#safe: Safe\r
#seed: string | null\r
get id () { return this.#id.hex }\r
? new Entropy(id)\r
: new Entropy(16)\r
this.#mnemonic = mnemonic ?? null\r
- this.#pool = new Pool(`const Blake2b = ${Blake2b}\n${NanoNaCl}`)\r
this.#safe = new Safe()\r
this.#seed = seed ?? null\r
}\r
let results = await this.ckd(indexes)\r
const data: any = []\r
results.forEach(r => data.push({ privateKey: r.privateKey, index: r.index }))\r
- const keypairs: KeyPair[] = await this.#pool.work('divide', data)\r
+ const pool = new Pool(`const Blake2b = ${Blake2b}\n${NanoNaCl}`)\r
+ const keypairs: KeyPair[] = await pool.work('divide', data)\r
+ pool.dismiss()\r
for (const keypair of keypairs) {\r
if (keypair.privateKey == null) throw new RangeError('Account private key missing')\r
if (keypair.publicKey == null) throw new RangeError('Account public key missing')\r
*/\r
export class Bip44Wallet extends Wallet {\r
static #isInternal: boolean = false\r
- #pool: Pool\r
\r
constructor (seed: string, mnemonic?: Bip39Mnemonic, id?: string) {\r
if (!Bip44Wallet.#isInternal) {\r
}\r
Bip44Wallet.#isInternal = false\r
super(seed, mnemonic, id)\r
- this.#pool = new Pool(Bip44Ckd)\r
}\r
\r
/**\r
* @returns {Promise<Account>}\r
*/\r
async ckd (indexes: number[]): Promise<KeyPair[]> {\r
+ const pool = new Pool(Bip44Ckd)\r
const data: any = []\r
indexes.forEach(i => data.push({ seed: this.seed, index: i }))\r
- const privateKeys: KeyPair[] = await this.#pool.work('divide', data)\r
+ const privateKeys: KeyPair[] = await pool.work('divide', data)\r
+ pool.dismiss()\r
return privateKeys\r
}\r
}\r
<head>
<link rel="icon" href="./favicon.ico">
- <script type="module" src="./dist/global.min.js"></script>
- <script type="module" src="./dist/test.min.js"></script>
+ <!-- <script type="module" src="./dist/global.min.js"></script> -->
+ <!-- <script type="module" src="./dist/test.min.js"></script> -->
<script type="module" src="./dist/perf.min.js"></script>
- <!-- <script type="module">
- console.log(`bip44`)
- const bipWallet = await libnemo.Bip44Wallet.create('test')
- await bipWallet.unlock('test')
- console.log(bipWallet.mnemonic)
- let now = performance.now()
- const bipAccounts = await bipWallet.accounts(0, 0x2000)
- console.log(`${bipAccounts.length} bip44 accounts done: ${performance.now() - now} ms`)
- const bipAccount = bipAccounts[0]
- console.log(bipAccount.privateKey)
- console.log(bipAccount.publicKey)
- console.log(bipAccount.address)
+ <script type="module">
+ // console.log(`bip44`)
+ // const bipWallet = await libnemo.Bip44Wallet.create('test')
+ // await bipWallet.unlock('test')
+ // console.log(bipWallet.mnemonic)
+ // let now = performance.now()
+ // const bipAccounts = await bipWallet.accounts(0, 0x2000)
+ // console.log(`${bipAccounts.length} bip44 accounts done: ${performance.now() - now} ms`)
+ // const bipAccount = bipAccounts[0]
+ // console.log(bipAccount.privateKey)
+ // console.log(bipAccount.publicKey)
+ // console.log(bipAccount.address)
- console.log(`blake2b`)
- const blakeWallet = await libnemo.Blake2bWallet.create('test')
- await blakeWallet.unlock('test')
- console.log(blakeWallet.mnemonic)
- now = performance.now()
- const blakeAccounts = await blakeWallet.accounts(0, 0x2000)
- console.log(`${blakeAccounts.length} blake2b accounts done: ${performance.now() - now} ms`)
- const blakeAccount = blakeAccounts[0]
- console.log(blakeAccount.privateKey)
- console.log(blakeAccount.publicKey)
- console.log(blakeAccount.address)
+ // console.log(`blake2b`)
+ // const blakeWallet = await libnemo.Blake2bWallet.create('test')
+ // await blakeWallet.unlock('test')
+ // console.log(blakeWallet.mnemonic)
+ // now = performance.now()
+ // const blakeAccounts = await blakeWallet.accounts(0, 0x2000)
+ // console.log(`${blakeAccounts.length} blake2b accounts done: ${performance.now() - now} ms`)
+ // const blakeAccount = blakeAccounts[0]
+ // console.log(blakeAccount.privateKey)
+ // console.log(blakeAccount.publicKey)
+ // console.log(blakeAccount.address)
- console.log('PoW')
- let blocks = []
- console.log(`send blocks`)
- now = performance.now()
- for (let i = 0; i < 10; i++) {
- const block = new libnemo.SendBlock(
- 'nano_1xmastiputrdrhnf35jdh4yj1q339tyuk86w3k6oy5knede8zfowpa1rgjpn',
- '100000000000000000000000000',
- 'nano_1xmastreedxwfhpktqxppwgwwhdx1p6hiskpw7jt8g5y19khyy38axg4tohm',
- '1',
- 'nano_3rw4un6ys57hrb39sy1qx8qy5wukst1iiponztrz9qiz6qqa55kxzx4491or',
- '4E5004CA14899B8F9AABA7A76D010F73E6BAE54948912588B8C4FE0A3B558CA5')
- try {
- await block.pow()
- console.log(`block ${i + 1} work: ${block.work}`)
- } catch (err) {
- console.error(err)
- }
- blocks.push(block)
- }
- console.log(`send pow done (${performance.now() - now} ms)`)
- now = performance.now()
- for (let i = 0; i < 10; i++) {
- const block = new libnemo.ReceiveBlock(
- 'nano_1xmastiputrdrhnf35jdh4yj1q339tyuk86w3k6oy5knede8zfowpa1rgjpn',
- '0',
- 'FB0D886948EF4BBC410C0C64C16291E31AB360BEB21B338988A6C37D89C24362',
- '1',
- 'nano_3rw4un6ys57hrb39sy1qx8qy5wukst1iiponztrz9qiz6qqa55kxzx4491or',
- 'B320F9AD2C3341E0FA6EFAF093C2D618036D10DB800F14830A928A44B8DD265C')
- try {
- await block.pow()
- console.log(`block ${i + 1} work: ${block.work}`)
- } catch (err) {
- console.error(err)
- }
- blocks.push(block)
- }
- console.log(`receive done (${performance.now() - now} ms)`)
- console.log(`pow done (${performance.now() - now} ms)`)
- </script> -->
+ // console.log('PoW')
+ // let blocks = []
+ // console.log(`send blocks`)
+ // now = performance.now()
+ // for (let i = 0; i < 10; i++) {
+ // const block = new libnemo.SendBlock(
+ // 'nano_1xmastiputrdrhnf35jdh4yj1q339tyuk86w3k6oy5knede8zfowpa1rgjpn',
+ // '100000000000000000000000000',
+ // 'nano_1xmastreedxwfhpktqxppwgwwhdx1p6hiskpw7jt8g5y19khyy38axg4tohm',
+ // '1',
+ // 'nano_3rw4un6ys57hrb39sy1qx8qy5wukst1iiponztrz9qiz6qqa55kxzx4491or',
+ // '4E5004CA14899B8F9AABA7A76D010F73E6BAE54948912588B8C4FE0A3B558CA5')
+ // try {
+ // await block.pow()
+ // console.log(`block ${i + 1} work: ${block.work}`)
+ // } catch (err) {
+ // console.error(err)
+ // }
+ // blocks.push(block)
+ // }
+ // console.log(`send pow done (${performance.now() - now} ms)`)
+ // now = performance.now()
+ // for (let i = 0; i < 10; i++) {
+ // const block = new libnemo.ReceiveBlock(
+ // 'nano_1xmastiputrdrhnf35jdh4yj1q339tyuk86w3k6oy5knede8zfowpa1rgjpn',
+ // '0',
+ // 'FB0D886948EF4BBC410C0C64C16291E31AB360BEB21B338988A6C37D89C24362',
+ // '1',
+ // 'nano_3rw4un6ys57hrb39sy1qx8qy5wukst1iiponztrz9qiz6qqa55kxzx4491or',
+ // 'B320F9AD2C3341E0FA6EFAF093C2D618036D10DB800F14830A928A44B8DD265C')
+ // try {
+ // await block.pow()
+ // console.log(`block ${i + 1} work: ${block.work}`)
+ // } catch (err) {
+ // console.error(err)
+ // }
+ // blocks.push(block)
+ // }
+ // console.log(`receive done (${performance.now() - now} ms)`)
+ // console.log(`pow done (${performance.now() - now} ms)`)
+ </script>
<style>body{background:black;}</style>
</head>