【不就是浏览器挖矿嘛】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 算法流程

  1. 初始化

    • 使用Keccak(b=1600, c=512)计算输入
    • 提取0-31字节作为AES-256密钥
    • 分配2MB暂存器
    • 提取64-191字节数据分割为8个16字节块
    • 进行10轮AES加密填充暂存器
  2. 内存处理

    • 主循环524,288次迭代
    • 使用a和b变量(各16字节)进行地址计算
    • 暂存器读写操作
  3. 结果计算

    • 再次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长连接
  • 核心流程不变:
    1. 认证/登录
    2. 获取任务
    3. 计算哈希
    4. 提交结果
    5. 确认有效性

6. 自建矿池方案

6.1 改造思路

  1. 构造PoolProxy接管WebSocket通信
  2. 实现协议转换层:
    • 前端WebSocket ↔ 后端传统矿池协议
  3. 直接对接矿池,避免Coinhive平台30%手续费

6.2 实现步骤

  1. 前端改造

    • 修改coinhive.min.js中的WebSocket地址
    • 调整认证参数为自定义格式
  2. 后端实现

    • WebSocket服务端
    • 协议转换层
    • 矿池客户端连接
  3. 部署方案

    • 反向代理配置
    • 负载均衡考虑
    • 算力监控

7. 应用场景与优化

7.1 合理使用方案

  • 替代网站广告,控制CPU占用率
  • 提供用户知情选择权
  • 作为验证码的"硬算力"验证方式

7.2 性能优化

  • 浏览器兼容性处理
  • 计算线程数控制
  • 节流策略实现
  • 用户设备适应性调整

8. 扩展学习资源

  • CryptoNote标准文档
  • WebAssembly官方文档
  • Monero挖矿协议规范
  • 开源矿池实现参考(xmr-stak, ccminer等)

通过以上技术分析和实现方案,可以构建自主可控的前端挖矿系统,避免依赖第三方平台,实现更高效的算力利用和收益最大化。

Coinhive挖矿脚本分析与Pool改造自建教学文档 1. 前端挖矿技术概述 1.1 基本概念 前端挖矿 :通过浏览器前端技术实现,利用访问者的CPU/GPU进行加密货币挖矿 与传统挖矿区别 : 传统挖矿:用户主动使用专用客户端(CPU/GPU) 前端挖矿:用户被动(或主动)通过浏览器参与 1.2 技术实现 CPU挖矿 :通过asm.js或WebAssembly实现 GPU挖矿 :通过HTML5 WebGL实现 优势 :分布式利用多设备算力,适合流量变现或替代广告 2. Coinhive脚本分析 2.1 核心组件 2.2 运行环境判断 2.3 兼容性处理 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 示例实现 参考项目: ccminer-cryptonight xmr-stak-cpu 4. 矿池通信协议分析 4.1 传统矿池协议(PoolSocket) 4.2 WebSocket协议(Coinhive) 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等) 通过以上技术分析和实现方案,可以构建自主可控的前端挖矿系统,避免依赖第三方平台,实现更高效的算力利用和收益最大化。