mining.subscribe и mining.authorize: Вход в пул
Прежде чем майнер сможет хешировать хоть один заголовок блока, ему нужно пройти рукопожатие с пулом. Это три метода, которые выполняются в строгом порядке: mining.configure, mining.subscribe, mining.authorize.
mining.configure: согласование расширений
Заголовок раздела «mining.configure: согласование расширений»В современных реализациях mining.configure отправляется первым — даже до mining.subscribe. Этот метод был добавлен позже (BIP 310) для функций, которые оригинальный Stratum не предусматривал. Главная из них — version rolling.
Зачем нужен version rolling
Заголовок раздела «Зачем нужен 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}Пул подтверждает согласие и возвращает маску, которую можно использовать. Маска может быть уже запрошенной, если пул не разрешает менять некоторые биты.
mining.subscribe: получение параметров сессии
Заголовок раздела «mining.subscribe: получение параметров сессии»После согласования расширений майнер подписывается на уведомления пула:
{ "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 миллиарда вариантов.
mining.authorize: аутентификация воркера
Заголовок раздела «mining.authorize: аутентификация воркера»Последний шаг — авторизация:
{ "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-соединение остаётся открытым, и пул пушит задания по мере необходимости.