Skip to content

AcSunday/eth-pow-pool

Repository files navigation

core-pool

基于github上的core-pool修改与优化 https://github.com/etclabscore/core-pool

Features

  • 支持 HTTP 和 Stratum 挖掘
  • 详细的区块统计数据,包括运气百分比和全额奖励
  • 故障转移geth实例:内置geth高可用性
  • 工人的单独统计数据:可以突出显示超时的工人,以便矿工可以对钻机进行维护
  • 用于统计的 JSON-API
  • 新的基于 vue 的 UI(前后端分离)
  • 支持以太坊经典、魔多、以太坊、Ropsten 和 Ubiq。

Building on Linux

环境与依赖关系:

  • go >= 1.13
  • core-geth
  • redis-server >= 2.8.0
  • nodejs >= 4 LTS
  • nginx

我强烈建议使用 Ubuntu 20.04 LTS

首先安装 core-geth.

Clone并编译(需要gcc环境):

git config --global http.https://gopkg.in.followRedirects true
git clone https://github.com/etclabscore/core-pool.git
cd core-pool
make

安装 redis-server:

sudo apt update
sudo apt install redis-server

默认情况下,受监督的指令设置为 no。 由于您正在运行使用 systemd init 系统的 Ubuntu,请将其更改为 systemd:

sudo nano /etc/redis/redis.conf
. . .

# If you run Redis from upstart or systemd, Redis can interact with your
# supervision tree. Options:
#   supervised no      - no supervision interaction
#   supervised upstart - signal upstart by putting Redis into SIGSTOP mode
#   supervised systemd - signal systemd by writing READY=1 to $NOTIFY_SOCKET
#   supervised auto    - detect upstart or systemd method based on
#                        UPSTART_JOB or NOTIFY_SOCKET environment variables
# Note: these supervision methods only signal "process is ready."
#       They do not enable continuous liveness pings back to your supervisor.
supervised systemd

. . .
sudo systemctl restart redis.service

确保 redis 绑定到本地主机

sudo nano /etc/redis/redis.conf

找到这一行并确保它没有被注释(删除 # 如果存在):

bind 127.0.0.1 ::1

重启 redis

sudo systemctl restart redis

运行 Pool

./build/bin/core-pool config.json

您可以使用 Ubuntu upstart - 检查 upstart.conf 中的示例配置.

使用 nginx 提供 API

创建一个 upstream 的转发 API:

upstream api {
    server 127.0.0.1:8080;
}

并在之后添加此设置 location /:

location /api {
    proxy_pass http://api;
}

配置文件说明

配置其实很简单,在更改默认值之前,只需阅读两遍并三思而后行。

不要直接从本手册中复制配置。 请使用项目中的示例配置, 否则你会因为 JSON 注释而在运行时出错。

{
  // 为您服务器设置的 CPU 核心数
  "threads": 2,
  // redis 存储中键的前缀
  "coin": "etc",
  // 为每个实例赋予唯一名称
  "name": "main",
  // 币种网络 mordor, classic, ethereum, ropsten 或 ubiq
  "network": "classic",
  // 运行级别:production,testing,dev 三种,只有dev会记录DEBUG日志
  "runlevel": "dev",
  // 最大运行的goroutine数量
  "maxRoutine": 10000,

  "proxy": {
    "enabled": true,

    // 将 HTTP 挖掘服务绑定到此 IP:PORT
    "listen": "0.0.0.0:8888",

    // 仅允许来自矿工的 HTTP 请求的此标头和正文大小
    "limitHeadersSize": 1024,
    "limitBodySize": 256,

    /*   如果您支持 CloudFlare(不推荐)或支持 http-reverse 代理,
       则设置为 true 以启用来自 X-Forwarded-For 标头的 IP 检测。
       仅限高级用户。 使它正确和安全是很棘手的。
    */
    "behindReverseProxy": false,

    // Stratum 协议挖矿配置
    "stratum": {
      "enabled": true,
      // 绑定 stratum 协议的 IP:PORT (走TCP)
      "listen": "0.0.0.0:8008",
      "timeout": "120s",
      "maxConn": 8192,
      // 安全证书验证
      "tls": false,
      "certFile": "/path/to/cert.pem",
      "keyFile": "/path/to/key.pem"
    },

    // 尝试在此时间间隔内,从钱包节点获取新的挖矿job
    "blockRefreshInterval": "120ms",
    "stateUpdateInterval": "3s",
    // 让矿工们共享这个难度
    "difficulty": 2000000000,

    /*   如果 redis 不可用,则向矿工而不是作业回复错误。
       如果矿池出问题并且它们没有设置故障转移,应该为矿工节省电力。
    */
    "healthCheck": true,
    // 检查 redis 多少次失败后,将池标记为生病(有问题)。
    "maxFails": 100,
    // 工人统计数据的 TTL,通常应等于 API 部分的大哈希率窗口(一个长时间的算力平滑窗口期)
    "hashrateExpiration": "3h",

    // 策略配置(如ban掉有问题矿工的策略)
    "policy": {
      // 工作协程数
      "workers": 8,
      "resetInterval": "60m",
      "refreshInterval": "1m",

      "banning": {
        "enabled": false,
        /*   禁止的ipset名称。
           请查看 http://ipset.netfilter.org/ 文档。
        */
        "ipset": "blacklist",
        // 在这段时间后解除禁令(解除黑名单时长)
        "timeout": 1800,
        // 禁止矿工的所有shares中无效share的百分比
        "invalidPercent": 30,
        // 在矿工提交此数量的share后检查
        "checkThreshold": 30,
        // 在此数量的格式错误的请求之后出现错误的矿工
        "malformedLimit": 5
      },
      // 连接速率限制
      "limits": {
        "enabled": false,
        // 初始连接数
        "limit": 30,
        "grace": "5m",
        // 增加每个有效共享上允许的连接数
        "limitJump": 10
      }
    }
  },

  // 为静态网站前端提供 JSON 格式的API数据
  "api": {
    "enabled": true,
    "listen": "0.0.0.0:8080",
    // 在此时间间隔内收集矿工统计数据(哈希率,等...)
    "statsCollectInterval": "5s",
    // 清除陈旧的统计数据间隔
    "purgeInterval": "10m",
    // 每个矿工的快速统计算力估计窗口
    "hashrateWindow": "30m",
    // 时间相对长而比较精确的算力,推荐值 3h 很酷,保持它
    "hashrateLargeWindow": "3h",
    // 收集此数量块的 份额/差异比率 的统计数据
    "luckWindow": [64, 128, 256],
    // 在前端显示的最大付款数
    "payments": 50,
    // 在前端显示的最大块数
    "blocks": 50,

    /*    如果您在不同的服务器上运行 API 节点,该模块正在从 redis 可写从属服务器读取数据,
        则必须在启用此选项的情况下运行 api 实例,以便从主 redis 节点清除哈希率统计信息。
        如果您使用 redis slaves 进行分发,则只有 redis 可写 slave 才能正常工作。
        很先进。 通常所有模块应该共享同一个 redis 实例。
    */
    "purgeOnly": false
  },

  // 检查此时间间隔内每个节点的健康状况
  "upstreamCheckInterval": "5s",

  /*    要轮询新作业的奇偶校验节点列表。 
      池将尝试从第一个活着的钱包节点开始工作,并在后台检查备份失败。
      池的当前块模板确实总是缓存在 RAM 中。
  */
  "upstream": [
    {
      "name": "main",
      "url": "http://127.0.0.1:8545",
      "timeout": "10s"
    },
    {
      "name": "backup",
      "url": "http://127.0.0.2:8545",
      "timeout": "10s"
    }
  ],

  // 这是标准的 redis 连接选项
  "redis": {
    // 您的 redis 实例在哪个IP:PORT侦听命令
    "endpoint": "127.0.0.1:6379",
    "poolSize": 10,
    "database": 0,
    "password": ""
  },

  // 该模块定期统计挖到的块是否成熟,并计算每个矿工应得的奖励
  "unlocker": {
    "enabled": false,
    // 池手续费的百分比,1.0 为 1%
    "poolFee": 1.0,
    // 池费受益人地址(留空以禁用费用提取)
    "poolFeeAddress": "",
    // 将池手续费的 10% 捐赠给开发商
    "donate": true,
    // 仅当挖回此数量的区块时才解锁
    "depth": 120,
    // 只需不要碰这个选项
    "immatureDepth": 20,
    // 将开采的交易费用保留为矿池费用
    "keepTxFees": false,
    // 在此时间间隔内运行解锁器unlocker
    "interval": "10m",
    // 用于解锁块的奇偶校验节点 rpc 端点
    "daemon": "http://127.0.0.1:8545",
    // 超时时间:如果无法达到奇偶校验,则上升错误
    "timeout": "10s"
  },

  // 此模块将给矿工支付它应得的区块奖励
  "payouts": {
    "enabled": false,
    // 转账时需要检查钱包节点上 最少连接上多少个节点
    "requirePeers": 25,
    // 在此时间间隔内进行付款给矿工
    "interval": "12h",
    // 用于支付处理的奇偶节点 rpc 端点
    "daemon": "http://127.0.0.1:8545",
    // 超时时间:如果无法达到奇偶校验,则上升错误
    "timeout": "10s",
    // 池聚合挖矿的基本钱包地址,也用于支付给矿工
    "address": "0x0",
    // 自动gas费:让网络来确定 gas 和 gasPrice
    "autoGas": true,
    // 支付交易的 Gas 数量和价格(仅限高级用户)
    "gas": "21000",
    "gasPrice": "50000000000",
    // 仅当矿工余额 >= 0.5 Ether 时才发送付款
    "threshold": 500000000,
    // 支付会话成功后在 Redis 上执行 BGSAVE
    "bgsave": false
  },

  // 日志配置
  "logger": {
        "logPath": "./demo.log",
        "errLogPath": "./demo_err.log",
        // 保存多少(天)内的日志
        "saveDays": 7,
        // 日志切割的时间间隔
        "cutInterval": 86400
  }
}

如果您要将池部署分发到多个服务器或进程, 在每台服务器上创建几个配置并禁用不需要的模块。 (高级用户)

我推荐这个部署策略:

  • 挖矿实例 - x1(视情况而定,您可以为欧盟运行一个节点,为美国运行一个节点,为亚洲运行一个节点)
  • 解锁器和支付实例 - 各 x1(最好这样!)
  • API 实例 - x1

备注

  • 解锁和支付是顺序的,第一个交易开始,第二个等待第一个确认等等。 您可以在代码中禁用它。 仔细阅读docs/PAYOUTS.md
  • 另外,请记住在后端或节点 RPC 错误的情况下将停止解锁和支付。 在这种情况下,检查一切并重新启动。
  • 如果您看到带有 suspended 字样的错误,您必须重新启动模块。
  • 不要将支付和解锁模块作为挖矿节点的一部分运行。 为两者创建单独的配置,独立启动并确保每个模块都有一个运行的实例。
  • 如果未指定poolFeeAddress,则所有池利润将保留在coinbase 地址上。 如果有指定,请确保定期发送一些付款所需的灰尘。

前端方面

请看 https://github.com/etclabscore/core-pool-interface

About

eth矿池二次开发

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages