【不就是浏览器挖矿嘛】Coinhive挖矿脚本分析与Pool改造自建(一)
字数 1330 2025-08-25 22:58:47
Coinhive挖矿脚本分析与Pool改造自建教学文档
1. 前端挖矿技术概述
1.1 基本概念
- 前端挖矿:通过浏览器前端技术实现,利用访问者的CPU/GPU进行加密货币挖矿
- 与传统挖矿区别:
- 传统挖矿:用户主动使用专用客户端(CPU/GPU)
- 前端挖矿:用户被动(或主动)通过浏览器参与
1.2 技术实现
- CPU挖矿:通过asm.js或WebAssembly实现
- GPU挖矿:通过HTML5 WebGL实现
- 优势:分布式利用多设备算力,适合流量变现或替代广告
2. Coinhive脚本分析
2.1 核心组件
coinhive.min.js
├── WebSocket矿池通信
├── worker分配与交互
├── CoinHive.CONFIG.WEBSOCKET_SHARDS (WebSocket地址)
├── CoinHive.CRYPTONIGHT_WORKER_BLOB (动态生成Blob链接)
├── cryptonight.wasm (WebAssembly实现)
├── cryptonight-asmjs.min.js (asm.js兼容方案)
└── cryptonight-asmjs.min.js.mem (asm.js模拟内存)
2.2 运行环境判断
var ENVIRONMENT_IS_WEB = typeof window === "object";
var ENVIRONMENT_IS_WORKER = typeof importScripts === "function";
var ENVIRONMENT_IS_NODE = typeof process === "object" && typeof require === "function";
var ENVIRONMENT_IS_SHELL = !ENVIRONMENT_IS_WEB && !ENVIRONMENT_IS_NODE && !ENVIRONMENT_IS_WORKER;
2.3 兼容性处理
function integrateWasmJS(Module) {
var method = Module["wasmJSMethod"] || "native-wasm";
var wasmTextFile = Module["wasmTextFile"] || "cryptonight.wast";
var wasmBinaryFile = Module["wasmBinaryFile"] || "cryptonight.wasm";
var asmjsCodeFile = Module["asmjsCodeFile"] || "cryptonight.temp.asm.js";
// ...
}
3. CryptoNight算法解析
3.1 算法流程
-
初始化:
- 使用Keccak(b=1600, c=512)计算输入
- 提取0-31字节作为AES-256密钥
- 分配2MB暂存器
- 提取64-191字节数据分割为8个16字节块
- 进行10轮AES加密填充暂存器
-
内存处理:
- 主循环524,288次迭代
- 使用a和b变量(各16字节)进行地址计算
- 暂存器读写操作
-
结果计算:
- 再次Keccak计算
- 与暂存器内容异或运算
- 根据结果选择哈希函数(BLAKE-256/Groestl-256/JH-256/Skein-256)
3.2 示例实现
4. 矿池通信协议分析
4.1 传统矿池协议(PoolSocket)
// 登录请求
{
"method": "login",
"params": {
"login": "WalletAddr",
"pass": "",
"agent": "xmr-stak-cpu/1.3.0-1.5.0"
},
"id": 1
}
// 任务分配
{
"id": 1,
"jsonrpc": "2.0",
"error": null,
"result": {
"id": "811233385116793",
"job": {
"blob": "0606e498c5ce057326423f235dcd67dec07d9cb79e3506da8b35198e7debb40be3cbc2326c1999000000008bad7c9d5b78e9c9693903e817d20c09befe2c72ee6d20f297c0026d9a6e492406",
"job_id": "664084446453489",
"target": "711b0d00"
},
"status": "OK"
}
}
// 提交结果
{
"method": "submit",
"params": {
"id": "811233385116793",
"job_id": "664084446453489",
"nonce": "11018000",
"result": "0e9b264a2a225cbbdc520b1fbef207a12e092c23325b7667c27bd0d95a590c00"
},
"id": 1
}
4.2 WebSocket协议(Coinhive)
// 认证
{
"type": "auth",
"params": {
"site_key": "siteKey",
"type": "anonymous",
"user": null,
"goal": 0
}
}
// 任务分配
{
"type": "job",
"params": {
"job_id": "931350207026116",
"blob": "0606ffbddece05a1e21456e45a3ca88d8e0ff2f299568aecc5db053f08e04774cdfba60d0ae4db000000003d710b3b5444505391ba01b634f94d72915bda5a7999499f40f62e3046b254b403",
"target": "ffffff00"
}
}
// 提交结果
{
"type": "submit",
"params": {
"job_id": "931350207026116",
"nonce": "197aae72",
"result": "6d9a8c2da95bcd498a4056631f1a03b51f2d6806b1c6d44e4f45fd9878b6eb00"
}
}
// 结果确认
{
"type": "hash_accepted",
"params": {
"hashes": 256
}
}
5. 技术实现要点
5.1 WebAssembly与asm.js
- WebAssembly:将C代码编译为.wasm二进制格式,高效执行
- asm.js:JavaScript子集,提供接近原生性能
- 转换工具:
- Emscripten
- Binaryen
- WABT
5.2 通信协议适配
- 将传统JsonRPC 2.0协议适配为WebSocket长连接
- 核心流程不变:
- 认证/登录
- 获取任务
- 计算哈希
- 提交结果
- 确认有效性
6. 自建矿池方案
6.1 改造思路
- 构造PoolProxy接管WebSocket通信
- 实现协议转换层:
- 前端WebSocket ↔ 后端传统矿池协议
- 直接对接矿池,避免Coinhive平台30%手续费
6.2 实现步骤
-
前端改造:
- 修改coinhive.min.js中的WebSocket地址
- 调整认证参数为自定义格式
-
后端实现:
- WebSocket服务端
- 协议转换层
- 矿池客户端连接
-
部署方案:
- 反向代理配置
- 负载均衡考虑
- 算力监控
7. 应用场景与优化
7.1 合理使用方案
- 替代网站广告,控制CPU占用率
- 提供用户知情选择权
- 作为验证码的"硬算力"验证方式
7.2 性能优化
- 浏览器兼容性处理
- 计算线程数控制
- 节流策略实现
- 用户设备适应性调整
8. 扩展学习资源
- CryptoNote标准文档
- WebAssembly官方文档
- Monero挖矿协议规范
- 开源矿池实现参考(xmr-stak, ccminer等)
通过以上技术分析和实现方案,可以构建自主可控的前端挖矿系统,避免依赖第三方平台,实现更高效的算力利用和收益最大化。