]> git.codecow.com Git - libnemo.git/commitdiff
Validate PoW before committing to block.
authorChris Duncan <chris@zoso.dev>
Sun, 6 Jul 2025 08:03:33 +0000 (01:03 -0700)
committerChris Duncan <chris@zoso.dev>
Sun, 6 Jul 2025 08:03:33 +0000 (01:03 -0700)
src/lib/block.ts
test/test.calculate-pow.mjs

index d430bed5d167f7792d1582f3cd51afa4c12cc5c7..3686e3c211135810d4db5b6829f97f538be3bf86 100644 (file)
@@ -91,6 +91,13 @@ abstract class Block {
                if ('error' in result) {
                        throw new Error('Failed to generate work', { cause: result.error })
                }
+               const check = await NanoPow.work_validate(result.work, this.previous, { difficulty })
+               if ('error' in check) {
+                       throw new Error('Failed to validate work generated', { cause: check.error })
+               }
+               if (check.valid === '0') {
+                       throw new Error('Wwork generated is invalid', { cause: `${check.difficulty} < ${difficulty}` })
+               }
                this.work = result.work
        }
 
index da742b8b61ce36c15f3d329bb6a41a2149ed64df..a2d90ed3fa8b1e3fe1ede7b4a881651498ffa8ff 100644 (file)
@@ -19,6 +19,7 @@ await suite('Calculate proof-of-work', async () => {
                        NANO_TEST_VECTORS.SEND_BLOCK.previous\r
                )\r
                await block.pow()\r
+\r
                assert.equals(block.previous.length, 64)\r
                assert.equals(block.work?.length, 16)\r
 \r
@@ -39,6 +40,7 @@ await suite('Calculate proof-of-work', async () => {
                        .update(bytes)\r
                        .digest('hex')\r
                        .slice(8, 16)\r
+\r
                assert.ok(parseInt(hash.slice(0, 2), 16) > 0xf0)\r
                assert.equals(parseInt(hash.slice(2, 8), 16), 0xffffff)\r
        })\r