Skip to content

CassiopeiaCode/powloot

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

14 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

PowLoot

一个基于服务端出题的 PoW 竞速游戏(多赛道、全局轮次、共享奖励池),后端使用 Node.js + Express + SQLite,前端为静态页面并带 WebSocket 实时状态。

项目特性

  • 多赛道独立轮次(每条赛道同时只有一个 open 轮次)
  • 按 IP 发放挑战并使用 ip_lock 保证单 IP 同时仅有一个有效挑战
  • 提交成功后原子结算:关轮次、发奖励、记账、开启下一轮
  • 奖池按时间持续补充(按毫秒累计),并在结算时按比例发放
  • /submit 具备并发与频率保护(全局 + 每 IP)
  • WebSocket 提供实时网络算力统计、轮次事件与提交密钥下发
  • 支持本地提现请求与一键兑换码(可选远程 MySQL 持久化)
  • 服务器端优先使用 WASM 验证器(有导出时)加速重型谜题校验

当前默认赛道

在默认配置下,启用赛道由 computeEnabledTracks() 计算,且 DISABLED_TRACKS 默认禁用了 CPU_HASH(测试环境除外)。

可用赛道定义见 ALL_TRACKS

  • CPU_HASH
  • MEM_WORK
  • CHAIN
  • BRANCHY_MIX
  • TINY_VM
  • VM_CHAIN
  • ARGON2D_CHAIN

说明:文档中若出现“3 赛道”描述,属于早期设计稿。实际运行以 CONFIG.tracks 为准。

技术栈

  • Node.js 22+
  • Express 5
  • better-sqlite3
  • ws (WebSocket)
  • zod
  • 可选:mysql2(用于 withdraw_code 远端写入)

参见 package.json

快速开始

1) 安装依赖

npm install

2) 配置环境变量

复制并编辑 .env.example

cp .env.example .env

核心变量:

  • PORT:服务端口(默认 8080
  • DB_PATH:SQLite 路径(默认 ./data/powloot.sqlite
  • TRUST_PROXY:反向代理信任策略(默认 1

一键兑换(可选)MySQL 变量:

  • REDEEM_MYSQL_HOST
  • REDEEM_MYSQL_PORT
  • REDEEM_MYSQL_USER
  • REDEEM_MYSQL_PASSWORD
  • REDEEM_MYSQL_DATABASE

3) 启动服务

npm start

启动入口见 src/server.js

4) 运行测试

npm test

核心玩法与结算

  1. 客户端请求 GET /challenge
  2. 服务端按 IP 选择赛道并返回当前轮次参数
  3. 客户端本地搜索 nonce
  4. 客户端提交 POST /submit
  5. 服务端验证通过后进行原子结算并轮转下一轮

关键逻辑:

奖池与难度(默认参数)

基于默认配置(见 CONFIG):

  • 奖池补充:1000 单位 / 24 小时(微单位累计)
  • 单次奖励:奖池的 0.1%payoutBps = 10
  • 轮次超时强制轮转:30 分钟
  • “慢解”阈值:10 秒(用于难度更新分支)

奖池补充函数见 applyPoolTopup()

HTTP API 概览

实现位于 createApp()

  • GET /challenge:获取挑战
  • POST /submit:提交证明
  • GET /balance:查询当前 IP 余额
  • POST /withdraw:创建提现请求(本地记账)
  • POST /withdraw_code:生成兑换码并尝试写入远端 MySQL
  • GET /withdraw_history:查询本地兑换历史
  • GET /admin/state:调试状态

更详细说明见 docs/API.md

WebSocket

端点:/ws,实现见 WebSocketServer

服务端推送:

  • stats:网络算力与在线矿工数
  • secret:提交密钥(用于 /submit 请求头)
  • round_solved:轮次被解出事件
  • kicked:同 IP 新连接挤掉旧连接

客户端上报:

  • hashrate:当前算力(可带 track)

安全与风控说明

  • /submit 可要求 x-pow-secret(默认生产/开发启用,测试关闭),校验见 verifyIpSecret()
  • 全局 HTTP 并发上限(默认 100),见 HTTP_MAX_INFLIGHT
  • 验证器并发上限(默认 2),见 VERIFY_MAX_INFLIGHT
  • 每 IP 提交限制:
    • 最小提交间隔 1 秒
    • 并发提交上限 1
    • 错误证明触发 10 秒禁提

数据存储

SQLite schema 迁移见 migrate(),主要表:

  • rounds, current_round, ip_lock
  • ip_track_times, global_track_times
  • balances, reward_pool
  • pool_ledger, ip_ledger
  • withdraw_requests, redemption_codes

数据模型文档见 docs/DATA_MODEL.md

运维脚本

设置奖池余额脚本:scripts/set_reward_pool.js

npm run set:pool -- 500 --units
npm run set:pool -- 123000000 --micro
npm run set:pool -- 500 --units --db ./data/powloot.sqlite

文档索引

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors