]> zoso.dev Git - libnemo.git/commitdiff
Add counter to pow WebGL main to loop it until a result is found or counter limit...
authorChris Duncan <chris@zoso.dev>
Tue, 10 Dec 2024 23:13:09 +0000 (15:13 -0800)
committerChris Duncan <chris@zoso.dev>
Tue, 10 Dec 2024 23:13:09 +0000 (15:13 -0800)
src/lib/block.ts
src/lib/pool.ts
src/lib/wallet.ts
src/lib/workers/pow.ts

index 26c8364d19f8f8e750e0065223e51411151c8a6f..19854aa3bcd4c7fa0e00f52369d339351fc87b7d 100644 (file)
@@ -87,7 +87,7 @@ abstract class Block {
                                ? THRESHOLD_SEND
                                : THRESHOLD_RECEIVE
                }
-               const [{ work }] = await Pool.work('converge', 'pow', [data])
+               const [{ work }] = await Pool.work('pow', [data])
                this.work = work
        }
 
index 16c8707f65f7ce394e6edcbec96968a19f93b00f..87994175e9ecb9e147812a085c5e7b27c01c9775 100644 (file)
@@ -79,9 +79,7 @@ export class Pool {
                }
        }
 
-       static async work (approach: 'converge' | 'distribute', name: string, data: object[]): Promise<any> {
-               if (approach !== 'converge' && approach !== 'distribute')
-                       throw new TypeError('Invalid work approach')
+       static async work (name: string, data: object[]): Promise<any> {
                if (!Array.isArray(data)) data = [data]
                return new Promise((resolve, reject) => {
                        const job: Job = {
index 40104f98927046ff55f3de7ba64de72b08ffc95b..b3286381c919d8768fd647e65587a6a568101487 100644 (file)
@@ -92,7 +92,7 @@ abstract class Wallet {
                        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 Pool.work('distribute', 'nano-nacl', data)\r
+                       const keypairs: KeyPair[] = await Pool.work('nano-nacl', data)\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
@@ -421,7 +421,7 @@ export class Bip44Wallet extends Wallet {
        async ckd (indexes: number[]): Promise<KeyPair[]> {\r
                const data: any = []\r
                indexes.forEach(i => data.push({ seed: this.seed, index: i }))\r
-               const privateKeys: KeyPair[] = await Pool.work('distribute', 'bip44-cdk', data)\r
+               const privateKeys: KeyPair[] = await Pool.work('bip44-cdk', data)\r
                return privateKeys\r
        }\r
 }\r
index 32eb1394948b83be9ab42435e6ef5b30af5b44bf..46acdcb4f4380e2e92f8feccca3c41214174065b 100644 (file)
@@ -29,8 +29,8 @@ export class Pow {
        // Both width and height must be multiple of 256, (one byte)
        // but do not need to be the same,
        // matching GPU capabilities is the aim
-       static webglWidth = 256 * 4
-       static webglHeight = 256 * 4
+       static webglWidth = 256 * 1
+       static webglHeight = 256 * 1
 
        static hexify (arr: number[] | Uint8Array): string {
                let out = ''
@@ -189,7 +189,8 @@ export class Pow {
       v[b + 1] = (xor0 >> 31) ^ (xor1 << 1);
     }
 
-    void main() {
+    bool found = false;
+    void find() {
       int i;
       uint uv_x = uint(uv_pos.x * ${canvas.width - 1}.);
       uint uv_y = uint(uv_pos.y * ${canvas.height - 1}.);
@@ -231,6 +232,7 @@ export class Pow {
       //  only calculate digest of the second 4 bytes
       if((BLAKE2B_IV32_1 ^ v[1] ^ v[17]) > ` + threshold + `u) {
         // Success found, return pixel data so work value can be constructed
+        found = true;
         fragColor = vec4(
           float(x_index + 1u)/255., // +1 to distinguish from 0 (unsuccessful) pixels
           float(y_index + 1u)/255., // Same as previous
@@ -238,6 +240,14 @@ export class Pow {
           float(y_pos)/255.  // Second custom byte
         );
       }
+    }
+
+    void main() {
+      int count = 0;
+      do {
+        count++;
+        find();
+      } while (!found && count < 200);
     }`
 
                const vertexShader = gl.createShader(gl.VERTEX_SHADER)
@@ -318,11 +328,7 @@ export class Pow {
                        gl.clear(gl.COLOR_BUFFER_BIT)
                        gl.drawArrays(gl.TRIANGLES, 0, 6)
                        const pixels = new Uint8Array(gl.drawingBufferWidth * gl.drawingBufferHeight * 4)
-                       performance.mark('readPixels start')
                        gl.readPixels(0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight, gl.RGBA, gl.UNSIGNED_BYTE, pixels)
-                       performance.mark('readPixels end')
-                       for (const e of performance.getEntries()) console.dir(e.toJSON())
-                       performance.clearMarks()
 
                        // Check the pixels for any success
                        for (let i = 0; i < pixels.length; i += 4) {