Compare commits
46 Commits
23e5346790
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
410435720e | ||
|
|
07f7b690b7 | ||
|
|
6cfb1bfea3 | ||
|
|
4c84d13de6 | ||
|
|
e9a3280c89 | ||
|
|
8c552ceecf | ||
|
|
bed059e904 | ||
|
|
45b719f12b | ||
|
|
fe278c0f85 | ||
|
|
32d2d5f0a7 | ||
|
|
b31bfa2751 | ||
|
|
696e0de3d8 | ||
|
|
324cbd3ce4 | ||
|
|
e4ddf65005 | ||
|
|
b8cb79e780 | ||
|
|
a29375d565 | ||
|
|
408c3d4c06 | ||
|
|
4ad30da8a0 | ||
|
|
934d170d37 | ||
|
|
79f9275b57 | ||
|
|
5728f3f3fa | ||
|
|
13c2ab3951 | ||
|
|
596359aea9 | ||
|
|
6337f64778 | ||
|
|
1cf2ae0f63 | ||
|
|
1915f20dbf | ||
|
|
ee1d1a34a7 | ||
|
|
55292cdd03 | ||
|
|
4328aeef0f | ||
|
|
2c90ba3baf | ||
|
|
7a2f51fc59 | ||
| e6d0d4c302 | |||
| 2a75e492da | |||
|
|
aac3f93b32 | ||
|
|
42c798a094 | ||
|
|
4b3ee3f266 | ||
|
|
6074bd4784 | ||
|
|
76c5ee6ed8 | ||
|
|
078a3ba799 | ||
|
|
7372719ac4 | ||
|
|
9458d9fa11 | ||
| 8dfc4db229 | |||
|
|
4c343fa950 | ||
|
|
e4516168dd | ||
|
|
b928e91936 | ||
|
|
861c6a6fb5 |
69
db/chat.sql
Normal file
69
db/chat.sql
Normal 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
48
db/pool.sql
Normal 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全网实际报块数表';
|
||||
104
v1/CHANGELOG.md
104
v1/CHANGELOG.md
@@ -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
|
||||
113
v1/kryptex_halfhour_monitor.py
Normal file
113
v1/kryptex_halfhour_monitor.py
Normal 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()
|
||||
108
v1/miner_2miners_collector.py
Normal file
108
v1/miner_2miners_collector.py
Normal 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()
|
||||
312
v1/miners_algorithms_fees.json
Normal file
312
v1/miners_algorithms_fees.json
Normal 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
108
v1/pool.json
Normal 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
BIN
v1/v1.0.0_测试报告.xlsx
Normal file
Binary file not shown.
Binary file not shown.
BIN
v1/v1.1.0_测试报告.xlsx
Normal file
BIN
v1/v1.1.0_测试报告.xlsx
Normal file
Binary file not shown.
BIN
v1/v1.1.0_测试用例.xlsx
Normal file
BIN
v1/v1.1.0_测试用例.xlsx
Normal file
Binary file not shown.
BIN
v1/v1.2.0_测试报告.xlsx
Normal file
BIN
v1/v1.2.0_测试报告.xlsx
Normal file
Binary file not shown.
BIN
v1/v1.2.0_测试用例.xlsx
Normal file
BIN
v1/v1.2.0_测试用例.xlsx
Normal file
Binary file not shown.
Binary file not shown.
BIN
v1/算力租赁系统v1.0.0_测试报告.xlsx
Normal file
BIN
v1/算力租赁系统v1.0.0_测试报告.xlsx
Normal file
Binary file not shown.
BIN
v1/算力租赁系统v1.0.0_测试用例.xlsx
Normal file
BIN
v1/算力租赁系统v1.0.0_测试用例.xlsx
Normal file
Binary file not shown.
BIN
主从同步步骤配置.xlsx
BIN
主从同步步骤配置.xlsx
Binary file not shown.
BIN
服务器监控需求.xlsx
Normal file
BIN
服务器监控需求.xlsx
Normal file
Binary file not shown.
104
算力租赁业务研究报告.md
Normal file
104
算力租赁业务研究报告.md
Normal 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方向) |
|
||||
Reference in New Issue
Block a user