nano-pow 4.0.9 → 4.0.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +20 -24
- package/dist/bin/cli.js +1 -1
- package/dist/bin/server.js +2 -2
- package/dist/main.min.js +27 -27
- package/dist/types.d.ts +95 -125
- package/docs/benchmarks.md +1 -1
- package/docs/nano-pow.1 +16 -10
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -19,8 +19,8 @@ https://docs.nano.org/integration-guides/work-generation/#work-calculation-detai
|
|
|
19
19
|
```console
|
|
20
20
|
$ npm i nano-pow
|
|
21
21
|
```
|
|
22
|
-
NanoPow can also be installed globally to add the `nano-pow` command to
|
|
23
|
-
environment. To learn more, see [#Executables](#executables).
|
|
22
|
+
NanoPow can also be installed globally to add the `nano-pow` command to the
|
|
23
|
+
system environment. To learn more, see [#Executables](#executables).
|
|
24
24
|
|
|
25
25
|
## Usage
|
|
26
26
|
### Import
|
|
@@ -76,9 +76,9 @@ const { valid } = await NanoPow.work_validate(work, hash)
|
|
|
76
76
|
```javascript
|
|
77
77
|
const options = {
|
|
78
78
|
// default 0xFFFFFFF800000000 for send/change blocks
|
|
79
|
-
|
|
79
|
+
difficulty: 'FFFFFFC000000000',
|
|
80
80
|
// default 8, valid range 1-32
|
|
81
|
-
effort:
|
|
81
|
+
effort: 16,
|
|
82
82
|
// default false
|
|
83
83
|
debug: true
|
|
84
84
|
}
|
|
@@ -93,21 +93,16 @@ $ npm -g i nano-pow
|
|
|
93
93
|
$ nano-pow --help # view abbreviated CLI help
|
|
94
94
|
$ man nano-pow # view full manual
|
|
95
95
|
```
|
|
96
|
-
Ensure
|
|
96
|
+
Ensure proper permissions exist on the
|
|
97
97
|
[npm `prefix`](https://docs.npmjs.com/cli/v11/commands/npm-prefix) directory and
|
|
98
|
-
|
|
98
|
+
that `PATH` is also configured accordingly. [nvm](https://github.com/nvm-sh/nvm)
|
|
99
|
+
is a great tool that handles this automatically.
|
|
99
100
|
|
|
100
|
-
For example, this adds a user-specific directory for local binaries to `PATH`
|
|
101
|
-
upon login and configures `npm prefix` to use it for global installations:
|
|
102
|
-
```console
|
|
103
|
-
$ echo 'PATH="$HOME/.local/bin:$PATH"' >> .bashrc
|
|
104
|
-
$ npm config set prefix="$HOME/.local"
|
|
105
|
-
```
|
|
106
101
|
### Command Line
|
|
107
102
|
NanoPow provides a shell command—`nano-pow`—to accomodate systems
|
|
108
103
|
without a graphical user interface. It launches a headless Chrome browser using
|
|
109
104
|
`puppeteer` to access the required WebGPU or WebGL APIs. Use the `--global` flag
|
|
110
|
-
when installing to add the executable script to
|
|
105
|
+
when installing to add the executable script to the system.
|
|
111
106
|
```console
|
|
112
107
|
$ npm i -g nano-pow
|
|
113
108
|
```
|
|
@@ -120,7 +115,7 @@ $ nano-pow --debug 0123456789abcdef0123456789abcdef0123456789abcdef0123456789abc
|
|
|
120
115
|
```
|
|
121
116
|
```console
|
|
122
117
|
$ # Generate work using customized behavior with options.
|
|
123
|
-
$ nano-pow --effort 32 --
|
|
118
|
+
$ nano-pow --effort 32 --difficulty FFFFFFC000000000 0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef
|
|
124
119
|
```
|
|
125
120
|
```console
|
|
126
121
|
$ # Validate an existing work nonce against a blockhash.
|
|
@@ -138,24 +133,25 @@ $ cat /path/to/hashes/file | nano-pow
|
|
|
138
133
|
### Server
|
|
139
134
|
NanoPow also provides a basic work server similar to the one included in the
|
|
140
135
|
official Nano node software. The installed command will launch the server in a
|
|
141
|
-
detached process, and
|
|
136
|
+
detached process, and it can also be started manually to customize behavior by
|
|
142
137
|
executing the server script directly.
|
|
143
138
|
|
|
144
|
-
|
|
145
|
-
|
|
139
|
+
#### Environment Variables
|
|
140
|
+
`NANO_POW_PORT`: override the default port 5040
|
|
141
|
+
|
|
142
|
+
`NANO_POW_EFFORT` increase or decrease demand on the GPU
|
|
146
143
|
|
|
147
|
-
`
|
|
148
|
-
or decrease the demand on the GPU and defaults to 8 if not specified.
|
|
144
|
+
`NANO_POW_DEBUG` enable additional logging saved to the HOME directory
|
|
149
145
|
|
|
150
146
|
```console
|
|
151
147
|
$ # Launch the server and detach from the current session
|
|
152
|
-
$
|
|
148
|
+
$ NANO_POW_PORT=8080 nano-pow --server
|
|
153
149
|
$ # View process ID for "NanoPow Server"
|
|
154
150
|
$ cat ~/.nano-pow/server.pid
|
|
155
151
|
$ # Display list of server logs
|
|
156
152
|
$ ls ~/.nano-pow/logs/
|
|
157
153
|
$ # Find process ID manually
|
|
158
|
-
$
|
|
154
|
+
$ pgrep NanoPow
|
|
159
155
|
```
|
|
160
156
|
Work is generated or validated by sending an HTTP `POST` request to the
|
|
161
157
|
configured hostname or IP address of the machine. Some basic help is available
|
|
@@ -165,7 +161,7 @@ $ # Generate a work value
|
|
|
165
161
|
$ curl -d '{
|
|
166
162
|
"action": "work_generate",
|
|
167
163
|
"hash": "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
|
|
168
|
-
}' localhost:
|
|
164
|
+
}' localhost:5040
|
|
169
165
|
```
|
|
170
166
|
```console
|
|
171
167
|
$ # Validate a work value
|
|
@@ -173,7 +169,7 @@ $ curl -d '{
|
|
|
173
169
|
"action": "work_validate",
|
|
174
170
|
"work": "e45835c3b291c3d1",
|
|
175
171
|
"hash": "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
|
|
176
|
-
}' localhost:
|
|
172
|
+
}' localhost:5040
|
|
177
173
|
```
|
|
178
174
|
|
|
179
175
|
## Notes
|
|
@@ -226,7 +222,7 @@ GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>
|
|
|
226
222
|
Portions of this code are also provided under the MIT License: <https://spdx.org/licenses/MIT.html>
|
|
227
223
|
|
|
228
224
|
## Donations
|
|
229
|
-
|
|
225
|
+
Tips are always appreciated and can be sent to the following developer address:
|
|
230
226
|
```
|
|
231
227
|
nano_1zosoqs47yt47bnfg7sdf46kj7asn58b7uzm9ek95jw7ccatq37898u1zoso
|
|
232
228
|
```
|
package/dist/bin/cli.js
CHANGED
|
@@ -5,7 +5,7 @@ import * as readline from "node:readline/promises";
|
|
|
5
5
|
process.title = "NanoPow CLI";
|
|
6
6
|
process.env.NANO_POW_DEBUG = "";
|
|
7
7
|
process.env.NANO_POW_EFFORT = "";
|
|
8
|
-
process.env.NANO_POW_PORT = "
|
|
8
|
+
process.env.NANO_POW_PORT = "5040";
|
|
9
9
|
function log(...args2) {
|
|
10
10
|
if (process.env.NANO_POW_DEBUG) console.log(new Date(Date.now()).toLocaleString(), "NanoPow", args2);
|
|
11
11
|
}
|
package/dist/bin/server.js
CHANGED
|
@@ -13,7 +13,7 @@ const MAX_REQUEST_SIZE = 1024;
|
|
|
13
13
|
const MAX_BODY_SIZE = 158;
|
|
14
14
|
const DEBUG = !!(process.env.NANO_POW_DEBUG || false);
|
|
15
15
|
const EFFORT = +(process.env.NANO_POW_EFFORT || 8);
|
|
16
|
-
const PORT = +(process.env.NANO_POW_PORT ||
|
|
16
|
+
const PORT = +(process.env.NANO_POW_PORT || 5040);
|
|
17
17
|
let browser;
|
|
18
18
|
let page;
|
|
19
19
|
function log(...args) {
|
|
@@ -44,7 +44,7 @@ async function respond(res, data) {
|
|
|
44
44
|
const options = {
|
|
45
45
|
debug: DEBUG,
|
|
46
46
|
effort: EFFORT,
|
|
47
|
-
|
|
47
|
+
difficulty
|
|
48
48
|
};
|
|
49
49
|
const args = [];
|
|
50
50
|
if (work) args.push(work);
|
package/dist/main.min.js
CHANGED
|
@@ -21,7 +21,7 @@ precision highp float;
|
|
|
21
21
|
#else
|
|
22
22
|
precision mediump float;
|
|
23
23
|
#endif
|
|
24
|
-
out uvec4 nonce;layout(std140)uniform UBO{uint blockhash[8];uvec2
|
|
24
|
+
out uvec4 nonce;layout(std140)uniform UBO{uint blockhash[8];uvec2 difficulty;bool validate;};layout(std140)uniform WORK{uvec2 seed;};const uvec2 BLAKE2B_IV[8]=uvec2[8](uvec2(0xF3BCC908u,0x6A09E667u),uvec2(0x84CAA73Bu,0xBB67AE85u),uvec2(0xFE94F82Bu,0x3C6EF372u),uvec2(0x5F1D36F1u,0xA54FF53Au),uvec2(0xADE682D1u,0x510E527Fu),uvec2(0x2B3E6C1Fu,0x9B05688Cu),uvec2(0xFB41BD6Bu,0x1F83D9ABu),uvec2(0x137E2179u,0x5BE0CD19u));const uvec2 BLAKE2B_PARAM=uvec2(0x01010008u,0u);const uvec2 BLAKE2B_INLEN=uvec2(0x00000028u,0u);const uvec2 BLAKE2B_FINAL=uvec2(0xFFFFFFFFu,0xFFFFFFFFu);const uvec2 BLAKE2B_INIT[16]=uvec2[16](BLAKE2B_IV[0u]^ BLAKE2B_PARAM,BLAKE2B_IV[1u],BLAKE2B_IV[2u],BLAKE2B_IV[3u],BLAKE2B_IV[4u],BLAKE2B_IV[5u],BLAKE2B_IV[6u],BLAKE2B_IV[7u],BLAKE2B_IV[0u],BLAKE2B_IV[1u],BLAKE2B_IV[2u],BLAKE2B_IV[3u],BLAKE2B_IV[4u]^ BLAKE2B_INLEN,BLAKE2B_IV[5u],BLAKE2B_IV[6u]^ BLAKE2B_FINAL,BLAKE2B_IV[7u]);const uint BLAKE2B_IV32_1=0x6A09E667u;const uvec4 ROTATE_1=uvec4(1u);const uvec4 ROTATE_8=uvec4(8u);const uvec4 ROTATE_16=uvec4(16u);const uvec4 ROTATE_24=uvec4(24u);const uvec4 ROTATE_31=uvec4(31u);uvec2 v[16];uvec2 m[16];void G(uint a0,uint b0,uint c0,uint d0,uvec2 x0,uvec2 y0,uint a1,uint b1,uint c1,uint d1,uvec2 x1,uvec2 y1){uvec4 a=uvec4(v[a0],v[a1]);uvec4 b=uvec4(v[b0],v[b1]);uvec4 c=uvec4(v[c0],v[c1]);uvec4 d=uvec4(v[d0],v[d1]);uvec4 mx=uvec4(x0,x1);uvec4 my=uvec4(y0,y1);a=a+b+uvec4(0u,uint(a.x+b.x<a.x),0u,uint(a.z+b.z<a.z));a=a+mx+uvec4(0u,uint(a.x+mx.x<a.x),0u,uint(a.z+mx.z<a.z));d=(d ^ a).yxwz;c=c+d+uvec4(0u,uint(c.x+d.x<c.x),0u,uint(c.z+d.z<c.z));b=((b ^ c)>>ROTATE_24)|((b ^ c)<<ROTATE_8).yxwz;a=a+b+uvec4(0u,uint(a.x+b.x<b.x),0u,uint(a.z+b.z<b.z));a=a+my+uvec4(0u,uint(a.x+my.x<a.x),0u,uint(a.z+my.z<a.z));d=((d ^ a)>>ROTATE_16)|((d ^ a)<<ROTATE_16).yxwz;c=c+d+uvec4(0u,uint(c.x+d.x<c.x),0u,uint(c.z+d.z<c.z));b=((b ^ c)>>ROTATE_31).yxwz|((b ^ c)<<ROTATE_1);v[a0]=a.xy;v[b0]=b.xy;v[c0]=c.xy;v[d0]=d.xy;v[a1]=a.zw;v[b1]=b.zw;v[c1]=c.zw;v[d1]=d.zw;}void main(){nonce=uvec4(0u);m[0u]=seed ^ uvec2(gl_FragCoord);m[1u]=uvec2(blockhash[0u],blockhash[1u]);m[2u]=uvec2(blockhash[2u],blockhash[3u]);m[3u]=uvec2(blockhash[4u],blockhash[5u]);m[4u]=uvec2(blockhash[6u],blockhash[7u]);v=BLAKE2B_INIT;G(0u,4u,8u,12u,m[0u],m[1u],1u,5u,9u,13u,m[2u],m[3u]);G(2u,6u,10u,14u,m[4u],m[5u],3u,7u,11u,15u,m[6u],m[7u]);G(0u,5u,10u,15u,m[8u],m[9u],1u,6u,11u,12u,m[10u],m[11u]);G(2u,7u,8u,13u,m[12u],m[13u],3u,4u,9u,14u,m[14u],m[15u]);G(0u,4u,8u,12u,m[14u],m[10u],1u,5u,9u,13u,m[4u],m[8u]);G(2u,6u,10u,14u,m[9u],m[15u],3u,7u,11u,15u,m[13u],m[6u]);G(0u,5u,10u,15u,m[1u],m[12u],1u,6u,11u,12u,m[0u],m[2u]);G(2u,7u,8u,13u,m[11u],m[7u],3u,4u,9u,14u,m[5u],m[3u]);G(0u,4u,8u,12u,m[11u],m[8u],1u,5u,9u,13u,m[12u],m[0u]);G(2u,6u,10u,14u,m[5u],m[2u],3u,7u,11u,15u,m[15u],m[13u]);G(0u,5u,10u,15u,m[10u],m[14u],1u,6u,11u,12u,m[3u],m[6u]);G(2u,7u,8u,13u,m[7u],m[1u],3u,4u,9u,14u,m[9u],m[4u]);G(0u,4u,8u,12u,m[7u],m[9u],1u,5u,9u,13u,m[3u],m[1u]);G(2u,6u,10u,14u,m[13u],m[12u],3u,7u,11u,15u,m[11u],m[14u]);G(0u,5u,10u,15u,m[2u],m[6u],1u,6u,11u,12u,m[5u],m[10u]);G(2u,7u,8u,13u,m[4u],m[0u],3u,4u,9u,14u,m[15u],m[8u]);G(0u,4u,8u,12u,m[9u],m[0u],1u,5u,9u,13u,m[5u],m[7u]);G(2u,6u,10u,14u,m[2u],m[4u],3u,7u,11u,15u,m[10u],m[15u]);G(0u,5u,10u,15u,m[14u],m[1u],1u,6u,11u,12u,m[11u],m[12u]);G(2u,7u,8u,13u,m[6u],m[8u],3u,4u,9u,14u,m[3u],m[13u]);G(0u,4u,8u,12u,m[2u],m[12u],1u,5u,9u,13u,m[6u],m[10u]);G(2u,6u,10u,14u,m[0u],m[11u],3u,7u,11u,15u,m[8u],m[3u]);G(0u,5u,10u,15u,m[4u],m[13u],1u,6u,11u,12u,m[7u],m[5u]);G(2u,7u,8u,13u,m[15u],m[14u],3u,4u,9u,14u,m[1u],m[9u]);G(0u,4u,8u,12u,m[12u],m[5u],1u,5u,9u,13u,m[1u],m[15u]);G(2u,6u,10u,14u,m[14u],m[13u],3u,7u,11u,15u,m[4u],m[10u]);G(0u,5u,10u,15u,m[0u],m[7u],1u,6u,11u,12u,m[6u],m[3u]);G(2u,7u,8u,13u,m[9u],m[2u],3u,4u,9u,14u,m[8u],m[11u]);G(0u,4u,8u,12u,m[13u],m[11u],1u,5u,9u,13u,m[7u],m[14u]);G(2u,6u,10u,14u,m[12u],m[1u],3u,7u,11u,15u,m[3u],m[9u]);G(0u,5u,10u,15u,m[5u],m[0u],1u,6u,11u,12u,m[15u],m[4u]);G(2u,7u,8u,13u,m[8u],m[6u],3u,4u,9u,14u,m[2u],m[10u]);G(0u,4u,8u,12u,m[6u],m[15u],1u,5u,9u,13u,m[14u],m[9u]);G(2u,6u,10u,14u,m[11u],m[3u],3u,7u,11u,15u,m[0u],m[8u]);G(0u,5u,10u,15u,m[12u],m[2u],1u,6u,11u,12u,m[13u],m[7u]);G(2u,7u,8u,13u,m[1u],m[4u],3u,4u,9u,14u,m[10u],m[5u]);G(0u,4u,8u,12u,m[10u],m[2u],1u,5u,9u,13u,m[8u],m[4u]);G(2u,6u,10u,14u,m[7u],m[6u],3u,7u,11u,15u,m[1u],m[5u]);G(0u,5u,10u,15u,m[15u],m[11u],1u,6u,11u,12u,m[9u],m[14u]);G(2u,7u,8u,13u,m[3u],m[12u],3u,4u,9u,14u,m[13u],m[0u]);G(0u,4u,8u,12u,m[0u],m[1u],1u,5u,9u,13u,m[2u],m[3u]);G(2u,6u,10u,14u,m[4u],m[5u],3u,7u,11u,15u,m[6u],m[7u]);G(0u,5u,10u,15u,m[8u],m[9u],1u,6u,11u,12u,m[10u],m[11u]);G(2u,7u,8u,13u,m[12u],m[13u],3u,4u,9u,14u,m[14u],m[15u]);G(0u,4u,8u,12u,m[14u],m[10u],1u,5u,9u,13u,m[4u],m[8u]);G(2u,6u,10u,14u,m[9u],m[15u],3u,7u,11u,15u,m[13u],m[6u]);G(0u,5u,10u,15u,m[1u],m[12u],1u,6u,11u,12u,m[0u],m[2u]);G(2u,7u,8u,13u,m[11u],m[7u],3u,4u,9u,14u,m[5u],m[3u]);uvec2 result=BLAKE2B_INIT[0u]^ v[0u]^ v[8u];if((validate&&uvec2(gl_FragCoord)==uvec2(0u))||(result.y>difficulty.y||(result.y==difficulty.y&&result.x>difficulty.x))){nonce=uvec4((BLAKE2B_INIT[0u]^ v[0u]^ v[8u]),m[0u]).yxwz;}if(nonce.x==0u){discard;}}`;
|
|
25
25
|
|
|
26
26
|
// src/lib/gl/gl-vertex.vert
|
|
27
27
|
var gl_vertex_default = `#version 300 es
|
|
@@ -358,14 +358,14 @@ var NanoPowGl = class _NanoPowGl {
|
|
|
358
358
|
}
|
|
359
359
|
if (this.#isInitialized === false) this.init();
|
|
360
360
|
this.#busy = true;
|
|
361
|
-
if (typeof options?.
|
|
361
|
+
if (typeof options?.difficulty === "string") {
|
|
362
362
|
try {
|
|
363
|
-
options.
|
|
363
|
+
options.difficulty = BigInt(`0x${options.difficulty}`);
|
|
364
364
|
} catch (err) {
|
|
365
|
-
throw new TypeError(`Invalid
|
|
365
|
+
throw new TypeError(`Invalid difficulty ${options.difficulty}`);
|
|
366
366
|
}
|
|
367
367
|
}
|
|
368
|
-
const
|
|
368
|
+
const difficulty = typeof options?.difficulty !== "bigint" || options.difficulty < 1n || options.difficulty > 0xffffffffffffffffn ? 0xfffffff800000000n : options.difficulty;
|
|
369
369
|
const effort = typeof options?.effort !== "number" || options.effort < 1 || options.effort > 32 ? this.#cores : options.effort;
|
|
370
370
|
this.#debug = !!options?.debug;
|
|
371
371
|
if (this.#debug) console.log("NanoPowGl.work_generate()");
|
|
@@ -388,7 +388,7 @@ var NanoPowGl = class _NanoPowGl {
|
|
|
388
388
|
const uint32 = hash.slice(i, i + 8);
|
|
389
389
|
this.#uboView.setUint32(i * 2, parseInt(uint32, 16));
|
|
390
390
|
}
|
|
391
|
-
this.#uboView.setBigUint64(128,
|
|
391
|
+
this.#uboView.setBigUint64(128, difficulty, true);
|
|
392
392
|
this.#uboView.setUint32(136, 0, true);
|
|
393
393
|
if (this.#debug) console.log("UBO", this.#uboView.buffer.slice(0));
|
|
394
394
|
this.#gl.bindBuffer(this.#gl.UNIFORM_BUFFER, this.#uboBuffer);
|
|
@@ -443,14 +443,14 @@ var NanoPowGl = class _NanoPowGl {
|
|
|
443
443
|
}
|
|
444
444
|
if (this.#isInitialized === false) this.init();
|
|
445
445
|
this.#busy = true;
|
|
446
|
-
if (typeof options?.
|
|
446
|
+
if (typeof options?.difficulty === "string") {
|
|
447
447
|
try {
|
|
448
|
-
options.
|
|
448
|
+
options.difficulty = BigInt(`0x${options.difficulty}`);
|
|
449
449
|
} catch (err) {
|
|
450
|
-
throw new TypeError(`Invalid
|
|
450
|
+
throw new TypeError(`Invalid difficulty ${options.difficulty}`);
|
|
451
451
|
}
|
|
452
452
|
}
|
|
453
|
-
const
|
|
453
|
+
const difficulty = typeof options?.difficulty !== "bigint" || options.difficulty < 1n || options.difficulty > 0xffffffffffffffffn ? 0xfffffff800000000n : options.difficulty;
|
|
454
454
|
this.#debug = !!options?.debug;
|
|
455
455
|
if (this.#debug) console.log("NanoPowGl.work_validate()");
|
|
456
456
|
if (this.#debug) console.log("blockhash", hash);
|
|
@@ -466,7 +466,7 @@ var NanoPowGl = class _NanoPowGl {
|
|
|
466
466
|
const uint32 = hash.slice(i, i + 8);
|
|
467
467
|
this.#uboView.setUint32(i * 2, parseInt(uint32, 16));
|
|
468
468
|
}
|
|
469
|
-
this.#uboView.setBigUint64(128,
|
|
469
|
+
this.#uboView.setBigUint64(128, difficulty, true);
|
|
470
470
|
this.#uboView.setUint32(136, 1, true);
|
|
471
471
|
if (this.#debug) console.log("UBO", this.#uboView.buffer.slice(0));
|
|
472
472
|
this.#gl.bindBuffer(this.#gl.UNIFORM_BUFFER, this.#uboBuffer);
|
|
@@ -497,7 +497,7 @@ var NanoPowGl = class _NanoPowGl {
|
|
|
497
497
|
valid_all: result >= this.#SEND ? "1" : "0",
|
|
498
498
|
valid_receive: result >= this.#RECEIVE ? "1" : "0"
|
|
499
499
|
};
|
|
500
|
-
if (options?.
|
|
500
|
+
if (options?.difficulty != null) response.valid = result >= difficulty ? "1" : "0";
|
|
501
501
|
return response;
|
|
502
502
|
}
|
|
503
503
|
};
|
|
@@ -505,7 +505,7 @@ var NanoPowGl = class _NanoPowGl {
|
|
|
505
505
|
// src/lib/gpu/compute.wgsl
|
|
506
506
|
var compute_default = `//! SPDX-FileCopyrightText: 2025 Chris Duncan <chris@zoso.dev>
|
|
507
507
|
//! SPDX-License-Identifier: GPL-3.0-or-later
|
|
508
|
-
struct UBO{blockhash:array<vec4<u32>,2>,seed:vec2<u32>,threshold:vec2<u32>};@group(0)@binding(0)var<uniform> ubo:UBO;struct WORK{found:atomic<u32>,nonce:vec2<u32>,result:vec2<u32>};@group(0)@binding(1)var<storage,read_write>work:WORK;const BLAKE2B_IV=array<vec2<u32>,8>(vec2<u32>(0xF3BCC908u,0x6A09E667u),vec2<u32>(0x84CAA73Bu,0xBB67AE85u),vec2<u32>(0xFE94F82Bu,0x3C6EF372u),vec2<u32>(0x5F1D36F1u,0xA54FF53Au),vec2<u32>(0xADE682D1u,0x510E527Fu),vec2<u32>(0x2B3E6C1Fu,0x9B05688Cu),vec2<u32>(0xFB41BD6Bu,0x1F83D9ABu),vec2<u32>(0x137E2179u,0x5BE0CD19u));const BLAKE2B_PARAM=vec2<u32>(0x01010008u,0u);const BLAKE2B_INLEN=vec2<u32>(0x00000028u,0u);const BLAKE2B_FINAL=vec2<u32>(0xFFFFFFFFu,0xFFFFFFFFu);const BLAKE2B_INIT=array<vec2<u32>,16>(BLAKE2B_IV[0u]^ BLAKE2B_PARAM,BLAKE2B_IV[1u],BLAKE2B_IV[2u],BLAKE2B_IV[3u],BLAKE2B_IV[4u],BLAKE2B_IV[5u],BLAKE2B_IV[6u],BLAKE2B_IV[7u],BLAKE2B_IV[0u],BLAKE2B_IV[1u],BLAKE2B_IV[2u],BLAKE2B_IV[3u],BLAKE2B_IV[4u]^ BLAKE2B_INLEN,BLAKE2B_IV[5u],BLAKE2B_IV[6u]^ BLAKE2B_FINAL,BLAKE2B_IV[7u]);const Z=vec2(0u);const CARRY=vec4(1u,0u,1u,0u);const ROTATE_1=vec4(1u);const ROTATE_8=vec4(8u);const ROTATE_16=vec4(16u);const ROTATE_24=vec4(24u);const ROTATE_31=vec4(31u);var<workgroup> found:bool;@compute @workgroup_size(32)fn search(@builtin(global_invocation_id)global_id:vec3<u32>,@builtin(local_invocation_id)local_id:vec3<u32>){found=(local_id.x==0u&&atomicLoad(&work.found)!=0u);workgroupBarrier();if(found){return;}main(global_id,false);}@compute @workgroup_size(1)fn validate(@builtin(global_invocation_id)global_id:vec3<u32>){main(global_id,true);}fn main(id:vec3<u32>,validate:bool){let m0:vec2<u32>=ubo.seed ^ id.xy;let m1:vec2<u32>=ubo.blockhash[0u].xy;let m2:vec2<u32>=ubo.blockhash[0u].zw;let m3:vec2<u32>=ubo.blockhash[1u].xy;let m4:vec2<u32>=ubo.blockhash[1u].zw;var v01:vec4<u32>=vec4<u32>(BLAKE2B_INIT[0u],BLAKE2B_INIT[1u]);var v23:vec4<u32>=vec4<u32>(BLAKE2B_INIT[2u],BLAKE2B_INIT[3u]);var v45:vec4<u32>=vec4<u32>(BLAKE2B_INIT[4u],BLAKE2B_INIT[5u]);var v67:vec4<u32>=vec4<u32>(BLAKE2B_INIT[6u],BLAKE2B_INIT[7u]);var v89:vec4<u32>=vec4<u32>(BLAKE2B_INIT[8u],BLAKE2B_INIT[9u]);var vAB:vec4<u32>=vec4<u32>(BLAKE2B_INIT[10u],BLAKE2B_INIT[11u]);var vCD:vec4<u32>=vec4<u32>(BLAKE2B_INIT[12u],BLAKE2B_INIT[13u]);var vEF:vec4<u32>=vec4<u32>(BLAKE2B_INIT[14u],BLAKE2B_INIT[15u]);var v56:vec4<u32>;var vFC:vec4<u32>;var v74:vec4<u32>;var vDE:vec4<u32>;var s0:vec4<u32>;var s1:vec4<u32>;s0=v01+v45;v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;s1=v23+v67;v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;s0=v01+vec4(m0,m2);v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;v23+=vec4(m4,Z);v23.y+=u32(v23.x<m4.x);vCD=(vCD ^ v01).yxwz;vEF=(vEF ^ v23).yxwz;s0=v89+vCD;v89=s0+(vec4<u32>(s0<v89)&CARRY).yxwz;s1=vAB+vEF;vAB=s1+(vec4<u32>(s1<vAB)&CARRY).yxwz;v45 ^=v89;v45=(v45>>ROTATE_24)|(v45<<ROTATE_8).yxwz;v67 ^=vAB;v67=(v67>>ROTATE_24)|(v67<<ROTATE_8).yxwz;s0=v01+v45;v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;s1=v23+v67;v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;s0=v01+vec4(m1,m3);v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;vCD ^=v01;vCD=(vCD>>ROTATE_16)|(vCD<<ROTATE_16).yxwz;vEF ^=v23;vEF=(vEF>>ROTATE_16)|(vEF<<ROTATE_16).yxwz;s0=v89+vCD;v89=s0+(vec4<u32>(s0<v89)&CARRY).yxwz;s1=vAB+vEF;vAB=s1+(vec4<u32>(s1<vAB)&CARRY).yxwz;v45 ^=v89;v45=(v45>>ROTATE_31).yxwz|(v45<<ROTATE_1);v67 ^=vAB;v67=(v67>>ROTATE_31).yxwz|(v67<<ROTATE_1);v56=vec4(v45.zw,v67.xy);v74=vec4(v67.zw,v45.xy);vFC=vec4(vEF.zw,vCD.xy);vDE=vec4(vCD.zw,vEF.xy);s0=v01+v56;v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;s1=v23+v74;v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;vFC=(vFC ^ v01).yxwz;vDE=(vDE ^ v23).yxwz;s0=vAB+vFC;vAB=s0+(vec4<u32>(s0<vAB)&CARRY).yxwz;s1=v89+vDE;v89=s1+(vec4<u32>(s1<v89)&CARRY).yxwz;v56 ^=vAB;v56=(v56>>ROTATE_24)|(v56<<ROTATE_8).yxwz;v74 ^=v89;v74=(v74>>ROTATE_24)|(v74<<ROTATE_8).yxwz;s0=v01+v56;v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;s1=v23+v74;v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;vFC ^=v01;vFC=(vFC>>ROTATE_16)|(vFC<<ROTATE_16).yxwz;vDE ^=v23;vDE=(vDE>>ROTATE_16)|(vDE<<ROTATE_16).yxwz;s0=vAB+vFC;vAB=s0+(vec4<u32>(s0<vAB)&CARRY).yxwz;s1=v89+vDE;v89=s1+(vec4<u32>(s1<v89)&CARRY).yxwz;v56 ^=vAB;v56=(v56>>ROTATE_31).yxwz|(v56<<ROTATE_1);v74 ^=v89;v74=(v74>>ROTATE_31).yxwz|(v74<<ROTATE_1);v45=vec4(v74.zw,v56.xy);v67=vec4(v56.zw,v74.xy);vCD=vec4(vFC.zw,vDE.xy);vEF=vec4(vDE.zw,vFC.xy);s0=v01+v45;v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;s1=v23+v67;v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;v01+=vec4(Z,m4);v01.w+=u32(v01.z<m4.x);vCD=(vCD ^ v01).yxwz;vEF=(vEF ^ v23).yxwz;s0=v89+vCD;v89=s0+(vec4<u32>(s0<v89)&CARRY).yxwz;s1=vAB+vEF;vAB=s1+(vec4<u32>(s1<vAB)&CARRY).yxwz;v45 ^=v89;v45=(v45>>ROTATE_24)|(v45<<ROTATE_8).yxwz;v67 ^=vAB;v67=(v67>>ROTATE_24)|(v67<<ROTATE_8).yxwz;s0=v01+v45;v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;s1=v23+v67;v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;vCD ^=v01;vCD=(vCD>>ROTATE_16)|(vCD<<ROTATE_16).yxwz;vEF ^=v23;vEF=(vEF>>ROTATE_16)|(vEF<<ROTATE_16).yxwz;s0=v89+vCD;v89=s0+(vec4<u32>(s0<v89)&CARRY).yxwz;s1=vAB+vEF;vAB=s1+(vec4<u32>(s1<vAB)&CARRY).yxwz;v45 ^=v89;v45=(v45>>ROTATE_31).yxwz|(v45<<ROTATE_1);v67 ^=vAB;v67=(v67>>ROTATE_31).yxwz|(v67<<ROTATE_1);v56=vec4(v45.zw,v67.xy);v74=vec4(v67.zw,v45.xy);vFC=vec4(vEF.zw,vCD.xy);vDE=vec4(vCD.zw,vEF.xy);s0=v01+v56;v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;s1=v23+v74;v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;s0=v01+vec4(m1,m0);v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;vFC=(vFC ^ v01).yxwz;vDE=(vDE ^ v23).yxwz;s0=vAB+vFC;vAB=s0+(vec4<u32>(s0<vAB)&CARRY).yxwz;s1=v89+vDE;v89=s1+(vec4<u32>(s1<v89)&CARRY).yxwz;v56 ^=vAB;v56=(v56>>ROTATE_24)|(v56<<ROTATE_8).yxwz;v74 ^=v89;v74=(v74>>ROTATE_24)|(v74<<ROTATE_8).yxwz;s0=v01+v56;v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;s1=v23+v74;v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;v01+=vec4(Z,m2);v01.w+=u32(v01.z<m2.x);v23+=vec4(Z,m3);v23.w+=u32(v23.z<m3.x);vFC ^=v01;vFC=(vFC>>ROTATE_16)|(vFC<<ROTATE_16).yxwz;vDE ^=v23;vDE=(vDE>>ROTATE_16)|(vDE<<ROTATE_16).yxwz;s0=vAB+vFC;vAB=s0+(vec4<u32>(s0<vAB)&CARRY).yxwz;s1=v89+vDE;v89=s1+(vec4<u32>(s1<v89)&CARRY).yxwz;v56 ^=vAB;v56=(v56>>ROTATE_31).yxwz|(v56<<ROTATE_1);v74 ^=v89;v74=(v74>>ROTATE_31).yxwz|(v74<<ROTATE_1);v45=vec4(v74.zw,v56.xy);v67=vec4(v56.zw,v74.xy);vCD=vec4(vFC.zw,vDE.xy);vEF=vec4(vDE.zw,vFC.xy);s0=v01+v45;v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;s1=v23+v67;v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;vCD=(vCD ^ v01).yxwz;vEF=(vEF ^ v23).yxwz;s0=v89+vCD;v89=s0+(vec4<u32>(s0<v89)&CARRY).yxwz;s1=vAB+vEF;vAB=s1+(vec4<u32>(s1<vAB)&CARRY).yxwz;v45 ^=v89;v45=(v45>>ROTATE_24)|(v45<<ROTATE_8).yxwz;v67 ^=vAB;v67=(v67>>ROTATE_24)|(v67<<ROTATE_8).yxwz;s0=v01+v45;v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;s1=v23+v67;v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;s0=v01+vec4(Z,m0);v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;s1=v23+vec4(m2,Z);v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;vCD ^=v01;vCD=(vCD>>ROTATE_16)|(vCD<<ROTATE_16).yxwz;vEF ^=v23;vEF=(vEF>>ROTATE_16)|(vEF<<ROTATE_16).yxwz;s0=v89+vCD;v89=s0+(vec4<u32>(s0<v89)&CARRY).yxwz;s1=vAB+vEF;vAB=s1+(vec4<u32>(s1<vAB)&CARRY).yxwz;v45 ^=v89;v45=(v45>>ROTATE_31).yxwz|(v45<<ROTATE_1);v67 ^=vAB;v67=(v67>>ROTATE_31).yxwz|(v67<<ROTATE_1);v56=vec4(v45.zw,v67.xy);v74=vec4(v67.zw,v45.xy);vFC=vec4(vEF.zw,vCD.xy);vDE=vec4(vCD.zw,vEF.xy);s0=v01+v56;v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;s1=v23+v74;v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;v01.z+=m3.x;v01.w+=m3.y+u32(v01.z<m3.x);vFC=(vFC ^ v01).yxwz;vDE=(vDE ^ v23).yxwz;s0=vAB+vFC;vAB=s0+(vec4<u32>(s0<vAB)&CARRY).yxwz;s1=v89+vDE;v89=s1+(vec4<u32>(s1<v89)&CARRY).yxwz;v56 ^=vAB;v56=(v56>>ROTATE_24)|(v56<<ROTATE_8).yxwz;v74 ^=v89;v74=(v74>>ROTATE_24)|(v74<<ROTATE_8).yxwz;s0=v01+v56;v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;s1=v23+v74;v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;v23+=vec4(m1,m4)+vec4(0u,u32(v23.x+vec4(m1,m4).x<v23.x),0u,u32(v23.z+vec4(m1,m4).z<v23.z));vFC ^=v01;vFC=(vFC>>ROTATE_16)|(vFC<<ROTATE_16).yxwz;vDE ^=v23;vDE=(vDE>>ROTATE_16)|(vDE<<ROTATE_16).yxwz;s0=vAB+vFC;vAB=s0+(vec4<u32>(s0<vAB)&CARRY).yxwz;s1=v89+vDE;v89=s1+(vec4<u32>(s1<v89)&CARRY).yxwz;v56 ^=vAB;v56=(v56>>ROTATE_31).yxwz|(v56<<ROTATE_1);v74 ^=v89;v74=(v74>>ROTATE_31).yxwz|(v74<<ROTATE_1);v45=vec4(v74.zw,v56.xy);v67=vec4(v56.zw,v74.xy);vCD=vec4(vFC.zw,vDE.xy);vEF=vec4(vDE.zw,vFC.xy);s0=v01+v45;v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;s1=v23+v67;v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;v01+=vec4(Z,m3)+vec4(Z,0u,u32(v01.z+vec4(Z,m3).z<v01.z));vCD=(vCD ^ v01).yxwz;vEF=(vEF ^ v23).yxwz;s0=v89+vCD;v89=s0+(vec4<u32>(s0<v89)&CARRY).yxwz;s1=vAB+vEF;vAB=s1+(vec4<u32>(s1<vAB)&CARRY).yxwz;v45 ^=v89;v45=(v45>>ROTATE_24)|(v45<<ROTATE_8).yxwz;v67 ^=vAB;v67=(v67>>ROTATE_24)|(v67<<ROTATE_8).yxwz;s0=v01+v45;v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;s1=v23+v67;v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;v01+=vec4(Z,m1)+vec4(Z,0u,u32(v01.z+vec4(Z,m1).z<v01.z));vCD ^=v01;vCD=(vCD>>ROTATE_16)|(vCD<<ROTATE_16).yxwz;vEF ^=v23;vEF=(vEF>>ROTATE_16)|(vEF<<ROTATE_16).yxwz;s0=v89+vCD;v89=s0+(vec4<u32>(s0<v89)&CARRY).yxwz;s1=vAB+vEF;vAB=s1+(vec4<u32>(s1<vAB)&CARRY).yxwz;v45 ^=v89;v45=(v45>>ROTATE_31).yxwz|(v45<<ROTATE_1);v67 ^=vAB;v67=(v67>>ROTATE_31).yxwz|(v67<<ROTATE_1);v56=vec4(v45.zw,v67.xy);v74=vec4(v67.zw,v45.xy);vFC=vec4(vEF.zw,vCD.xy);vDE=vec4(vCD.zw,vEF.xy);s0=v01+v56;v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;s1=v23+v74;v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;v01+=vec4(m2,Z)+vec4(0u,u32(v01.x+vec4(m2,Z).x<v01.x),Z);v23+=vec4(m4,Z)+vec4(0u,u32(v23.x+vec4(m4,Z).x<v23.x),Z);vFC=(vFC ^ v01).yxwz;vDE=(vDE ^ v23).yxwz;s0=vAB+vFC;vAB=s0+(vec4<u32>(s0<vAB)&CARRY).yxwz;s1=v89+vDE;v89=s1+(vec4<u32>(s1<v89)&CARRY).yxwz;v56 ^=vAB;v56=(v56>>ROTATE_24)|(v56<<ROTATE_8).yxwz;v74 ^=v89;v74=(v74>>ROTATE_24)|(v74<<ROTATE_8).yxwz;s0=v01+v56;v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;s1=v23+v74;v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;v23+=vec4(m0,Z)+vec4(0u,u32(v23.x+vec4(m0,Z).x<v23.x),Z);vFC ^=v01;vFC=(vFC>>ROTATE_16)|(vFC<<ROTATE_16).yxwz;vDE ^=v23;vDE=(vDE>>ROTATE_16)|(vDE<<ROTATE_16).yxwz;s0=vAB+vFC;vAB=s0+(vec4<u32>(s0<vAB)&CARRY).yxwz;s1=v89+vDE;v89=s1+(vec4<u32>(s1<v89)&CARRY).yxwz;v56 ^=vAB;v56=(v56>>ROTATE_31).yxwz|(v56<<ROTATE_1);v74 ^=v89;v74=(v74>>ROTATE_31).yxwz|(v74<<ROTATE_1);v45=vec4(v74.zw,v56.xy);v67=vec4(v56.zw,v74.xy);vCD=vec4(vFC.zw,vDE.xy);vEF=vec4(vDE.zw,vFC.xy);s0=v01+v45;v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;s1=v23+v67;v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;s1=v23+vec4(m2,Z);v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;vCD=(vCD ^ v01).yxwz;vEF=(vEF ^ v23).yxwz;s0=v89+vCD;v89=s0+(vec4<u32>(s0<v89)&CARRY).yxwz;s1=vAB+vEF;vAB=s1+(vec4<u32>(s1<vAB)&CARRY).yxwz;v45 ^=v89;v45=(v45>>ROTATE_24)|(v45<<ROTATE_8).yxwz;v67 ^=vAB;v67=(v67>>ROTATE_24)|(v67<<ROTATE_8).yxwz;s0=v01+v45;v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;s1=v23+v67;v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;v01+=vec4(m0,Z)+vec4(0u,u32(v01.x+vec4(m0,Z).x<v01.x),Z);v23+=vec4(m4,Z)+vec4(0u,u32(v23.x+vec4(m4,Z).x<v23.x),Z);vCD ^=v01;vCD=(vCD>>ROTATE_16)|(vCD<<ROTATE_16).yxwz;vEF ^=v23;vEF=(vEF>>ROTATE_16)|(vEF<<ROTATE_16).yxwz;s0=v89+vCD;v89=s0+(vec4<u32>(s0<v89)&CARRY).yxwz;s1=vAB+vEF;vAB=s1+(vec4<u32>(s1<vAB)&CARRY).yxwz;v45 ^=v89;v45=(v45>>ROTATE_31).yxwz|(v45<<ROTATE_1);v67 ^=vAB;v67=(v67>>ROTATE_31).yxwz|(v67<<ROTATE_1);v56=vec4(v45.zw,v67.xy);v74=vec4(v67.zw,v45.xy);vFC=vec4(vEF.zw,vCD.xy);vDE=vec4(vCD.zw,vEF.xy);s0=v01+v56;v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;s1=v23+v74;v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;s1=v23+vec4(Z,m3);v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;vFC=(vFC ^ v01).yxwz;vDE=(vDE ^ v23).yxwz;s0=vAB+vFC;vAB=s0+(vec4<u32>(s0<vAB)&CARRY).yxwz;s1=v89+vDE;v89=s1+(vec4<u32>(s1<v89)&CARRY).yxwz;v56 ^=vAB;v56=(v56>>ROTATE_24)|(v56<<ROTATE_8).yxwz;v74 ^=v89;v74=(v74>>ROTATE_24)|(v74<<ROTATE_8).yxwz;s0=v01+v56;v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;s1=v23+v74;v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;v01+=vec4(m1,Z)+vec4(0u,u32(v01.x+vec4(m1,Z).x<v01.x),Z);vFC ^=v01;vFC=(vFC>>ROTATE_16)|(vFC<<ROTATE_16).yxwz;vDE ^=v23;vDE=(vDE>>ROTATE_16)|(vDE<<ROTATE_16).yxwz;s0=vAB+vFC;vAB=s0+(vec4<u32>(s0<vAB)&CARRY).yxwz;s1=v89+vDE;v89=s1+(vec4<u32>(s1<v89)&CARRY).yxwz;v56 ^=vAB;v56=(v56>>ROTATE_31).yxwz|(v56<<ROTATE_1);v74 ^=v89;v74=(v74>>ROTATE_31).yxwz|(v74<<ROTATE_1);v45=vec4(v74.zw,v56.xy);v67=vec4(v56.zw,v74.xy);vCD=vec4(vFC.zw,vDE.xy);vEF=vec4(vDE.zw,vFC.xy);s0=v01+v45;v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;s1=v23+v67;v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;v01+=vec4(m2,Z)+vec4(0u,u32(v01.x+vec4(m2,Z).x<v01.x),Z);v23+=vec4(m0,Z)+vec4(0u,u32(v23.x+vec4(m0,Z).x<v23.x),Z);vCD=(vCD ^ v01).yxwz;vEF=(vEF ^ v23).yxwz;s0=v89+vCD;v89=s0+(vec4<u32>(s0<v89)&CARRY).yxwz;s1=vAB+vEF;vAB=s1+(vec4<u32>(s1<vAB)&CARRY).yxwz;v45 ^=v89;v45=(v45>>ROTATE_24)|(v45<<ROTATE_8).yxwz;v67 ^=vAB;v67=(v67>>ROTATE_24)|(v67<<ROTATE_8).yxwz;s0=v01+v45;v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;s1=v23+v67;v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;s1=v23+vec4(Z,m3);v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;vCD ^=v01;vCD=(vCD>>ROTATE_16)|(vCD<<ROTATE_16).yxwz;vEF ^=v23;vEF=(vEF>>ROTATE_16)|(vEF<<ROTATE_16).yxwz;s0=v89+vCD;v89=s0+(vec4<u32>(s0<v89)&CARRY).yxwz;s1=vAB+vEF;vAB=s1+(vec4<u32>(s1<vAB)&CARRY).yxwz;v45 ^=v89;v45=(v45>>ROTATE_31).yxwz|(v45<<ROTATE_1);v67 ^=vAB;v67=(v67>>ROTATE_31).yxwz|(v67<<ROTATE_1);v56=vec4(v45.zw,v67.xy);v74=vec4(v67.zw,v45.xy);vFC=vec4(vEF.zw,vCD.xy);vDE=vec4(vCD.zw,vEF.xy);s0=v01+v56;v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;s1=v23+v74;v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;v01+=vec4(m4,Z)+vec4(0u,u32(v01.x+vec4(m4,Z).x<v01.x),Z);v23+=vec4(Z,m1)+vec4(Z,0u,u32(v23.z+vec4(Z,m1).z<v23.z));vFC=(vFC ^ v01).yxwz;vDE=(vDE ^ v23).yxwz;s0=vAB+vFC;vAB=s0+(vec4<u32>(s0<vAB)&CARRY).yxwz;s1=v89+vDE;v89=s1+(vec4<u32>(s1<v89)&CARRY).yxwz;v56 ^=vAB;v56=(v56>>ROTATE_24)|(v56<<ROTATE_8).yxwz;v74 ^=v89;v74=(v74>>ROTATE_24)|(v74<<ROTATE_8).yxwz;s0=v01+v56;v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;s1=v23+v74;v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;vFC ^=v01;vFC=(vFC>>ROTATE_16)|(vFC<<ROTATE_16).yxwz;vDE ^=v23;vDE=(vDE>>ROTATE_16)|(vDE<<ROTATE_16).yxwz;s0=vAB+vFC;vAB=s0+(vec4<u32>(s0<vAB)&CARRY).yxwz;s1=v89+vDE;v89=s1+(vec4<u32>(s1<v89)&CARRY).yxwz;v56 ^=vAB;v56=(v56>>ROTATE_31).yxwz|(v56<<ROTATE_1);v74 ^=v89;v74=(v74>>ROTATE_31).yxwz|(v74<<ROTATE_1);v45=vec4(v74.zw,v56.xy);v67=vec4(v56.zw,v74.xy);vCD=vec4(vFC.zw,vDE.xy);vEF=vec4(vDE.zw,vFC.xy);s0=v01+v45;v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;s1=v23+v67;v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;v01+=vec4(Z,m1)+vec4(Z,0u,u32(v01.z+vec4(Z,m1).z<v01.z));v23+=vec4(Z,m4)+vec4(Z,0u,u32(v23.z+vec4(Z,m4).z<v23.z));vCD=(vCD ^ v01).yxwz;vEF=(vEF ^ v23).yxwz;s0=v89+vCD;v89=s0+(vec4<u32>(s0<v89)&CARRY).yxwz;s1=vAB+vEF;vAB=s1+(vec4<u32>(s1<vAB)&CARRY).yxwz;v45 ^=v89;v45=(v45>>ROTATE_24)|(v45<<ROTATE_8).yxwz;v67 ^=vAB;v67=(v67>>ROTATE_24)|(v67<<ROTATE_8).yxwz;s0=v01+v45;v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;s1=v23+v67;v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;vCD ^=v01;vCD=(vCD>>ROTATE_16)|(vCD<<ROTATE_16).yxwz;vEF ^=v23;vEF=(vEF>>ROTATE_16)|(vEF<<ROTATE_16).yxwz;s0=v89+vCD;v89=s0+(vec4<u32>(s0<v89)&CARRY).yxwz;s1=vAB+vEF;vAB=s1+(vec4<u32>(s1<vAB)&CARRY).yxwz;v45 ^=v89;v45=(v45>>ROTATE_31).yxwz|(v45<<ROTATE_1);v67 ^=vAB;v67=(v67>>ROTATE_31).yxwz|(v67<<ROTATE_1);v56=vec4(v45.zw,v67.xy);v74=vec4(v67.zw,v45.xy);vFC=vec4(vEF.zw,vCD.xy);vDE=vec4(vCD.zw,vEF.xy);s0=v01+v56;v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;s1=v23+v74;v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;v01+=vec4(m0,Z)+vec4(0u,u32(v01.x+vec4(m0,Z).x<v01.x),Z);vFC=(vFC ^ v01).yxwz;vDE=(vDE ^ v23).yxwz;s0=vAB+vFC;vAB=s0+(vec4<u32>(s0<vAB)&CARRY).yxwz;s1=v89+vDE;v89=s1+(vec4<u32>(s1<v89)&CARRY).yxwz;v56 ^=vAB;v56=(v56>>ROTATE_24)|(v56<<ROTATE_8).yxwz;v74 ^=v89;v74=(v74>>ROTATE_24)|(v74<<ROTATE_8).yxwz;s0=v01+v56;v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;s1=v23+v74;v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;v01+=vec4(Z,m3)+vec4(Z,0u,u32(v01.z+vec4(Z,m3).z<v01.z));s1=v23+vec4(m2,Z);v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;vFC ^=v01;vFC=(vFC>>ROTATE_16)|(vFC<<ROTATE_16).yxwz;vDE ^=v23;vDE=(vDE>>ROTATE_16)|(vDE<<ROTATE_16).yxwz;s0=vAB+vFC;vAB=s0+(vec4<u32>(s0<vAB)&CARRY).yxwz;s1=v89+vDE;v89=s1+(vec4<u32>(s1<v89)&CARRY).yxwz;v56 ^=vAB;v56=(v56>>ROTATE_31).yxwz|(v56<<ROTATE_1);v74 ^=v89;v74=(v74>>ROTATE_31).yxwz|(v74<<ROTATE_1);v45=vec4(v74.zw,v56.xy);v67=vec4(v56.zw,v74.xy);vCD=vec4(vFC.zw,vDE.xy);vEF=vec4(vDE.zw,vFC.xy);s0=v01+v45;v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;s1=v23+v67;v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;s1=v23+vec4(Z,m3);v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;vCD=(vCD ^ v01).yxwz;vEF=(vEF ^ v23).yxwz;s0=v89+vCD;v89=s0+(vec4<u32>(s0<v89)&CARRY).yxwz;s1=vAB+vEF;vAB=s1+(vec4<u32>(s1<vAB)&CARRY).yxwz;v45 ^=v89;v45=(v45>>ROTATE_24)|(v45<<ROTATE_8).yxwz;v67 ^=vAB;v67=(v67>>ROTATE_24)|(v67<<ROTATE_8).yxwz;s0=v01+v45;v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;s1=v23+v67;v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;v23+=vec4(m1,Z)+vec4(0u,u32(v23.x+vec4(m1,Z).x<v23.x),Z);vCD ^=v01;vCD=(vCD>>ROTATE_16)|(vCD<<ROTATE_16).yxwz;vEF ^=v23;vEF=(vEF>>ROTATE_16)|(vEF<<ROTATE_16).yxwz;s0=v89+vCD;v89=s0+(vec4<u32>(s0<v89)&CARRY).yxwz;s1=vAB+vEF;vAB=s1+(vec4<u32>(s1<vAB)&CARRY).yxwz;v45 ^=v89;v45=(v45>>ROTATE_31).yxwz|(v45<<ROTATE_1);v67 ^=vAB;v67=(v67>>ROTATE_31).yxwz|(v67<<ROTATE_1);v56=vec4(v45.zw,v67.xy);v74=vec4(v67.zw,v45.xy);vFC=vec4(vEF.zw,vCD.xy);vDE=vec4(vCD.zw,vEF.xy);s0=v01+v56;v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;s1=v23+v74;v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;v23+=vec4(Z,m2)+vec4(Z,0u,u32(v23.z+vec4(Z,m2).z<v23.z));vFC=(vFC ^ v01).yxwz;vDE=(vDE ^ v23).yxwz;s0=vAB+vFC;vAB=s0+(vec4<u32>(s0<vAB)&CARRY).yxwz;s1=v89+vDE;v89=s1+(vec4<u32>(s1<v89)&CARRY).yxwz;v56 ^=vAB;v56=(v56>>ROTATE_24)|(v56<<ROTATE_8).yxwz;v74 ^=v89;v74=(v74>>ROTATE_24)|(v74<<ROTATE_8).yxwz;s0=v01+v56;v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;s1=v23+v74;v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;v01+=vec4(m0,m4)+vec4(0u,u32(v01.x+vec4(m0,m4).x<v01.x),0u,u32(v01.z+vec4(m0,m4).z<v01.z));vFC ^=v01;vFC=(vFC>>ROTATE_16)|(vFC<<ROTATE_16).yxwz;vDE ^=v23;vDE=(vDE>>ROTATE_16)|(vDE<<ROTATE_16).yxwz;s0=vAB+vFC;vAB=s0+(vec4<u32>(s0<vAB)&CARRY).yxwz;s1=v89+vDE;v89=s1+(vec4<u32>(s1<v89)&CARRY).yxwz;v56 ^=vAB;v56=(v56>>ROTATE_31).yxwz|(v56<<ROTATE_1);v74 ^=v89;v74=(v74>>ROTATE_31).yxwz|(v74<<ROTATE_1);v45=vec4(v74.zw,v56.xy);v67=vec4(v56.zw,v74.xy);vCD=vec4(vFC.zw,vDE.xy);vEF=vec4(vDE.zw,vFC.xy);s0=v01+v45;v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;s1=v23+v67;v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;v23+=vec4(Z,m0);v23.w+=u32(v23.z<m0.x);vCD=(vCD ^ v01).yxwz;vEF=(vEF ^ v23).yxwz;s0=v89+vCD;v89=s0+(vec4<u32>(s0<v89)&CARRY).yxwz;s1=vAB+vEF;vAB=s1+(vec4<u32>(s1<vAB)&CARRY).yxwz;v45 ^=v89;v45=(v45>>ROTATE_24)|(v45<<ROTATE_8).yxwz;v67 ^=vAB;v67=(v67>>ROTATE_24)|(v67<<ROTATE_8).yxwz;s0=v01+v45;v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;s1=v23+v67;v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;v23+=vec4(m3,Z)+vec4(0u,u32(v23.x+vec4(m3,Z).x<v23.x),Z);vCD ^=v01;vCD=(vCD>>ROTATE_16)|(vCD<<ROTATE_16).yxwz;vEF ^=v23;vEF=(vEF>>ROTATE_16)|(vEF<<ROTATE_16).yxwz;s0=v89+vCD;v89=s0+(vec4<u32>(s0<v89)&CARRY).yxwz;s1=vAB+vEF;vAB=s1+(vec4<u32>(s1<vAB)&CARRY).yxwz;v45 ^=v89;v45=(v45>>ROTATE_31).yxwz|(v45<<ROTATE_1);v67 ^=vAB;v67=(v67>>ROTATE_31).yxwz|(v67<<ROTATE_1);v56=vec4(v45.zw,v67.xy);v74=vec4(v67.zw,v45.xy);vFC=vec4(vEF.zw,vCD.xy);vDE=vec4(vCD.zw,vEF.xy);s0=v01+v56;v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;s1=v23+v74;v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;v23+=vec4(m1,Z)+vec4(0u,u32(v23.x+vec4(m1,Z).x<v23.x),Z);vFC=(vFC ^ v01).yxwz;vDE=(vDE ^ v23).yxwz;s0=vAB+vFC;vAB=s0+(vec4<u32>(s0<vAB)&CARRY).yxwz;s1=v89+vDE;v89=s1+(vec4<u32>(s1<v89)&CARRY).yxwz;v56 ^=vAB;v56=(v56>>ROTATE_24)|(v56<<ROTATE_8).yxwz;v74 ^=v89;v74=(v74>>ROTATE_24)|(v74<<ROTATE_8).yxwz;s0=v01+v56;v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;s1=v23+v74;v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;v01+=vec4(m2,Z)+vec4(0u,u32(v01.x+vec4(m2,Z).x<v01.x),Z);v23+=vec4(m4,Z)+vec4(0u,u32(v23.x+vec4(m4,Z).x<v23.x),Z);vFC ^=v01;vFC=(vFC>>ROTATE_16)|(vFC<<ROTATE_16).yxwz;vDE ^=v23;vDE=(vDE>>ROTATE_16)|(vDE<<ROTATE_16).yxwz;s0=vAB+vFC;vAB=s0+(vec4<u32>(s0<vAB)&CARRY).yxwz;s1=v89+vDE;v89=s1+(vec4<u32>(s1<v89)&CARRY).yxwz;v56 ^=vAB;v56=(v56>>ROTATE_31).yxwz|(v56<<ROTATE_1);v74 ^=v89;v74=(v74>>ROTATE_31).yxwz|(v74<<ROTATE_1);v45=vec4(v74.zw,v56.xy);v67=vec4(v56.zw,v74.xy);vCD=vec4(vFC.zw,vDE.xy);vEF=vec4(vDE.zw,vFC.xy);s0=v01+v45;v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;s1=v23+v67;v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;v23+=vec4(Z,m1);v23.w+=u32(v23.z<m1.x);vCD=(vCD ^ v01).yxwz;vEF=(vEF ^ v23).yxwz;s0=v89+vCD;v89=s0+(vec4<u32>(s0<v89)&CARRY).yxwz;s1=vAB+vEF;vAB=s1+(vec4<u32>(s1<vAB)&CARRY).yxwz;v45 ^=v89;v45=(v45>>ROTATE_24)|(v45<<ROTATE_8).yxwz;v67 ^=vAB;v67=(v67>>ROTATE_24)|(v67<<ROTATE_8).yxwz;s0=v01+v45;v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;s1=v23+v67;v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;s0=v01+vec4(m2,m4);v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;vCD ^=v01;vCD=(vCD>>ROTATE_16)|(vCD<<ROTATE_16).yxwz;vEF ^=v23;vEF=(vEF>>ROTATE_16)|(vEF<<ROTATE_16).yxwz;s0=v89+vCD;v89=s0+(vec4<u32>(s0<v89)&CARRY).yxwz;s1=vAB+vEF;vAB=s1+(vec4<u32>(s1<vAB)&CARRY).yxwz;v45 ^=v89;v45=(v45>>ROTATE_31).yxwz|(v45<<ROTATE_1);v67 ^=vAB;v67=(v67>>ROTATE_31).yxwz|(v67<<ROTATE_1);v56=vec4(v45.zw,v67.xy);v74=vec4(v67.zw,v45.xy);vFC=vec4(vEF.zw,vCD.xy);vDE=vec4(vCD.zw,vEF.xy);s0=v01+v56;v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;s1=v23+v74;v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;v23+=vec4(m3,Z);v23.y+=u32(v23.x<m3.x);vFC=(vFC ^ v01).yxwz;vDE=(vDE ^ v23).yxwz;s0=vAB+vFC;vAB=s0+(vec4<u32>(s0<vAB)&CARRY).yxwz;s1=v89+vDE;v89=s1+(vec4<u32>(s1<v89)&CARRY).yxwz;v56 ^=vAB;v56=(v56>>ROTATE_24)|(v56<<ROTATE_8).yxwz;v74 ^=v89;v74=(v74>>ROTATE_24)|(v74<<ROTATE_8).yxwz;s0=v01+v56;v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;s1=v23+v74;v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;v23+=vec4(Z,m0);v23.w+=u32(v23.z<m0.x);vFC ^=v01;vFC=(vFC>>ROTATE_16)|(vFC<<ROTATE_16).yxwz;vDE ^=v23;vDE=(vDE>>ROTATE_16)|(vDE<<ROTATE_16).yxwz;s0=vAB+vFC;vAB=s0+(vec4<u32>(s0<vAB)&CARRY).yxwz;s1=v89+vDE;v89=s1+(vec4<u32>(s1<v89)&CARRY).yxwz;v56 ^=vAB;v56=(v56>>ROTATE_31).yxwz|(v56<<ROTATE_1);v74 ^=v89;v74=(v74>>ROTATE_31).yxwz|(v74<<ROTATE_1);v45=vec4(v74.zw,v56.xy);v67=vec4(v56.zw,v74.xy);vCD=vec4(vFC.zw,vDE.xy);vEF=vec4(vDE.zw,vFC.xy);s0=v01+v45;v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;s1=v23+v67;v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;s0=v01+vec4(m0,m2);v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;v23+=vec4(m4,Z);v23.y+=u32(v23.x<m4.x);vCD=(vCD ^ v01).yxwz;vEF=(vEF ^ v23).yxwz;s0=v89+vCD;v89=s0+(vec4<u32>(s0<v89)&CARRY).yxwz;s1=vAB+vEF;vAB=s1+(vec4<u32>(s1<vAB)&CARRY).yxwz;v45 ^=v89;v45=(v45>>ROTATE_24)|(v45<<ROTATE_8).yxwz;v67 ^=vAB;v67=(v67>>ROTATE_24)|(v67<<ROTATE_8).yxwz;s0=v01+v45;v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;s1=v23+v67;v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;s0=v01+vec4(m1,m3);v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;vCD ^=v01;vCD=(vCD>>ROTATE_16)|(vCD<<ROTATE_16).yxwz;vEF ^=v23;vEF=(vEF>>ROTATE_16)|(vEF<<ROTATE_16).yxwz;s0=v89+vCD;v89=s0+(vec4<u32>(s0<v89)&CARRY).yxwz;s1=vAB+vEF;vAB=s1+(vec4<u32>(s1<vAB)&CARRY).yxwz;v45 ^=v89;v45=(v45>>ROTATE_31).yxwz|(v45<<ROTATE_1);v67 ^=vAB;v67=(v67>>ROTATE_31).yxwz|(v67<<ROTATE_1);v56=vec4(v45.zw,v67.xy);v74=vec4(v67.zw,v45.xy);vFC=vec4(vEF.zw,vCD.xy);vDE=vec4(vCD.zw,vEF.xy);s0=v01+v56;v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;s1=v23+v74;v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;vFC=(vFC ^ v01).yxwz;vDE=(vDE ^ v23).yxwz;s0=vAB+vFC;vAB=s0+(vec4<u32>(s0<vAB)&CARRY).yxwz;s1=v89+vDE;v89=s1+(vec4<u32>(s1<v89)&CARRY).yxwz;v56 ^=vAB;v56=(v56>>ROTATE_24)|(v56<<ROTATE_8).yxwz;v74 ^=v89;v74=(v74>>ROTATE_24)|(v74<<ROTATE_8).yxwz;s0=v01+v56;v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;s1=v23+v74;v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;vFC ^=v01;vFC=(vFC>>ROTATE_16)|(vFC<<ROTATE_16).yxwz;vDE ^=v23;vDE=(vDE>>ROTATE_16)|(vDE<<ROTATE_16).yxwz;s0=vAB+vFC;vAB=s0+(vec4<u32>(s0<vAB)&CARRY).yxwz;s1=v89+vDE;v89=s1+(vec4<u32>(s1<v89)&CARRY).yxwz;v56 ^=vAB;v56=(v56>>ROTATE_31).yxwz|(v56<<ROTATE_1);v74 ^=v89;v74=(v74>>ROTATE_31).yxwz|(v74<<ROTATE_1);v45=vec4(v74.zw,v56.xy);v67=vec4(v56.zw,v74.xy);vCD=vec4(vFC.zw,vDE.xy);vEF=vec4(vDE.zw,vFC.xy);s0=v01+v45;v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;s1=v23+v67;v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;v01+=vec4(Z,m4);v01.w+=u32(v01.z<m4.x);vCD=(vCD ^ v01).yxwz;vEF=(vEF ^ v23).yxwz;s0=v89+vCD;v89=s0+(vec4<u32>(s0<v89)&CARRY).yxwz;s1=vAB+vEF;vAB=s1+(vec4<u32>(s1<vAB)&CARRY).yxwz;v45 ^=v89;v45=(v45>>ROTATE_24)|(v45<<ROTATE_8).yxwz;v67 ^=vAB;v67=(v67>>ROTATE_24)|(v67<<ROTATE_8).yxwz;s0=v01+v45;v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;s1=v23+v67;v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;vCD ^=v01;vCD=(vCD>>ROTATE_16)|(vCD<<ROTATE_16).yxwz;vEF ^=v23;vEF=(vEF>>ROTATE_16)|(vEF<<ROTATE_16).yxwz;s0=v89+vCD;v89=s0+(vec4<u32>(s0<v89)&CARRY).yxwz;s1=vAB+vEF;vAB=s1+(vec4<u32>(s1<vAB)&CARRY).yxwz;v45 ^=v89;v45=(v45>>ROTATE_31).yxwz|(v45<<ROTATE_1);v67 ^=vAB;v67=(v67>>ROTATE_31).yxwz|(v67<<ROTATE_1);v56=vec4(v45.zw,v67.xy);v74=vec4(v67.zw,v45.xy);vFC=vec4(vEF.zw,vCD.xy);vDE=vec4(vCD.zw,vEF.xy);s0=v01+v56;v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;s1=v23+v74;v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;s0=v01+vec4(m1,m0);v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;vFC=(vFC ^ v01).yxwz;vDE=(vDE ^ v23).yxwz;s0=vAB+vFC;vAB=s0+(vec4<u32>(s0<vAB)&CARRY).yxwz;s1=v89+vDE;v89=s1+(vec4<u32>(s1<v89)&CARRY).yxwz;v56 ^=vAB;v56=(v56>>ROTATE_24)|(v56<<ROTATE_8).yxwz;v74 ^=v89;v74=(v74>>ROTATE_24)|(v74<<ROTATE_8).yxwz;s0=v01+v56;v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;s1=v23+v74;v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;v23+=vec4(Z,m3);v23.w+=u32(v23.z<m3.x);vDE ^=v23;vDE=(vDE>>ROTATE_16)|(vDE<<ROTATE_16).yxwz;s1=v89+vDE;v89=s1+(vec4<u32>(s1<v89)&CARRY).yxwz;var result=BLAKE2B_INIT[0u]^ v01.xy ^ v89.xy;if(validate||((result.y>ubo.threshold.y||(result.y==ubo.threshold.y&&result.y>=ubo.threshold.y))&&atomicLoad(&work.found)==0u)){atomicStore(&work.found,1u);work.nonce=m0;work.result=result;}return;}`;
|
|
508
|
+
struct UBO{blockhash:array<vec4<u32>,2>,seed:vec2<u32>,difficulty:vec2<u32>};@group(0)@binding(0)var<uniform> ubo:UBO;struct WORK{found:atomic<u32>,nonce:vec2<u32>,result:vec2<u32>};@group(0)@binding(1)var<storage,read_write>work:WORK;const BLAKE2B_IV=array<vec2<u32>,8>(vec2<u32>(0xF3BCC908u,0x6A09E667u),vec2<u32>(0x84CAA73Bu,0xBB67AE85u),vec2<u32>(0xFE94F82Bu,0x3C6EF372u),vec2<u32>(0x5F1D36F1u,0xA54FF53Au),vec2<u32>(0xADE682D1u,0x510E527Fu),vec2<u32>(0x2B3E6C1Fu,0x9B05688Cu),vec2<u32>(0xFB41BD6Bu,0x1F83D9ABu),vec2<u32>(0x137E2179u,0x5BE0CD19u));const BLAKE2B_PARAM=vec2<u32>(0x01010008u,0u);const BLAKE2B_INLEN=vec2<u32>(0x00000028u,0u);const BLAKE2B_FINAL=vec2<u32>(0xFFFFFFFFu,0xFFFFFFFFu);const BLAKE2B_INIT=array<vec2<u32>,16>(BLAKE2B_IV[0u]^ BLAKE2B_PARAM,BLAKE2B_IV[1u],BLAKE2B_IV[2u],BLAKE2B_IV[3u],BLAKE2B_IV[4u],BLAKE2B_IV[5u],BLAKE2B_IV[6u],BLAKE2B_IV[7u],BLAKE2B_IV[0u],BLAKE2B_IV[1u],BLAKE2B_IV[2u],BLAKE2B_IV[3u],BLAKE2B_IV[4u]^ BLAKE2B_INLEN,BLAKE2B_IV[5u],BLAKE2B_IV[6u]^ BLAKE2B_FINAL,BLAKE2B_IV[7u]);const Z=vec2(0u);const CARRY=vec4(1u,0u,1u,0u);const ROTATE_1=vec4(1u);const ROTATE_8=vec4(8u);const ROTATE_16=vec4(16u);const ROTATE_24=vec4(24u);const ROTATE_31=vec4(31u);var<workgroup> found:bool;@compute @workgroup_size(32)fn search(@builtin(global_invocation_id)global_id:vec3<u32>,@builtin(local_invocation_id)local_id:vec3<u32>){found=(local_id.x==0u&&atomicLoad(&work.found)!=0u);workgroupBarrier();if(found){return;}main(global_id,false);}@compute @workgroup_size(1)fn validate(@builtin(global_invocation_id)global_id:vec3<u32>){main(global_id,true);}fn main(id:vec3<u32>,validate:bool){let m0:vec2<u32>=ubo.seed ^ id.xy;let m1:vec2<u32>=ubo.blockhash[0u].xy;let m2:vec2<u32>=ubo.blockhash[0u].zw;let m3:vec2<u32>=ubo.blockhash[1u].xy;let m4:vec2<u32>=ubo.blockhash[1u].zw;var v01:vec4<u32>=vec4<u32>(BLAKE2B_INIT[0u],BLAKE2B_INIT[1u]);var v23:vec4<u32>=vec4<u32>(BLAKE2B_INIT[2u],BLAKE2B_INIT[3u]);var v45:vec4<u32>=vec4<u32>(BLAKE2B_INIT[4u],BLAKE2B_INIT[5u]);var v67:vec4<u32>=vec4<u32>(BLAKE2B_INIT[6u],BLAKE2B_INIT[7u]);var v89:vec4<u32>=vec4<u32>(BLAKE2B_INIT[8u],BLAKE2B_INIT[9u]);var vAB:vec4<u32>=vec4<u32>(BLAKE2B_INIT[10u],BLAKE2B_INIT[11u]);var vCD:vec4<u32>=vec4<u32>(BLAKE2B_INIT[12u],BLAKE2B_INIT[13u]);var vEF:vec4<u32>=vec4<u32>(BLAKE2B_INIT[14u],BLAKE2B_INIT[15u]);var v56:vec4<u32>;var vFC:vec4<u32>;var v74:vec4<u32>;var vDE:vec4<u32>;var s0:vec4<u32>;var s1:vec4<u32>;s0=v01+v45;v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;s1=v23+v67;v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;s0=v01+vec4(m0,m2);v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;v23+=vec4(m4,Z);v23.y+=u32(v23.x<m4.x);vCD=(vCD ^ v01).yxwz;vEF=(vEF ^ v23).yxwz;s0=v89+vCD;v89=s0+(vec4<u32>(s0<v89)&CARRY).yxwz;s1=vAB+vEF;vAB=s1+(vec4<u32>(s1<vAB)&CARRY).yxwz;v45 ^=v89;v45=(v45>>ROTATE_24)|(v45<<ROTATE_8).yxwz;v67 ^=vAB;v67=(v67>>ROTATE_24)|(v67<<ROTATE_8).yxwz;s0=v01+v45;v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;s1=v23+v67;v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;s0=v01+vec4(m1,m3);v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;vCD ^=v01;vCD=(vCD>>ROTATE_16)|(vCD<<ROTATE_16).yxwz;vEF ^=v23;vEF=(vEF>>ROTATE_16)|(vEF<<ROTATE_16).yxwz;s0=v89+vCD;v89=s0+(vec4<u32>(s0<v89)&CARRY).yxwz;s1=vAB+vEF;vAB=s1+(vec4<u32>(s1<vAB)&CARRY).yxwz;v45 ^=v89;v45=(v45>>ROTATE_31).yxwz|(v45<<ROTATE_1);v67 ^=vAB;v67=(v67>>ROTATE_31).yxwz|(v67<<ROTATE_1);v56=vec4(v45.zw,v67.xy);v74=vec4(v67.zw,v45.xy);vFC=vec4(vEF.zw,vCD.xy);vDE=vec4(vCD.zw,vEF.xy);s0=v01+v56;v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;s1=v23+v74;v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;vFC=(vFC ^ v01).yxwz;vDE=(vDE ^ v23).yxwz;s0=vAB+vFC;vAB=s0+(vec4<u32>(s0<vAB)&CARRY).yxwz;s1=v89+vDE;v89=s1+(vec4<u32>(s1<v89)&CARRY).yxwz;v56 ^=vAB;v56=(v56>>ROTATE_24)|(v56<<ROTATE_8).yxwz;v74 ^=v89;v74=(v74>>ROTATE_24)|(v74<<ROTATE_8).yxwz;s0=v01+v56;v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;s1=v23+v74;v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;vFC ^=v01;vFC=(vFC>>ROTATE_16)|(vFC<<ROTATE_16).yxwz;vDE ^=v23;vDE=(vDE>>ROTATE_16)|(vDE<<ROTATE_16).yxwz;s0=vAB+vFC;vAB=s0+(vec4<u32>(s0<vAB)&CARRY).yxwz;s1=v89+vDE;v89=s1+(vec4<u32>(s1<v89)&CARRY).yxwz;v56 ^=vAB;v56=(v56>>ROTATE_31).yxwz|(v56<<ROTATE_1);v74 ^=v89;v74=(v74>>ROTATE_31).yxwz|(v74<<ROTATE_1);v45=vec4(v74.zw,v56.xy);v67=vec4(v56.zw,v74.xy);vCD=vec4(vFC.zw,vDE.xy);vEF=vec4(vDE.zw,vFC.xy);s0=v01+v45;v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;s1=v23+v67;v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;v01+=vec4(Z,m4);v01.w+=u32(v01.z<m4.x);vCD=(vCD ^ v01).yxwz;vEF=(vEF ^ v23).yxwz;s0=v89+vCD;v89=s0+(vec4<u32>(s0<v89)&CARRY).yxwz;s1=vAB+vEF;vAB=s1+(vec4<u32>(s1<vAB)&CARRY).yxwz;v45 ^=v89;v45=(v45>>ROTATE_24)|(v45<<ROTATE_8).yxwz;v67 ^=vAB;v67=(v67>>ROTATE_24)|(v67<<ROTATE_8).yxwz;s0=v01+v45;v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;s1=v23+v67;v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;vCD ^=v01;vCD=(vCD>>ROTATE_16)|(vCD<<ROTATE_16).yxwz;vEF ^=v23;vEF=(vEF>>ROTATE_16)|(vEF<<ROTATE_16).yxwz;s0=v89+vCD;v89=s0+(vec4<u32>(s0<v89)&CARRY).yxwz;s1=vAB+vEF;vAB=s1+(vec4<u32>(s1<vAB)&CARRY).yxwz;v45 ^=v89;v45=(v45>>ROTATE_31).yxwz|(v45<<ROTATE_1);v67 ^=vAB;v67=(v67>>ROTATE_31).yxwz|(v67<<ROTATE_1);v56=vec4(v45.zw,v67.xy);v74=vec4(v67.zw,v45.xy);vFC=vec4(vEF.zw,vCD.xy);vDE=vec4(vCD.zw,vEF.xy);s0=v01+v56;v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;s1=v23+v74;v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;s0=v01+vec4(m1,m0);v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;vFC=(vFC ^ v01).yxwz;vDE=(vDE ^ v23).yxwz;s0=vAB+vFC;vAB=s0+(vec4<u32>(s0<vAB)&CARRY).yxwz;s1=v89+vDE;v89=s1+(vec4<u32>(s1<v89)&CARRY).yxwz;v56 ^=vAB;v56=(v56>>ROTATE_24)|(v56<<ROTATE_8).yxwz;v74 ^=v89;v74=(v74>>ROTATE_24)|(v74<<ROTATE_8).yxwz;s0=v01+v56;v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;s1=v23+v74;v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;v01+=vec4(Z,m2);v01.w+=u32(v01.z<m2.x);v23+=vec4(Z,m3);v23.w+=u32(v23.z<m3.x);vFC ^=v01;vFC=(vFC>>ROTATE_16)|(vFC<<ROTATE_16).yxwz;vDE ^=v23;vDE=(vDE>>ROTATE_16)|(vDE<<ROTATE_16).yxwz;s0=vAB+vFC;vAB=s0+(vec4<u32>(s0<vAB)&CARRY).yxwz;s1=v89+vDE;v89=s1+(vec4<u32>(s1<v89)&CARRY).yxwz;v56 ^=vAB;v56=(v56>>ROTATE_31).yxwz|(v56<<ROTATE_1);v74 ^=v89;v74=(v74>>ROTATE_31).yxwz|(v74<<ROTATE_1);v45=vec4(v74.zw,v56.xy);v67=vec4(v56.zw,v74.xy);vCD=vec4(vFC.zw,vDE.xy);vEF=vec4(vDE.zw,vFC.xy);s0=v01+v45;v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;s1=v23+v67;v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;vCD=(vCD ^ v01).yxwz;vEF=(vEF ^ v23).yxwz;s0=v89+vCD;v89=s0+(vec4<u32>(s0<v89)&CARRY).yxwz;s1=vAB+vEF;vAB=s1+(vec4<u32>(s1<vAB)&CARRY).yxwz;v45 ^=v89;v45=(v45>>ROTATE_24)|(v45<<ROTATE_8).yxwz;v67 ^=vAB;v67=(v67>>ROTATE_24)|(v67<<ROTATE_8).yxwz;s0=v01+v45;v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;s1=v23+v67;v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;s0=v01+vec4(Z,m0);v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;s1=v23+vec4(m2,Z);v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;vCD ^=v01;vCD=(vCD>>ROTATE_16)|(vCD<<ROTATE_16).yxwz;vEF ^=v23;vEF=(vEF>>ROTATE_16)|(vEF<<ROTATE_16).yxwz;s0=v89+vCD;v89=s0+(vec4<u32>(s0<v89)&CARRY).yxwz;s1=vAB+vEF;vAB=s1+(vec4<u32>(s1<vAB)&CARRY).yxwz;v45 ^=v89;v45=(v45>>ROTATE_31).yxwz|(v45<<ROTATE_1);v67 ^=vAB;v67=(v67>>ROTATE_31).yxwz|(v67<<ROTATE_1);v56=vec4(v45.zw,v67.xy);v74=vec4(v67.zw,v45.xy);vFC=vec4(vEF.zw,vCD.xy);vDE=vec4(vCD.zw,vEF.xy);s0=v01+v56;v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;s1=v23+v74;v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;v01.z+=m3.x;v01.w+=m3.y+u32(v01.z<m3.x);vFC=(vFC ^ v01).yxwz;vDE=(vDE ^ v23).yxwz;s0=vAB+vFC;vAB=s0+(vec4<u32>(s0<vAB)&CARRY).yxwz;s1=v89+vDE;v89=s1+(vec4<u32>(s1<v89)&CARRY).yxwz;v56 ^=vAB;v56=(v56>>ROTATE_24)|(v56<<ROTATE_8).yxwz;v74 ^=v89;v74=(v74>>ROTATE_24)|(v74<<ROTATE_8).yxwz;s0=v01+v56;v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;s1=v23+v74;v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;v23+=vec4(m1,m4)+vec4(0u,u32(v23.x+vec4(m1,m4).x<v23.x),0u,u32(v23.z+vec4(m1,m4).z<v23.z));vFC ^=v01;vFC=(vFC>>ROTATE_16)|(vFC<<ROTATE_16).yxwz;vDE ^=v23;vDE=(vDE>>ROTATE_16)|(vDE<<ROTATE_16).yxwz;s0=vAB+vFC;vAB=s0+(vec4<u32>(s0<vAB)&CARRY).yxwz;s1=v89+vDE;v89=s1+(vec4<u32>(s1<v89)&CARRY).yxwz;v56 ^=vAB;v56=(v56>>ROTATE_31).yxwz|(v56<<ROTATE_1);v74 ^=v89;v74=(v74>>ROTATE_31).yxwz|(v74<<ROTATE_1);v45=vec4(v74.zw,v56.xy);v67=vec4(v56.zw,v74.xy);vCD=vec4(vFC.zw,vDE.xy);vEF=vec4(vDE.zw,vFC.xy);s0=v01+v45;v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;s1=v23+v67;v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;v01+=vec4(Z,m3)+vec4(Z,0u,u32(v01.z+vec4(Z,m3).z<v01.z));vCD=(vCD ^ v01).yxwz;vEF=(vEF ^ v23).yxwz;s0=v89+vCD;v89=s0+(vec4<u32>(s0<v89)&CARRY).yxwz;s1=vAB+vEF;vAB=s1+(vec4<u32>(s1<vAB)&CARRY).yxwz;v45 ^=v89;v45=(v45>>ROTATE_24)|(v45<<ROTATE_8).yxwz;v67 ^=vAB;v67=(v67>>ROTATE_24)|(v67<<ROTATE_8).yxwz;s0=v01+v45;v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;s1=v23+v67;v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;v01+=vec4(Z,m1)+vec4(Z,0u,u32(v01.z+vec4(Z,m1).z<v01.z));vCD ^=v01;vCD=(vCD>>ROTATE_16)|(vCD<<ROTATE_16).yxwz;vEF ^=v23;vEF=(vEF>>ROTATE_16)|(vEF<<ROTATE_16).yxwz;s0=v89+vCD;v89=s0+(vec4<u32>(s0<v89)&CARRY).yxwz;s1=vAB+vEF;vAB=s1+(vec4<u32>(s1<vAB)&CARRY).yxwz;v45 ^=v89;v45=(v45>>ROTATE_31).yxwz|(v45<<ROTATE_1);v67 ^=vAB;v67=(v67>>ROTATE_31).yxwz|(v67<<ROTATE_1);v56=vec4(v45.zw,v67.xy);v74=vec4(v67.zw,v45.xy);vFC=vec4(vEF.zw,vCD.xy);vDE=vec4(vCD.zw,vEF.xy);s0=v01+v56;v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;s1=v23+v74;v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;v01+=vec4(m2,Z)+vec4(0u,u32(v01.x+vec4(m2,Z).x<v01.x),Z);v23+=vec4(m4,Z)+vec4(0u,u32(v23.x+vec4(m4,Z).x<v23.x),Z);vFC=(vFC ^ v01).yxwz;vDE=(vDE ^ v23).yxwz;s0=vAB+vFC;vAB=s0+(vec4<u32>(s0<vAB)&CARRY).yxwz;s1=v89+vDE;v89=s1+(vec4<u32>(s1<v89)&CARRY).yxwz;v56 ^=vAB;v56=(v56>>ROTATE_24)|(v56<<ROTATE_8).yxwz;v74 ^=v89;v74=(v74>>ROTATE_24)|(v74<<ROTATE_8).yxwz;s0=v01+v56;v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;s1=v23+v74;v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;v23+=vec4(m0,Z)+vec4(0u,u32(v23.x+vec4(m0,Z).x<v23.x),Z);vFC ^=v01;vFC=(vFC>>ROTATE_16)|(vFC<<ROTATE_16).yxwz;vDE ^=v23;vDE=(vDE>>ROTATE_16)|(vDE<<ROTATE_16).yxwz;s0=vAB+vFC;vAB=s0+(vec4<u32>(s0<vAB)&CARRY).yxwz;s1=v89+vDE;v89=s1+(vec4<u32>(s1<v89)&CARRY).yxwz;v56 ^=vAB;v56=(v56>>ROTATE_31).yxwz|(v56<<ROTATE_1);v74 ^=v89;v74=(v74>>ROTATE_31).yxwz|(v74<<ROTATE_1);v45=vec4(v74.zw,v56.xy);v67=vec4(v56.zw,v74.xy);vCD=vec4(vFC.zw,vDE.xy);vEF=vec4(vDE.zw,vFC.xy);s0=v01+v45;v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;s1=v23+v67;v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;s1=v23+vec4(m2,Z);v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;vCD=(vCD ^ v01).yxwz;vEF=(vEF ^ v23).yxwz;s0=v89+vCD;v89=s0+(vec4<u32>(s0<v89)&CARRY).yxwz;s1=vAB+vEF;vAB=s1+(vec4<u32>(s1<vAB)&CARRY).yxwz;v45 ^=v89;v45=(v45>>ROTATE_24)|(v45<<ROTATE_8).yxwz;v67 ^=vAB;v67=(v67>>ROTATE_24)|(v67<<ROTATE_8).yxwz;s0=v01+v45;v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;s1=v23+v67;v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;v01+=vec4(m0,Z)+vec4(0u,u32(v01.x+vec4(m0,Z).x<v01.x),Z);v23+=vec4(m4,Z)+vec4(0u,u32(v23.x+vec4(m4,Z).x<v23.x),Z);vCD ^=v01;vCD=(vCD>>ROTATE_16)|(vCD<<ROTATE_16).yxwz;vEF ^=v23;vEF=(vEF>>ROTATE_16)|(vEF<<ROTATE_16).yxwz;s0=v89+vCD;v89=s0+(vec4<u32>(s0<v89)&CARRY).yxwz;s1=vAB+vEF;vAB=s1+(vec4<u32>(s1<vAB)&CARRY).yxwz;v45 ^=v89;v45=(v45>>ROTATE_31).yxwz|(v45<<ROTATE_1);v67 ^=vAB;v67=(v67>>ROTATE_31).yxwz|(v67<<ROTATE_1);v56=vec4(v45.zw,v67.xy);v74=vec4(v67.zw,v45.xy);vFC=vec4(vEF.zw,vCD.xy);vDE=vec4(vCD.zw,vEF.xy);s0=v01+v56;v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;s1=v23+v74;v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;s1=v23+vec4(Z,m3);v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;vFC=(vFC ^ v01).yxwz;vDE=(vDE ^ v23).yxwz;s0=vAB+vFC;vAB=s0+(vec4<u32>(s0<vAB)&CARRY).yxwz;s1=v89+vDE;v89=s1+(vec4<u32>(s1<v89)&CARRY).yxwz;v56 ^=vAB;v56=(v56>>ROTATE_24)|(v56<<ROTATE_8).yxwz;v74 ^=v89;v74=(v74>>ROTATE_24)|(v74<<ROTATE_8).yxwz;s0=v01+v56;v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;s1=v23+v74;v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;v01+=vec4(m1,Z)+vec4(0u,u32(v01.x+vec4(m1,Z).x<v01.x),Z);vFC ^=v01;vFC=(vFC>>ROTATE_16)|(vFC<<ROTATE_16).yxwz;vDE ^=v23;vDE=(vDE>>ROTATE_16)|(vDE<<ROTATE_16).yxwz;s0=vAB+vFC;vAB=s0+(vec4<u32>(s0<vAB)&CARRY).yxwz;s1=v89+vDE;v89=s1+(vec4<u32>(s1<v89)&CARRY).yxwz;v56 ^=vAB;v56=(v56>>ROTATE_31).yxwz|(v56<<ROTATE_1);v74 ^=v89;v74=(v74>>ROTATE_31).yxwz|(v74<<ROTATE_1);v45=vec4(v74.zw,v56.xy);v67=vec4(v56.zw,v74.xy);vCD=vec4(vFC.zw,vDE.xy);vEF=vec4(vDE.zw,vFC.xy);s0=v01+v45;v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;s1=v23+v67;v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;v01+=vec4(m2,Z)+vec4(0u,u32(v01.x+vec4(m2,Z).x<v01.x),Z);v23+=vec4(m0,Z)+vec4(0u,u32(v23.x+vec4(m0,Z).x<v23.x),Z);vCD=(vCD ^ v01).yxwz;vEF=(vEF ^ v23).yxwz;s0=v89+vCD;v89=s0+(vec4<u32>(s0<v89)&CARRY).yxwz;s1=vAB+vEF;vAB=s1+(vec4<u32>(s1<vAB)&CARRY).yxwz;v45 ^=v89;v45=(v45>>ROTATE_24)|(v45<<ROTATE_8).yxwz;v67 ^=vAB;v67=(v67>>ROTATE_24)|(v67<<ROTATE_8).yxwz;s0=v01+v45;v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;s1=v23+v67;v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;s1=v23+vec4(Z,m3);v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;vCD ^=v01;vCD=(vCD>>ROTATE_16)|(vCD<<ROTATE_16).yxwz;vEF ^=v23;vEF=(vEF>>ROTATE_16)|(vEF<<ROTATE_16).yxwz;s0=v89+vCD;v89=s0+(vec4<u32>(s0<v89)&CARRY).yxwz;s1=vAB+vEF;vAB=s1+(vec4<u32>(s1<vAB)&CARRY).yxwz;v45 ^=v89;v45=(v45>>ROTATE_31).yxwz|(v45<<ROTATE_1);v67 ^=vAB;v67=(v67>>ROTATE_31).yxwz|(v67<<ROTATE_1);v56=vec4(v45.zw,v67.xy);v74=vec4(v67.zw,v45.xy);vFC=vec4(vEF.zw,vCD.xy);vDE=vec4(vCD.zw,vEF.xy);s0=v01+v56;v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;s1=v23+v74;v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;v01+=vec4(m4,Z)+vec4(0u,u32(v01.x+vec4(m4,Z).x<v01.x),Z);v23+=vec4(Z,m1)+vec4(Z,0u,u32(v23.z+vec4(Z,m1).z<v23.z));vFC=(vFC ^ v01).yxwz;vDE=(vDE ^ v23).yxwz;s0=vAB+vFC;vAB=s0+(vec4<u32>(s0<vAB)&CARRY).yxwz;s1=v89+vDE;v89=s1+(vec4<u32>(s1<v89)&CARRY).yxwz;v56 ^=vAB;v56=(v56>>ROTATE_24)|(v56<<ROTATE_8).yxwz;v74 ^=v89;v74=(v74>>ROTATE_24)|(v74<<ROTATE_8).yxwz;s0=v01+v56;v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;s1=v23+v74;v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;vFC ^=v01;vFC=(vFC>>ROTATE_16)|(vFC<<ROTATE_16).yxwz;vDE ^=v23;vDE=(vDE>>ROTATE_16)|(vDE<<ROTATE_16).yxwz;s0=vAB+vFC;vAB=s0+(vec4<u32>(s0<vAB)&CARRY).yxwz;s1=v89+vDE;v89=s1+(vec4<u32>(s1<v89)&CARRY).yxwz;v56 ^=vAB;v56=(v56>>ROTATE_31).yxwz|(v56<<ROTATE_1);v74 ^=v89;v74=(v74>>ROTATE_31).yxwz|(v74<<ROTATE_1);v45=vec4(v74.zw,v56.xy);v67=vec4(v56.zw,v74.xy);vCD=vec4(vFC.zw,vDE.xy);vEF=vec4(vDE.zw,vFC.xy);s0=v01+v45;v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;s1=v23+v67;v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;v01+=vec4(Z,m1)+vec4(Z,0u,u32(v01.z+vec4(Z,m1).z<v01.z));v23+=vec4(Z,m4)+vec4(Z,0u,u32(v23.z+vec4(Z,m4).z<v23.z));vCD=(vCD ^ v01).yxwz;vEF=(vEF ^ v23).yxwz;s0=v89+vCD;v89=s0+(vec4<u32>(s0<v89)&CARRY).yxwz;s1=vAB+vEF;vAB=s1+(vec4<u32>(s1<vAB)&CARRY).yxwz;v45 ^=v89;v45=(v45>>ROTATE_24)|(v45<<ROTATE_8).yxwz;v67 ^=vAB;v67=(v67>>ROTATE_24)|(v67<<ROTATE_8).yxwz;s0=v01+v45;v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;s1=v23+v67;v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;vCD ^=v01;vCD=(vCD>>ROTATE_16)|(vCD<<ROTATE_16).yxwz;vEF ^=v23;vEF=(vEF>>ROTATE_16)|(vEF<<ROTATE_16).yxwz;s0=v89+vCD;v89=s0+(vec4<u32>(s0<v89)&CARRY).yxwz;s1=vAB+vEF;vAB=s1+(vec4<u32>(s1<vAB)&CARRY).yxwz;v45 ^=v89;v45=(v45>>ROTATE_31).yxwz|(v45<<ROTATE_1);v67 ^=vAB;v67=(v67>>ROTATE_31).yxwz|(v67<<ROTATE_1);v56=vec4(v45.zw,v67.xy);v74=vec4(v67.zw,v45.xy);vFC=vec4(vEF.zw,vCD.xy);vDE=vec4(vCD.zw,vEF.xy);s0=v01+v56;v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;s1=v23+v74;v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;v01+=vec4(m0,Z)+vec4(0u,u32(v01.x+vec4(m0,Z).x<v01.x),Z);vFC=(vFC ^ v01).yxwz;vDE=(vDE ^ v23).yxwz;s0=vAB+vFC;vAB=s0+(vec4<u32>(s0<vAB)&CARRY).yxwz;s1=v89+vDE;v89=s1+(vec4<u32>(s1<v89)&CARRY).yxwz;v56 ^=vAB;v56=(v56>>ROTATE_24)|(v56<<ROTATE_8).yxwz;v74 ^=v89;v74=(v74>>ROTATE_24)|(v74<<ROTATE_8).yxwz;s0=v01+v56;v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;s1=v23+v74;v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;v01+=vec4(Z,m3)+vec4(Z,0u,u32(v01.z+vec4(Z,m3).z<v01.z));s1=v23+vec4(m2,Z);v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;vFC ^=v01;vFC=(vFC>>ROTATE_16)|(vFC<<ROTATE_16).yxwz;vDE ^=v23;vDE=(vDE>>ROTATE_16)|(vDE<<ROTATE_16).yxwz;s0=vAB+vFC;vAB=s0+(vec4<u32>(s0<vAB)&CARRY).yxwz;s1=v89+vDE;v89=s1+(vec4<u32>(s1<v89)&CARRY).yxwz;v56 ^=vAB;v56=(v56>>ROTATE_31).yxwz|(v56<<ROTATE_1);v74 ^=v89;v74=(v74>>ROTATE_31).yxwz|(v74<<ROTATE_1);v45=vec4(v74.zw,v56.xy);v67=vec4(v56.zw,v74.xy);vCD=vec4(vFC.zw,vDE.xy);vEF=vec4(vDE.zw,vFC.xy);s0=v01+v45;v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;s1=v23+v67;v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;s1=v23+vec4(Z,m3);v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;vCD=(vCD ^ v01).yxwz;vEF=(vEF ^ v23).yxwz;s0=v89+vCD;v89=s0+(vec4<u32>(s0<v89)&CARRY).yxwz;s1=vAB+vEF;vAB=s1+(vec4<u32>(s1<vAB)&CARRY).yxwz;v45 ^=v89;v45=(v45>>ROTATE_24)|(v45<<ROTATE_8).yxwz;v67 ^=vAB;v67=(v67>>ROTATE_24)|(v67<<ROTATE_8).yxwz;s0=v01+v45;v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;s1=v23+v67;v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;v23+=vec4(m1,Z)+vec4(0u,u32(v23.x+vec4(m1,Z).x<v23.x),Z);vCD ^=v01;vCD=(vCD>>ROTATE_16)|(vCD<<ROTATE_16).yxwz;vEF ^=v23;vEF=(vEF>>ROTATE_16)|(vEF<<ROTATE_16).yxwz;s0=v89+vCD;v89=s0+(vec4<u32>(s0<v89)&CARRY).yxwz;s1=vAB+vEF;vAB=s1+(vec4<u32>(s1<vAB)&CARRY).yxwz;v45 ^=v89;v45=(v45>>ROTATE_31).yxwz|(v45<<ROTATE_1);v67 ^=vAB;v67=(v67>>ROTATE_31).yxwz|(v67<<ROTATE_1);v56=vec4(v45.zw,v67.xy);v74=vec4(v67.zw,v45.xy);vFC=vec4(vEF.zw,vCD.xy);vDE=vec4(vCD.zw,vEF.xy);s0=v01+v56;v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;s1=v23+v74;v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;v23+=vec4(Z,m2)+vec4(Z,0u,u32(v23.z+vec4(Z,m2).z<v23.z));vFC=(vFC ^ v01).yxwz;vDE=(vDE ^ v23).yxwz;s0=vAB+vFC;vAB=s0+(vec4<u32>(s0<vAB)&CARRY).yxwz;s1=v89+vDE;v89=s1+(vec4<u32>(s1<v89)&CARRY).yxwz;v56 ^=vAB;v56=(v56>>ROTATE_24)|(v56<<ROTATE_8).yxwz;v74 ^=v89;v74=(v74>>ROTATE_24)|(v74<<ROTATE_8).yxwz;s0=v01+v56;v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;s1=v23+v74;v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;v01+=vec4(m0,m4)+vec4(0u,u32(v01.x+vec4(m0,m4).x<v01.x),0u,u32(v01.z+vec4(m0,m4).z<v01.z));vFC ^=v01;vFC=(vFC>>ROTATE_16)|(vFC<<ROTATE_16).yxwz;vDE ^=v23;vDE=(vDE>>ROTATE_16)|(vDE<<ROTATE_16).yxwz;s0=vAB+vFC;vAB=s0+(vec4<u32>(s0<vAB)&CARRY).yxwz;s1=v89+vDE;v89=s1+(vec4<u32>(s1<v89)&CARRY).yxwz;v56 ^=vAB;v56=(v56>>ROTATE_31).yxwz|(v56<<ROTATE_1);v74 ^=v89;v74=(v74>>ROTATE_31).yxwz|(v74<<ROTATE_1);v45=vec4(v74.zw,v56.xy);v67=vec4(v56.zw,v74.xy);vCD=vec4(vFC.zw,vDE.xy);vEF=vec4(vDE.zw,vFC.xy);s0=v01+v45;v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;s1=v23+v67;v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;v23+=vec4(Z,m0);v23.w+=u32(v23.z<m0.x);vCD=(vCD ^ v01).yxwz;vEF=(vEF ^ v23).yxwz;s0=v89+vCD;v89=s0+(vec4<u32>(s0<v89)&CARRY).yxwz;s1=vAB+vEF;vAB=s1+(vec4<u32>(s1<vAB)&CARRY).yxwz;v45 ^=v89;v45=(v45>>ROTATE_24)|(v45<<ROTATE_8).yxwz;v67 ^=vAB;v67=(v67>>ROTATE_24)|(v67<<ROTATE_8).yxwz;s0=v01+v45;v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;s1=v23+v67;v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;v23+=vec4(m3,Z)+vec4(0u,u32(v23.x+vec4(m3,Z).x<v23.x),Z);vCD ^=v01;vCD=(vCD>>ROTATE_16)|(vCD<<ROTATE_16).yxwz;vEF ^=v23;vEF=(vEF>>ROTATE_16)|(vEF<<ROTATE_16).yxwz;s0=v89+vCD;v89=s0+(vec4<u32>(s0<v89)&CARRY).yxwz;s1=vAB+vEF;vAB=s1+(vec4<u32>(s1<vAB)&CARRY).yxwz;v45 ^=v89;v45=(v45>>ROTATE_31).yxwz|(v45<<ROTATE_1);v67 ^=vAB;v67=(v67>>ROTATE_31).yxwz|(v67<<ROTATE_1);v56=vec4(v45.zw,v67.xy);v74=vec4(v67.zw,v45.xy);vFC=vec4(vEF.zw,vCD.xy);vDE=vec4(vCD.zw,vEF.xy);s0=v01+v56;v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;s1=v23+v74;v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;v23+=vec4(m1,Z)+vec4(0u,u32(v23.x+vec4(m1,Z).x<v23.x),Z);vFC=(vFC ^ v01).yxwz;vDE=(vDE ^ v23).yxwz;s0=vAB+vFC;vAB=s0+(vec4<u32>(s0<vAB)&CARRY).yxwz;s1=v89+vDE;v89=s1+(vec4<u32>(s1<v89)&CARRY).yxwz;v56 ^=vAB;v56=(v56>>ROTATE_24)|(v56<<ROTATE_8).yxwz;v74 ^=v89;v74=(v74>>ROTATE_24)|(v74<<ROTATE_8).yxwz;s0=v01+v56;v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;s1=v23+v74;v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;v01+=vec4(m2,Z)+vec4(0u,u32(v01.x+vec4(m2,Z).x<v01.x),Z);v23+=vec4(m4,Z)+vec4(0u,u32(v23.x+vec4(m4,Z).x<v23.x),Z);vFC ^=v01;vFC=(vFC>>ROTATE_16)|(vFC<<ROTATE_16).yxwz;vDE ^=v23;vDE=(vDE>>ROTATE_16)|(vDE<<ROTATE_16).yxwz;s0=vAB+vFC;vAB=s0+(vec4<u32>(s0<vAB)&CARRY).yxwz;s1=v89+vDE;v89=s1+(vec4<u32>(s1<v89)&CARRY).yxwz;v56 ^=vAB;v56=(v56>>ROTATE_31).yxwz|(v56<<ROTATE_1);v74 ^=v89;v74=(v74>>ROTATE_31).yxwz|(v74<<ROTATE_1);v45=vec4(v74.zw,v56.xy);v67=vec4(v56.zw,v74.xy);vCD=vec4(vFC.zw,vDE.xy);vEF=vec4(vDE.zw,vFC.xy);s0=v01+v45;v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;s1=v23+v67;v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;v23+=vec4(Z,m1);v23.w+=u32(v23.z<m1.x);vCD=(vCD ^ v01).yxwz;vEF=(vEF ^ v23).yxwz;s0=v89+vCD;v89=s0+(vec4<u32>(s0<v89)&CARRY).yxwz;s1=vAB+vEF;vAB=s1+(vec4<u32>(s1<vAB)&CARRY).yxwz;v45 ^=v89;v45=(v45>>ROTATE_24)|(v45<<ROTATE_8).yxwz;v67 ^=vAB;v67=(v67>>ROTATE_24)|(v67<<ROTATE_8).yxwz;s0=v01+v45;v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;s1=v23+v67;v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;s0=v01+vec4(m2,m4);v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;vCD ^=v01;vCD=(vCD>>ROTATE_16)|(vCD<<ROTATE_16).yxwz;vEF ^=v23;vEF=(vEF>>ROTATE_16)|(vEF<<ROTATE_16).yxwz;s0=v89+vCD;v89=s0+(vec4<u32>(s0<v89)&CARRY).yxwz;s1=vAB+vEF;vAB=s1+(vec4<u32>(s1<vAB)&CARRY).yxwz;v45 ^=v89;v45=(v45>>ROTATE_31).yxwz|(v45<<ROTATE_1);v67 ^=vAB;v67=(v67>>ROTATE_31).yxwz|(v67<<ROTATE_1);v56=vec4(v45.zw,v67.xy);v74=vec4(v67.zw,v45.xy);vFC=vec4(vEF.zw,vCD.xy);vDE=vec4(vCD.zw,vEF.xy);s0=v01+v56;v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;s1=v23+v74;v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;v23+=vec4(m3,Z);v23.y+=u32(v23.x<m3.x);vFC=(vFC ^ v01).yxwz;vDE=(vDE ^ v23).yxwz;s0=vAB+vFC;vAB=s0+(vec4<u32>(s0<vAB)&CARRY).yxwz;s1=v89+vDE;v89=s1+(vec4<u32>(s1<v89)&CARRY).yxwz;v56 ^=vAB;v56=(v56>>ROTATE_24)|(v56<<ROTATE_8).yxwz;v74 ^=v89;v74=(v74>>ROTATE_24)|(v74<<ROTATE_8).yxwz;s0=v01+v56;v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;s1=v23+v74;v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;v23+=vec4(Z,m0);v23.w+=u32(v23.z<m0.x);vFC ^=v01;vFC=(vFC>>ROTATE_16)|(vFC<<ROTATE_16).yxwz;vDE ^=v23;vDE=(vDE>>ROTATE_16)|(vDE<<ROTATE_16).yxwz;s0=vAB+vFC;vAB=s0+(vec4<u32>(s0<vAB)&CARRY).yxwz;s1=v89+vDE;v89=s1+(vec4<u32>(s1<v89)&CARRY).yxwz;v56 ^=vAB;v56=(v56>>ROTATE_31).yxwz|(v56<<ROTATE_1);v74 ^=v89;v74=(v74>>ROTATE_31).yxwz|(v74<<ROTATE_1);v45=vec4(v74.zw,v56.xy);v67=vec4(v56.zw,v74.xy);vCD=vec4(vFC.zw,vDE.xy);vEF=vec4(vDE.zw,vFC.xy);s0=v01+v45;v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;s1=v23+v67;v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;s0=v01+vec4(m0,m2);v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;v23+=vec4(m4,Z);v23.y+=u32(v23.x<m4.x);vCD=(vCD ^ v01).yxwz;vEF=(vEF ^ v23).yxwz;s0=v89+vCD;v89=s0+(vec4<u32>(s0<v89)&CARRY).yxwz;s1=vAB+vEF;vAB=s1+(vec4<u32>(s1<vAB)&CARRY).yxwz;v45 ^=v89;v45=(v45>>ROTATE_24)|(v45<<ROTATE_8).yxwz;v67 ^=vAB;v67=(v67>>ROTATE_24)|(v67<<ROTATE_8).yxwz;s0=v01+v45;v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;s1=v23+v67;v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;s0=v01+vec4(m1,m3);v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;vCD ^=v01;vCD=(vCD>>ROTATE_16)|(vCD<<ROTATE_16).yxwz;vEF ^=v23;vEF=(vEF>>ROTATE_16)|(vEF<<ROTATE_16).yxwz;s0=v89+vCD;v89=s0+(vec4<u32>(s0<v89)&CARRY).yxwz;s1=vAB+vEF;vAB=s1+(vec4<u32>(s1<vAB)&CARRY).yxwz;v45 ^=v89;v45=(v45>>ROTATE_31).yxwz|(v45<<ROTATE_1);v67 ^=vAB;v67=(v67>>ROTATE_31).yxwz|(v67<<ROTATE_1);v56=vec4(v45.zw,v67.xy);v74=vec4(v67.zw,v45.xy);vFC=vec4(vEF.zw,vCD.xy);vDE=vec4(vCD.zw,vEF.xy);s0=v01+v56;v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;s1=v23+v74;v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;vFC=(vFC ^ v01).yxwz;vDE=(vDE ^ v23).yxwz;s0=vAB+vFC;vAB=s0+(vec4<u32>(s0<vAB)&CARRY).yxwz;s1=v89+vDE;v89=s1+(vec4<u32>(s1<v89)&CARRY).yxwz;v56 ^=vAB;v56=(v56>>ROTATE_24)|(v56<<ROTATE_8).yxwz;v74 ^=v89;v74=(v74>>ROTATE_24)|(v74<<ROTATE_8).yxwz;s0=v01+v56;v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;s1=v23+v74;v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;vFC ^=v01;vFC=(vFC>>ROTATE_16)|(vFC<<ROTATE_16).yxwz;vDE ^=v23;vDE=(vDE>>ROTATE_16)|(vDE<<ROTATE_16).yxwz;s0=vAB+vFC;vAB=s0+(vec4<u32>(s0<vAB)&CARRY).yxwz;s1=v89+vDE;v89=s1+(vec4<u32>(s1<v89)&CARRY).yxwz;v56 ^=vAB;v56=(v56>>ROTATE_31).yxwz|(v56<<ROTATE_1);v74 ^=v89;v74=(v74>>ROTATE_31).yxwz|(v74<<ROTATE_1);v45=vec4(v74.zw,v56.xy);v67=vec4(v56.zw,v74.xy);vCD=vec4(vFC.zw,vDE.xy);vEF=vec4(vDE.zw,vFC.xy);s0=v01+v45;v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;s1=v23+v67;v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;v01+=vec4(Z,m4);v01.w+=u32(v01.z<m4.x);vCD=(vCD ^ v01).yxwz;vEF=(vEF ^ v23).yxwz;s0=v89+vCD;v89=s0+(vec4<u32>(s0<v89)&CARRY).yxwz;s1=vAB+vEF;vAB=s1+(vec4<u32>(s1<vAB)&CARRY).yxwz;v45 ^=v89;v45=(v45>>ROTATE_24)|(v45<<ROTATE_8).yxwz;v67 ^=vAB;v67=(v67>>ROTATE_24)|(v67<<ROTATE_8).yxwz;s0=v01+v45;v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;s1=v23+v67;v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;vCD ^=v01;vCD=(vCD>>ROTATE_16)|(vCD<<ROTATE_16).yxwz;vEF ^=v23;vEF=(vEF>>ROTATE_16)|(vEF<<ROTATE_16).yxwz;s0=v89+vCD;v89=s0+(vec4<u32>(s0<v89)&CARRY).yxwz;s1=vAB+vEF;vAB=s1+(vec4<u32>(s1<vAB)&CARRY).yxwz;v45 ^=v89;v45=(v45>>ROTATE_31).yxwz|(v45<<ROTATE_1);v67 ^=vAB;v67=(v67>>ROTATE_31).yxwz|(v67<<ROTATE_1);v56=vec4(v45.zw,v67.xy);v74=vec4(v67.zw,v45.xy);vFC=vec4(vEF.zw,vCD.xy);vDE=vec4(vCD.zw,vEF.xy);s0=v01+v56;v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;s1=v23+v74;v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;s0=v01+vec4(m1,m0);v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;vFC=(vFC ^ v01).yxwz;vDE=(vDE ^ v23).yxwz;s0=vAB+vFC;vAB=s0+(vec4<u32>(s0<vAB)&CARRY).yxwz;s1=v89+vDE;v89=s1+(vec4<u32>(s1<v89)&CARRY).yxwz;v56 ^=vAB;v56=(v56>>ROTATE_24)|(v56<<ROTATE_8).yxwz;v74 ^=v89;v74=(v74>>ROTATE_24)|(v74<<ROTATE_8).yxwz;s0=v01+v56;v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;s1=v23+v74;v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;v23+=vec4(Z,m3);v23.w+=u32(v23.z<m3.x);vDE ^=v23;vDE=(vDE>>ROTATE_16)|(vDE<<ROTATE_16).yxwz;s1=v89+vDE;v89=s1+(vec4<u32>(s1<v89)&CARRY).yxwz;var result=BLAKE2B_INIT[0u]^ v01.xy ^ v89.xy;if(validate||((result.y>ubo.difficulty.y||(result.y==ubo.difficulty.y&&result.y>=ubo.difficulty.y))&&atomicLoad(&work.found)==0u)){atomicStore(&work.found,1u);work.nonce=m0;work.result=result;}return;}`;
|
|
509
509
|
|
|
510
510
|
// src/lib/gpu/index.ts
|
|
511
511
|
//! SPDX-FileCopyrightText: 2025 Chris Duncan <chris@zoso.dev>
|
|
@@ -637,7 +637,7 @@ var NanoPowGpu = class _NanoPowGpu {
|
|
|
637
637
|
};
|
|
638
638
|
console.table(averages);
|
|
639
639
|
}
|
|
640
|
-
static async #dispatch(pipeline, seed, hash,
|
|
640
|
+
static async #dispatch(pipeline, seed, hash, difficulty, passes) {
|
|
641
641
|
if (this.#device == null) throw new Error(`WebGPU device failed to load.`);
|
|
642
642
|
for (let i = 0; i < this.#uboView.byteLength; i++) this.#uboView.setUint8(i, 0);
|
|
643
643
|
for (let i = 0; i < 64; i += 16) {
|
|
@@ -645,7 +645,7 @@ var NanoPowGpu = class _NanoPowGpu {
|
|
|
645
645
|
this.#uboView.setBigUint64(i / 2, BigInt(`0x${u64}`));
|
|
646
646
|
}
|
|
647
647
|
this.#uboView.setBigUint64(32, seed, true);
|
|
648
|
-
this.#uboView.setBigUint64(40,
|
|
648
|
+
this.#uboView.setBigUint64(40, difficulty, true);
|
|
649
649
|
if (this.#debug) console.log("UBO", this.#uboView);
|
|
650
650
|
this.#device.queue.writeBuffer(this.#uboBuffer, 0, this.#uboView);
|
|
651
651
|
this.#device.queue.writeBuffer(this.#gpuBuffer, 0, this.#bufferReset);
|
|
@@ -683,7 +683,7 @@ var NanoPowGpu = class _NanoPowGpu {
|
|
|
683
683
|
this.#cpuBuffer.unmap();
|
|
684
684
|
} catch (err) {
|
|
685
685
|
console.warn(`Error getting data from GPU. ${err}`);
|
|
686
|
-
return this.#dispatch(pipeline, seed, hash,
|
|
686
|
+
return this.#dispatch(pipeline, seed, hash, difficulty, passes);
|
|
687
687
|
}
|
|
688
688
|
if (this.#debug) console.log("gpuBuffer data", data);
|
|
689
689
|
if (data == null) throw new Error(`Failed to get data from buffer.`);
|
|
@@ -708,14 +708,14 @@ var NanoPowGpu = class _NanoPowGpu {
|
|
|
708
708
|
}
|
|
709
709
|
if (this.#isInitialized === false) this.init();
|
|
710
710
|
this.#busy = true;
|
|
711
|
-
if (typeof options?.
|
|
711
|
+
if (typeof options?.difficulty === "string") {
|
|
712
712
|
try {
|
|
713
|
-
options.
|
|
713
|
+
options.difficulty = BigInt(`0x${options.difficulty}`);
|
|
714
714
|
} catch (err) {
|
|
715
|
-
throw new TypeError(`Invalid
|
|
715
|
+
throw new TypeError(`Invalid difficulty ${options.difficulty}`);
|
|
716
716
|
}
|
|
717
717
|
}
|
|
718
|
-
const
|
|
718
|
+
const difficulty = typeof options?.difficulty !== "bigint" || options.difficulty < 1n || options.difficulty > 0xffffffffffffffffn ? 0xfffffff800000000n : options.difficulty;
|
|
719
719
|
const effort = typeof options?.effort !== "number" || options.effort < 1 || options.effort > 32 ? 2048 : options.effort * 256;
|
|
720
720
|
this.#debug = !!options?.debug;
|
|
721
721
|
if (this.#debug) console.log("NanoPowGpu.work_generate()");
|
|
@@ -741,7 +741,7 @@ var NanoPowGpu = class _NanoPowGpu {
|
|
|
741
741
|
const random1 = Math.floor(Math.random() * 4294967295);
|
|
742
742
|
const seed = BigInt(random0) << 32n | BigInt(random1);
|
|
743
743
|
if (this.#debug) console.log("seed", seed.toString(16).padStart(16, "0"));
|
|
744
|
-
const data = await this.#dispatch(this.#searchPipeline, seed, hash,
|
|
744
|
+
const data = await this.#dispatch(this.#searchPipeline, seed, hash, difficulty, effort);
|
|
745
745
|
const found = !!data.getUint32(0);
|
|
746
746
|
nonce = data.getBigUint64(8, true);
|
|
747
747
|
result = data.getBigUint64(16, true);
|
|
@@ -778,14 +778,14 @@ var NanoPowGpu = class _NanoPowGpu {
|
|
|
778
778
|
}
|
|
779
779
|
if (this.#isInitialized === false) this.init();
|
|
780
780
|
this.#busy = true;
|
|
781
|
-
if (typeof options?.
|
|
781
|
+
if (typeof options?.difficulty === "string") {
|
|
782
782
|
try {
|
|
783
|
-
options.
|
|
783
|
+
options.difficulty = BigInt(`0x${options.difficulty}`);
|
|
784
784
|
} catch (err) {
|
|
785
|
-
throw new TypeError(`Invalid
|
|
785
|
+
throw new TypeError(`Invalid difficulty ${options.difficulty}`);
|
|
786
786
|
}
|
|
787
787
|
}
|
|
788
|
-
const
|
|
788
|
+
const difficulty = typeof options?.difficulty !== "bigint" || options.difficulty < 1n || options.difficulty > 0xffffffffffffffffn ? 0xfffffff800000000n : options.difficulty;
|
|
789
789
|
this.#debug = !!options?.debug;
|
|
790
790
|
if (this.#debug) console.log("NanoPowGpu.work_validate()");
|
|
791
791
|
if (this.#debug) console.log("blockhash", hash);
|
|
@@ -804,7 +804,7 @@ var NanoPowGpu = class _NanoPowGpu {
|
|
|
804
804
|
let nonce = 0n;
|
|
805
805
|
const seed = BigInt(`0x${work}`);
|
|
806
806
|
if (this.#debug) console.log("work", work);
|
|
807
|
-
const data = await this.#dispatch(this.#validatePipeline, seed, hash,
|
|
807
|
+
const data = await this.#dispatch(this.#validatePipeline, seed, hash, difficulty, 1);
|
|
808
808
|
nonce = data.getBigUint64(8, true);
|
|
809
809
|
result = data.getBigUint64(16, true);
|
|
810
810
|
this.#busy = false;
|
|
@@ -817,7 +817,7 @@ var NanoPowGpu = class _NanoPowGpu {
|
|
|
817
817
|
valid_all: result >= this.#SEND ? "1" : "0",
|
|
818
818
|
valid_receive: result >= this.#RECEIVE ? "1" : "0"
|
|
819
819
|
};
|
|
820
|
-
if (options?.
|
|
820
|
+
if (options?.difficulty != null) response.valid = result >= difficulty ? "1" : "0";
|
|
821
821
|
return response;
|
|
822
822
|
}
|
|
823
823
|
};
|
package/dist/types.d.ts
CHANGED
|
@@ -7,6 +7,101 @@ declare global {
|
|
|
7
7
|
}
|
|
8
8
|
}
|
|
9
9
|
|
|
10
|
+
declare const NanoPow: typeof NanoPowGl | typeof NanoPowGpu | null
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Nano proof-of-work using WebGL 2.0.
|
|
14
|
+
*/
|
|
15
|
+
export declare class NanoPowGl {
|
|
16
|
+
static [key: string]: (...args: any[]) => any
|
|
17
|
+
#private
|
|
18
|
+
/**
|
|
19
|
+
* Constructs canvas, gets WebGL context, initializes buffers, and compiles
|
|
20
|
+
* shaders.
|
|
21
|
+
*/
|
|
22
|
+
static init (): Promise<void>
|
|
23
|
+
/**
|
|
24
|
+
* On WebGL context loss, attempts to clear all program variables and then
|
|
25
|
+
* reinitialize them by calling `init()`.
|
|
26
|
+
*/
|
|
27
|
+
static reset (): void
|
|
28
|
+
/**
|
|
29
|
+
* Finds a nonce that satisfies the Nano proof-of-work requirements.
|
|
30
|
+
*
|
|
31
|
+
* @param {string} hash - Hexadecimal hash of previous block, or public key for new accounts
|
|
32
|
+
* @param {NanoPowOptions} options - Options used to configure search execution
|
|
33
|
+
*/
|
|
34
|
+
static work_generate (hash: string, options?: NanoPowOptions): Promise<WorkGenerateResponse>
|
|
35
|
+
/**
|
|
36
|
+
* Validates that a nonce satisfies Nano proof-of-work requirements.
|
|
37
|
+
*
|
|
38
|
+
* @param {string} work - Hexadecimal proof-of-work value to validate
|
|
39
|
+
* @param {string} hash - Hexadecimal hash of previous block, or public key for new accounts
|
|
40
|
+
* @param {NanoPowOptions} options - Options used to configure search execution
|
|
41
|
+
*/
|
|
42
|
+
static work_validate (work: string, hash: string, options?: NanoPowOptions): Promise<WorkValidateResponse>
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Nano proof-of-work using WebGPU.
|
|
47
|
+
*/
|
|
48
|
+
export declare class NanoPowGpu {
|
|
49
|
+
#private
|
|
50
|
+
static [key: string]: (...args: any[]) => any
|
|
51
|
+
static init (): Promise<void>
|
|
52
|
+
static setup (): void
|
|
53
|
+
static reset (): void
|
|
54
|
+
/**
|
|
55
|
+
* Finds a nonce that satisfies the Nano proof-of-work requirements.
|
|
56
|
+
*
|
|
57
|
+
* @param {string} hash - Hexadecimal hash of previous block, or public key for new accounts
|
|
58
|
+
* @param {NanoPowOptions} options - Used to configure search execution
|
|
59
|
+
*/
|
|
60
|
+
static work_generate (hash: string, options?: NanoPowOptions): Promise<WorkGenerateResponse>
|
|
61
|
+
/**
|
|
62
|
+
* Validates that a nonce satisfies Nano proof-of-work requirements.
|
|
63
|
+
*
|
|
64
|
+
* @param {string} work - Hexadecimal proof-of-work value to validate
|
|
65
|
+
* @param {string} hash - Hexadecimal hash of previous block, or public key for new accounts
|
|
66
|
+
* @param {NanoPowOptions} options - Options used to configure search execution
|
|
67
|
+
*/
|
|
68
|
+
static work_validate (work: string, hash: string, options?: NanoPowOptions): Promise<WorkValidateResponse>
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* Used to configure NanoPow.
|
|
73
|
+
*
|
|
74
|
+
* @param {boolean} [debug=false] - Enables additional debug logging to the console. Default: false
|
|
75
|
+
* @param {number} [effort=0x8] - Multiplier for dispatching work search. Larger values are not necessarily better since they can quickly overwhelm the GPU. Ignored when validating. Default: 0x8
|
|
76
|
+
* @param {bigint|string} [difficulty=0xfffffff800000000] - Minimum value result of `BLAKE2b(nonce||blockhash)`. Default: 0xFFFFFFF800000000
|
|
77
|
+
*/
|
|
78
|
+
export type NanoPowOptions = {
|
|
79
|
+
debug?: boolean
|
|
80
|
+
effort?: number
|
|
81
|
+
difficulty?: bigint | string
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* Used to create WebGL framebuffer objects.
|
|
86
|
+
*
|
|
87
|
+
* @param {WebGLTexture} - Defines storage size
|
|
88
|
+
* @param {WebGLFramebuffer} - Holds texture data
|
|
89
|
+
* @param {size} - 2D lengths of texture
|
|
90
|
+
*/
|
|
91
|
+
export type FBO = {
|
|
92
|
+
texture: WebGLTexture
|
|
93
|
+
framebuffer: WebGLFramebuffer
|
|
94
|
+
size: {
|
|
95
|
+
x: number
|
|
96
|
+
y: number
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
export declare const NanoPowGlDownsampleShader: string
|
|
101
|
+
export declare const NanoPowGlDrawShader: string
|
|
102
|
+
export declare const NanoPowGlVertexShader: string
|
|
103
|
+
export declare const NanoPowGpuComputeShader: any
|
|
104
|
+
|
|
10
105
|
/**
|
|
11
106
|
* Used by work server for inbound requests to `work_generate`.
|
|
12
107
|
*
|
|
@@ -70,128 +165,3 @@ type WorkValidateResponse = {
|
|
|
70
165
|
valid_all: '0' | '1'
|
|
71
166
|
valid_receive: '0' | '1'
|
|
72
167
|
}
|
|
73
|
-
|
|
74
|
-
export declare const NanoPowGlDownsampleShader: string
|
|
75
|
-
export declare const NanoPowGlDrawShader: string
|
|
76
|
-
export declare const NanoPowGlVertexShader: string
|
|
77
|
-
export declare const NanoPowGpuComputeShader: any
|
|
78
|
-
|
|
79
|
-
declare const NanoPow: typeof NanoPowGl | typeof NanoPowGpu | null
|
|
80
|
-
|
|
81
|
-
/**
|
|
82
|
-
* Used to create WebGL framebuffer objects.
|
|
83
|
-
*
|
|
84
|
-
* @param {WebGLTexture} - Defines storage size
|
|
85
|
-
* @param {WebGLFramebuffer} - Holds texture data
|
|
86
|
-
* @param {size} - 2D lengths of texture
|
|
87
|
-
*/
|
|
88
|
-
export type FBO = {
|
|
89
|
-
texture: WebGLTexture
|
|
90
|
-
framebuffer: WebGLFramebuffer
|
|
91
|
-
size: {
|
|
92
|
-
x: number
|
|
93
|
-
y: number
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
/**
|
|
98
|
-
* Used to configure NanoPow.
|
|
99
|
-
*
|
|
100
|
-
* @param {boolean} [debug=false] - Enables additional debug logging to the console. Default: false
|
|
101
|
-
* @param {number} [effort=0x8] - Multiplier for dispatching work search. Larger values are not necessarily better since they can quickly overwhelm the GPU. Ignored when validating. Default: 0x8
|
|
102
|
-
* @param {bigint|string} [threshold=0xfffffff800000000] - Minimum value result of `BLAKE2b(nonce||blockhash)`. Default: 0xFFFFFFF800000000
|
|
103
|
-
*/
|
|
104
|
-
export type NanoPowOptions = {
|
|
105
|
-
debug?: boolean
|
|
106
|
-
effort?: number
|
|
107
|
-
threshold?: bigint | string
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
/**
|
|
111
|
-
* Nano proof-of-work using WebGL 2.0.
|
|
112
|
-
*/
|
|
113
|
-
export declare class NanoPowGl {
|
|
114
|
-
static [key: string]: (...args: any[]) => any
|
|
115
|
-
#private
|
|
116
|
-
/**
|
|
117
|
-
* Constructs canvas, gets WebGL context, initializes buffers, and compiles
|
|
118
|
-
* shaders.
|
|
119
|
-
*/
|
|
120
|
-
static init (): Promise<void>
|
|
121
|
-
/**
|
|
122
|
-
* On WebGL context loss, attempts to clear all program variables and then
|
|
123
|
-
* reinitialize them by calling `init()`.
|
|
124
|
-
*/
|
|
125
|
-
static reset (): void
|
|
126
|
-
/**
|
|
127
|
-
* Finds a nonce that satisfies the Nano proof-of-work requirements.
|
|
128
|
-
*
|
|
129
|
-
* @param {string} hash - Hexadecimal hash of previous block, or public key for new accounts
|
|
130
|
-
* @param {NanoPowOptions} options - Used to configure search execution
|
|
131
|
-
*/
|
|
132
|
-
static search (hash: string, options?: NanoPowOptions): Promise<string>
|
|
133
|
-
/**
|
|
134
|
-
* Finds a nonce that satisfies the Nano proof-of-work requirements.
|
|
135
|
-
*
|
|
136
|
-
* @param {string} hash - Hexadecimal hash of previous block, or public key for new accounts
|
|
137
|
-
* @param {NanoPowOptions} options - Options used to configure search execution
|
|
138
|
-
*/
|
|
139
|
-
static work_generate (hash: string, options?: NanoPowOptions): Promise<WorkGenerateResponse>
|
|
140
|
-
/**
|
|
141
|
-
* Validates that a nonce satisfies Nano proof-of-work requirements.
|
|
142
|
-
*
|
|
143
|
-
* @param {string} work - Hexadecimal proof-of-work value to validate
|
|
144
|
-
* @param {string} hash - Hexadecimal hash of previous block, or public key for new accounts
|
|
145
|
-
* @param {NanoPowOptions} options - Options used to configure search execution
|
|
146
|
-
*/
|
|
147
|
-
static validate (work: string, hash: string, options?: NanoPowOptions): Promise<boolean>
|
|
148
|
-
/**
|
|
149
|
-
* Validates that a nonce satisfies Nano proof-of-work requirements.
|
|
150
|
-
*
|
|
151
|
-
* @param {string} work - Hexadecimal proof-of-work value to validate
|
|
152
|
-
* @param {string} hash - Hexadecimal hash of previous block, or public key for new accounts
|
|
153
|
-
* @param {NanoPowOptions} options - Options used to configure search execution
|
|
154
|
-
*/
|
|
155
|
-
static work_validate (work: string, hash: string, options?: NanoPowOptions): Promise<WorkValidateResponse>
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
/**
|
|
159
|
-
* Nano proof-of-work using WebGPU.
|
|
160
|
-
*/
|
|
161
|
-
export declare class NanoPowGpu {
|
|
162
|
-
#private
|
|
163
|
-
static [key: string]: (...args: any[]) => any
|
|
164
|
-
static init (): Promise<void>
|
|
165
|
-
static setup (): void
|
|
166
|
-
static reset (): void
|
|
167
|
-
/**
|
|
168
|
-
* Finds a nonce that satisfies the Nano proof-of-work requirements.
|
|
169
|
-
*
|
|
170
|
-
* @param {string} hash - Hexadecimal hash of previous block, or public key for new accounts
|
|
171
|
-
* @param {NanoPowOptions} options - Used to configure search execution
|
|
172
|
-
*/
|
|
173
|
-
static search (hash: string, options?: NanoPowOptions): Promise<string>
|
|
174
|
-
/**
|
|
175
|
-
* Finds a nonce that satisfies the Nano proof-of-work requirements.
|
|
176
|
-
*
|
|
177
|
-
* @param {string} hash - Hexadecimal hash of previous block, or public key for new accounts
|
|
178
|
-
* @param {NanoPowOptions} options - Used to configure search execution
|
|
179
|
-
*/
|
|
180
|
-
static work_generate (hash: string, options?: NanoPowOptions): Promise<WorkGenerateResponse>
|
|
181
|
-
/**
|
|
182
|
-
* Validates that a nonce satisfies Nano proof-of-work requirements.
|
|
183
|
-
*
|
|
184
|
-
* @param {string} work - Hexadecimal proof-of-work value to validate
|
|
185
|
-
* @param {string} hash - Hexadecimal hash of previous block, or public key for new accounts
|
|
186
|
-
* @param {NanoPowOptions} options - Options used to configure search execution
|
|
187
|
-
*/
|
|
188
|
-
static validate (work: string, hash: string, options?: NanoPowOptions): Promise<boolean>
|
|
189
|
-
/**
|
|
190
|
-
* Validates that a nonce satisfies Nano proof-of-work requirements.
|
|
191
|
-
*
|
|
192
|
-
* @param {string} work - Hexadecimal proof-of-work value to validate
|
|
193
|
-
* @param {string} hash - Hexadecimal hash of previous block, or public key for new accounts
|
|
194
|
-
* @param {NanoPowOptions} options - Options used to configure search execution
|
|
195
|
-
*/
|
|
196
|
-
static work_validate (work: string, hash: string, options?: NanoPowOptions): Promise<WorkValidateResponse>
|
|
197
|
-
}
|
package/docs/benchmarks.md
CHANGED
|
@@ -4,7 +4,7 @@ SPDX-License-Identifier: GPL-3.0-or-later
|
|
|
4
4
|
-->
|
|
5
5
|
|
|
6
6
|
# Benchmarks to compute 16,777,216 nonces
|
|
7
|
-
_Each test is 128 samples of one pass (dispatch or frame) at zero
|
|
7
|
+
_Each test is 128 samples of one pass (dispatch or frame) at zero difficulty with no early exit_
|
|
8
8
|
|
|
9
9
|
## Summary
|
|
10
10
|
- Chromium WebGPU and Firefox WebGL are the clear winners
|
package/docs/nano-pow.1
CHANGED
|
@@ -37,7 +37,7 @@ Format final output of all hashes as a JSON array of stringified values instead
|
|
|
37
37
|
\fB\-e\fR, \fB\-\-effort\fR=\fIEFFORT\fR
|
|
38
38
|
Increase demand on GPU processing. Must be between 1 and 32 inclusive.
|
|
39
39
|
.TP
|
|
40
|
-
\fB\-t\fR, \fB\-\-
|
|
40
|
+
\fB\-t\fR, \fB\-\-difficulty\fR=\fIDIFFICULTY\fR
|
|
41
41
|
Override the minimum threshold value. Higher values increase difficulty. Must be a hexadecimal string between 1 and FFFFFFFFFFFFFFFF inclusive.
|
|
42
42
|
.TP
|
|
43
43
|
\fB\-v\fR, \fB\-\-validate\fR=\fIWORK\fR
|
|
@@ -50,12 +50,18 @@ It provides work generation and validation via HTTP requests in a similar, but n
|
|
|
50
50
|
.PP
|
|
51
51
|
More specifically, it does not support the \fIuse_peers\fR, \fImultiplier\fR, \fIaccount\fR, \fIversion\fR, \fIblock\fR, and \fIjson_block\fR options.
|
|
52
52
|
.PP
|
|
53
|
-
By default, the server listens on port
|
|
53
|
+
By default, the server listens on port 5040.
|
|
54
54
|
|
|
55
|
-
.
|
|
56
|
-
.
|
|
57
|
-
|
|
58
|
-
.
|
|
55
|
+
.SS ENVIRONMENT VARIABLES
|
|
56
|
+
.TP
|
|
57
|
+
\fBNANO_POW_PORT\fR
|
|
58
|
+
Override the default port on which the NanoPow server listens for requests.
|
|
59
|
+
.TP
|
|
60
|
+
\fBNANO_POW_EFFORT\fR
|
|
61
|
+
Increase demand on GPU processing. Must be between 1 and 32 inclusive.
|
|
62
|
+
.TP
|
|
63
|
+
\fBNANO_POW_DEBUG\fR
|
|
64
|
+
Enable additional logging saved to the \fBHOME\fR directory.
|
|
59
65
|
|
|
60
66
|
.PP
|
|
61
67
|
The server process ID (PID) is saved to \fB~/.nano-pow/server.pid\fR. Log files are stored in \fB~/.nano-pow/logs/\fR.
|
|
@@ -89,13 +95,13 @@ Validate an existing work value against a blockhash. Requires \fBwork\fR field c
|
|
|
89
95
|
|
|
90
96
|
.SH EXAMPLES - CLI
|
|
91
97
|
.PP
|
|
92
|
-
Search for a work nonce for a blockhash using the default
|
|
98
|
+
Search for a work nonce for a blockhash using the default difficulty 0xFFFFFFF800000000:
|
|
93
99
|
.EX
|
|
94
100
|
$ nano-pow \fB0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\fR
|
|
95
101
|
.EE
|
|
96
102
|
|
|
97
103
|
.PP
|
|
98
|
-
Search for a work nonce using a custom
|
|
104
|
+
Search for a work nonce using a custom difficulty and increased effort:
|
|
99
105
|
.EX
|
|
100
106
|
$ nano-pow \fB\-t fffffe0000000000 \-e 32 0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\fR
|
|
101
107
|
.EE
|
|
@@ -119,7 +125,7 @@ Generate a work value:
|
|
|
119
125
|
$ curl -d '{
|
|
120
126
|
"action": "work_generate",
|
|
121
127
|
"hash": "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
|
|
122
|
-
}' localhost:
|
|
128
|
+
}' localhost:5040
|
|
123
129
|
.EE
|
|
124
130
|
|
|
125
131
|
.PP
|
|
@@ -129,7 +135,7 @@ $ curl -d '{
|
|
|
129
135
|
"action": "work_validate",
|
|
130
136
|
"work": "e45835c3b291c3d1",
|
|
131
137
|
"hash": "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
|
|
132
|
-
}' localhost:
|
|
138
|
+
}' localhost:5040
|
|
133
139
|
.EE
|
|
134
140
|
|
|
135
141
|
.SH AUTHOR
|