【不就是浏览器挖矿嘛】Coinhive挖矿脚本分析与Pool改造自建(二)
字数 759 2025-08-25 22:58:47
Coinhive挖矿脚本分析与Pool改造自建教程
一、概述
本教程详细介绍了Coinhive挖矿脚本的构成、运作方式,以及如何构建自己的WebMoneroPool。教程分为两部分:中间件deepMiner构造和自建矿池搭建。
二、中间件deepMiner构造
1. 基本思路
有两种实现方式:
- 从开源矿池项目二次构造:全面可控但服务器要求高
- 使用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
四、相关项目
五、发展构想
- 前端算力可用于机器人验证,通过算力难度增加批量化成本
- asmjs和WebAssembly提升前端处理能力
- 浏览器构造本地应用、3D页游等新形式
- 类似Coinhive验证码的应用前景
六、注意事项
- 矿池开启应在Pool_Proxy之前
- 根据web挖矿特点适当调整矿池配置(如降低难度、减少端口等)
- 确保Redis安全配置,不要对外开放
- 注意Miner_banned问题的处理(通过pid区分)