diff options
| author | 2025-05-03 16:45:25 +0000 | |
|---|---|---|
| committer | 2025-05-03 16:45:25 +0000 | |
| commit | 211192c482310f42849d7bfba7ce63f5ef6e5aa0 (patch) | |
| tree | 8d5485502c1311eccae775ba935536f82e16362e /web/source/nollamasworker/index.js | |
| parent | [bugfix] Ensure Account and TargetAccount set when doing UndoFollow (#4118) (diff) | |
| download | gotosocial-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.js | 54 |
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 }); +}; |
