Compare commits

...

36 Commits

Author SHA1 Message Date
fengche
410435720e 2miners矿池算力获取 2025-12-15 17:39:35 +08:00
fengche
07f7b690b7 kryptex矿池根据钱包地址币种获取矿工算力代码 2025-12-05 17:06:05 +08:00
fengche
6cfb1bfea3 挖矿软件支持的币种算法费率和矿池网站挖矿基本信息的json格式 2025-11-28 17:51:15 +08:00
fengche
4c84d13de6 各币种前几个矿池网站的挖矿基本信息 2025-11-21 17:47:53 +08:00
fengche
e9a3280c89 算力租赁系统v1.0.0测试用例测试报告更新 2025-11-07 17:58:33 +08:00
fengche
8c552ceecf m2pool租赁系统部分测试用例更新 2025-10-31 17:54:32 +08:00
fengche
bed059e904 算力租赁系统v1.0.0测试报告更新 2025-09-26 11:01:04 +08:00
fengche
45b719f12b 算力租赁系统v1.0.0版本测试用例更新 2025-09-23 15:40:30 +08:00
fengche
fe278c0f85 算力租赁系统部分测试用例 2025-09-19 18:04:23 +08:00
fengche
32d2d5f0a7 v1.2.0测试用例,测试报告,changelog更新 2025-09-05 17:29:18 +08:00
fengche
b31bfa2751 changelog更新 2025-08-28 14:54:08 +08:00
fengche
696e0de3d8 v1.2.0测试报告更新 2025-08-14 15:03:49 +08:00
fengche
324cbd3ce4 v1.2.0测试报告更新 2025-08-13 17:20:48 +08:00
fengche
e4ddf65005 v1.2.0测试报告更新 2025-08-13 15:04:22 +08:00
fengche
b8cb79e780 v1.2.0测试报告提交 2025-08-11 15:34:16 +08:00
fengche
a29375d565 v1.2.0测试报告提交 2025-08-11 15:32:30 +08:00
lzx
408c3d4c06 pass 2025-08-08 14:43:40 +08:00
fengche
4ad30da8a0 v1.2.0测试用例更新 2025-08-08 14:24:24 +08:00
fengche
934d170d37 v1.1.0CHANGELOG更新 2025-07-18 11:27:04 +08:00
fengche
79f9275b57 v1.1.0测试报告更新 2025-07-18 10:26:02 +08:00
fengche
5728f3f3fa m2poolv1.1.0测试报告更新 2025-07-17 15:34:33 +08:00
lzx
13c2ab3951 update v1.2.0 2025-07-16 11:12:25 +08:00
lzx
596359aea9 update v1.2.0 2025-07-16 11:11:33 +08:00
fengche
6337f64778 v1.1.0测试用例更新 2025-07-08 17:59:40 +08:00
fengche
1cf2ae0f63 v1.1.0测试用例更新 2025-07-08 16:38:05 +08:00
fengche
1915f20dbf v1.1.0测试用例 2025-07-04 15:34:38 +08:00
fengche
ee1d1a34a7 v1.1.0广播部分测试用例 2025-06-26 17:07:50 +08:00
fengche
55292cdd03 changelog更新 2025-06-17 14:06:07 +08:00
lzx
4328aeef0f v1.0.0 pass 2025-06-17 13:37:00 +08:00
fengche
2c90ba3baf v1.0.0测试报告更新 2025-06-17 11:22:50 +08:00
lzx
7a2f51fc59 update v1.1.0需求文档 2025-06-16 10:42:53 +08:00
yyb
e6d0d4c302 Merge remote-tracking branch 'origin/main' 2025-06-13 15:05:29 +08:00
yyb
2a75e492da 聊天室表和全网算力的表 2025-06-13 15:04:53 +08:00
fengche
aac3f93b32 v1.0.0测试报告更新 2025-06-13 14:58:38 +08:00
lzx
42c798a094 Merge branch 'main' of http://47.129.22.53:22345/lizixuan/m2pool_docs 2025-06-09 17:16:58 +08:00
lzx
4b3ee3f266 add 算力租赁业务文档 2025-06-09 17:16:14 +08:00
17 changed files with 966 additions and 0 deletions

69
db/chat.sql Normal file
View File

@@ -0,0 +1,69 @@
CREATE TABLE `chat_room` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键id',
`user_one_email` varchar(32) COLLATE utf8mb4_bin NOT NULL COMMENT '聊天室用户1(普通用户)',
`user_two_email` varchar(32) COLLATE utf8mb4_bin NOT NULL COMMENT '聊天室用户2(客服)',
`last_user_send_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '用户最后发送时间',
`last_customer_send_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '客服最后发送时间',
`flag` tinyint(1) NOT NULL DEFAULT '0' COMMENT '重要聊天室标记 0 正常 1重要',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
`del` tinyint(1) unsigned zerofill NOT NULL DEFAULT '0' COMMENT '逻辑删除字段',
PRIMARY KEY (`id`),
UNIQUE KEY `usertwo_userone` (`user_two_email`,`user_one_email`) USING BTREE COMMENT '聊天室快速查找索引'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 AUTO_INCREMENT=1 COLLATE=utf8mb4_bin COMMENT='聊天服务---聊天室';
CREATE TABLE `chat_message` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键id',
`send_email` varchar(32) COLLATE utf8mb4_bin NOT NULL COMMENT '发送者id',
`content` varchar(255) COLLATE utf8mb4_bin NOT NULL COMMENT '消息内容',
`room_id` bigint(20) NOT NULL COMMENT '外键-聊天室id',
`type` tinyint(1) NOT NULL DEFAULT '0' COMMENT '消息类型 0 文本 1图片',
`read` tinyint(1) NOT NULL DEFAULT '0' COMMENT '0已读 1未读',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 AUTO_INCREMENT=1 COLLATE=utf8mb4_bin COMMENT='聊天消息存储表';
CREATE TABLE `chat_message_history` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键id',
`send_email` varchar(32) COLLATE utf8mb4_bin NOT NULL COMMENT '发送者邮箱',
`content` varchar(255) COLLATE utf8mb4_bin NOT NULL COMMENT '消息内容',
`room_id` bigint(20) NOT NULL COMMENT '外键-聊天室id',
`type` tinyint(1) NOT NULL DEFAULT '0' COMMENT '消息类型 0 文本 1图片',
`read` tinyint(1) NOT NULL DEFAULT '0' COMMENT '0已读 1未读',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 AUTO_INCREMENT=1 COLLATE=utf8mb4_bin COMMENT='聊天消息存储表';
alter table chat_room MODIFY COLUMN `last_user_send_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '用户最后发送时间';
alter table chat_room MODIFY COLUMN `last_customer_send_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '客服最后发送时间';
ALTER TABLE chat_message ALTER COLUMN room_id SET DEFAULT '0';
ALTER TABLE chat_message_history ALTER COLUMN room_id SET DEFAULT '0';
ALTER TABLE chat_room ALTER COLUMN user_one_email SET DEFAULT '';
ALTER TABLE chat_room ALTER COLUMN user_two_email SET DEFAULT '';
ALTER TABLE chat_message_history
CHANGE COLUMN `read` is_read tinyint(1) NOT NULL DEFAULT '0' COMMENT '0已读 1未读';
ALTER TABLE chat_message
CHANGE COLUMN `read` is_read tinyint(1) NOT NULL DEFAULT '0' COMMENT '0已读 1未读';
-- 2025-4-28 9:50
ALTER TABLE chat_message DROP COLUMN `is_read`;
ALTER TABLE chat_message_history DROP COLUMN `is_read`;
ALTER TABLE chat_room ADD COLUMN service_read_num bigint(4) NOT NULL DEFAULT '0' COMMENT '客服未读消息数量';
ALTER TABLE chat_room ADD COLUMN client_read_num bigint(4) NOT NULL DEFAULT '0' COMMENT '客户未读消息数量';
ALTER TABLE chat_room CHANGE COLUMN content longtext COLLATE utf8mb4_bin NOT NULL COMMENT '消息内容',
-- 存储图片的base64编码文件
ALTER TABLE chat_message CHANGE COLUMN content LONGTEXT NOT NULL COMMENT '消息内容';

48
db/pool.sql Normal file
View File

@@ -0,0 +1,48 @@
-- 2025-05-07 9:50
CREATE TABLE `nexa_net_block` (
`id` int(10) NOT NULL AUTO_INCREMENT COMMENT '主键id',
`date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`height` int(10) NOT NULL DEFAULT '0' COMMENT '高度',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 AUTO_INCREMENT=1 COLLATE=utf8mb4_bin COMMENT='nexa全网实际报块数表';
CREATE TABLE `grs_net_block` (
`id` int(10) NOT NULL AUTO_INCREMENT COMMENT '主键id',
`date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`height` int(10) NOT NULL DEFAULT '0' COMMENT '高度',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 AUTO_INCREMENT=1 COLLATE=utf8mb4_bin COMMENT='grs全网实际报块数表';
CREATE TABLE `mona_net_block` (
`id` int(10) NOT NULL AUTO_INCREMENT COMMENT '主键id',
`date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`height` int(10) NOT NULL DEFAULT '0' COMMENT '高度',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 AUTO_INCREMENT=1 COLLATE=utf8mb4_bin COMMENT='mona全网实际报块数表';
CREATE TABLE `dgbo_net_block` (
`id` int(10) NOT NULL AUTO_INCREMENT COMMENT '主键id',
`date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`height` int(10) NOT NULL DEFAULT '0' COMMENT '高度',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 AUTO_INCREMENT=1 COLLATE=utf8mb4_bin COMMENT='dgbo全网实际报块数表';
CREATE TABLE `rxd_net_block` (
`id` int(10) NOT NULL AUTO_INCREMENT COMMENT '主键id',
`date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`height` int(10) NOT NULL DEFAULT '0' COMMENT '高度',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 AUTO_INCREMENT=1 COLLATE=utf8mb4_bin COMMENT='rxd全网实际报块数表';
CREATE TABLE `dgbq_net_block` (
`id` int(10) NOT NULL AUTO_INCREMENT COMMENT '主键id',
`date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`height` int(10) NOT NULL DEFAULT '0' COMMENT '高度',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 AUTO_INCREMENT=1 COLLATE=utf8mb4_bin COMMENT='dgbq全网实际报块数表';
CREATE TABLE `dgbs_net_block` (
`id` int(10) NOT NULL AUTO_INCREMENT COMMENT '主键id',
`date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`height` int(10) NOT NULL DEFAULT '0' COMMENT '高度',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 AUTO_INCREMENT=1 COLLATE=utf8mb4_bin COMMENT='dgbs全网实际报块数表';

View File

@@ -3,3 +3,107 @@
版本变更记录日志,该文件由测试人员编写,主要记录版本变更情况,包括版本号、变更内容、变更时间等。
日志内容应与对应版本号的需求文档一致,以便于版本管理和追溯。
```
版本号----v1.0.0----
变更内容----
导航栏主要提供跳转至各个页面的功能如果在点击当前页面则不提供任何操作例如在首页点击logo或者首页按钮不做任何操作
登陆提供完整功能,未登陆只提供首页相关功能
所有页面该组件均应锁定在页面最上方,方便用户跳转
轮播图,主要展示宣传图等内容
币种选择器,根据选择的币种调整主页相关内容显示
广播,显示一些提示或者紧急信息
算力图,提供矿池算力、全网算力图标,图中显示算力和币价
币种相关信息,提供矿池算力,全网算力,全网难度,算法,当前高度,币价,分配模式/矿池费率,收益计算,接入文档跳转功能
提供矿池最新10个报块信息包括出块高度、出块时间、出块hash、出块奖励并提供点击跳转至最新报块页面功能
如果没有登陆,则不提供该功能
页尾栏提供一些文档跳转、发送邮件功能例如m2pool描述、api文档跳转、费率文档跳转、挖矿教程跳转、工单页跳转、发送邮件、一般性声明文件跳转
客服聊天按钮,提供客服聊天功能
显示挖矿账户币种-挖矿账户名方便用户查看锁定至navigation组件下方
显示当前挖矿账户总收入、总支出(已提现)、昨日收益、今日已挖、账户余额的数据显示,提供跳转至付款设置功能
今日已挖(预估)特别说明:
账户余额特别说明:
展示当前挖矿地址拥有的算力图、矿机分布图
展示当前挖矿地址拥有的全部矿机在离线数、矿机对应算力、最后提交时间、状态数据,并提供矿机历史算力图
展示当前挖矿账户收益表格包括结算日期结算时过去24小时算力收益数量
站址当前挖矿账户提现表格,包括提现日期,提现地址,提现金额,支付状态
币种选择器,根据选择的币种调整最新报块页面相关内容显示
幸运值显示3日7日30日90日所选币种的幸运值
提供所选币种全部的矿池报块信息包括区块高度出块时间区块hash值区块奖励,点击指定区块信息可跳转到相应的币种浏览器
下方显示总页数,可选每页显示条数,可以点击页数跳转,可以输入页数跳转
可以选择币种,添加,删除和修改挖矿账户
添加需设置账户名称,钱包地址,币种,备注(选填),需通过双重验证动态口令
删除需通过双重验证动态口令
修改需通过双重验证动态口令后可修改钱包地址,设置起付额和是否自动提现以及备注
可以根据挖矿账户创建,删除,设置只读页面
创建时可设置备注,权限,也可以通过设置修改只读页面的备注和权限
创建完后会生成只读页面链接,只读页面会根据权限显示总收入,总支出,昨日收益,今日已挖(预估),账户余额,实时/一天的总算力和拒绝率,实时/一天的矿机算力分布,全部/在线/离线矿工和收益支付等数据
可以通过邮箱验证码修改密码
可以使用手机上的谷歌身份验证器扫码或输入16位密钥输入密码邮箱验证码双重验证动态口令开启双重验证
可以使用邮箱验证码,双重验证动态口令关闭双重验证
可以进行api文档跳转指定ip地址和权限生成apikey可以删除apikey
可以通过设置修改ip和权限
显示进行中,已完成和全部工单
下方显示工单号,提交时间,用户邮箱,工单状态和工单详情
进行中的工单点击详情可以看到工单具体信息,可以上传指定格式附件,选择继续提交和关闭工单
已完成的工单点击详情只能看到工单具体信息
提供中英文切换功能
展示币种矿池费率相关的内容,例如币种,挖矿地址,挖矿费率,收益结算模式,起付额
根据所选币种提供币种相关的挖矿教程,包含起付额,端口,挖矿软件,矿机型号,币种的的钱包地址
根据遇到的问题填写问题描述,可选添加指定格式的附件,提交工单
展示服务条款内容,包含总则,服务说明,用户资格,用户责任,费用与支付,收益与分配,数据与隐私,知识产权,免责声明,终止服务,法律适用与争议解决
输入正确的邮箱和密码后输入正确的验证码即可登录
输入邮箱,然后获取到验证码输入进去,再按格式输入密码即刻完成注册
根据矿池的shares信息统计每个矿工的算力提供30分钟和24小时算力统计
统计blkreportprofitv2表中最大高度 - 区块链当前高度的全部报块
每天对过去一天的blkreportprofitv2表中的全部报块进行确认
统计每天0时每个挖矿账户下面所有矿工的24小时算力之和再根据每个挖矿账户的算力占比以及昨日全部报块收益分配挖矿账户前一天的收益
统计每天收益的转账情况
变更时间----2025-06-17
版本号----v1.1.0----
变更内容----
在v1.0.0版本的基础上新增后台操作系统
后台操作系统的登录使用业务系统的登录,会判断用户角色,登录后台管理员账号会直接进入后台操作系统页面
页面目前一级目录为广播,用户管理,工单管理
广播操作页面整体为一张表包含时间、内容、操作对应m2pool网站主页币种选择框下方矿池算力图上方的内容该位置内容滚动播放所有广播
内容为广播内容显示固定字数内容点击后弹出打开一个文本操作界面显示完整内容并且可编辑长度限制为100字节可添加按钮和对应的跳转页面最多可添加五个
操作为编辑/删除两个功能,编辑同上述点击表格行,删除需二次确认
用户管理页面整体为一张表显示注册用户管理默认显示nexa的注册用户可选择币种可通过挖矿账户邮箱进行查询
此页面显示选择币种的所有注册用户和对应的id币种邮箱最小起付金额用户状态挖矿账号支付地址是否自动提现和操作详情和发送邮件按钮
点击详情可进入用户详情页面,页面整体为两个图表
第一个图表显示钱包余额,还可选择查询的开始日期和结束日期
不选择查询的开始日期和结束日期则默认显示按收益分配日期的时间从最近到最前顺序的各项数据(收益分配日期,实际转账日期,币种,交易金额,挖矿账号,转账地址,最大高度)
第二个图表为用户算力及在离线状态图
用户算力折线图包含时间、算力折线图平滑曲线数值不要超过4位数
用户在离线柱状图,同一个用户 同一时间的在离线在一根柱子上显示,离线用深色放在下方,在线用浅色放在上方
x轴为时间y轴为数量
点击发送邮件弹出文本框,用于输入邮件内容,点击发送后发送该邮件
邮箱使用do.not.reply@m2pool.com
工单管理页面将v1.0.0版本的工单管理页面移过来
变更时间----2025-07-18
版本号----v1.2.0----
变更内容----
用户管理页面查看详情点击后显示该挖矿账户所有收益、支付、钱包地址、转账高度,多条数据分行显示
新增待支付汇总页面,页面可查看正常显示币种,挖矿账号,最后分配时间,最后分配高度,起付额,待支付金额
二级导航文档管理将v1.1.0的main-broadcast合并进来即该二级导航分为两个三级导航分别为广播和发布文章
广播页面为v1.1.0版本的广播发布页面
发布文章页面:文本编辑器、选择发布文章模块(对应下方文档系统各个子模块)
编辑基本的功能,例如字体大小设置、字体加粗、超链接、基本格式设置、下划线、颜色等
新增帮助中心页面
帮助中心首页,内容为帮助中心各个子模块导航、推荐文章(低优先)、最新公告(按公告中心发布文章的时间倒序显示只显示5-8篇公告)
子模块报块:挖矿教程、常见问题、公告中心、其他
挖矿教程,现挖矿教程模块(接入矿池)
常见问题,现矿池分配及转账规则页面作为该模块下的一篇文章
公告中心,现无对应页面
其他,现无对应页面
移除币种enx相关按钮、页面和接口
变更时间----2025-08-27

View File

@@ -0,0 +1,113 @@
import redis
import requests
from bs4 import BeautifulSoup
import pymysql
from datetime import datetime, timedelta
import time
# Redis 配置
r = redis.Redis(host='127.0.0.1', port=6379, db=7, decode_responses=True)
# MySQL 配置
conn = pymysql.connect(
host='127.0.0.1',
user='root',
password='123456',
database='pool',
port=25600,
charset='utf8mb4'
)
cursor = conn.cursor()
# URL 模板
BASE_URL = "https://pool.kryptex.com/zh-cn/{coin}/miner/stats/{wallet}"
HEADERS = {"User-Agent": "Mozilla/5.0"}
def to_mhs(value: str):
"""自动把算力字符串转换成 MH/s 纯数字"""
value = value.strip().lower()
if "gh/s" in value:
return float(value.replace("gh/s", "").strip()) * 1000
if "mh/s" in value:
return float(value.replace("mh/s", "").strip())
if "kh/s" in value:
return float(value.replace("kh/s", "").strip()) / 1000
if "h/s" in value:
return float(value.replace("h/s", "").strip()) / 1_000_000
return 0.0
def get_half_hour_time(now):
"""取最近半点时间"""
minute = 0 if now.minute < 30 else 30
return now.replace(minute=minute, second=0, microsecond=0)
def query_and_insert():
keys = r.keys("*") # 遍历所有 key
half_hour_time = get_half_hour_time(datetime.now())
for key in keys:
try:
parts = key.split(":")
if len(parts) != 4:
continue
pool_name, wallet, coin, algo = parts
coin_lower = coin.lower()
# xtm 特殊处理
coin_for_url = "xtm-c29" if coin_lower == "xtm" else coin_lower
url = BASE_URL.format(coin=coin_for_url, wallet=wallet.lower())
resp = requests.get(url, headers=HEADERS, timeout=10)
resp.raise_for_status()
soup = BeautifulSoup(resp.text, "html.parser")
tbody = soup.find("tbody")
if not tbody:
print(f"池:{pool_name} 币种:{coin} 钱包:{wallet} 没有矿工数据")
continue
rows = tbody.find_all("tr")
if not rows:
print(f"池:{pool_name} 币种:{coin} 钱包:{wallet} 没有矿工数据")
continue
for row in rows:
try:
worker = row.find("th").find("a").text.strip()
tds = row.find_all("td")
# 10 分钟算力列
hashrate_raw = tds[5].text.strip()
mhs = to_mhs(hashrate_raw)
# 输出日志
print(f"池:{pool_name} 币种:{coin} 钱包:{wallet} 矿工:{worker} -> {mhs:.2f} MH/s")
# 写入数据库
sql = """
INSERT INTO `pool.kryptex`
(datetime, pool_name, wallet, miner, hashrate, coin, algorithm)
VALUES (%s,%s,%s,%s,%s,%s,%s)
"""
cursor.execute(sql, (half_hour_time, pool_name, wallet, worker, mhs, coin.upper(), algo))
conn.commit()
except Exception as e:
print("解析矿工数据失败:", e)
except Exception as e:
print("请求或解析失败:", e)
if __name__ == "__main__":
try:
while True:
now = datetime.now()
next_minute = 30 if now.minute < 30 else 60
wait_seconds = (next_minute - now.minute) * 60 - now.second
if wait_seconds > 0:
print(f"等待 {wait_seconds} 秒到下一个半点...")
time.sleep(wait_seconds)
query_and_insert()
except KeyboardInterrupt:
print("程序结束")
finally:
cursor.close()
conn.close()

View File

@@ -0,0 +1,108 @@
import redis
import requests
import pymysql
from datetime import datetime, timedelta
import time
# ---------------- Redis 配置 ----------------
r = redis.Redis(host='127.0.0.1', port=6379, db=7, decode_responses=True)
# ---------------- MySQL 配置 ----------------
conn = pymysql.connect(
host='127.0.0.1',
user='root',
password='123456',
database='pool',
port=25600,
charset='utf8mb4'
)
cursor = conn.cursor()
# ---------------- API 配置 ----------------
API_URLS = {
"NEXA": "https://nexa.2miners.com/api/accounts/{wallet}",
"XNA": "https://xna.2miners.com/api/accounts/{wallet}",
"CLORE": "https://clore.2miners.com/api/accounts/{wallet}",
"RVN": "https://rvn.2miners.com/api/accounts/{wallet}",
"ERG": "https://erg.2miners.com/api/accounts/{wallet}"
}
# ---------------- 工具函数 ----------------
def to_mhs(value):
"""算力转换为 MH/s"""
return float(value) / 1_000_000 if value else 0.0
def get_half_hour_time(now):
"""取最近半点时间"""
minute = 0 if now.minute < 30 else 30
return now.replace(minute=minute, second=0, microsecond=0)
# ---------------- 主逻辑 ----------------
def query_and_insert():
keys = r.keys("*") # 遍历所有 key
half_hour_time = get_half_hour_time(datetime.now())
for key in keys:
try:
# key 格式: pool_name:wallet:coin:algo
parts = key.split(":")
if len(parts) != 4:
continue
pool_name, wallet, coin, algo = parts
if pool_name.lower() != "2miners":
continue # 不是 2Miners 的数据就跳过
coin_upper = coin.upper()
if coin_upper not in API_URLS:
print(f"币种 {coin_upper} 不在支持列表中,跳过")
continue
# NEXA 特殊处理,其他币种直接用 wallet
if coin_upper == "NEXA" and not wallet.lower().startswith("nexa:"):
wallet_for_api = f"nexa:{wallet}"
else:
wallet_for_api = wallet
url = API_URLS[coin_upper].format(wallet=wallet_for_api)
resp = requests.get(url, timeout=10)
resp.raise_for_status()
data = resp.json()
# 遍历矿机
workers = data.get("workers", {})
if not workers:
print(f"{coin_upper} 钱包 {wallet} 没有矿机数据")
continue
for miner_name, miner_data in workers.items():
hashrate = to_mhs(miner_data.get("hr"))
print(f"池:{pool_name} 币种:{coin_upper} 钱包:{wallet} 矿机:{miner_name} -> {hashrate:.2f} MH/s")
# 写入数据库
sql = """
INSERT INTO `2miners`
(datetime, pool_name, wallet, miner, hashrate, coin, algorithm)
VALUES (%s,%s,%s,%s,%s,%s,%s)
"""
cursor.execute(sql, (half_hour_time, pool_name, wallet, miner_name, hashrate, coin_upper, algo))
conn.commit()
except Exception as e:
print("请求或解析失败:", e)
# ---------------- 定时执行 ----------------
if __name__ == "__main__":
try:
while True:
now = datetime.now()
next_minute = 30 if now.minute < 30 else 60
wait_seconds = (next_minute - now.minute) * 60 - now.second
if wait_seconds > 0:
print(f"等待 {wait_seconds} 秒到下一个半点...")
time.sleep(wait_seconds)
query_and_insert()
except KeyboardInterrupt:
print("程序结束")
finally:
cursor.close()
conn.close()

View File

@@ -0,0 +1,312 @@
{
"lolminer": {
"Alephium": {
"coins": ["ALPH"],
"fee": 0.75
},
"Autolykos V2": {
"coins": ["ERG"],
"fee": 1.5
},
"BeamHash III": {
"coins": ["BEAM"],
"fee": 1.0
},
"Cuckoo 29": {
"coins": ["GRIN-C29"],
"fee": 2.0
},
"CuckarooD 29": {
"coins": ["GRIN-CD29"],
"fee": 2.0
},
"CuckarooM 29": {
"coins": ["GRIN-CM29"],
"fee": 2.0
},
"Cuckaroo 30 CTXC": {
"coins": ["CTXC"],
"fee": 2.5
},
"Cuckatoo 31": {
"coins": ["GRIN-C31"],
"fee": 2.0
},
"Cuckatoo 32": {
"coins": ["GRIN-C32"],
"fee": 2.0
},
"Cuckaroo 29-32": {
"coins": ["GRIN-C29-32"],
"fee": 1.0
},
"Cuckaroo 29-40": {
"coins": ["GRIN-C29-40"],
"fee": 1.0
},
"Dual ETC + (KAS/ALEPH)": {
"coins": ["ETC", "ALPH/KAS"],
"fee": "1.0 / 0.0"
},
"Dual ETH (ETHW) + (KAS/ALEPH)": {
"coins": ["ETHW", "ALPH/KAS"],
"fee": "1.0 / 0.0"
},
"Dual RTH + (ALEPH/GRAM/KLS/PYI/RXD)": {
"coins": ["RTH", "ALPH/GRAM/KLS/PYI/RXD"],
"fee": "1.0 / 0.75 - 1.0"
},
"Dual IRON + (ALEPH/GRAM/KLS/PYI/RXD)": {
"coins": ["IRON", "ALPH/GRAM/KLS/PYI/RXD"],
"fee": "1.0 / 0.75 - 1.0"
},
"Equihash 144/5": {
"coins": ["EQUIHASH144/5"],
"fee": 1.0
},
"Equihash 192/7": {
"coins": ["EQUIHASH192/7"],
"fee": 1.0
},
"Equihash 210/9": {
"coins": ["EQUIHASH210/9"],
"fee": 1.0
},
"Etchash": {
"coins": ["ETC"],
"fee": 0.7
},
"Ethash (ETHW)": {
"coins": ["ETHW"],
"fee": 0.7
},
"Ironfish": {
"coins": ["IRON"],
"fee": 1.0
},
"Kaspa": {
"coins": ["KAS"],
"fee": 0.75
},
"Karlsen": {
"coins": ["KLS"],
"fee": 1.0
},
"Nexa": {
"coins": ["NEXA"],
"fee": 2.0
},
"Pyrin": {
"coins": ["PYI"],
"fee": 1.0
},
"Radiant": {
"coins": ["RAD"],
"fee": 0.75
},
"Rethereum": {
"coins": ["RTH"],
"fee": 1.0
},
"TON/GRAM": {
"coins": ["TON", "GRAM"],
"fee": 1.0
},
"ZelHash (Flux)": {
"coins": ["FLUX"],
"fee": "1.0 / 1.5"
}
},
"bzminer": {
"aidepin": {
"coins": ["AI-DEPIN"],
"fee": 1.0
},
"aipg": {
"coins": ["AIPG"],
"fee": 1.0
},
"alph": {
"coins": ["ALPH"],
"fee": 0.5
},
"blocx": {
"coins": ["BLOX"],
"fee": 1.0
},
"clore": {
"coins": ["CLORE"],
"fee": 1.0
},
"canxium": {
"coins": ["CANXIUM"],
"fee": 0.5
},
"dynex": {
"coins": ["DNX"],
"fee": 2.0
},
"ergo": {
"coins": ["ERG"],
"fee": 1.0
},
"etchash": {
"coins": ["ETC"],
"fee": 0.5
},
"ethw": {
"coins": ["ETHW"],
"fee": 0.5
},
"gamepass": {
"coins": ["GAMEPASS"],
"fee": 1.0
},
"ironfish": {
"coins": ["IRON"],
"fee": 1.0
},
"ixi": {
"coins": ["IXI"],
"fee": 1.0
},
"karlsen": {
"coins": ["KLS"],
"fee": 1.0
},
"kaspa": {
"coins": ["KAS"],
"fee": 1.0
},
"neoxa": {
"coins": ["NEOX"],
"fee": 1.0
},
"nexa": {
"coins": ["NEXA"],
"fee": 2.0
},
"novo": {
"coins": ["NOVO"],
"fee": 1.0
},
"meowcoin": {
"coins": ["MEOW"],
"fee": 1.0
},
"octa": {
"coins": ["OCTA"],
"fee": 0.5
},
"olhash": {
"coins": ["OLHASH"],
"fee": 1.0
},
"radiant": {
"coins": ["RAD"],
"fee": 1.0
},
"rethereum": {
"coins": ["RTH"],
"fee": 1.0
},
"rvn": {
"coins": ["RVN"],
"fee": 1.0
},
"warthog": {
"coins": ["WARTHOG"],
"fee": 2.0
},
"woodcoin": {
"coins": ["WOOD"],
"fee": 1.0
},
"xna": {
"coins": ["XNA"],
"fee": 1.0
},
"zil": {
"coins": ["ZIL"],
"fee": 0.0
}
},
"rigel": {
"abelian": {
"coins": ["ABEL"],
"fee": 1.0
},
"alephium": {
"coins": ["ALPH"],
"fee": 0.7
},
"autolykos2": {
"coins": ["ERG"],
"fee": 1.0
},
"etchash": {
"coins": ["ETC"],
"fee": 0.7
},
"ethash": {
"coins": ["ETHW","XPB","OCTA"],
"fee": 0.7
},
"ethashb3": {
"coins": ["HYP"],
"fee": 1.0
},
"fishhash": {
"coins": ["IRON"],
"fee": 1.0
},
"karlsenhashv2": {
"coins": ["KLS"],
"fee": 1.0
},
"kawpow": {
"coins": ["RVN","AIPG","XNA","CLORE","NEOX"],
"fee": 1.0
},
"nexapow": {
"coins": ["NEXA"],
"fee": 2.0
},
"octopus": {
"coins": ["CFX"],
"fee": 2.0
},
"progpowz": {
"coins": ["ZANO"],
"fee": 1.0
},
"quai": {
"coins": ["QUAI"],
"fee": 1.0
},
"sha256ton": {
"coins": ["GRAM"],
"fee": 1.0
},
"sha3x": {
"coins": ["XTM"],
"fee": 1.0
},
"sha512256d": {
"coins": ["RXD"],
"fee": 1.0
},
"xelishash": {
"coins": ["XEL"],
"fee": 3.0
},
"xelishashv2": {
"coins": ["XEL"],
"fee": 2.0
},
"zil": {
"coins": ["ZIL"],
"fee": 0.0
}
}
}

108
v1/pool.json Normal file
View File

@@ -0,0 +1,108 @@
{
"DxPool": {
"wallet_mining": false,
"coins": {"GPU": ["XTM", "ERG"], "ASIC": []},
"XTM": {"full_name": "Tari(XTM)", "algos": ["SHA3X"], "pay_interval": 24, "min_pay": 100, "model_fee": {"PROP": 0.03}, "mining_url": {"tcp": {"GPU": "xtm.ss.dxpool.com:3301", "ASIC": ""}, "ssl": {"GPU": "", "ASIC": ""}}, "hashrate_url": ""},
"ERG": {"full_name": "Ergo", "algos": ["Autolykos2"], "pay_interval": "10:00~12:00 (UTC+8)", "min_pay": 1, "model_fee": {"PPS": 0.025}, "mining_url": {"tcp": {"GPU": "erg.ss.dxpool.com:8888", "ASIC": ""}, "ssl": {"GPU": "", "ASIC": ""}}, "hashrate_url": ""}
},
"pool.kryptex": {
"wallet_mining": true,
"coins": {"GPU": ["XTM", "XNA", "CLORE", "CFX", "IRON", "NEXA", "KLS", "RVN", "ERG", "XEL"], "ASIC": []},
"XTM": {"full_name": "Tari(XTM)", "algos": ["SHA3X"], "pay_interval": -1, "min_pay": 200, "model_fee": {"PROP": 0.01, "SOLO": 0.01}, "mining_url": {"tcp": {"GPU": "xtm-sha3x-sg.kryptex.network:7039", "ASIC": ""}, "ssl": {"GPU": "xtm-sha3x-sg.kryptex.network:8039", "ASIC": ""}}, "hashrate_url": ""},
"XNA": {"full_name": "Neurai", "algos": ["KawPow"], "pay_interval": -1, "min_pay": 100, "model_fee": {"PROP": 0.01, "SOLO": 0.01}, "mining_url": {"tcp": {"GPU": "xna-sg.kryptex.network:7024", "ASIC": ""}, "ssl": {"GPU": "xna-sg.kryptex.network:8024", "ASIC": ""}}, "hashrate_url": ""},
"CLORE": {"full_name": "Clore.ai", "algos": ["KawPow"], "pay_interval": -1, "min_pay": 5, "model_fee": {"PROP": 0.01, "SOLO": 0.01}, "mining_url": {"tcp": {"GPU": "clore-sg.kryptex.network:7025", "ASIC": ""}, "ssl": {"GPU": "clore-sg.kryptex.network:8025", "ASIC": ""}}, "hashrate_url": ""},
"CFX": {"full_name": "Conflux", "algos": ["Octopus"], "pay_interval": -1, "min_pay": 1, "model_fee": {"PPS+": 0.01, "SOLO": 0.01}, "mining_url": {"tcp": {"GPU": "cfx-sg.kryptex.network:7027", "ASIC": ""}, "ssl": {"GPU": "cfx-sg.kryptex.network:8027", "ASIC": ""}}, "hashrate_url": ""},
"IRON": {"full_name": "Iron Fish", "algos": ["IronFish"], "pay_interval": -1, "min_pay": 0.1, "model_fee": {"PPS+": 0.01, "SOLO": 0.01}, "mining_url": {"tcp": {"GPU": "iron-sg.kryptex.network:7017", "ASIC": ""}, "ssl": {"GPU": "iron-sg.kryptex.network:8017", "ASIC": ""}}, "hashrate_url": ""},
"NEXA": {"full_name": "Nexa", "algos": ["NexaPow"], "pay_interval": -1, "min_pay": 20000, "model_fee": {"PPS+": 0.03, "SOLO": 0.01}, "mining_url": {"tcp": {"GPU": "nexa-sg.kryptex.network:7026", "ASIC": ""}, "ssl": {"GPU": "nexa-sg.kryptex.network:8026", "ASIC": ""}}, "hashrate_url": ""},
"KLS": {"full_name": "Karlsen", "algos": ["KarlsenHash"], "pay_interval": -1, "min_pay": 10, "model_fee": {"PROP": 0.01, "SOLO": 0.01}, "mining_url": {"tcp": {"GPU": "kls-sg.kryptex.network:7022", "ASIC": ""}, "ssl": {"GPU": "kls-sg.kryptex.network:8022", "ASIC": ""}}, "hashrate_url": ""},
"RVN": {"full_name": "Ravencoin", "algos": ["KawPow"], "pay_interval": -1, "min_pay": 10, "model_fee": {"PPS+": 0.01}, "mining_url": {"tcp": {"GPU": "rvn-sg.kryptex.network:7031", "ASIC": ""}, "ssl": {"GPU": "rvn-sg.kryptex.network:8031", "ASIC": ""}}, "hashrate_url": ""},
"ERG": {"full_name": "Ergo", "algos": ["Autolykos"], "pay_interval": -1, "min_pay": 1, "model_fee": {"PPS+": 0.01, "SOLO": 0.01}, "mining_url": {"tcp": {"GPU": "erg-sg.kryptex.network:7021", "ASIC": ""}, "ssl": {"GPU": "erg-sg.kryptex.network:8021", "ASIC": ""}}, "hashrate_url": ""},
"XEL": {"full_name": "Xelis", "algos": ["Xelishashv2"], "pay_interval": -1, "min_pay": 0.1, "model_fee": {"PROP": 0.01, "SOLO": 0.01}, "mining_url": {"tcp": {"GPU": "xel-sg.kryptex.network:7019", "ASIC": ""}, "ssl": {"GPU": "xel-sg.kryptex.network:8019", "ASIC": ""}}, "hashrate_url": ""}
},
"2miners": {
"wallet_mining": true,
"coins": {"GPU": ["XNA", "CLORE", "NEXA", "RVN", "ERG"], "ASIC": []},
"XNA": {"full_name": "Neurai", "algos": ["KawPOW"], "pay_interval": 2, "min_pay": 1000, "model_fee": {"PPLNS": 0.01, "SOLO": 0.015}, "mining_url": {"tcp": {"GPU": "xna.2miners.com:6060", "ASIC": ""}, "ssl": {"GPU": "xna.2miners.com:16060", "ASIC": ""}}, "hashrate_url": ""},
"CLORE": {"full_name": "Clore.ai", "algos": ["KawPOW"], "pay_interval": 2, "min_pay": 10, "model_fee": {"PPLNS": 0.01, "SOLO": 0.015}, "mining_url": {"tcp": {"GPU": "clore.2miners.com:2020", "ASIC": ""}, "ssl": {"GPU": "clore.2miners.com:12020", "ASIC": ""}}, "hashrate_url": ""},
"NEXA": {"full_name": "Nexa", "algos": ["NexaPow"], "pay_interval": 2, "min_pay": 50000, "model_fee": {"PPLNS": 0.01, "SOLO": 0.015}, "mining_url": {"tcp": {"GPU": "nexa.2miners.com:5050", "ASIC": ""}, "ssl": {"GPU": "nexa.2miners.com:15050", "ASIC": ""}}, "hashrate_url": ""},
"RVN": {"full_name": "Ravencoin", "algos": ["KawPOW"], "pay_interval": 2, "min_pay": 10, "model_fee": {"PPLNS": 0.01, "SOLO": 0.015}, "mining_url": {"tcp": {"GPU": "asia-rvn.2miners.com:6060", "ASIC": ""}, "ssl": {"GPU": "asia-rvn.2miners.com:16060", "ASIC": ""}}, "hashrate_url": ""},
"ERG": {"full_name": "Ergo", "algos": ["Autolykos"], "pay_interval": 2, "min_pay": 1, "model_fee": {"PPLNS": 0.01, "SOLO": 0.015}, "mining_url": {"tcp": {"GPU": "asia-erg.2miners.com:8888", "ASIC": ""}, "ssl": {"GPU": "asia-erg.2miners.com:18888", "ASIC": ""}}, "hashrate_url": ""}
},
"vipor.net": {
"wallet_mining": true,
"coins": {"GPU": ["XNA", "CLORE", "NEXA", "XEL"], "ASIC": []},
"XNA": {"full_name": "Neurai", "algos": ["KawPOW"], "pay_interval": 1, "min_pay": 1, "model_fee": {"PPLNS": 0.008, "SOLO": 0.008}, "mining_url": {"tcp": {"GPU": "cn.vipor.net:5090", "ASIC": ""}, "ssl": {"GPU": "cn.vipor.net:5190", "ASIC": ""}}, "hashrate_url": ""},
"CLORE": {"full_name": "Clore.ai", "algos": ["KawPOW"], "pay_interval": 1, "min_pay": 1, "model_fee": {"PPLNS": 0.008, "SOLO": 0.008}, "mining_url": {"tcp": {"GPU": "cn.vipor.net:5030", "ASIC": ""}, "ssl": {"GPU": "cn.vipor.net:5130", "ASIC": ""}}, "hashrate_url": ""},
"NEXA": {"full_name": "Nexa", "algos": ["NexaPow"], "pay_interval": 1, "min_pay": 5000, "model_fee": {"PPLNS": 0.01, "SOLO": 0.01}, "mining_url": {"tcp": {"GPU": "cn.vipor.net:5084", "ASIC": ""}, "ssl": {"GPU": "cn.vipor.net:5184", "ASIC": ""}}, "hashrate_url": ""},
"XEL": {"full_name": "Xelis", "algos": ["XelisHashV2"], "pay_interval": 1, "min_pay": 0.05, "model_fee": {"PPLNS": 0.008, "SOLO": 0.008}, "mining_url": {"tcp": {"GPU": "cn.vipor.net:5077", "ASIC": ""}, "ssl": {"GPU": "cn.vipor.net:5177", "ASIC": ""}}, "hashrate_url": ""}
},
"herominers": {
"wallet_mining": true,
"coins": {"GPU": ["CLORE", "CFX", "IRON", "KLS", "RVN", "ERG", "XEL"], "ASIC": []},
"CLORE": {"full_name": "Clore.ai", "algos": ["KawPow"], "pay_interval": 1, "min_pay": 10, "model_fee": {"PROP": 0.009, "SOLO": 0.009}, "mining_url": {"tcp": {"GPU": "hk.clore.herominers.com:1163", "ASIC": ""}, "ssl": {"GPU": "", "ASIC": ""}}, "hashrate_url": ""},
"CFX": {"full_name": "Conflux", "algos": ["Octopus"], "pay_interval": 1, "min_pay": 1, "model_fee": {"PROP": 0.009, "SOLO": 0.009}, "mining_url": {"tcp": {"GPU": "hk.conflux.herominers.com:1170", "ASIC": ""}, "ssl": {"GPU": "", "ASIC": ""}}, "hashrate_url": ""},
"IRON": {"full_name": "Iron Fish", "algos": ["FishHash"], "pay_interval": 1, "min_pay": 0.05, "model_fee": {"PROP": 0.009, "SOLO": 0.009}, "mining_url": {"tcp": {"GPU": "hk.ironfish.herominers.com:1145", "ASIC": ""}, "ssl": {"GPU": "", "ASIC": ""}}, "hashrate_url": ""},
"KLS": {"full_name": "Karlsen", "algos": ["KarlsenHashv2"], "pay_interval": 1, "min_pay": 1, "model_fee": {"PROP": 0.009, "SOLO": 0.009}, "mining_url": {"tcp": {"GPU": "hk.karlsen.herominers.com:1195", "ASIC": ""}, "ssl": {"GPU": "", "ASIC": ""}}, "hashrate_url": ""},
"RVN": {"full_name": "Ravencoin", "algos": ["KawPow"], "pay_interval": 1, "min_pay": 5, "model_fee": {"PROP": 0.009, "SOLO": 0.009}, "mining_url": {"tcp": {"GPU": "hk.ravencoin.herominers.com:1140", "ASIC": ""}, "ssl": {"GPU": "", "ASIC": ""}}, "hashrate_url": ""},
"ERG": {"full_name": "Ergo", "algos": ["Autolykos v2"], "pay_interval": 1, "min_pay": 0.5, "model_fee": {"PROP": 0.009, "SOLO": 0.009}, "mining_url": {"tcp": {"GPU": "hk.ergo.herominers.com:1180", "ASIC": ""}, "ssl": {"GPU": "", "ASIC": ""}}, "hashrate_url": ""},
"XEL": {"full_name": "Xelis", "algos": ["Xelishashv2"], "pay_interval": 1, "min_pay": 0.1, "model_fee": {"PROP": 0.009, "SOLO": 0.009}, "mining_url": {"tcp": {"GPU": "hk.xelis.herominers.com:1225", "ASIC": ""}, "ssl": {"GPU": "", "ASIC": ""}}, "hashrate_url": ""}
},
"rplant.xyz": {
"wallet_mining": true,
"coins": {"GPU": ["CLORE", "NEXA"], "ASIC": []},
"CLORE": {"full_name": "Clore.ai", "algos": ["kawpow"], "pay_interval": 1, "min_pay": 1, "model_fee": {"PROP": 0.01, "SOLO": 0.02}, "mining_url": {"tcp": {"GPU": "asia.rplant.xyz:17083", "ASIC": ""}, "ssl": {"GPU": "", "ASIC": ""}}, "hashrate_url": ""},
"NEXA": {"full_name": "Nexa", "algos": ["nexapow"], "pay_interval": 2, "min_pay": 5000, "model_fee": {"PROP": 0.009, "SOLO": 0.018}, "mining_url": {"tcp": {"GPU": "asia.rplant.xyz:17092", "ASIC": ""}, "ssl": {"GPU": "", "ASIC": ""}}, "hashrate_url": ""}
},
"f2pool": {
"wallet_mining": false,
"coins": {"GPU": ["CFX", "NEXA"], "ASIC": []},
"CFX": {"full_name": "Conflux", "algos": ["Octopus"], "pay_interval": "00:00--08:00 UTC", "min_pay": 1, "model_fee": {"PPLNS": 0.01}, "mining_url": {"tcp": {"GPU": "cfx.f2pool.com:6800", "ASIC": ""}, "ssl": {"GPU": "cfxssl.f2pool.com:6820", "ASIC": ""}}, "hashrate_url": ""},
"NEXA": {"full_name": "Nexa", "algos": ["NexaPow"], "pay_interval": "00:00--08:00 UTC", "min_pay": 50000, "model_fee": {"PPLNS": 0.01}, "mining_url": {"tcp": {"GPU": "nexa.f2pool.com:3400", "ASIC": ""}, "ssl": {"GPU": "", "ASIC": ""}}, "hashrate_url": ""}
},
"ntminerpool": {
"wallet_mining": true,
"coins": {"GPU": ["CLORE", "CFX", "IRON", "NEXA", "KLS", "RVN", "ERG"], "ASIC": []},
"CLORE": {"full_name": "Clore.ai", "algos": ["KawPow"], "pay_interval": 24, "min_pay": 10, "model_fee": {"PPLNS": 0}, "mining_url": {"tcp": {"GPU": "clore.ntminer.vip:13688", "ASIC": ""}, "ssl": {"GPU": "clore.ntminer.vip:13699", "ASIC": ""}}, "hashrate_url": ""},
"CFX": {"full_name": "Conflux", "algos": ["Octopus"], "pay_interval": 24, "min_pay": 100, "model_fee": {"PPS+": 0.005}, "mining_url": {"tcp": {"GPU": "cfx.ntminer.vip:26060", "ASIC": ""}, "ssl": {"GPU": "cfx.ntminer.vip:25050", "ASIC": ""}}, "hashrate_url": ""},
"IRON": {"full_name": "IronFish", "algos": ["FishHash"], "pay_interval": 24, "min_pay": 0.05, "model_fee": {"PPS+": 0}, "mining_url": {"tcp": {"GPU": "iron.ntminer.vip:9688", "ASIC": ""}, "ssl": {"GPU": "iron.ntminer.vip:9699", "ASIC": ""}}, "hashrate_url": ""},
"NEXA": {"full_name": "Nexa", "algos": ["NexaPow"], "pay_interval": 24, "min_pay": 50000, "model_fee": {"PPLNS": 0}, "mining_url": {"tcp": {"GPU": "nexa.ntminer.vip:14688", "ASIC": ""}, "ssl": {"GPU": "nexa.ntminer.vip:14699", "ASIC": ""}}, "hashrate_url": ""},
"KLS": {"full_name": "Karlsen", "algos": ["KarlsenHashv2"], "pay_interval": 24, "min_pay": 10, "model_fee": {"PPLNS": 0}, "mining_url": {"tcp": {"GPU": "kls.ntminer.vip:8699", "ASIC": ""}, "ssl": {"GPU": "kls.ntminer.vip:8688", "ASIC": ""}}, "hashrate_url": ""},
"RVN": {"full_name": "Ravencoin", "algos": ["KawPow"], "pay_interval": 24, "min_pay": 10, "model_fee": {"PPS+": 0}, "mining_url": {"tcp": {"GPU": "rvn.ntminer.vip:22020", "ASIC": ""}, "ssl": {"GPU": "rvn.ntminer.vip:21010", "ASIC": ""}}, "hashrate_url": ""},
"ERG": {"full_name": "Ergo", "algos": ["Autolykos2"], "pay_interval": 24, "min_pay": 1, "model_fee": {"PPS+": 0}, "mining_url": {"tcp": {"GPU": "ergo.ntminer.vip:24040", "ASIC": ""}, "ssl": {"GPU": "ergo.ntminer.vip:23030", "ASIC": ""}}, "hashrate_url": ""}
},
"woolypooly": {
"wallet_mining": true,
"coins": {"GPU": ["XNA","CLORE","CFX","NEXA","KLS","RVN","ERG","XEL"], "ASIC": []},
"XNA": {"full_name": "Neurai", "algos": ["KawPow"], "pay_interval": -1, "min_pay": 1000, "model_fee": {"PPLNS": 0.009, "SOLO": 0.009}, "mining_url": {"tcp": {"GPU": "pool.zh.woolypooly.com:3128", "ASIC": ""}, "ssl": {"GPU": "pool.zh.woolypooly.com:3128", "ASIC": ""}}, "hashrate_url": ""},
"CLORE": {"full_name": "Clore.ai", "algos": ["KawPow"], "pay_interval": -1, "min_pay": 10, "model_fee": {"PPLNS": 0.009, "SOLO": 0.009}, "mining_url": {"tcp": {"GPU": "pool.zh.woolypooly.com:3126", "ASIC": ""}, "ssl": {"GPU": "pool.zh.woolypooly.com:3126", "ASIC": ""}}, "hashrate_url": ""},
"CFX": {"full_name": "Conflux", "algos": ["Octopus"], "pay_interval": -1, "min_pay": 1, "model_fee": {"PPLNS": 0.009, "SOLO": 0.009}, "mining_url": {"tcp": {"GPU": "pool.zh.woolypooly.com:3094", "ASIC": ""}, "ssl": {"GPU": "pool.zh.woolypooly.com:3094", "ASIC": ""}}, "hashrate_url": ""},
"NEXA": {"full_name": "Nexa", "algos": ["NexaPow"], "pay_interval": -1, "min_pay": 50000, "model_fee": {"PPLNS": 0.009, "SOLO": 0.009}, "mining_url": {"tcp": {"GPU": "pool.zh.woolypooly.com:3124", "ASIC": ""}, "ssl": {"GPU": "pool.zh.woolypooly.com:3124", "ASIC": ""}}, "hashrate_url": ""},
"KLS": {"full_name": "Karlsen", "algos": ["KarlsenV2"], "pay_interval": -1, "min_pay": 25, "model_fee": {"PPLNS": 0.009, "SOLO": 0.009}, "mining_url": {"tcp": {"GPU": "pool.zh.woolypooly.com:3132", "ASIC": ""}, "ssl": {"GPU": "pool.zh.woolypooly.com:3132", "ASIC": ""}}, "hashrate_url": ""},
"RVN": {"full_name": "Ravencoin", "algos": ["kawpow"], "pay_interval": -1, "min_pay": 5, "model_fee": {"PPLNS": 0.009, "SOLO": 0.009}, "mining_url": {"tcp": {"GPU": "pool.zh.woolypooly.com:55555", "ASIC": ""}, "ssl": {"GPU": "pool.zh.woolypooly.com:55555", "ASIC": ""}}, "hashrate_url": ""},
"ERG": {"full_name": "Ergo", "algos": ["Autolykos"], "pay_interval": -1, "min_pay": 1, "model_fee": {"PPLNS": 0.009, "SOLO": 0.009}, "mining_url": {"tcp": {"GPU": "pool.zh.woolypooly.com:3100", "ASIC": ""}, "ssl": {"GPU": "pool.zh.woolypooly.com:3100", "ASIC": ""}}, "hashrate_url": ""},
"XEL": {"full_name": "Xelis", "algos": ["Xelishash"], "pay_interval": -1, "min_pay": 0.1, "model_fee": {"PPLNS": 0.009, "SOLO": 0.009}, "mining_url": {"tcp": {"GPU": "pool.zh.woolypooly.com:3150", "ASIC": ""}, "ssl": {"GPU": "pool.zh.woolypooly.com:3150", "ASIC": ""}}, "hashrate_url": ""}
},
"K1pool": {
"wallet_mining": false,
"coins": {"GPU": ["CLORE", "RVN", "ERG", "XEL"], "ASIC": []},
"CLORE": {"full_name": "CLORE", "algos": ["KAWPOW"], "pay_interval": 0.3, "min_pay": 100, "model_fee": {"PPLNS": 0.01, "SOLO":0.01}, "mining_url": {"tcp": {"GPU": "cn.clore.k1pool.com:5030", "ASIC": ""}, "ssl": {"GPU": "cn.clore.k1pool.com:5030", "ASIC": ""}}, "hashrate_url": ""},
"RVN": {"full_name": "Ravencoin", "algos": ["KAWPOW"], "pay_interval": 0.3, "min_pay": 100, "model_fee": {"PPLNS": 0.01, "SOLO":0.01}, "mining_url": {"tcp": {"GPU": "cn.rvn.k1pool.com:7861", "ASIC": ""}, "ssl": {"GPU": "cn.rvn.k1pool.com:7861", "ASIC": ""}}, "hashrate_url": ""},
"ERG": {"full_name": "Ergo", "algos": ["Autolykos2"], "pay_interval": 0.3, "min_pay": 2, "model_fee": {"PPLNS": 0.01, "SOLO":0.01}, "mining_url": {"tcp": {"GPU": "cn.erg.k1pool.com:3746", "ASIC": ""}, "ssl": {"GPU": "", "ASIC": ""}}, "hashrate_url": ""},
"XEL": {"full_name": "Xelis", "algos": ["Xelishashv2"], "pay_interval": 4, "min_pay": 1, "model_fee": {"PPLNS": 0.01, "SOLO":0.01}, "mining_url": {"tcp": {"GPU": "cn.xel.k1pool.com:9351", "ASIC": ""}, "ssl": {"GPU": "", "ASIC": ""}}, "hashrate_url": ""}
},
"hiveon.net": {
"wallet_mining": true,
"coins": {"GPU": ["RVN"], "ASIC": []},
"RVN": {"full_name": "Ravencoin", "algos": ["kawpow"], "pay_interval": "07:30 UTC", "min_pay": 10, "model_fee": {"PPS+": 0.005}, "mining_url": {"tcp": {"GPU": "rvn.hiveon.com:8888", "ASIC": ""}, "ssl": {"GPU": "rvn.hiveon.com:7777", "ASIC": ""}}, "hashrate_url": ""}
},
"ravenminer": {
"wallet_mining": true,
"coins": {"GPU": ["RVN"], "ASIC": []},
"RVN": {"full_name": "Ravencoin", "algos": ["kawpow"], "pay_interval": 3, "min_pay": 5, "model_fee": {"PPLNS":0.005, "PPS+": 0.01, "SOLO":0.005}, "mining_url": {"tcp": {"GPU": "stratum.ravenminer.com:3838", "ASIC": ""}, "ssl": {"GPU": "", "ASIC": ""}}, "hashrate_url": ""}
},
"antpool": {
"wallet_mining": false,
"coins": {"GPU": ["RVN"], "ASIC": []},
"RVN": {"full_name": "Ravencoin", "algos": ["kawpow"], "pay_interval": "08:00-16:00", "min_pay": 1, "model_fee": {"PPS": 0.03}, "mining_url": {"tcp": {"GPU": "rvn.antpool.com:8003", "ASIC": ""}, "ssl": {"GPU": "", "ASIC": ""}}, "hashrate_url": ""}
}
}

BIN
v1/v1.0.0_测试报告.xlsx Normal file

Binary file not shown.

BIN
v1/v1.1.0_测试报告.xlsx Normal file

Binary file not shown.

BIN
v1/v1.1.0_测试用例.xlsx Normal file

Binary file not shown.

BIN
v1/v1.2.0_测试报告.xlsx Normal file

Binary file not shown.

BIN
v1/v1.2.0_测试用例.xlsx Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,104 @@
# 项目背景
```
随着区块链技术的广泛应用与数字货币市场的持续发展,挖矿活动成为保障去中心化网络安全和运行的重要方式。由于专业矿机价格高昂、电力成本上升、算力集中等因素,越来越多的个人或机构用户希望通过“算力租赁”方式参与挖矿活动。
算力租赁即通过互联网将本地或数据中心的算力资源出租,用户无需购买矿机,即可远程参与挖矿,获取加密货币收益。本报告旨在分析开展挖矿算力租赁业务的可行性,并提出实施方案。
```
# 市场分析
## -市场需求
| 用户类型 | 需求动因 |
| ---- | ---------------------- |
| 散户矿工 | 无法承担高额硬件和电力成本,倾向于轻资产挖矿 |
| 矿池 | 扩大算力规模,增强出块能力 |
| 投资机构 | 希望获取数字资产敞口但无技术能力 |
## -竞争分析
| 平台 | 业务模式 | 优势 | 风险点 |
| ------------ | ---------------- | ---------------- | ------------ |
| NiceHash | 即时算力租赁市场 | 灵活定价、用户多 | 对接门槛较高 |
| BitDeer | 云挖矿合约 | 品牌强、合约稳定 | 锁仓周期长 |
| 私人矿工平台 | 自建小型算力商城 | 成本低,快速部署 | 信任风险高 |
# 业务模式设计
## -商业模式
```
平台型算力市场:撮合买方(租客)与卖方(矿工);
自营型云算力服务:企业自持算力资源,售卖虚拟化算力合约;
混合模式:结合以上两种,既出租自营算力,也开放给第三方矿工接入。
```
## -核心功能模块
| 模块 | 功能描述 |
| ------------ | ------------------------------------- |
| 算力管理系统 | 支持多种算法、多节点管理与调度 |
| 用户租赁平台 | 前端下单、支付、算力分配 |
| 收益分发系统 | 对接矿池,按有效算力分配收入 |
| 风险控制 | 异常算力检测、黑名单、掉线保护 |
| 财务系统 | 支持法币/加密货币支付、结算、发票 |
# 技术方案
## -系统架构
```
后端技术栈Node.js / Go + MySQL / Redis
前端Vue.js / React
调度:基于 ZMQ / gRPC 的异步算力调度系统
矿机接入协议Stratum V1/V2
自动化部署与监控Docker + Prometheus + Grafana
```
## -安全设计
```
用户钱包采用冷热分离方案;
实时算力数据加密传输;
风控脚本定期清理僵尸任务、防止算力欺诈。
```
# 运营计划
## -收益来源
| 来源 | 说明 |
| ------ | ----------------- |
| 算力租赁费 | 向租户收取的服务费 |
| 挖矿收入分成 | 若使用共享矿池,可提取部分挖矿奖励 |
| 提现手续费 | 低比例手续费增加收入 |
| 广告与推广位 | 吸引矿机厂商、电力公司合作投放 |
## -推广渠道
```
矿工社区Telegram、Discord、Bitcointalk
矿池合作
币圈 KOL 带货推广
SEO + 中文/英文官网
海外 Telegram 群与 Reddit 宣传
```
# 风险与对策
| 风险 | 应对措施 |
| ---------- | --------------------------- |
| 币价波动影响租赁意愿 | 提供多币种支持、稳定币支付 |
| 矿机掉线或被攻击 | 异常报警+自动迁移+DDOS防御 |
| 用户欺诈/洗钱行为 | 接入 KYC 与 AML 系统 |
| 法规不明朗 | 避开高监管区域,选择友好国家部署(如冰岛、哈萨克斯坦) |
# 发展规划
| 阶段 | 时间 | 目标 |
| ---- | ------- | -------------------------- |
| 第一阶段 | 第1-3个月 | 完成系统开发、上线测试版本 |
| 第二阶段 | 第4-6个月 | 建立矿池合作,完成首轮用户增长 |
| 第三阶段 | 第7-12个月 | 拓展海外市场,实现盈亏平衡 |
| 第四阶段 | 1年后 | 上线移动端App探索分布式租赁市场Web3方向 |