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

mining.subscribe и mining.authorize: Вход в пул

Прежде чем майнер сможет хешировать хоть один заголовок блока, ему нужно пройти рукопожатие с пулом. Это три метода, которые выполняются в строгом порядке: mining.configure, mining.subscribe, mining.authorize.

В современных реализациях mining.configure отправляется первым — даже до mining.subscribe. Этот метод был добавлен позже (BIP 310) для функций, которые оригинальный Stratum не предусматривал. Главная из них — version rolling.

В заголовке блока есть 4-байтное поле версии. Часть его битов не используется протоколом. Майнер может переключать эти биты как дополнительное пространство nonce, умножая количество комбинаций без пересчёта корня Меркла.

Это связано с оптимизацией AsicBoost — способом ускорить вычисление SHA-256 за счёт переиспользования промежуточных состояний. Для этого майнер и пул должны договориться, какие биты версии разрешено менять.

{
"id": 1,
"method": "mining.configure",
"params": [
["version-rolling"],
{
"version-rolling.mask": "1fffe000",
"version-rolling.min-bit-count": 2
}
]
}
  • version-rolling.mask — битовая маска, определяющая какие биты версии майнер хочет использовать
  • version-rolling.min-bit-count — минимальное количество бит, которое майнеру нужно для эффективной работы
{
"id": 1,
"result": {
"version-rolling": true,
"version-rolling.mask": "1fffe000"
},
"error": null
}

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

После согласования расширений майнер подписывается на уведомления пула:

{
"id": 2,
"method": "mining.subscribe",
"params": ["bmminer/2.0.0", null]
}
  • Первый параметр — user-agent (название и версия ПО майнера)
  • Второй — ID предыдущей сессии для возобновления (null при первом подключении)
{
"id": 2,
"result": [
[
["mining.set_difficulty", "deadbeef"],
["mining.notify", "deadbeef"]
],
"08000002",
4
],
"error": null
}

Три ключевых элемента в ответе:

1. Подписки — пары [метод, ID подписки]. Говорят майнеру, какие уведомления он будет получать.

2. extraNonce1 ("08000002") — уникальный идентификатор, назначаемый пулом этому конкретному подключению. 4 байта hex = 2 байта данных. Этот extraNonce1 будет частью каждой coinbase-транзакции, которую построит майнер.

3. Размер extraNonce2 (4) — сколько байт майнер может использовать для перебора extraNonce2. В данном случае 4 байта = 2^32 = ~4 миллиарда вариантов.

Последний шаг — авторизация:

{
"id": 3,
"method": "mining.authorize",
"params": ["account.worker01", "password"]
}
  • Worker name — обычно в формате аккаунт.имя_воркера или адрес.имя_воркера
  • Password — на большинстве пулов может быть любым (часто "x" или "123")
{
"id": 3,
"result": true,
"error": null
}

true — авторизация успешна. Если false или есть error — неправильный воркер или пароль.

Можно авторизовать несколько воркеров на одном TCP-соединении, отправив mining.authorize несколько раз с разными именами. Это используется редко — обычно каждый физический майнер открывает своё соединение.

Майнер Пул
| |
| ───── mining.configure ─────────> |
| <──── result (mask) ──────────── |
| |
| ───── mining.subscribe ─────────> |
| <──── extraNonce1 + size ─────── |
| |
| ───── mining.authorize ─────────> |
| <──── true ───────────────────── |
| |
| <──── mining.set_difficulty ──── |
| <──── mining.notify (первое задание) ── |
| |
| ... майнинг начался ... |

Всё рукопожатие — 3 запроса и 3 ответа. После этого TCP-соединение остаётся открытым, и пул пушит задания по мере необходимости.