diff --git a/index.html b/index.html index 2a9bdce..ba7497d 100644 --- a/index.html +++ b/index.html @@ -16,7 +16,7 @@ - + diff --git a/jspow/.gitignore b/jspow/.gitignore new file mode 100644 index 0000000..dbf0821 --- /dev/null +++ b/jspow/.gitignore @@ -0,0 +1 @@ +node_modules/* \ No newline at end of file diff --git a/jspow/README.md b/jspow/README.md new file mode 100644 index 0000000..c87c8c8 --- /dev/null +++ b/jspow/README.md @@ -0,0 +1,3 @@ +# OnionrPOW-js + +lazy implementation of onionr proof of work \ No newline at end of file diff --git a/jspow/index.js b/jspow/index.js new file mode 100644 index 0000000..6dc790e --- /dev/null +++ b/jspow/index.js @@ -0,0 +1,83 @@ +/* +Copyright 2020 Kevin Froman + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ + +// version = 0.0.0 + +class Block { + constructor(meta, sig, signer, time, pow=0, c=0) { + this.meta = meta + this.sig = sig + this.signer = signer + this.time = time + this.c = c + } + } + + +let doHash = function(data){ + const shaObj = new jsSHA("SHA3-256", "UINT8ARRAY", { encoding: "UTF8" }); + shaObj.update(data) + return shaObj.getHash("UINT8ARRAY"); +} +let doHashHex = function(data){ + const shaObj = new jsSHA("SHA3-256", "UINT8ARRAY", { encoding: "UTF8" }); + shaObj.update(data) + return shaObj.getHash("HEX"); +} + +function doPow(metadata, data, difficulty){ + // Inefficient single threaded proof of work. Accepting better implementations! + var encoder = new TextEncoder("utf-8") + if (typeof data == 'string'){ + data = encoder.encode(data) + } + + metadata['c'] = 0 + metadata['n'] = Math.floor(Math.random() * Math.floor(10000)) + Math.floor(Math.random() * Math.floor(10000)) + + while (true){ + var difficultyCounter = 0 + let metadataString = encoder.encode(JSON.stringify(metadata) + "\n") + let arr = new Uint8Array(metadataString.length + data.length) + arr.set(metadataString) + arr.set(data, metadataString.length) + hash = doHash(arr) + + for (var i = 0; i < hash.length; i++){ + if (hash[i] == 0){ + difficultyCounter += 1 + if (difficultyCounter === difficulty){ + return arr + } + } + else{ + break + } + } + metadata['c'] += 1 + } + +} + +function unserialize(str, theClass) { + var instance = new theClass() // NOTE: if your constructor checks for unpassed arguments, then just pass dummy ones to prevent throwing an error + var serializedObject = JSON.parse(str) + Object.assign(instance, serializedObject) + return instance +} + + diff --git a/jspow/package.json b/jspow/package.json new file mode 100644 index 0000000..ed8f3b3 --- /dev/null +++ b/jspow/package.json @@ -0,0 +1,15 @@ +{ + "name": "onionr-jspow", + "version": "0.0.0", + "description": "Onionr POW JS Implementation", + "main": "index.js", + "type": "module", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "author": "", + "license": "GPL-3.0-or-later", + "dependencies": { + "sha3": "^2.1.3" + } +} diff --git a/onionr-jspow b/onionr-jspow deleted file mode 160000 index abd1872..0000000 --- a/onionr-jspow +++ /dev/null @@ -1 +0,0 @@ -Subproject commit abd1872a9174c983a75f2ffe102dab72da706b14