cemehbl4

@cemehbl4

Соло-майнинг форков Ethereum: open-ethereum-pool
19.10.2022 16:47
Post earned 0.00 UFO

После наступления PoS вновь возрос интерес к соло-майнингу, как и в прошлую криптозиму. Попытаюсь объяснить общие принципы создания простейшего карманного пула для соло-майнинга практически для любого форка Ethereum.

Актуальный для этой статьи список монет с сайта miningpoolstats: ETC, UBQ, ETHW, ETHF, EXP, ESN, DBIX, EGEM, ELLA, AKA, ATH, CLO, MOAC, ETHO, NILU, TSF, OCTA, DAE, EGAZ, ETHONE, POM, PINK

Ноды монет вроде ETP, QKC, QIE имеют более значительные отличия от Ethereum, поэтому не рассматриваются.

Как обычно, использую Ubuntu, рекомендую брать версию 20.04. Системные требования очень сильно разнятся. Если вы хотите покопать прямые форки ETH после PoS, такие как ETHW и ETHF, то вам понадобится SSD объёмом 1 TB, 16 GB RAM и по крайней мере 8 ядер CPU. А вот для того же ETC требования существенно ниже, хватит и 128 GB SSD, а вот оперативкой пренебрегать не рекомендую, ставьте хотя бы 8.

В данной инструкции не рассматриваются вопросы выплат нескольким майнерам, а также подключение асиков от Innosilicon. Асики iPollo будут работать, про Antminer не знаю, так и не довелось их пощупать.

Также хочу заметить, что нормального тестнета на данный момент не существует, поэтому настоятельно рекомендуется опробовать данную инструкцию на каком-либо лёгком блокчейне с небольшим общим хэшрейтом сети.

Нода (полный узел)

Ссылку на GitHub каждого проекта можно найти на том же miningpoolstats, обычно она и ведёт на репозиторий с нодой.

Нас интересует имплементация ноды на языке go, она же geth, у разных монет название может отличаться, но суть та же, например ETC - core-geth, UBQ - gubiq, EXP - gexp и т.д.

Чаще всего на GitHub уже лежит готовый исполняемый файл, который можно просто скачать и запустить, например для ETC https://github.com/etclabscore/core-geth/releases/latest, здесь нас интересует файл core-geth-linux-v1.12.8.zip. Но так бывает не всегда, и ноду придётся собрать из исходников самомстоятельно. Настоятельно рекомендую прочитать readme репозитория с нодой, там обычно есть инструкция по сборке из исходников и первоначальной настройке, но в общем случае это выглядит так:


# устанавливаем зависимости
sudo apt update && sudo apt upgrade
sudo apt install make gcc g++ git

# устанавливаем golang, скачиваем необходимую версию с сайта https://go.dev/dl
wget https://go.dev/dl/go1.17.13.linux-amd64.tar.gz
sudo rm -rf /usr/local/go && sudo tar -C /usr/local -xzf go1.17.13.linux-amd64.tar.gz
echo "export PATH=$PATH:/usr/local/go/bin" >> $HOME/.bashrc
source ~/.bashrc
go version

# собираем ноду, для примера возьму ETHF
git clone https://github.com/ethereumfair/go-ethereum ethf
cd ethf
make geth

# в конце сборки должен появиться путь к исполняемому файлу,
# в моём случае - Run "./build/bin/geth" to launch geth.

# перемещаем и переименовываем готовый файл
sudo mv build/bin/geth /usr/local/bin/geth-ethf

После сборки изучаем параметры, с которыми можно запускать ноду:

geth-ethf --help

Основные опции могут отличаться в разных монетах:

--http (или --rpc) - включить HTTP-RPC сервер, чтобы к ноде можно было подключиться сторонним приложением, в нашем случае это пул

--http.port (или --rpcport) - порт подключения к ноде, обычно 8545, но может отличаться

--mine - включить майнинг

--miner.threads - иногда требуется указать 0, чтобы не осуществлялся майнинг процессором

--miner.etherbase (или --etherbase, в MOAC - --moacbase) - адрес кошелька, на который будут падать награды за блоки. ВНИМАНИЕ! Нельзя использовать биржевой кошелёк, использовать можно только свой личный, от которого имеется приватный ключ: MetaMask, MyCrypto, MyEtherWallet, Trezor и т.д.

Для core-geth (ETC) необходимо указать опцию --classic, иначе начнёте синхронизировать ноду Ethereum.

Ещё бывают различные, специфические для выбранного блокчейна, первоначальные действия, вроде импорта genesis-блока или указания bootnodes. Об этом обязательно будет написано либо на GitHub, либо на официальном сайте монеты, читайте внимательно инструкции!

Запускаем:


geth-ethf --http --mine --miner.etherbase 0x1234567890AaBbCcDdEeFf

# если используете серверную версию, то запускаете в screen
screen -dmS node geth-ethf --http --mine --miner.etherbase 0x1234567890AaBbCcDdEeFf

# посмотреть, что происходит в скрине: screen -r node
# выйти из скрина: последовательно нажать ctrl+A, ctrl+D

Когда синхронизация будет завершена, вы увидите в логе ноды строки "Commit new sealing work" (или "Commit new mining work"), а параметр number будет больше на единицу, чем высота последнего известного блока в обозревателе. Ссылку на обозреватель блоков (explorer) можно так же найти на miningpoolstats.

Пора собирать пул

Иногда разработчики монеты выкладывают свой собственный пул, но все они основаны на https://github.com/sammy007/open-ethereum-pool. Для ETC, EGAZ и UBQ нужно использовать пул от разработчиков монет, потому что в них алгоритм отличается от Ethash - https://github.com/etclabscore/open-etc-pool, https://github.com/etica/egaz-pool и https://github.com/ubiq/open-ethereum-pool соответственно. Так же на GitHub можно найти форки оригинального пула от sammy007, например, тут работают графики - https://github.com/esprezzo/open-perkle-pool.

Так как все вышеперечисленные пулы основаны на одном и том же, то возможные проблемы при сборке мало отличаются.


# устанавливаем redis
sudo apt install redis-server

# устанавливаем go версии 1.13.15
wget https://go.dev/dl/go1.13.15.linux-amd64.tar.gz
sudo rm -rf /usr/local/go && sudo tar -C /usr/local -xzf go1.13.15.linux-amd64.tar.gz
go version

# клонируем репозиторий нужного пула,
# для sammy007 нужно дополнительно указывать -b develop
git clone https://github.com/sammy007/open-ethereum-pool -b develop
cd open-ethereum-pool

# для начала внесём небольшое изменение в код для поддержки длинных имён воркеров,
# а так же для возможности указания имени воркера через точку после адреса
nano proxy/handlers.go
# внесите измения согласно этого коммита

# пробуем собрать, процесс скачивания зависимостей довольно долгий
make

Я получил ошибку: ../../ethereum/go-ethereum/common/test_utils.go:27:18: undefined: os.ReadFile. У вас может быть такая же или очень похожая ошибка, нужно лишь внести небольшое изменение в исходники Ethereum, второе число после имени файла указывает на номер строки с ошибкой, в моём случае 27.

nano +27 build/_workspace/src/github.com/ethereum/go-ethereum/common/test_utils.go

Преобразую строку "content, err := os.ReadFile(file)" в "content, err := ioutil.ReadFile(file)"

Также в начале файла нужно поправить импорты:


import (
                "encoding/json"
                "fmt"
                "os"
)

заменить на:


import (
                "encoding/json"
                "fmt"
                "io/ioutil"
)

Сохраняем файл и снова пытаемся собрать:

make

Новая ошибка: util/util.go:38:16: undefined: common.ToHex


# нужно внести изменения в два файла согласно коммита
nano rpc/rpc.go
nano util/util.go

# сохраняем и собираем
make

Готово, ошибок не произошло.

Вытаскиваем готовый исполняемый файл в основную директорию пула:


mv build/bin/open-ethereum-pool .

В папке пула уже лежит пример конфигурационного файла. Переименовываем его и вносим необходимые изменения:


mv config.example.json config.json
nano config.json

{
  "threads": 16, // число потоков вашего процессора
  "coin": "ethf", // название монеты
  "name": "main",

  "proxy": {
     "enabled": true,
     "listen": "0.0.0.0:8888",
     "limitHeadersSize": 1024,
     "limitBodySize": 256,
     "behindReverseProxy": false,
     "blockRefreshInterval": "120ms",
     "stateUpdateInterval": "3s",
     // сложность заданий пула, данное значение соответствует 4G, что вполне оптимально
    "difficulty": 4000000000,
    "hashrateExpiration": "3h",

     "healthCheck": true,
     "maxFails": 100,

     "stratum": {
       "enabled": true,
       "listen": "0.0.0.0:8008", // порт, на который будут подключаться майнеры
       "timeout": "120s",
       "maxConn": 8192,
       "tls": false,
       "certFile": "/path/to/cert.pem",
       "keyFile": "/path/to/key.pem"
     },

     "policy": {
       "workers": 8,
       "resetInterval": "60m",
       "refreshInterval": "1m",

       "banning": {
         "enabled": false,
         "ipset": "blacklist",
         "timeout": 1800,
         "invalidPercent": 30,
         "checkThreshold": 30,
         "malformedLimit": 5
       },
       "limits": {
         "enabled": false,
         "limit": 30,
         "grace": "5m",
         "limitJump": 10
       }
     }
   },

   "api": {
     "enabled": true,
     "purgeOnly": false,
     "purgeInterval": "10m",
     "listen": "0.0.0.0:8080", // порт API, понадобится при настройке web-интерфейса
     "statsCollectInterval": "5s",
     "hashrateWindow": "30m",
     "hashrateLargeWindow": "3h",
     "luckWindow": [64, 128, 256],
     "payments": 30,
     "blocks": 50
   },

   "upstreamCheckInterval": "5s",
   "upstream": [
     {
       "name": "main",
       "url": "http://127.0.0.1:8545", // порт ноды
       "timeout": "10s"
     },
    {
       "name": "backup",
       "url": "http://127.0.0.2:8545",
       "timeout": "10s"
     }
   ],

   "redis": {
     "endpoint": "127.0.0.1:6379",
     "poolSize": 10,
     "database": 0,
     "password": ""
   },

   "unlocker": {
     "enabled": true, // включаем для отображения награды за блок
     "poolFee": 1.0,
    // вставляем любой адрес кошелька, в данном случае он роли не играет,
    // так как пул не производит выплат нескольким майнерам
     "poolFeeAddress": "0x1234567890AaBbCcDdEeFf",
     "donate": true,
     "depth": 120,
     "immatureDepth": 20,
     "keepTxFees": false,
     "interval": "10m",
     "daemon": "http://127.0.0.1:8545", // порт ноды
     "timeout": "10s"
   },

   "payouts": {
     "enabled": false,
     "requirePeers": 25,
     "interval": "120m",
     "daemon": "http://127.0.0.1:8545",
     "timeout": "10s",
     "address": "0x0",
     "gas": "21000",
     "gasPrice": "50000000000",
     "autoGas": true,
     "threshold": 500000000,
     "bgsave": false
   },

   "newrelicEnabled": false,
   "newrelicName": "MyEtherProxy",
   "newrelicKey": "SECRET_KEY",
   "newrelicVerbose": false
}

Cохраняем файл и можно запускать:


./open-ethereum-pool config.json

# на серверном дистрибутиве, запускайте в скрине, как и ноду
screen -dmS pool ./open-ethereum-pool config.json

Лог пула должен выглядеть примерно так:


# путь к файлу конфигурации
Loading config: /home/user/open-ethereum-pool/config.json

# количество используемых потоков
Running with 16 threads

Backend check reply: PONG

# API запущено
Starting API on 0.0.0.0:8080

Set stats collect interval to 5s
Set purge interval to 10m0s
Policy state refresh complete
Set policy stats reset every 1h0m0s
Set policy state refresh every 1m0s
Running with 8 policy workers
Upstream: main => http://127.0.0.1:8545
Upstream: backup => http://127.0.0.2:8545

# подключен к ноде
Default upstream: main => http://127.0.0.1:8545

Purged stale stats from backend, 0 shares affected, elapsed time 129.896µs

# запущен стратум-порт
Stratum listening on 0.0.0.0:8008

Stats collection finished 379.555µs

# ищем решение блока 15762129
New block to mine on main at height 15762129 / 0x58571df9 / 1464660359025

Set block refresh every 120ms
Starting proxy on 0.0.0.0:8888

# передача заданий майнерам, пока никто не подключен
Broadcasting new job to 0 stratum miners
Jobs broadcast finished 22.965µs

Собираем веб-интерфейс

В директории пула находится папка www, переходим в неё:

cd ~/open-ethereum-pool/www

Устанавливаем nvm по инструкции:


wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.2/install.sh | bash
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"

Устанавливаем nodejs:

nvm install v8.17.0

Далее нужно внести изменения в конфигурационный файл веб-интерфейса:

nano config/environment.js

На работоспособность интерфейса влияет только настройка ApiUrl: '//example.net/',

Здесь необходимо указать ваш статический публичный IP-адрес и порт, но если вы не планируете мониторить происходящее из внешнего интернета или не имеете публичного IP, то укажите локальный IP компьютера, на котором производите установку.

Пример - ApiUrl: '//192.168.1.8:7070/',

Пример - ApiUrl: '//99.88.77.66:7070/',

Во избежание казусов с внешним адресом, настоятельно рекомендую ознакомиться со статьёй.

Собираем:


nvm use v8.17.0
npm install -g ember-cli@2.9.1
npm install -g bower
npm install
bower install
./build.sh

Если впоследствии вы будуте вносить правки в конфигурацию или файлы веб-интерфейса, то нужно запускать ./build.sh из папки www для применения изменений.

Устанавливаем nginx и настраиваем веб-сервер:


sudo apt install nginx
sudo nano /etc/nginx/sites-available/default

В открывшемся файле всё удаляем и прописываем следующую конфигурацию:


upstream ethf {
    # здесь указываем API порт из конфигрурации пула
    server 127.0.0.1:8080;
}

server {
     # здесь указываем порт из конфигрурации веб-интерфейса, который указан в ApiUrl
     listen 0.0.0.0:7070;
     # путь к файлам веб-интерфейса, измените юзернейм после /home/ на свой
     root /home/user/open-ethereum-pool/www/dist;
     index index.html index.htm;

     server_name localhost;

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

     location / {
         try_files $uri $uri/ /index.html;
     }
}

Сохраняем файл и применяем настройки nginx:

sudo systemctl reload nginx.service

Открываем порты веб-интерфейса и стратума:


sudo ufw allow 7070
sudo ufw allow 8008

При использовании публичного IP необходимо пробросить эти два порта на вашем роутере.

Заходим на наш пул по айпи и порту:

http://192.168.1.8:7070

Теперь можно коннектиться любым майнером на стратум порт 8008, как и на любой другой пул. Кошелёк при майнинге вы можете указывать любой, так как награда за блок падает на адрес, указанный при запуске ноды, а пул выплат не производит.

Не забывайте правильно указывать алгоритм в майнере, для ETC и EGAZ - etchash, для UBQ - ubqhash, для остальных - ethash.

Пул покажет информацию о майнере моментально после нахождения первой шары.

Остались вопросы или что-то не получается? Пишите в комментариях, всем отвечу.

Если вас интересует соло-майнинг на других алгоритмах, можете ознакомиться с моей статьёй о пуле miningcore здесь.

Удачной охоты :)

Post earned 0.00 UFO

Post earned 0.00 UFO

Комментарии

Comments: