【不就是浏览器挖矿嘛】Coinhive挖矿脚本分析与Pool改造自建(二)
字数 759 2025-08-25 22:58:47

Coinhive挖矿脚本分析与Pool改造自建教程

一、概述

本教程详细介绍了Coinhive挖矿脚本的构成、运作方式,以及如何构建自己的WebMoneroPool。教程分为两部分:中间件deepMiner构造和自建矿池搭建。

二、中间件deepMiner构造

1. 基本思路

有两种实现方式:

  1. 从开源矿池项目二次构造:全面可控但服务器要求高
  2. 使用Pool_Proxy中间件形式:便于维护但对矿池控制有限

推荐使用Pool_Proxy中间件方式。

2. 技术实现

使用Node.js实现WebSocket与PoolSocket(TCP)的流量转换。

核心代码框架

var http = require('http'),
    WebSocket = require("ws"),
    net = require('net'),
    fs = require('fs');

配置文件config.json

{
  "lhost": "127.0.0.1",
  "lport": 7777,
  "domain": "miner.deepwn.com",
  "pool": "pool.usxmrpool.com:3333",
  "addr": "41ynfGBUDbGJYYzz2jgS*",
  "pass": ""
}

Web服务基础

var conf = fs.readFileSync(__dirname + '/config.json', 'utf8');
conf = JSON.parse(conf);

var web = http.createServer((req, res) => {
  res.setHeader('Access-Control-Allow-Origin', '*');
  res.end('Pool Worked!');
}).listen(conf.lport, conf.lhost);

WebSocket服务

var srv = new WebSocket.Server({
  server: web,
  path: "/proxy",
  maxPayload: 256
});

srv.on('connection', (ws) => {
  var conn = {
    uid: null,
    pid: new Date().getTime(), // 解决Miner_banned问题
    workerId: null,
    found: 0,
    accepted: 0,
    ws: ws,
    pl: new net.Socket()
  };
  
  var pool = conf.pool.split(':');
  conn.pl.connect(pool[1], pool[0]);
});

事件处理

// WebSocket事件
conn.ws.on('message', (data) => { ws2pool(data); });
conn.ws.on('error', (data) => { conn.pl.destroy(); });
conn.ws.on('close', () => { conn.pl.destroy(); });

// PoolSocket事件
conn.pl.on('data', (data) => { pool2ws(data); });
conn.pl.on('error', (data) => { conn.ws.close(); });
conn.pl.on('close', () => { conn.ws.close(); });

流量转换函数

// WebSocket转PoolSocket
function ws2pool(data) {
  var buf;
  data = JSON.parse(data);
  
  switch(data.type) {
    case 'auth':
      // 处理认证
      break;
    case 'submit':
      // 处理提交
      break;
  }
}

// PoolSocket转WebSocket
function pool2ws(data) {
  var buf;
  data = JSON.parse(data);
  
  // 处理各种响应类型
  if(data.id === conn.pid && data.result) {
    // 处理不同结果
  }
}

静态资源处理

req.url = (req.url === '/') ? '/index.html' : req.url;
fs.readFile(__dirname + '/web' + req.url, (err, buf) => {
  if(err) {
    // 404处理
  } else {
    if(!req.url.match(/\.wasm$/) && !req.url.match(/\.mem$/)) {
      buf = buf.toString().replace(/%deepMiner_domain%/g, conf.domain);
    }
    res.end(buf);
  }
});

3. 项目结构

deepMiner.git
|-- README.md
|-- banner
|-- config.json
|-- package-lock.json
|-- package.json
|-- server.js
|__ web
    |-- 404.html
    |-- deepMiner.js
    |-- demo.html
    |-- index.html
    |-- lib
    |   |-- cryptonight-asmjs.min.js
    |   |-- cryptonight-asmjs.min.js.mem
    |   |__ cryptonight.wasm
    |__ worker.js

三、自建矿池搭建

1. 准备工作

服务器要求

  • 建议配置:≥2C4G
  • 设置虚拟内存:
dd if=/dev/zero of=/mnt/myswap.swap bs=1M count=4000
mkswap /mnt/myswap.swap
swapon /mnt/myswap.swap

添加到/etc/fstab:

/mnt/myswap.swap none swap sw 0 0

安装依赖

apt-get install build-essential libtool autotools-dev autoconf pkg-config libssl-dev
apt-get install libboost-all-dev git libminiupnpc-dev redis-server
add-apt-repository ppa:bitcoin/bitcoin
apt-get update
apt-get install libdb4.8-dev libdb4.8++-dev

2. 搭建Monero节点

cd
mkdir monero
cd monero
wget https://downloads.getmonero.org/cli/monero-linux-x64-v0.11.0.0.tar.bz2
tar -xjvf monero-linux-x64-v0.11.0.0.tar.bz2

启动monerod:

./monerod --detach

或者手动下载区块链数据:

wget -c --progress=bar https://downloads.getmonero.org/blockchain.raw
./monero-blockchain-import --verify 0 --input-file ./blockchain.raw
rm -rf ./blockchain.raw

3. 搭建矿池

下载源码

cd /srv
git clone https://github.com/zone117x/node-cryptonote-pool.git pool
cd pool
npm update

配置矿池

cp config_example.json config.json
vi config.json

关键配置项:

{
  "coin": "monero",
  "symbol": "MRO",
  "poolServer": {
    "enabled": true,
    "clusterForks": "auto",
    "poolAddress": "你的钱包地址",
    "blockRefreshInterval": 1000,
    "minerTimeout": 900,
    "ports": [
      {
        "port": 1111,
        "difficulty": 100,
        "desc": "Low end hardware"
      }
    ],
    "banning": {
      "enabled": true,
      "time": 30,
      "invalidPercent": 25,
      "checkThreshold": 30
    }
  },
  "payments": {
    "enabled": true,
    "interval": 600,
    "maxAddresses": 50,
    "mixin": 3,
    "transferFee": 5000000000,
    "minPayment": 100000000000,
    "denomination": 100000000000
  },
  "blockUnlocker": {
    "enabled": true,
    "interval": 30,
    "depth": 60,
    "poolFee": 1.8,
    "devDonation": 0.1,
    "coreDevDonation": 0.1
  },
  "api": {
    "enabled": true,
    "hashrateWindow": 600,
    "updateInterval": 3,
    "port": 8117,
    "blocks": 30,
    "payments": 30,
    "password": "test"
  },
  "daemon": {
    "host": "127.0.0.1",
    "port": 18081
  },
  "wallet": {
    "host": "127.0.0.1",
    "port": 8082
  },
  "redis": {
    "host": "127.0.0.1",
    "port": 6379,
    "auth": null
  }
}

启动矿池

node init.js

或使用forever保持运行:

forever start /srv/pool/init.js

四、相关项目

  1. node-cryptonote-pool
  2. monero-universal-pool
  3. 其他Monero矿池

五、发展构想

  1. 前端算力可用于机器人验证,通过算力难度增加批量化成本
  2. asmjs和WebAssembly提升前端处理能力
  3. 浏览器构造本地应用、3D页游等新形式
  4. 类似Coinhive验证码的应用前景

六、注意事项

  1. 矿池开启应在Pool_Proxy之前
  2. 根据web挖矿特点适当调整矿池配置(如降低难度、减少端口等)
  3. 确保Redis安全配置,不要对外开放
  4. 注意Miner_banned问题的处理(通过pid区分)
Coinhive挖矿脚本分析与Pool改造自建教程 一、概述 本教程详细介绍了Coinhive挖矿脚本的构成、运作方式,以及如何构建自己的WebMoneroPool。教程分为两部分:中间件deepMiner构造和自建矿池搭建。 二、中间件deepMiner构造 1. 基本思路 有两种实现方式: 从开源矿池项目二次构造:全面可控但服务器要求高 使用Pool_ Proxy中间件形式:便于维护但对矿池控制有限 推荐使用Pool_ Proxy中间件方式。 2. 技术实现 使用Node.js实现WebSocket与PoolSocket(TCP)的流量转换。 核心代码框架 配置文件config.json Web服务基础 WebSocket服务 事件处理 流量转换函数 静态资源处理 3. 项目结构 三、自建矿池搭建 1. 准备工作 服务器要求 建议配置:≥2C4G 设置虚拟内存: 添加到/etc/fstab: 安装依赖 2. 搭建Monero节点 启动monerod: 或者手动下载区块链数据: 3. 搭建矿池 下载源码 配置矿池 关键配置项: 启动矿池 或使用forever保持运行: 四、相关项目 node-cryptonote-pool monero-universal-pool 其他Monero矿池 五、发展构想 前端算力可用于机器人验证,通过算力难度增加批量化成本 asmjs和WebAssembly提升前端处理能力 浏览器构造本地应用、3D页游等新形式 类似Coinhive验证码的应用前景 六、注意事项 矿池开启应在Pool_ Proxy之前 根据web挖矿特点适当调整矿池配置(如降低难度、减少端口等) 确保Redis安全配置,不要对外开放 注意Miner_ banned问题的处理(通过pid区分)