commit d3684a8f2584e08b1b0a7b3aec5ba8b38b75cd1a Author: _xxfedexx_ <> Date: Fri Apr 28 17:06:45 2023 +0200 upload stuff diff --git a/main.js b/main.js new file mode 100644 index 0000000..27dbee5 --- /dev/null +++ b/main.js @@ -0,0 +1,235 @@ +var drawChart +(() => { + const difficulty_window = 69; + const target = 10; + + // possible diff algos: LWMA, Cryptonote, MA, EMA + const diffAlgo = "Cryptonote" + + const CryptonoteCut = 0; // 12 + + + document.getElementById("title").innerText = `Diff algo: ${diffAlgo} - window: ${difficulty_window} ${(diffAlgo === "Cryptonote" ? "cut: "+CryptonoteCut : "")}` + + let blocks = [] + let hashrates = [] + + let difficulty = 10; + let time = 0; + + + function mineBlock(hashrate) { + time = 0; + while (true) { + time++; + if (hashrate / difficulty > Math.random()) { + blocks.push({ + t: time, + d: difficulty, + }) + hashrates.push(hashrate) + calculateDifficulty() + return + } + } + } + + for (let x = 0; x < 5; x++) { + for (let i = 0; i < 350; i++) { + mineBlock(10) + } + for (let i = 0; i < 350; i++) { + mineBlock(6) + } + + } + + function calculateDifficulty() { + if (blocks.length < 2) return; + const bScan = Math.min(difficulty_window, blocks.length - 1) + let blocksToScan = blocks.slice(blocks.length - bScan - 1, blocks.length - 1) + //console.log(blocksToScan) + + let avgTime = 0; + let avgDiff = 0; + + if (diffAlgo === "LWMA") { + let totalWeights = 0; + //console.clear() + + for (i in blocksToScan) { + let curW = bScan - (bScan - i) + 1 // i+1 + //console.log("curW", curW) + + totalWeights += curW + + avgTime += blocksToScan[i].t * curW + avgDiff += blocksToScan[i].d * curW + + //console.log("diff",blocksToScan[i].d) + } + avgTime /= totalWeights + avgDiff /= totalWeights // bScan + } else if (diffAlgo === "EMA") { + let totalWeights = 0; + //console.clear() + + for (i in blocksToScan) { + let curW = (bScan - (bScan - i) + 1) ** 2 // i+1 + //console.log("curW", curW) + + totalWeights += curW + + avgTime += blocksToScan[i].t * curW + avgDiff += blocksToScan[i].d * curW + + //console.log("diff",blocksToScan[i].d) + } + avgTime /= totalWeights + avgDiff /= totalWeights // bScan + } else if (diffAlgo === "MA") { + for (i in blocksToScan) { + + avgTime += blocksToScan[i].t + avgDiff += blocksToScan[i].d + } + avgTime /= bScan + avgDiff /= bScan // bScan + } else if (diffAlgo === "Cryptonote") { + let cut = Math.max(Math.min(CryptonoteCut, Math.floor(bScan / 2) - 2), 0) + if (bScan < difficulty_window) { + cut = 0; + } + if (cut >= bScan) { + throw new Error("invalid cut " + CryptonoteCut + " with window of " + bScan) + } + + let blTimes = [] + for (i of blocksToScan) { + blTimes.push(i.t) + avgDiff += i.d + + } + blTimes = blTimes.slice(cut, blTimes.length - cut) + + for (i of blTimes) { + avgTime += i + + + } + avgTime /= (bScan - cut) + avgDiff /= bScan // bScan + } + diffMultiplier = Math.min(Math.max(target / avgTime, 0.1), 10) + //console.log("avgTime: " + avgTime + " avgDiff: " + avgDiff + " multiplier: " + diffMultiplier) + difficulty = Math.ceil(avgDiff * diffMultiplier) // Math.round(avgDiff * diffMultiplier) + //console.log(difficulty) + } + + + + + + let blockDiffs = [] + let blockTimes = [] + let blockHeights = [] + lastBlockTime = target; + + let deviation = 0; + let diffDeviation = 0; + + for (i in blocks) { + blockDiffs.push(blocks[i].d) + const blockTime = (blocks[i].t + lastBlockTime * 30) / 31 + + const perfectDiff = hashrates[i] * target + console.log("perfectDiff:", perfectDiff) + diffDeviation += Math.sqrt(Math.abs(perfectDiff - blocks[i].d)) + + deviation += Math.sqrt(Math.abs(blocks[i].t - blockTime)) + + blockTimes.push(blockTime) + lastBlockTime = blockTime + + + blockHeights.push(i) + + } + deviation /= blocks.length + diffDeviation /= blocks.length + + const ctx = document.getElementById("myChart"); + const stats = document.getElementById("stats"); + + stats.innerText = `block time st.devt: ${(deviation / target * 100).toFixed(2)}% - difficulty st.devt. from perfect value: ${diffDeviation.toFixed(2)}` + + + drawChart = () => { + new Chart(ctx, { + type: "line", + data: { + labels: blockHeights, + datasets: [{ + label: "Mean Block Time", + data: blockTimes, + borderWidth: 1, + }, + { + label: "Difficulty", + data: blockDiffs, + yAxisID: "y1", + borderWidth: 1 + }, { + label: "Hashrate", + data: hashrates, + yAxisID: "y2", + borderWidth: 1 + }, + + ] + }, + options: { + // tension: 0.5, + elements: { + point: { + radius: 0, + hoverRadius: 3 + }, + line: { + width: 1 + } + }, + scales: { + y: { + type: "linear", // logarithmic + display: true, + position: "left", + max: 20, + min: 0 + }, + y1: { + type: "linear", + display: true, + position: "right", + min: 0, + max: 200, + + // grid line settings + grid: { + drawOnChartArea: false, // only want the grid lines for one axis to show up + }, + }, + y2: { + type: "linear", + display: false, + min: 0 + } + + } + } + }); + } + + +})() + diff --git a/test.html b/test.html new file mode 100644 index 0000000..766f9bb --- /dev/null +++ b/test.html @@ -0,0 +1,13 @@ + + +
+
+ +
+ +
+ + + + + \ No newline at end of file