From: Chris Duncan Date: Wed, 6 Aug 2025 21:46:20 +0000 (-0700) Subject: Start updating block calls in tests. X-Git-Tag: v0.10.5~43^2~60 X-Git-Url: https://git.codecow.com/?a=commitdiff_plain;h=f44567598661d3a12be3fcfa1f6e2ec56f3b4ff3;p=libnemo.git Start updating block calls in tests. --- diff --git a/test/perf.block.mjs b/test/perf.block.mjs index ffadedb..f1ee95c 100644 --- a/test/perf.block.mjs +++ b/test/perf.block.mjs @@ -7,13 +7,13 @@ import { isNode, stats, suite, test } from './GLOBALS.mjs' import { NANO_TEST_VECTORS } from './VECTORS.mjs' /** -* @type {typeof import('../dist/types.d.ts').SendBlock} +* @type {typeof import('../dist/types.d.ts').Block} */ -let SendBlock +let Block if (isNode) { - ({ SendBlock } = await import('../dist/nodejs.min.js')) + ({ Block } = await import('../dist/nodejs.min.js')) } else { - ({ SendBlock } = await import('../dist/browser.min.js')) + ({ Block } = await import('../dist/browser.min.js')) } await Promise.all([ @@ -21,15 +21,11 @@ await Promise.all([ const COUNT = 0x200 await test(`libnemo: Time to calculate proof-of-work for a send block ${COUNT} times`, { skip: true }, async () => { + const { account, balance, previous, representative } = NANO_TEST_VECTORS.SEND_BLOCK const times = [] - const block = new SendBlock( - NANO_TEST_VECTORS.SEND_BLOCK.account, - NANO_TEST_VECTORS.SEND_BLOCK.balance, - NANO_TEST_VECTORS.SEND_BLOCK.link, - '0', - NANO_TEST_VECTORS.SEND_BLOCK.representative, - NANO_TEST_VECTORS.SEND_BLOCK.previous - ) + const block = new Block(account, balance, representative, previous) + .send(0) + .to(NANO_TEST_VECTORS.SEND_BLOCK.link) for (let i = 0; i < COUNT; i++) { const start = performance.now() await block.pow() diff --git a/test/test.blocks.mjs b/test/test.blocks.mjs index 269ef8a..962ef55 100644 --- a/test/test.blocks.mjs +++ b/test/test.blocks.mjs @@ -7,232 +7,169 @@ import { assert, isNode, suite, test } from './GLOBALS.mjs' import { NANO_TEST_VECTORS } from './VECTORS.mjs' /** -* @type {typeof import('../dist/types.d.ts').Wallet} -*/ -let Wallet -/** -* @type {typeof import('../dist/types.d.ts').ChangeBlock} +* @type {typeof import('../dist/types.d.ts').Block} */ -let ChangeBlock +let Block /** -* @type {typeof import('../dist/types.d.ts').ReceiveBlock} -*/ -let ReceiveBlock -/** -* @type {typeof import('../dist/types.d.ts').SendBlock} +* @type {typeof import('../dist/types.d.ts').Wallet} */ -let SendBlock +let Wallet if (isNode) { - ({ Wallet, ChangeBlock, ReceiveBlock, SendBlock } = await import('../dist/nodejs.min.js')) + ({ Block, Wallet } = await import('../dist/nodejs.min.js')) } else { - ({ Wallet, ChangeBlock, ReceiveBlock, SendBlock } = await import('../dist/browser.min.js')) + ({ Block, Wallet } = await import('../dist/browser.min.js')) } await Promise.all([ suite('Block format', async () => { + const { ADDRESS_0, ADDRESS_1, ADDRESS_2, RECEIVE_BLOCK } = NANO_TEST_VECTORS await test('throw on negative balances', async () => { assert.throws(() => { - new SendBlock( - NANO_TEST_VECTORS.ADDRESS_0, - '7000000000000000000000000000000', - NANO_TEST_VECTORS.ADDRESS_1, - '12000000000000000000000000000000', - NANO_TEST_VECTORS.ADDRESS_2, - '92BA74A7D6DC7557F3EDA95ADC6341D51AC777A0A6FF0688A5C492AB2B2CB40D' - ) + new Block(ADDRESS_0, '7000000000000000000000000000000', '92BA74A7D6DC7557F3EDA95ADC6341D51AC777A0A6FF0688A5C492AB2B2CB40D', ADDRESS_2) + .send('12000000000000000000000000000000') + .to(ADDRESS_1) }, { message: 'Negative balance' }) }) await test('allow zero balances', async () => { - const block = new SendBlock( - NANO_TEST_VECTORS.ADDRESS_0, - '9007199254740991', - NANO_TEST_VECTORS.ADDRESS_1, - '9007199254740991', - NANO_TEST_VECTORS.ADDRESS_2, - '92BA74A7D6DC7557F3EDA95ADC6341D51AC777A0A6FF0688A5C492AB2B2CB40D' - ) + const block = new Block( + ADDRESS_0, '9007199254740991', '92BA74A7D6DC7557F3EDA95ADC6341D51AC777A0A6FF0688A5C492AB2B2CB40D', ADDRESS_2) + .send('9007199254740991') + .to(ADDRESS_1) assert.notEqual(block.balance, 0) assert.equal(block.balance, BigInt(0)) }) await test('subtract balance from SendBlock correctly', async () => { - const block = new SendBlock( - NANO_TEST_VECTORS.ADDRESS_0, - '3000000000000000000000000000000', - NANO_TEST_VECTORS.ADDRESS_1, - '2000000000000000000000000000000', - NANO_TEST_VECTORS.ADDRESS_2, - '92BA74A7D6DC7557F3EDA95ADC6341D51AC777A0A6FF0688A5C492AB2B2CB40D' - ) + const block = new Block( + ADDRESS_0, '3000000000000000000000000000000', '92BA74A7D6DC7557F3EDA95ADC6341D51AC777A0A6FF0688A5C492AB2B2CB40D', ADDRESS_2) + .send('2000000000000000000000000000000') + .to(ADDRESS_1) assert.equal(block.balance, 1000000000000000000000000000000n) }) await test('add balance from ReceiveBlock correctly', async () => { - const block = new ReceiveBlock( - NANO_TEST_VECTORS.ADDRESS_0, - '2000000000000000000000000000000', - NANO_TEST_VECTORS.ADDRESS_1, - '1000000000000000000000000000000', - NANO_TEST_VECTORS.ADDRESS_2, - '92BA74A7D6DC7557F3EDA95ADC6341D51AC777A0A6FF0688A5C492AB2B2CB40D' - ) + const block = new Block(ADDRESS_0, '2000000000000000000000000000000', '92BA74A7D6DC7557F3EDA95ADC6341D51AC777A0A6FF0688A5C492AB2B2CB40D', ADDRESS_2) + .receive('1000000000000000000000000000000') + .from(RECEIVE_BLOCK.link) assert.equal(block.balance, 3000000000000000000000000000000n) }) + + await test('fail to receive from address, link must be block hash', async () => { + assert.throws(new Block(ADDRESS_0, '2000000000000000000000000000000', '92BA74A7D6DC7557F3EDA95ADC6341D51AC777A0A6FF0688A5C492AB2B2CB40D', ADDRESS_2) + .receive('1000000000000000000000000000000') + .from(ADDRESS_1)) + }) }), suite('Block signing using official test vectors', async () => { + const { ADDRESS_0, BIP39_SEED, OPEN_BLOCK, PASSWORD, PRIVATE_0, RECEIVE_BLOCK, SEND_BLOCK } = NANO_TEST_VECTORS await test('sign open block with wallet', async () => { - const wallet = await Wallet.import('BIP-44', NANO_TEST_VECTORS.PASSWORD, NANO_TEST_VECTORS.BIP39_SEED) - await assert.resolves(wallet.unlock(NANO_TEST_VECTORS.PASSWORD)) - - const block = new ReceiveBlock( - NANO_TEST_VECTORS.ADDRESS_0, - '0', - NANO_TEST_VECTORS.OPEN_BLOCK.link, - NANO_TEST_VECTORS.OPEN_BLOCK.balance, - NANO_TEST_VECTORS.OPEN_BLOCK.representative, - NANO_TEST_VECTORS.OPEN_BLOCK.previous, - NANO_TEST_VECTORS.OPEN_BLOCK.work - ) - const signature = await wallet.sign(0, block) + const wallet = await Wallet.import('BIP-44', PASSWORD, BIP39_SEED) + await assert.resolves(wallet.unlock(PASSWORD)) + + const block = new Block(ADDRESS_0, '0', OPEN_BLOCK.previous, OPEN_BLOCK.representative) + .receive(OPEN_BLOCK.balance) + .from(OPEN_BLOCK.link) + const signature = await wallet.sign(0, block, 'hex') assert.equal(block.signature, signature) await wallet.destroy() }) await test('fail to sign open block with wallet when locked', async () => { - const wallet = await Wallet.import('BIP-44', NANO_TEST_VECTORS.PASSWORD, NANO_TEST_VECTORS.BIP39_SEED) - const block = new ReceiveBlock( - NANO_TEST_VECTORS.OPEN_BLOCK.account, - '0', - NANO_TEST_VECTORS.OPEN_BLOCK.link, - NANO_TEST_VECTORS.OPEN_BLOCK.balance, - NANO_TEST_VECTORS.OPEN_BLOCK.representative, - NANO_TEST_VECTORS.OPEN_BLOCK.previous, - NANO_TEST_VECTORS.OPEN_BLOCK.work - ) + const wallet = await Wallet.import('BIP-44', PASSWORD, BIP39_SEED) + const block = new Block(OPEN_BLOCK.account, '0', OPEN_BLOCK.previous, OPEN_BLOCK.representative) + .receive(OPEN_BLOCK.balance) + .from(OPEN_BLOCK.link) + await assert.rejects(wallet.sign(0, block)) - assert.equal(block.hash, NANO_TEST_VECTORS.OPEN_BLOCK.hash) + assert.equal(block.hash, OPEN_BLOCK.hash) assert.ok(block.signature === undefined) await wallet.destroy() }) await test('sign open block with private key', async () => { - const block = new ReceiveBlock( - NANO_TEST_VECTORS.OPEN_BLOCK.account, - '0', - NANO_TEST_VECTORS.OPEN_BLOCK.link, - NANO_TEST_VECTORS.OPEN_BLOCK.balance, - NANO_TEST_VECTORS.OPEN_BLOCK.representative, - NANO_TEST_VECTORS.OPEN_BLOCK.previous, - NANO_TEST_VECTORS.OPEN_BLOCK.work - ) - await block.sign(NANO_TEST_VECTORS.OPEN_BLOCK.key) - assert.equal(block.hash, NANO_TEST_VECTORS.OPEN_BLOCK.hash) - assert.equal(block.signature, NANO_TEST_VECTORS.OPEN_BLOCK.signature) + const block = await (new Block(OPEN_BLOCK.account, '0', OPEN_BLOCK.previous, OPEN_BLOCK.representative) + .receive(OPEN_BLOCK.balance) + .from(OPEN_BLOCK.link)) + .pow(OPEN_BLOCK.work) + await block.sign(OPEN_BLOCK.key) + assert.equal(block.hash, OPEN_BLOCK.hash) + assert.equal(block.signature, OPEN_BLOCK.signature) }) await test('sign receive block', async () => { - const block = new ReceiveBlock( - NANO_TEST_VECTORS.RECEIVE_BLOCK.account, - NANO_TEST_VECTORS.RECEIVE_BLOCK.balance, - NANO_TEST_VECTORS.RECEIVE_BLOCK.link, - '0', - NANO_TEST_VECTORS.RECEIVE_BLOCK.representative, - NANO_TEST_VECTORS.RECEIVE_BLOCK.previous, - NANO_TEST_VECTORS.RECEIVE_BLOCK.work - ) - await block.sign(NANO_TEST_VECTORS.RECEIVE_BLOCK.key) - assert.equal(block.hash, NANO_TEST_VECTORS.RECEIVE_BLOCK.hash) - assert.equal(block.signature, NANO_TEST_VECTORS.RECEIVE_BLOCK.signature) + const block = await (new Block(RECEIVE_BLOCK.account, RECEIVE_BLOCK.balance, RECEIVE_BLOCK.previous, RECEIVE_BLOCK.representative) + .receive(0) + .from(RECEIVE_BLOCK.link)) + .pow(RECEIVE_BLOCK.work) + await block.sign(RECEIVE_BLOCK.key) + assert.equal(block.hash, RECEIVE_BLOCK.hash) + assert.equal(block.signature, RECEIVE_BLOCK.signature) }) await test('sign receive block without work', async () => { - const block = new ReceiveBlock( - NANO_TEST_VECTORS.RECEIVE_BLOCK.account, - NANO_TEST_VECTORS.RECEIVE_BLOCK.balance, - NANO_TEST_VECTORS.RECEIVE_BLOCK.link, - '0', - NANO_TEST_VECTORS.RECEIVE_BLOCK.representative, - NANO_TEST_VECTORS.RECEIVE_BLOCK.previous - ) - await block.sign(NANO_TEST_VECTORS.RECEIVE_BLOCK.key) - assert.equal(block.hash, NANO_TEST_VECTORS.RECEIVE_BLOCK.hash) - assert.equal(block.signature, NANO_TEST_VECTORS.RECEIVE_BLOCK.signature) + const block = new Block(RECEIVE_BLOCK.account, RECEIVE_BLOCK.balance, RECEIVE_BLOCK.previous, RECEIVE_BLOCK.representative) + .receive('0') + .from(RECEIVE_BLOCK.link) + await block.sign(RECEIVE_BLOCK.key) + assert.equal(block.hash, RECEIVE_BLOCK.hash) + assert.equal(block.signature, RECEIVE_BLOCK.signature) assert.equal(block.work, '') }) await test('sign send block', async () => { - const block = new SendBlock( - NANO_TEST_VECTORS.SEND_BLOCK.account, - NANO_TEST_VECTORS.SEND_BLOCK.balance, - NANO_TEST_VECTORS.SEND_BLOCK.link, - '0', - NANO_TEST_VECTORS.SEND_BLOCK.representative, - NANO_TEST_VECTORS.SEND_BLOCK.previous, - NANO_TEST_VECTORS.SEND_BLOCK.work - ) - await block.sign(NANO_TEST_VECTORS.SEND_BLOCK.key) - assert.equal(block.hash, NANO_TEST_VECTORS.SEND_BLOCK.hash) - assert.equal(block.signature, NANO_TEST_VECTORS.SEND_BLOCK.signature) + const block = await (new Block(SEND_BLOCK.account, SEND_BLOCK.balance, SEND_BLOCK.previous, SEND_BLOCK.representative) + .send('0') + .to(SEND_BLOCK.link)) + .pow(SEND_BLOCK.work) + await block.sign(SEND_BLOCK.key) + assert.equal(block.hash, SEND_BLOCK.hash) + assert.equal(block.signature, SEND_BLOCK.signature) }) await test('sign send block without work', async () => { - const block = new SendBlock( - NANO_TEST_VECTORS.SEND_BLOCK.account, - NANO_TEST_VECTORS.SEND_BLOCK.balance, - NANO_TEST_VECTORS.SEND_BLOCK.link, - '0', - NANO_TEST_VECTORS.SEND_BLOCK.representative, - NANO_TEST_VECTORS.SEND_BLOCK.previous - ) - await block.sign(NANO_TEST_VECTORS.SEND_BLOCK.key) - assert.equal(block.hash, NANO_TEST_VECTORS.SEND_BLOCK.hash) - assert.equal(block.signature, NANO_TEST_VECTORS.SEND_BLOCK.signature) + const block = new Block(SEND_BLOCK.account, SEND_BLOCK.balance, SEND_BLOCK.previous, SEND_BLOCK.representative) + .send(0n) + .to(SEND_BLOCK.link) + await block.sign(SEND_BLOCK.key) + //@ts-expect-error + assert.equal(block.hash.map(b => b.toString(16).padStart(2, '0')).join(''), SEND_BLOCK.hash) + assert.equal(block.signature, SEND_BLOCK.signature) assert.equal(block.work, '') }) await test('sign change rep block', async () => { const work = '0000000000000000' - const block = new ChangeBlock( - 'nano_3igf8hd4sjshoibbbkeitmgkp1o6ug4xads43j6e4gqkj5xk5o83j8ja9php', - '3000000000000000000000000000000', - 'nano_1anrzcuwe64rwxzcco8dkhpyxpi8kd7zsjc1oeimpc3ppca4mrjtwnqposrs', - '128106287002E595F479ACD615C818117FCB3860EC112670557A2467386249D4', - work, - ) + const block = await (new Block('nano_3igf8hd4sjshoibbbkeitmgkp1o6ug4xads43j6e4gqkj5xk5o83j8ja9php', '3000000000000000000000000000000', '128106287002E595F479ACD615C818117FCB3860EC112670557A2467386249D4') + .change() + .to('nano_1anrzcuwe64rwxzcco8dkhpyxpi8kd7zsjc1oeimpc3ppca4mrjtwnqposrs')) + .pow(work) await block.sign('781186FB9EF17DB6E3D1056550D9FAE5D5BBADA6A6BC370E4CBB938B1DC71DA3') // Did not find a private key at nano docs for this address assert.equal(block.signature?.toUpperCase(), 'A3C3C66D6519CBC0A198E56855942DEACC6EF741021A1B11279269ADC587DE1DA53CD478B8A47553231104CF24D742E1BB852B0546B87038C19BAE20F9082B0D') assert.equal(block.work, work) }) await test('sign change rep block without work', async () => { - const block = new ChangeBlock( - NANO_TEST_VECTORS.ADDRESS_0, - '0', - 'nano_34amtofxstsfyqcgphp8piij9u33widykq9wbz6ysjpxhbgmqu8btu1eexer', - 'F3C1D7B6EE97DA09D4C00538CEA93CBA5F74D78FD3FBE71347D2DFE7E53DF327' - ) - await block.sign(NANO_TEST_VECTORS.PRIVATE_0) + const block = new Block(ADDRESS_0, '0', 'F3C1D7B6EE97DA09D4C00538CEA93CBA5F74D78FD3FBE71347D2DFE7E53DF327') + .change() + .to('nano_34amtofxstsfyqcgphp8piij9u33widykq9wbz6ysjpxhbgmqu8btu1eexer') + await block.sign(PRIVATE_0) assert.equal(block.signature?.toUpperCase(), '2BD2F905E74B5BEE3E2277CED1D1E3F7535E5286B6E22F7B08A814AA9E5C4E1FEA69B61D60B435ADC2CE756E6EE5F5BE7EC691FE87E024A0B22A3D980CA5B305') assert.equal(block.work, '') }) await test('fail to sign open block without key', async () => { - const block = new ReceiveBlock( - NANO_TEST_VECTORS.OPEN_BLOCK.account, - '0', - NANO_TEST_VECTORS.OPEN_BLOCK.link, - NANO_TEST_VECTORS.OPEN_BLOCK.balance, - NANO_TEST_VECTORS.OPEN_BLOCK.representative, - NANO_TEST_VECTORS.OPEN_BLOCK.previous, - NANO_TEST_VECTORS.OPEN_BLOCK.work - ) + const block = await (new Block(OPEN_BLOCK.account, '0', OPEN_BLOCK.previous, OPEN_BLOCK.representative) + .receive(OPEN_BLOCK.balance) + .from(OPEN_BLOCK.link)) + .pow(OPEN_BLOCK.work) + //@ts-expect-error await assert.rejects(block.sign()) assert.nullish(block.signature) //@ts-expect-error