This commit is contained in:
lzx
2025-04-10 18:53:16 +08:00
parent 239b06227c
commit b4acd2aee6
48 changed files with 40898 additions and 0 deletions

28
public/baseResponse.js Normal file
View File

@@ -0,0 +1,28 @@
class SuccessResponse {
constructor(data) {
if (data) {
this.code = 0;
this.msg = "Success";
this.data = data;
} else {
this.code = 0;
this.msg = "Success";
}
}
}
class ErrorResponse {
constructor(data) {
if (data) {
this.code = -1;
this.msg = "Error";
this.data = data;
} else {
this.code = -1;
this.msg = "Error";
}
}
}
module.exports = { SuccessResponse, ErrorResponse };

View File

@@ -0,0 +1,10 @@
/**
* 计算算力占比
* @param {Array} list [{user:"user1", mhs24h:100}, {user:"user2", mhs24h:320}]
* @returns
*/
module.exports = (list) => {
const total_hashrate = list.reduce((sum, user) => sum + user.mhs24h, 0);
const users_weight = list.map((user) => ({ user: user.user, mhs24h: user.mhs24h, weight: user.mhs24h / total_hashrate }));
return users_weight
};

View File

@@ -0,0 +1,49 @@
/**
* 截取小数点后dots位
* @param {Number} number 要截取的小数
* @param {Number} dots 小数点位数
* @returns
*/
function truncateToTenDecimals(number, dots) {
const str = number.toString();
const decimalIndex = str.indexOf(".");
// 如果没有小数部分,直接返回原始数值
if (decimalIndex === -1) {
return str;
}
// 截取到小数点后 10 位
const truncatedStr = str.slice(0, decimalIndex + dots + 1);
return Number(truncatedStr);
}
/**
* 根据shares队列计算每个user本轮次的分配占比
* @param {Array} data [{user:"user1", pool_diff:100, miner_diff:100}, ]
* @returns {"1x1":{totalWeight:10, weightRatio:0.1}}
*/
function calculate_shares_weight(data) {
// Step 1: 按照 user 分类计算每个 user 的总 weight
const userWeights = data.reduce((acc, item) => {
const weight = item.miner_diff / item.pool_diff;
if (!acc[item.user]) {
acc[item.user] = { totalWeight: 0, data: [] };
}
acc[item.user].totalWeight += weight;
acc[item.user].data.push(item);
return acc;
}, {});
// Step 2: 计算所有 user 的总 weight
const totalWeight = Object.values(userWeights).reduce((acc, user) => acc + user.totalWeight, 0);
// Step 3: 计算每个 user 的 weight 占总 weight 的比重并返回所需格式
const userWeightRatios = Object.keys(userWeights).reduce((acc, user) => {
const weightRatio = truncateToTenDecimals(userWeights[user].totalWeight / totalWeight, 10);
acc[user] = Number(weightRatio);
return acc;
}, {});
return userWeightRatios;
}
module.exports = { calculate_shares_weight, truncateToTenDecimals };

7
public/endian.js Normal file
View File

@@ -0,0 +1,7 @@
const changeEndian = (hex) =>{
const buffer = Buffer.from(hex, 'hex');
const endian = Buffer.from(buffer.reverse())
const result = endian.toString("hex")
return result
}
module.exports = changeEndian

513
public/index.sql Normal file
View File

@@ -0,0 +1,513 @@
-- 矿工历史算力表
CREATE TABLE IF NOT EXISTS nexa_mhsv2(
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
user VARCHAR(64) NOT NULL,
miner VARCHAR(64) NOT NULL,
date DATETIME NOT NULL,
mhs30m DECIMAL(32, 6) NOT NULL,
mhs24h DECIMAL(32, 6) NOT NULL,
state VARCHAR(15) NOT NULL,
last_submit DATETIME NOT NULL
);
CREATE TABLE IF NOT EXISTS nexa_mhs_realv2(
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
user VARCHAR(64) NOT NULL,
miner VARCHAR(64) NOT NULL,
date DATETIME NOT NULL,
mhs30m DECIMAL(32, 6) NOT NULL,
mhs24h DECIMAL(32, 6) NOT NULL,
state VARCHAR(15) NOT NULL,
last_submit DATETIME NOT NULL
);
CREATE TABLE IF NOT EXISTS nexa_minersv2(
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
user VARCHAR(64) NOT NULL,
miner VARCHAR(64) NOT NULL,
date DATETIME NOT NULL,
accepts DECIMAL(16,8) NOT NULL,
state VARCHAR(10) NOT NULL,
last_submit DATETIME NOT NULL
);
-- 矿工历史算力表
CREATE TABLE IF NOT EXISTS grs_mhsv2(
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
user VARCHAR(64) NOT NULL,
miner VARCHAR(64) NOT NULL,
date DATETIME NOT NULL,
mhs30m DECIMAL(32, 6) NOT NULL,
mhs24h DECIMAL(32, 6) NOT NULL,
state VARCHAR(15) NOT NULL,
last_submit DATETIME NOT NULL
);
CREATE TABLE IF NOT EXISTS grs_mhs_realv2(
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
user VARCHAR(64) NOT NULL,
miner VARCHAR(64) NOT NULL,
date DATETIME NOT NULL,
mhs30m DECIMAL(32, 6) NOT NULL,
mhs24h DECIMAL(32, 6) NOT NULL,
state VARCHAR(15) NOT NULL,
last_submit DATETIME NOT NULL
);
CREATE TABLE IF NOT EXISTS grs_minersv2(
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
user VARCHAR(64) NOT NULL,
miner VARCHAR(64) NOT NULL,
date DATETIME NOT NULL,
accepts DECIMAL(16,8) NOT NULL,
state VARCHAR(10) NOT NULL,
last_submit DATETIME NOT NULL
);
-- 矿工历史算力表
CREATE TABLE IF NOT EXISTS mona_mhsv2(
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
user VARCHAR(64) NOT NULL,
miner VARCHAR(64) NOT NULL,
date DATETIME NOT NULL,
mhs30m DECIMAL(32, 6) NOT NULL,
mhs24h DECIMAL(32, 6) NOT NULL,
state VARCHAR(15) NOT NULL,
last_submit DATETIME NOT NULL
);
CREATE TABLE IF NOT EXISTS mona_mhs_realv2(
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
user VARCHAR(64) NOT NULL,
miner VARCHAR(64) NOT NULL,
date DATETIME NOT NULL,
mhs30m DECIMAL(32, 6) NOT NULL,
mhs24h DECIMAL(32, 6) NOT NULL,
state VARCHAR(15) NOT NULL,
last_submit DATETIME NOT NULL
);
CREATE TABLE IF NOT EXISTS mona_minersv2(
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
user VARCHAR(64) NOT NULL,
miner VARCHAR(64) NOT NULL,
date DATETIME NOT NULL,
accepts DECIMAL(16,8) NOT NULL,
state VARCHAR(10) NOT NULL,
last_submit DATETIME NOT NULL
);
-- 矿工历史算力表
CREATE TABLE IF NOT EXISTS dgbs_mhsv2(
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
user VARCHAR(64) NOT NULL,
miner VARCHAR(64) NOT NULL,
date DATETIME NOT NULL,
mhs30m DECIMAL(32, 6) NOT NULL,
mhs24h DECIMAL(32, 6) NOT NULL,
state VARCHAR(15) NOT NULL,
last_submit DATETIME NOT NULL
);
CREATE TABLE IF NOT EXISTS dgbs_mhs_realv2(
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
user VARCHAR(64) NOT NULL,
miner VARCHAR(64) NOT NULL,
date DATETIME NOT NULL,
mhs30m DECIMAL(32, 6) NOT NULL,
mhs24h DECIMAL(32, 6) NOT NULL,
state VARCHAR(15) NOT NULL,
last_submit DATETIME NOT NULL
);
CREATE TABLE IF NOT EXISTS dgbs_minersv2(
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
user VARCHAR(64) NOT NULL,
miner VARCHAR(64) NOT NULL,
date DATETIME NOT NULL,
accepts DECIMAL(16,8) NOT NULL,
state VARCHAR(10) NOT NULL,
last_submit DATETIME NOT NULL
);
-- 矿工历史算力表
CREATE TABLE IF NOT EXISTS dgbq_mhsv2(
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
user VARCHAR(64) NOT NULL,
miner VARCHAR(64) NOT NULL,
date DATETIME NOT NULL,
mhs30m DECIMAL(32, 6) NOT NULL,
mhs24h DECIMAL(32, 6) NOT NULL,
state VARCHAR(15) NOT NULL,
last_submit DATETIME NOT NULL
);
CREATE TABLE IF NOT EXISTS dgbq_mhs_realv2(
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
user VARCHAR(64) NOT NULL,
miner VARCHAR(64) NOT NULL,
date DATETIME NOT NULL,
mhs30m DECIMAL(32, 6) NOT NULL,
mhs24h DECIMAL(32, 6) NOT NULL,
state VARCHAR(15) NOT NULL,
last_submit DATETIME NOT NULL
);
CREATE TABLE IF NOT EXISTS dgbq_minersv2(
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
user VARCHAR(64) NOT NULL,
miner VARCHAR(64) NOT NULL,
date DATETIME NOT NULL,
accepts DECIMAL(16,8) NOT NULL,
state VARCHAR(10) NOT NULL,
last_submit DATETIME NOT NULL
);
-- 矿工历史算力表
CREATE TABLE IF NOT EXISTS dgbo_mhsv2(
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
user VARCHAR(64) NOT NULL,
miner VARCHAR(64) NOT NULL,
date DATETIME NOT NULL,
mhs30m DECIMAL(32, 6) NOT NULL,
mhs24h DECIMAL(32, 6) NOT NULL,
state VARCHAR(15) NOT NULL,
last_submit DATETIME NOT NULL
);
CREATE TABLE IF NOT EXISTS dgbo_mhs_realv2(
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
user VARCHAR(64) NOT NULL,
miner VARCHAR(64) NOT NULL,
date DATETIME NOT NULL,
mhs30m DECIMAL(32, 6) NOT NULL,
mhs24h DECIMAL(32, 6) NOT NULL,
state VARCHAR(15) NOT NULL,
last_submit DATETIME NOT NULL
);
CREATE TABLE IF NOT EXISTS dgbo_minersv2(
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
user VARCHAR(64) NOT NULL,
miner VARCHAR(64) NOT NULL,
date DATETIME NOT NULL,
accepts DECIMAL(16,8) NOT NULL,
state VARCHAR(10) NOT NULL,
last_submit DATETIME NOT NULL
);
CREATE TABLE IF NOT EXISTS nexa_blkreportprofitv2(
date DATETIME NOT NULL,
height INT NOT NULL PRIMARY KEY,
hash VARCHAR(255) NOT NULL,
reward DECIMAL(18,8) NOT NULL,
fees DECIMAL(18,8),
state TINYINT NOT NULL
);
CREATE TABLE IF NOT EXISTS mona_blkreportprofitv2(
date DATETIME NOT NULL,
height INT NOT NULL PRIMARY KEY,
hash VARCHAR(255) NOT NULL,
reward DECIMAL(18,8) NOT NULL,
fees DECIMAL(18,8),
state TINYINT NOT NULL
);
CREATE TABLE IF NOT EXISTS grs_blkreportprofitv2(
date DATETIME NOT NULL,
height INT NOT NULL PRIMARY KEY,
hash VARCHAR(255) NOT NULL,
reward DECIMAL(18,8) NOT NULL,
fees DECIMAL(18,8),
state TINYINT NOT NULL
);
CREATE TABLE IF NOT EXISTS dgbq_blkreportprofitv2(
date DATETIME NOT NULL,
height INT NOT NULL PRIMARY KEY,
hash VARCHAR(255) NOT NULL,
reward DECIMAL(18,8) NOT NULL,
fees DECIMAL(18,8),
state TINYINT NOT NULL
);
CREATE TABLE IF NOT EXISTS dgbo_blkreportprofitv2(
date DATETIME NOT NULL,
height INT NOT NULL PRIMARY KEY,
hash VARCHAR(255) NOT NULL,
reward DECIMAL(18,8) NOT NULL,
fees DECIMAL(18,8),
state TINYINT NOT NULL
);
CREATE TABLE IF NOT EXISTS dgbs_blkreportprofitv2(
date DATETIME NOT NULL,
height INT NOT NULL PRIMARY KEY,
hash VARCHAR(255) NOT NULL,
reward DECIMAL(18,8) NOT NULL,
fees DECIMAL(18,8),
state TINYINT NOT NULL
);
-- 矿工历史算力表
CREATE TABLE IF NOT EXISTS rxd_mhsv2(
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
user VARCHAR(64) NOT NULL,
miner VARCHAR(64) NOT NULL,
date DATETIME NOT NULL,
mhs30m DECIMAL(32, 6) NOT NULL,
mhs24h DECIMAL(32, 6) NOT NULL,
state VARCHAR(15) NOT NULL,
last_submit DATETIME NOT NULL
);
CREATE TABLE IF NOT EXISTS rxd_mhs_realv2(
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
user VARCHAR(64) NOT NULL,
miner VARCHAR(64) NOT NULL,
date DATETIME NOT NULL,
mhs30m DECIMAL(32, 6) NOT NULL,
mhs24h DECIMAL(32, 6) NOT NULL,
state VARCHAR(15) NOT NULL,
last_submit DATETIME NOT NULL
);
CREATE TABLE IF NOT EXISTS rxd_minersv2(
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
user VARCHAR(64) NOT NULL,
miner VARCHAR(64) NOT NULL,
date DATETIME NOT NULL,
accepts DECIMAL(16,8) NOT NULL,
state VARCHAR(10) NOT NULL,
last_submit DATETIME NOT NULL
);
CREATE TABLE IF NOT EXISTS rxd_blkreportprofitv2(
date DATETIME NOT NULL,
height INT NOT NULL PRIMARY KEY,
hash VARCHAR(255) NOT NULL,
reward DECIMAL(18,8) NOT NULL,
fees DECIMAL(18,8),
state TINYINT NOT NULL
);
-- 矿工历史算力表
CREATE TABLE IF NOT EXISTS enx_mhsv2(
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
user VARCHAR(64) NOT NULL,
miner VARCHAR(64) NOT NULL,
date DATETIME NOT NULL,
mhs30m DECIMAL(32, 6) NOT NULL,
mhs24h DECIMAL(32, 6) NOT NULL,
state VARCHAR(15) NOT NULL,
last_submit DATETIME NOT NULL
);
CREATE TABLE IF NOT EXISTS enx_mhs_realv2(
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
user VARCHAR(64) NOT NULL,
miner VARCHAR(64) NOT NULL,
date DATETIME NOT NULL,
mhs30m DECIMAL(32, 6) NOT NULL,
mhs24h DECIMAL(32, 6) NOT NULL,
state VARCHAR(15) NOT NULL,
last_submit DATETIME NOT NULL
);
CREATE TABLE IF NOT EXISTS enx_minersv2(
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
user VARCHAR(64) NOT NULL,
miner VARCHAR(64) NOT NULL,
date DATETIME NOT NULL,
accepts DECIMAL(16,8) NOT NULL,
state VARCHAR(10) NOT NULL,
last_submit DATETIME NOT NULL
);
CREATE TABLE IF NOT EXISTS enx_blkreportprofitv2(
date DATETIME NOT NULL,
height INT NOT NULL PRIMARY KEY,
hash VARCHAR(255) NOT NULL,
reward DECIMAL(18,8) NOT NULL,
fees DECIMAL(18,8),
state TINYINT NOT NULL
);
-- 矿工历史算力表
CREATE TABLE IF NOT EXISTS alph_mhsv2(
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
user VARCHAR(64) NOT NULL,
miner VARCHAR(64) NOT NULL,
date DATETIME NOT NULL,
mhs30m DECIMAL(32, 6) NOT NULL,
mhs24h DECIMAL(32, 6) NOT NULL,
state VARCHAR(15) NOT NULL,
last_submit DATETIME NOT NULL
);
CREATE TABLE IF NOT EXISTS alph_mhs_realv2(
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
user VARCHAR(64) NOT NULL,
miner VARCHAR(64) NOT NULL,
date DATETIME NOT NULL,
mhs30m DECIMAL(32, 6) NOT NULL,
mhs24h DECIMAL(32, 6) NOT NULL,
state VARCHAR(15) NOT NULL,
last_submit DATETIME NOT NULL
);
CREATE TABLE IF NOT EXISTS alph_minersv2(
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
user VARCHAR(64) NOT NULL,
miner VARCHAR(64) NOT NULL,
date DATETIME NOT NULL,
accepts DECIMAL(16,8) NOT NULL,
state VARCHAR(10) NOT NULL,
last_submit DATETIME NOT NULL
);
CREATE TABLE IF NOT EXISTS alph_blkreportprofitv2(
date DATETIME NOT NULL,
height INT NOT NULL PRIMARY KEY,
hash VARCHAR(255) NOT NULL,
reward DECIMAL(32,8) NOT NULL,
fees DECIMAL(32,8),
state TINYINT NOT NULL
);
CREATE TABLE IF NOT EXISTS `alph_pool_blkstats` (
`id` INT(10) NOT NULL AUTO_INCREMENT,
`date` DATETIME NOT NULL,
`height` INT(10),
`hash` VARCHAR(128),
`pow` VARCHAR(128),
`net_target` VARCHAR(128),
`submit` VARCHAR(64),
`success` TINYINT(1),
`accepts` DECIMAL(32,6),
`rejects` DECIMAL(32,6),
`reward` DECIMAL(32,6),
`fee` DECIMAL(32,6),
`nonce` VARCHAR(64),
`subidx` INT(10),
PRIMARY KEY (`id`)
);
CREATE TABLE `alph_miners` (
`id` INT(10) NOT NULL AUTO_INCREMENT,
`date` DATETIME NOT NULL,
`fromip` VARCHAR(64),
`state` VARCHAR(64),
`online` DATETIME,
`offline` DATETIME,
`retry` INT(10),
`duration` DECIMAL(12,6),
`protocol` VARCHAR(64),
`user` VARCHAR(128),
`miner` VARCHAR(128),
`refindex` VARCHAR(128),
`diff` DECIMAL(32,6),
`height` INT(10),
`accepts` DECIMAL(32,6),
`rejects` DECIMAL(32,6),
`ratio` DECIMAL(32,6),
`staleds` DECIMAL(32,6),
`lows` DECIMAL(32,6),
`duplicates` DECIMAL(32,6),
`formats` DECIMAL(32,6),
`others` DECIMAL(32,6),
`is_disabled` TINYINT(1),
`last_submit` DATETIME,
`submits` INT(10),
`blocks` INT(10),
`orphans` INT(10),
`orphan_ratio` DECIMAL(32,6),
PRIMARY KEY (`id`)
);
CREATE TABLE `alph_miners_stats` (
`id` INT(10) NOT NULL AUTO_INCREMENT,
`date` DATETIME NOT NULL,
`user` VARCHAR(128),
`miner` VARCHAR(128),
`refindex` VARCHAR(128),
`shares5m` DECIMAL(32,6),
`shares15m` DECIMAL(32,6),
`shares30m` DECIMAL(32,6),
`shares1h` DECIMAL(32,6),
`shares3h` DECIMAL(32,6),
`shares6h` DECIMAL(32,6),
`shares12h` DECIMAL(32,6),
`shares24h` DECIMAL(32,6),
`shares48h` DECIMAL(32,6),
`rejects5m` DECIMAL(32,6),
`rejects15m` DECIMAL(32,6),
`rejects30m` DECIMAL(32,6),
`rejects1h` DECIMAL(32,6),
`rejects3h` DECIMAL(32,6),
`rejects6h` DECIMAL(32,6),
`rejects12h` DECIMAL(32,6),
`rejects24h` DECIMAL(32,6),
`rejects48h` DECIMAL(32,6),
`mhs5m` DECIMAL(32,6),
`mhs15m` DECIMAL(32,6),
`mhs30m` DECIMAL(32,6),
`mhs1h` DECIMAL(32,6),
`mhs3h` DECIMAL(32,6),
`mhs6h` DECIMAL(32,6),
`mhs12h` DECIMAL(32,6),
`mhs24h` DECIMAL(32,6),
`mhs48h` DECIMAL(32,6),
`ratio5m` DECIMAL(32,6),
`ratio15m` DECIMAL(32,6),
`ratio30m` DECIMAL(32,6),
`ratio1h` DECIMAL(32,6),
`ratio3h` DECIMAL(32,6),
`ratio6h` DECIMAL(32,6),
`ratio12h` DECIMAL(32,6),
`ratio24h` DECIMAL(32,6),
`ratio48h` DECIMAL(32,6),
PRIMARY KEY (`id`)
);
CREATE TABLE `alph_blk_height_detail` (
`id` INT(10) NOT NULL AUTO_INCREMENT,
`date` DATETIME NOT NULL,
`from` INT(10),
`to` INT(10),
PRIMARY KEY (`id`)
);
CREATE TABLE `alph_blk_detail` (
`id` INT(10) NOT NULL AUTO_INCREMENT,
`date` DATETIME NOT NULL,
`height` INT(10),
`hash` VARCHAR(128),
`user` VARCHAR(128),
`miner` VARCHAR(128),
`refindex` VARCHAR(128),
`success` TINYINT(1),
`miner_diff` DECIMAL(32,6),
`pool_diff` DECIMAL(32,6),
`nonce` VARCHAR(64),
`subidx` INT(10),
PRIMARY KEY (`id`)
);
CREATE TABLE `alph_blk_new` (
`id` INT(10) NOT NULL AUTO_INCREMENT,
`date` DATETIME NOT NULL,
`height` INT(10),
`hash` VARCHAR(128),
`success` TINYINT(1),
`nonce` VARCHAR(64),
`subidx` INT(10),
PRIMARY KEY (`id`)
);

33
public/retry.js Normal file
View File

@@ -0,0 +1,33 @@
/**
* 异步任务重试器
* @param {Function} task 异步任务
* @param {Number} maxRetries 最大重试次数
* @param {Number} delay 重试间隔(秒)
* @returns
*/
async function executeWithRetry(task, maxRetries, delay) {
let attempts = 0;
while (attempts < maxRetries) {
try {
// 尝试执行异步任务
const result = await task();
// console.log("任务成功");
return result; // 成功时返回结果
} catch (error) {
attempts++;
console.error(`尝试 ${attempts} 失败:`, error.message);
if (attempts >= maxRetries) {
console.error("已达最大重试次数,任务失败。");
throw error; // 达到最大重试次数时抛出错误
}
console.log(`等待 ${delay} 秒后重试...`);
// 等待指定时间后再重试
await new Promise((resolve) => setTimeout(resolve, delay * 1000));
}
}
}
module.exports = executeWithRetry

48
public/score.js Normal file
View File

@@ -0,0 +1,48 @@
// 计算标准差
function caculate_standar_deviation(data) {
// 计算数学期望(均值)
const calculateMean = (values) => {
const total = values.reduce((acc, value) => acc + parseFloat(value), 0);
return total / values.length;
};
// 计算标准差
const calculateStandardDeviation = (values, mean) => {
const variance = values.reduce((acc, value) => acc + Math.pow(parseFloat(value) - mean, 2), 0) / values.length;
return Math.sqrt(variance);
};
// 计算每个用户的标准差
const results = Object.keys(data).reduce((acc, user) => {
const values = data[user];
const mean = calculateMean(values);
const stddev = calculateStandardDeviation(values, mean);
acc[user] = stddev;
return acc;
}, {});
return results;
}
/**
* 计算每个用户最终得分满分为100分
* @param {Array} alluser_mhs24h 每个用户过去24小时平均算力
* @param {Number} hash_percent 24小时平均算力权重
* @returns 每个用户最终得分
*/
function score(alluser_mhs24h, hash_percent = 1) {
// 提取 mhs24h 数值
const hashrateValues = alluser_mhs24h.map((obj) => obj.mhs24h);
// 计算总和
const totalHashrate = hashrateValues.reduce((sum, value) => sum + value, 0);
const result = {};
// 计算每个用户的算力占比
for (let { user, mhs24h } of alluser_mhs24h) {
result[user] = (mhs24h / totalHashrate) * hash_percent;
}
return result;
}
module.exports = { caculate_standar_deviation, score };

52
public/times.js Normal file
View File

@@ -0,0 +1,52 @@
class Times {
static bjTime(dateForm) {
if (dateForm === "") {
//解决deteForm为空传1970-01-01 00:00:00
return "";
} else {
var dateee = new Date(dateForm).toJSON();
var date = new Date(+new Date(dateee) + 8 * 3600 * 1000)
.toISOString()
.replace(/T/g, " ")
.replace(/\.[\d]{3}Z/, "");
return date;
}
}
static utcTime(dateForm) {
if (dateForm === "") {
//解决deteForm为空传1970-01-01 00:00:00
return "";
} else {
var dateee = new Date(dateForm).toJSON();
var date = new Date(+new Date(dateee))
.toISOString()
.replace(/T/g, " ")
.replace(/\.[\d]{3}Z/, "");
return date;
}
}
static times() {
const date = new Date();
const y = date.getFullYear();
const M = String(date.getMonth() + 1).padStart(2, '0');
const d = String(date.getDate()).padStart(2, '0');
const h = String(date.getHours()).padStart(2, '0');
const m = String(date.getMinutes()).padStart(2, '0');
const s = String(date.getSeconds()).padStart(2, '0');
return [
`${y}-${M}-${d} ${h}:${m}`, // 格式YYYY-MM-DD HH:mm
`${y}-${M}-${d} ${h}:${m}:${s}`, // 格式YYYY-MM-DD HH:mm:ss
`${y}-${M}-${d}`, // 格式YYYY-MM-DD
`${m}`, // 分钟格式mm
`${h}`, // 小时格式HH
`${d}` // 日期格式DD
];
}
}
module.exports = Times;