<!DOCTYPE html> <!-- SPDX-License-Identifier: BSD-2-Clause SPDX-FileCopyrightText: Copyright (c) 2025 Runxi Yu <https://runxiyu.org> --> <html lang="en"> <head> <meta charset="utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1" /> <title>Proof-of-work challenge</title> <link rel="stylesheet" href="/.powxy/static/style.css" /> <script> /* @licstart The following is the entire license notice for the JavaScript code in this page. Copyright (C) 2025 Runxi Yu Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. @licend The above is the entire license notice for the JavaScript code in this page. */ </script> </head> <body> <main> <header> <h1>Proof-of-work challenge</h1> </header> <section> <p>This site is protected by <a href="{{ .Global.SourceURL }}">Powxy</a>{{ if .Global.Version }} {{ .Global.Version }}{{ end }}.</p> <p>You must complete this proof-of-work challenge before you can access this site.</p> </section> <section> <p>Select a nonce no longer than 32 bytes, such that when it is appended to the decoded form of the challenge identifier, and the entire result is hashed with SHA-256, the first {{ .Global.NeedBits }} bits of the SHA-256 hash are all zeros. Within one octet, higher bits are considered to come before lower bits.</p> <p>In other words, find an nonce <math display="inline" xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mi>N</mi><annotation encoding="application/x-tex">N</annotation></semantics></math> with <math display="inline" xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false" form="prefix">|</mo><mi>N</mi><mo stretchy="false" form="postfix">|</mo><mo>≤</mo><mn>32</mn><mspace width="0.167em"></mspace><mi mathvariant="normal">B</mi></mrow><annotation encoding="application/x-tex">\lvert N\rvert \le 32\,\mathrm{B}</annotation></semantics></math>, such that <math display="inline" xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mrow><mi mathvariant="normal">S</mi><mi mathvariant="normal">H</mi><mi mathvariant="normal">A</mi><mn mathvariant="normal">256</mn></mrow><mrow><mo stretchy="true" form="prefix">(</mo><mi>I</mi><mspace width="0.167em"></mspace><mo stretchy="false" form="postfix">∥</mo><mspace width="0.167em"></mspace><mi>N</mi><mo stretchy="true" form="postfix">)</mo></mrow><mo><</mo><msup><mn>2</mn><mn>{{ .Global.NeedBitsReverse }}</mn></msup></mrow><annotation encoding="application/x-tex">\mathrm{SHA256}(I \,\|\, N) < 2^{{{ .Global.NeedBitsReverse }}}</annotation></semantics></math> in big endian, where <math display="inline" xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mi>I</mi><annotation encoding="application/x-tex">I</annotation></semantics></math> is the identifier provided below.</p> <label for="identifier">Challenge identifier (read-only)</label> <pre id="identifier">{{ .Identifier }}</pre> </section> <section> <form method="POST"> <p>Encode your selected nonce in base64 and submit it below.</p> <p>Please note that if your submission is successful, you will be given a cookie that will allow you to access this site for a period of time without having to complete the challenge again. By pressing the submit button, you agree to be given cookies for this purpose.</p> <label for="nonce">Nonce</label> <input id="nonce" name="powxy" type="text" /> <input type="submit" value="Submit" /> </form> </section> {{- if .Message }} <section> <p><strong>{{ .Message }}</strong></p> </section> {{- end }} <section> <p class="somewhat-transparent" id="solver_status">JavaScript seems to be disabled. You must solve the challenge externally.</p> </section> <section> <p class="somewhat-transparent"><a href="/.powxy/static/solver.c">A C implementation of the challenge solver</a> is available.</p> </section> </main> <script> document.addEventListener("DOMContentLoaded", async function() { let challenge_b64 = "{{ .Identifier }}"; let difficulty = {{ .Global.NeedBits }}; let form = document.querySelector("form"); let field = form.querySelector("input[name='powxy']"); let status_el = document.getElementById("solver_status"); let identifier_bytes = Uint8Array.from( atob(challenge_b64), ch => ch.charCodeAt(0) ); status_el.textContent = "Starting WebAssembly solver as a worker..."; let worker = new Worker("/.powxy/static/solver.js"); worker.onmessage = function(e) { let { nonce, nonce_bytes } = e.data; let nonce_str = String.fromCharCode(...nonce_bytes); field.value = btoa(nonce_str); status_el.textContent = "Challenge solved automatically in " + nonce + " iterations"; }; worker.postMessage({ identifier_bytes, difficulty }); }); </script> </body> </html>