* 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>
35 lines
759 B
JavaScript
35 lines
759 B
JavaScript
import { Sha256 } from '@aws-crypto/sha256-js';
|
|
|
|
const sha256 = (text) => {
|
|
const hash = new Sha256();
|
|
hash.update(text);
|
|
return hash.digest()
|
|
.then((result) =>
|
|
Array.from(new Uint8Array(result))
|
|
.map((c) => c.toString(16).padStart(2, "0"))
|
|
.join(""),
|
|
);
|
|
};
|
|
|
|
addEventListener('message', async (event) => {
|
|
let data = event.data.data;
|
|
let difficulty = event.data.difficulty;
|
|
|
|
let hash;
|
|
let nonce = 0;
|
|
do {
|
|
if ((nonce & 1023) === 0) {
|
|
postMessage(nonce);
|
|
}
|
|
hash = await sha256(data + nonce++);
|
|
} while (hash.substring(0, difficulty) !== Array(difficulty + 1).join('0'));
|
|
|
|
nonce -= 1; // last nonce was post-incremented
|
|
|
|
postMessage({
|
|
hash,
|
|
data,
|
|
difficulty,
|
|
nonce,
|
|
});
|
|
});
|