js代码改写py
This commit is contained in:
29
m2pool_backend_app/public/baseResponse.py
Normal file
29
m2pool_backend_app/public/baseResponse.py
Normal file
@@ -0,0 +1,29 @@
|
||||
class SuccessResponse:
|
||||
def __init__(self, data=None):
|
||||
self.code = 0
|
||||
self.msg = "Success"
|
||||
if data:
|
||||
self.data = data
|
||||
|
||||
def to_dict(self):
|
||||
result = {"code": self.code, "msg": self.msg}
|
||||
if hasattr(self, "data"):
|
||||
result["data"] = self.data
|
||||
return result
|
||||
|
||||
|
||||
class ErrorResponse:
|
||||
def __init__(self, data=None):
|
||||
self.code = -1
|
||||
self.msg = "Error"
|
||||
if data:
|
||||
self.data = data
|
||||
|
||||
def to_dict(self):
|
||||
result = {"code": self.code, "msg": self.msg}
|
||||
if hasattr(self, "data"):
|
||||
result["data"] = self.data
|
||||
return result
|
||||
|
||||
|
||||
__all__ = ["SuccessResponse", "ErrorResponse"]
|
||||
11
m2pool_backend_app/public/distribution-hashrate.py
Normal file
11
m2pool_backend_app/public/distribution-hashrate.py
Normal file
@@ -0,0 +1,11 @@
|
||||
def compute_weights(lst):
|
||||
total_hashrate = sum(user["mhs24h"] for user in lst)
|
||||
users_weight = [
|
||||
{
|
||||
"user": user["user"],
|
||||
"mhs24h": user["mhs24h"],
|
||||
"weight": user["mhs24h"] / total_hashrate
|
||||
}
|
||||
for user in lst
|
||||
]
|
||||
return users_weight
|
||||
45
m2pool_backend_app/public/distribution-shares.py
Normal file
45
m2pool_backend_app/public/distribution-shares.py
Normal file
@@ -0,0 +1,45 @@
|
||||
from typing import List, Dict, Any
|
||||
from decimal import Decimal, getcontext, ROUND_DOWN
|
||||
|
||||
getcontext().prec = 50 # 高精度,避免极端值丢失
|
||||
|
||||
def truncate_to_decimals_js(number: float, dots: int) -> float:
|
||||
dec = Decimal(str(number))
|
||||
# 转成字符串,避免科学计数法
|
||||
s = format(dec, "f")
|
||||
if "." not in s:
|
||||
return float(s)
|
||||
integer_part, frac_part = s.split(".")
|
||||
truncated_frac = frac_part[:dots] # 截取小数点后 dots 位
|
||||
truncated_str = f"{integer_part}.{truncated_frac}" if truncated_frac else integer_part
|
||||
return float(truncated_str)
|
||||
|
||||
|
||||
def calculate_shares_weight_js(data: List[Dict[str, Any]]) -> Dict[str, float]:
|
||||
user_weights: Dict[str, Dict[str, Any]] = {}
|
||||
for item in data:
|
||||
user = item.get("user")
|
||||
pool_diff = Decimal(str(item.get("pool_diff", 0)))
|
||||
miner_diff = Decimal(str(item.get("miner_diff", 0)))
|
||||
weight = Decimal("0")
|
||||
if pool_diff != 0:
|
||||
weight = miner_diff / pool_diff
|
||||
if user not in user_weights:
|
||||
user_weights[user] = {"totalWeight": Decimal("0"), "data": []}
|
||||
user_weights[user]["totalWeight"] += weight
|
||||
user_weights[user]["data"].append(item)
|
||||
|
||||
total_weight = sum(u["totalWeight"] for u in user_weights.values())
|
||||
|
||||
if total_weight == 0:
|
||||
return {user: 0.0 for user in user_weights.keys()}
|
||||
|
||||
result: Dict[str, float] = {}
|
||||
for user, v in user_weights.items():
|
||||
ratio = v["totalWeight"] / total_weight
|
||||
result[user] = truncate_to_decimals_js(float(ratio), 10)
|
||||
|
||||
return result
|
||||
|
||||
|
||||
__all__ = ["calculate_shares_weight_js", "truncate_to_decimals_js"]
|
||||
11
m2pool_backend_app/public/endian.py
Normal file
11
m2pool_backend_app/public/endian.py
Normal file
@@ -0,0 +1,11 @@
|
||||
def change_endian(hex_str: str) -> str:
|
||||
# Convert hex string to bytes
|
||||
buffer = bytes.fromhex(hex_str)
|
||||
# Reverse the byte order
|
||||
endian = buffer[::-1]
|
||||
# Convert back to hex string
|
||||
result = endian.hex()
|
||||
return result
|
||||
|
||||
|
||||
__all__ = ["change_endian"]
|
||||
513
m2pool_backend_app/public/index.sql
Normal file
513
m2pool_backend_app/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`)
|
||||
);
|
||||
22
m2pool_backend_app/public/retry.py
Normal file
22
m2pool_backend_app/public/retry.py
Normal file
@@ -0,0 +1,22 @@
|
||||
import asyncio
|
||||
import sys
|
||||
|
||||
async def execute_with_retry(task, max_retries, delay):
|
||||
attempts = 0
|
||||
|
||||
while attempts < max_retries:
|
||||
try:
|
||||
return await task()
|
||||
except Exception as error:
|
||||
attempts += 1
|
||||
print(f"尝试 {attempts} 失败: {error}", file=sys.stderr)
|
||||
|
||||
if attempts >= max_retries:
|
||||
print("已达最大重试次数,任务失败。", file=sys.stderr)
|
||||
raise
|
||||
|
||||
print(f"等待 {delay} 秒后重试...")
|
||||
await asyncio.sleep(delay)
|
||||
|
||||
|
||||
__all__ = ["execute_with_retry"]
|
||||
35
m2pool_backend_app/public/score.py
Normal file
35
m2pool_backend_app/public/score.py
Normal file
@@ -0,0 +1,35 @@
|
||||
def caculate_standar_deviation(data):
|
||||
def calculate_mean(values):
|
||||
total = sum(float(value) for value in values)
|
||||
return total / len(values)
|
||||
|
||||
def calculate_standard_deviation(values, mean):
|
||||
variance = sum((float(value) - mean) ** 2 for value in values) / len(values)
|
||||
return variance ** 0.5
|
||||
|
||||
results = {}
|
||||
for user in data:
|
||||
values = data[user]
|
||||
mean = calculate_mean(values)
|
||||
stddev = calculate_standard_deviation(values, mean)
|
||||
results[user] = stddev
|
||||
|
||||
return results
|
||||
|
||||
|
||||
def score(alluser_mhs24h, hash_percent=1):
|
||||
hashrate_values = [obj["mhs24h"] for obj in alluser_mhs24h]
|
||||
|
||||
total_hashrate = sum(hashrate_values)
|
||||
|
||||
result = {}
|
||||
|
||||
for item in alluser_mhs24h:
|
||||
user = item["user"]
|
||||
mhs24h = item["mhs24h"]
|
||||
result[user] = (mhs24h / total_hashrate) * hash_percent
|
||||
|
||||
return result
|
||||
|
||||
|
||||
__all__ = ["caculate_standar_deviation", "score"]
|
||||
66
m2pool_backend_app/public/times.py
Normal file
66
m2pool_backend_app/public/times.py
Normal file
@@ -0,0 +1,66 @@
|
||||
from datetime import datetime, timezone, timedelta
|
||||
from email.utils import parsedate_to_datetime
|
||||
|
||||
|
||||
class Times:
|
||||
@staticmethod
|
||||
def _js_date_parse(date_form: str) -> datetime:
|
||||
if date_form == "":
|
||||
raise ValueError("Invalid Date")
|
||||
try:
|
||||
if date_form.endswith("Z"):
|
||||
return datetime.fromisoformat(date_form.replace("Z", "+00:00"))
|
||||
return datetime.fromisoformat(date_form)
|
||||
except Exception:
|
||||
pass
|
||||
try:
|
||||
return datetime.strptime(date_form, "%Y-%m-%d %H:%M:%S")
|
||||
except Exception:
|
||||
pass
|
||||
try:
|
||||
return datetime.strptime(date_form, "%Y/%m/%d %H:%M:%S")
|
||||
except Exception:
|
||||
pass
|
||||
try:
|
||||
return parsedate_to_datetime(date_form)
|
||||
except Exception:
|
||||
pass
|
||||
raise ValueError("Invalid Date")
|
||||
|
||||
@staticmethod
|
||||
def bj_time(date_form: str) -> str:
|
||||
if date_form == "":
|
||||
return ""
|
||||
dt = Times._js_date_parse(date_form)
|
||||
if dt.tzinfo is None:
|
||||
dt = dt.replace(tzinfo=timezone.utc)
|
||||
bj_dt = dt + timedelta(hours=8)
|
||||
return bj_dt.strftime("%Y-%m-%d %H:%M:%S")
|
||||
|
||||
@staticmethod
|
||||
def utc_time(date_form: str) -> str:
|
||||
if date_form == "":
|
||||
return ""
|
||||
dt = Times._js_date_parse(date_form)
|
||||
if dt.tzinfo is None:
|
||||
dt = dt.replace(tzinfo=timezone.utc)
|
||||
utc_dt = dt.astimezone(timezone.utc)
|
||||
return utc_dt.strftime("%Y-%m-%d %H:%M:%S")
|
||||
|
||||
@staticmethod
|
||||
def times():
|
||||
now = datetime.now()
|
||||
y = now.strftime("%Y")
|
||||
M = now.strftime("%m")
|
||||
d = now.strftime("%d")
|
||||
h = now.strftime("%H")
|
||||
m = now.strftime("%M")
|
||||
s = now.strftime("%S")
|
||||
return [
|
||||
f"{y}-{M}-{d} {h}:{m}",
|
||||
f"{y}-{M}-{d} {h}:{m}:{s}",
|
||||
f"{y}-{M}-{d}",
|
||||
f"{m}",
|
||||
f"{h}",
|
||||
f"{d}",
|
||||
]
|
||||
Reference in New Issue
Block a user