Перейти к содержимому

mining.set_difficulty и обработка ошибок

Майнинг не всегда идёт гладко. Соединения рвутся, шары отклоняются, а пул меняет правила на ходу. Два механизма управляют этими ситуациями: mining.set_difficulty регулирует интенсивность работы, а система ошибок сообщает о проблемах.

{
"id": null,
"method": "mining.set_difficulty",
"params": [8192]
}

Единственный параметр — новая сложность шар. Вступает в силу со следующего задания mining.notify.

Представьте, что пул установил одинаковую сложность для всех. S21 на 200 TH/s будет отправлять тысячи шар в секунду, заваливая сервер. Старый S9 на 14 TH/s — одну шару в минуту.

Vardiff (variable difficulty) решает это, подстраивая сложность под каждого майнера так, чтобы все отправляли шары примерно с одинаковой частотой — обычно одна шара каждые 5-10 секунд.

  • Хешрейт вырос → сложность повышается → меньше шар, но каждая “дороже”
  • Хешрейт упал → сложность понижается → больше шар, но каждая “дешевле”
  • Итоговый доход не меняется. Одна шара на сложности 8192 = 8192 шары на сложности 1.

Когда mining.submit отклоняется, пул отвечает ошибкой:

{"id": 4, "result": null, "error": [21, "Job not found", null]}
КодНазваниеЧто значит
20Other/UnknownОбщая ошибка. Может быть чем угодно.
21Job not foundЗадание с указанным job_id больше не активно. Обычно — устаревшая шара (новый блок уже найден).
22Duplicate shareШара с таким nonce/extranonce2/ntime уже отправлялась. Возможен баг прошивки.
23Low difficultyХеш не проходит текущий порог сложности. Проблема синхронизации или баг.
24UnauthorizedВоркер не авторизован через mining.authorize.
25Not subscribedПопытка отправить шару до завершения mining.subscribe.

Это устаревшая шара (stale share). Сценарий:

  1. Пул отправил задание “a1”
  2. Майнер работает над “a1”
  3. Кто-то в сети нашёл блок
  4. Пул отправил задание “a2” с clean_jobs = true
  5. Майнер отправляет шару для “a1”, вычисленную за миллисекунды до получения “a2”
  6. Пул: ошибка 21 — задание “a1” уже удалено

Это нормально и неизбежно из-за сетевой задержки. Уровень устаревших шар 0.5-2% — норма. Выше 5% — проверьте подключение.

Когда соединение падает, майнер должен пройти полное рукопожатие заново: subscribe → configure → authorize → ждать задание.

Не нужно забрасывать пул запросами:

  • 1-я попытка: ждать 1 секунду
  • 2-я: 2 секунды
  • 3-я: 4 секунды
  • 4-я: 8 секунд
  • …до максимума ~60 секунд

Вот зачем нужны Pool 2 и Pool 3 в настройках майнера:

  1. Pool 1 недоступен после 3-5 попыток
  2. Переключаемся на Pool 2
  3. Периодически пробуем Pool 1
  4. Восстановился — переключаемся обратно