app v1.0
This commit is contained in:
28
public/baseResponse.js
Normal file
28
public/baseResponse.js
Normal 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 };
|
||||
|
||||
10
public/distribution-hashrate.js
Normal file
10
public/distribution-hashrate.js
Normal 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
|
||||
};
|
||||
49
public/distribution-shares.js
Normal file
49
public/distribution-shares.js
Normal 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
7
public/endian.js
Normal 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
513
public/index.sql
Normal 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
33
public/retry.js
Normal 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
48
public/score.js
Normal 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
52
public/times.js
Normal 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;
|
||||
|
||||
Reference in New Issue
Block a user