01 · Problem
Wofür braucht man das?
Ein Client soll vor einer Anfrage nachweisbar Rechenarbeit leisten, deren Prüfung wesentlich günstiger als ihre Suche ist.
02 · Denkmodell
Das mentale Modell
Der Miner variiert eine eindeutig codierte Nonce, bis der Hash unter dem Ziel liegt. Der Prüfer hasht genau einmal und kontrolliert dasselbe Ziel.
ProofOfWork ist nicht exportiert, crypto-js fehlt im Manifest und eine Import-IIFE startet Mining. Die als async markierte Schleife enthält kein await und blockiert den Event Loop.
03 · Kontrollfluss
Was passiert in welcher Reihenfolge?
- Difficulty als endliche ganze Zahl im Hashbereich validieren.
- Nutzdaten und Nonce kollisionsfrei in Bytes codieren.
- SHA-256 berechnen und Zielpräfix prüfen.
- In begrenzten Batches fortfahren oder auf Abort reagieren.
- Zur Verifikation Hash neu berechnen; mitgelieferten Hash nicht blind vertrauen.
04 · Bauteile
Die entscheidenden Verträge
ProofOfWork.mine (intern)
Sucht synchron blockierend nach Nonce und Hash.
ProofOfWork.validate (intern)
Berechnet erneut und prüft Hash plus Präfix.
05 · Build it yourself
Selbst implementieren
Nutze WebCrypto oder node:crypto und verschiebe hohe Difficulty in einen Worker.
- Difficulty, Noncebereich und eindeutiges Encoding festlegen.
- Hashfunktion als austauschbaren, deterministischen Port implementieren.
- Batchgröße, Fortschritt, Attempt-Limit und AbortSignal anbieten.
async function sha256Hex(value: string) {
const bytes = new TextEncoder().encode(value);
const digest = await crypto.subtle.digest("SHA-256", bytes);
return [...new Uint8Array(digest)]
.map(byte => byte.toString(16).padStart(2, "0"))
.join("");
}
async function validate(data: string, nonce: number, difficulty: number) {
if (!Number.isInteger(difficulty) || difficulty < 0 || difficulty > 64) return false;
const hash = await sha256Hex(data.length + ":" + data + ":" + nonce);
return hash.startsWith("0".repeat(difficulty));
}06 · Verifizieren
Was du testen solltest
- Gefundene Nonce validiert, veränderte Nutzdaten oder Nonce validieren nicht.
- Negative, gebrochene, NaN- und zu große Difficulty werden abgelehnt.
- Abort beendet eine lange Suche zeitnah und Worker werden aufgeräumt.
07 · Grenzen
Kompromisse und Stolperfallen
- Mehr Difficulty erhöht Kosten exponentiell und benachteiligt schwache Geräte.
- Event-Loop-Yields halten die UI reaktionsfähig, Worker bieten echte Parallelität.
- Proof of Work verhindert Missbrauch nicht allein und ist energieintensiv.
Eine führende Hex-Null entspricht vier Difficulty-Bits. Stringkonkatenation ohne Längen- oder Trennencoding kann mehrdeutig sein.
08 · Weiterdenken