fix(js): use pure JS SHA256 library, refactor (#471)

* fix(js): use pure JS SHA256 library, refactor

Closes #458

Additionally, I made a horrifying discovery: Firefox seems to actively
hinder performance if you are using more than one Worker per page. It
does not spread the load out across cores like I expected. Instead it
seems to make that one Worker thrash and have to constantly context
switch, which caused a lot of slowdown.

The benchmarks in #155 continue to be the best contribution ever made to
Anubis. What clued me into there being a problem here was the fact that
the "slow" algorithm was faster than the "fast" algorithm on my laptop.
This made no intuitive sense to me so I dug further.

Either way I think this is a Firefox bug at its core, but for now we
have to work around it by doing the hacky terrible thing that I hate.

I also swapped the SHA256 operations to @aws-crypto/sha256-js on the
advice of a trusted cryptography expert. I don't know what performance
differences this makes, but I'm getting 150-225 kilohashes per second,
which is pretty dang good.

Signed-off-by: Xe Iaso <me@xeiaso.net>

* fix(js): apply suggestions from code review

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Signed-off-by: Xe Iaso <me@xeiaso.net>

* fix(js): use fast algo for fast worker

Signed-off-by: Xe Iaso <me@xeiaso.net>

---------

Signed-off-by: Xe Iaso <me@xeiaso.net>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
This commit is contained in:
Xe Iaso 2025-05-08 17:38:51 -04:00 committed by GitHub
parent 7f0f691ba5
commit 7b84904d15
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
13 changed files with 335 additions and 234 deletions

View file

@ -1,11 +1,12 @@
import processFast from "./proof-of-work.mjs";
import processSlow from "./proof-of-work-slow.mjs";
import processFast from "./algorithms/fast.mjs";
import processSlow from "./algorithms/slow.mjs";
const defaultDifficulty = 4;
const algorithms = {
fast: processFast,
slow: processSlow,
};
const basePrefix = "";
const status = document.getElementById("status");
const difficultyInput = document.getElementById("difficulty-input");
@ -42,7 +43,7 @@ const benchmarkTrial = async (stats, difficulty, algorithm, signal) => {
.join("");
const t0 = performance.now();
const { hash, nonce } = await process(challenge, Number(difficulty), signal);
const { hash, nonce } = await process({ basePrefix, version: "devel" }, challenge, Number(difficulty), signal);
const t1 = performance.now();
console.log({ hash, nonce });
@ -114,6 +115,7 @@ const benchmarkLoop = async (controller) => {
} catch (e) {
if (e !== false) {
status.innerText = e;
throw e;
}
return;
}