summaryrefslogtreecommitdiff
path: root/web/source/nollamasworker/index.js
diff options
context:
space:
mode:
authorLibravatar kim <grufwub@gmail.com>2025-05-03 16:45:25 +0000
committerLibravatar kim <gruf@noreply.codeberg.org>2025-05-03 16:45:25 +0000
commit211192c482310f42849d7bfba7ce63f5ef6e5aa0 (patch)
tree8d5485502c1311eccae775ba935536f82e16362e /web/source/nollamasworker/index.js
parent[bugfix] Ensure Account and TargetAccount set when doing UndoFollow (#4118) (diff)
downloadgotosocial-211192c482310f42849d7bfba7ce63f5ef6e5aa0.tar.xz
[chore] more NoLLaMas proof-of-work tweaking (#4096)
- replaces the sha256 calculation with an alternative implementation that seems to use more uniform time-taken across different platforms - goes back to the simpler difficulty calculation without a "partial" difficulty level Reviewed-on: https://codeberg.org/superseriousbusiness/gotosocial/pulls/4096 Co-authored-by: kim <grufwub@gmail.com> Co-committed-by: kim <grufwub@gmail.com>
Diffstat (limited to 'web/source/nollamasworker/index.js')
-rw-r--r--web/source/nollamasworker/index.js54
1 files changed, 31 insertions, 23 deletions
diff --git a/web/source/nollamasworker/index.js b/web/source/nollamasworker/index.js
index 37a54349a..2762b125e 100644
--- a/web/source/nollamasworker/index.js
+++ b/web/source/nollamasworker/index.js
@@ -17,43 +17,51 @@
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-onmessage = async function(e) {
- console.log('worker started'); // eslint-disable-line no-console
+import sha256 from "./sha256";
- const challenge = e.data.challenge;
+let compute = async function(challengeStr, diffStr) {
const textEncoder = new TextEncoder();
- // Get difficulty and generate the expected
- // zero ASCII prefix to check for in hashes.
- const difficulty1Str = e.data.difficulty1;
- const difficulty2Str = e.data.difficulty2;
- const difficulty1 = parseInt(difficulty1Str, 10);
- const zeroPrefix = '0'.repeat(difficulty1);
+ // Get difficulty1 as number and generate
+ // expected zero ASCII prefix to check for.
+ const diff1 = parseInt(diffStr, 10);
+ const zeros = "0".repeat(diff1);
+
+ // Calculate hex encoded prefix required to check solution, where we
+ // need diff1 no. chars in hex, and hex encoding doubles input length.
+ const prefixLen = diff1 / 2 + (diff1 % 2 != 0 ? 2 : 0);
let nonce = 0;
while (true) { // eslint-disable-line no-constant-condition
- // Create possible solution string from challenge + nonce.
- const solution = textEncoder.encode(challenge + nonce.toString());
+ // Create possible solution string from challenge string + nonce.
+ const solution = textEncoder.encode(challengeStr + nonce.toString());
- // Generate SHA256 hashsum of solution string and hex encode the result.
- const hashBuffer = await crypto.subtle.digest('SHA-256', solution);
- const hashArray = Array.from(new Uint8Array(hashBuffer));
- const hashHex = hashArray.map(b => b.toString(16).padStart(2, '0')).join('');
+ // Generate SHA256 hashsum of solution string, and hex encode the
+ // necessary prefix length we need to check for a valid solution.
+ const prefixArray = Array.from(sha256(solution).slice(0, prefixLen));
+ const prefixHex = prefixArray.map(b => b.toString(16).padStart(2, "0")).join("");
// Check if the hex encoded hash has
// difficulty defined zeroes prefix.
- if (hashHex.startsWith(zeroPrefix)) {
-
- // Check if the next char after zero prefix
- // is specifically less than difficulty2 char.
- if (hashHex.charAt(difficulty1) < difficulty2Str) {
- postMessage({ nonce: nonce, done: true });
- break;
- }
+ if (prefixHex.startsWith(zeros)) {
+ return nonce;
}
// Iter.
nonce++;
}
};
+
+onmessage = async function(e) {
+ console.log('worker started'); // eslint-disable-line no-console
+
+ const challenge = e.data.challenge;
+ const difficulty = e.data.difficulty;
+
+ // Compute the nonce that produces solution with args.
+ let nonce = await compute(challenge, difficulty);
+
+ // Post the solution nonce back to caller.
+ postMessage({ nonce: nonce, done: true });
+};