Stratum спецификация
Протокол Stratum используется для общения между майнерами и сервером майнинг-пула, и включает в себя несколько важных команд и форматов сообщений. Спецификация протокола Stratum описывает как майнеры и серверы передают данные, какие команды и параметры используются, а также как происходит взаимодействие между ними.
Общая структура Stratum:
- Транспортный слой: Stratum работает поверх TCP или WebSocket, что позволяет подключаться к серверу через стандартные сетевые соединения.
- Структура сообщения: Сообщения Stratum имеют структуру JSON-RPC, где данные представляются в виде JSON-объектов.
Основные команды и их описание:
1. Mining.subscribe
- Цель: Инициализация подключения к пулу и подписка на работу с пулом.
- Описание: Майнер отправляет серверу команду subscribeдля начала работы.
- Пример запроса:
 123456{"id": 1,"method": "mining.subscribe","params": []}
- Пример ответа:
 123456789{"id": 1,"result": [["mining.set_difficulty", []],["mining.notify", []]],"error": null}
- В ответе сервер отправляет команды, на которые майнер может подписаться, например, mining.set_difficultyиmining.notify.
2. Mining.authorize
- Цель: Авторизация майнера в пуле с указанием идентификатора (например, адреса кошелька).
- Описание: После подписки майнер должен авторизоваться, предоставив свой идентификатор (например, кошелек для выплат).
- Пример запроса:
 123456{"id": 2,"method": "mining.authorize","params": ["wallet_address", "worker_name"]}- 
- wallet_address: Идентификатор кошелька или адрес для получения вознаграждений.
- worker_name: Имя рабочего устройства (опционально).
 
- Пример ответа:
 Ответ подтверждает успешную авторизацию.123456{"id": 2,"result": true,"error": null}
 
- 
Mining.notify
- Цель: Передача задания для майнинга (новая задача).
- Описание: Когда сервер готов предоставить задачу для вычислений, он отправляет команду notify. Это сообщение включает в себя блок и данные, которые майнер должен использовать для вычисления хеша.
- Пример запроса: Сервер отправляет информацию о новой задаче.
 12345678910111213141516{"id": 3,"method": "mining.notify","params": ["job_id","prevhash","coinbase1","coinbase2","merkleroot","version","nbits","ntime","clean_jobs"]}
- Параметры:
- job_id: Идентификатор задания.
- prevhash: Хеш предыдущего блока.
- coinbase1,- coinbase2: Данные для создания транзакции coinbase.
- merkleroot: Корень дерева Меркла.
- version: Версия блока.
- nbits: Сложность блока.
- ntime: Время для текущего блока.
- clean_jobs: Признак очистки старых задач (обычно- false).
 
4. Mining.submit
- Цель: Отправка найденного решения задачи (например, хеша).
- Описание: Когда майнер находит решение задачи, он отправляет его обратно на сервер пула.
- Пример запроса:
 123456{"id": 4,"method": "mining.submit","params": ["worker_name", "job_id", "ntime", "nonce"]}- worker_name: Имя рабочего устройства, отправляющего решение.
- job_id: Идентификатор задания.
- ntime: Время, использованное для вычислений.
- nonce: Значение nonce, найденное в процессе майнинга.
 
- Пример ответа:
 Ответ подтверждает, что решение было принято пулом.123456{"id": 4,"result": true,"error": null}
5. Mining.set_difficulty
- Цель: Установка сложности задачи.
- Описание: Сервер может изменять сложность задачи для майнера в зависимости от текущей ситуации в сети.
- Пример запроса:
 123456{"id": 5,"method": "mining.set_difficulty","params": [new_difficulty]}new_difficulty: Новая сложность задачи для майнера.
- Пример ответа:
 123456{"id": 5,"result": true,"error": null}
6. Mining.ping
- Цель: Проверка живости соединения.
- Описание: Пул или майнер может использовать команду pingдля того, чтобы проверить, что соединение не потеряно.
- Пример запроса:
 123456{"id": 6,"method": "mining.ping","params": []}
- Пример ответа:
 123456{"id": 6,"result": true,"error": null}
Структура сообщения
Каждое сообщение Stratum в формате JSON имеет общую структуру:
| 1 2 3 4 5 6 7 | {   "id": <id>,                    // Идентификатор запроса (целое число)   "method": <method_name>,        // Метод или команда (строка)   "params": <params_array>,       // Параметры команды (массив)   "error": <error_object>         // Ошибки (если есть) } | 
- id: Идентификатор запроса, который помогает сопоставить запрос и ответ.
- method: Имя вызываемой команды.
- params: Параметры, передаваемые с запросом.
- error: Ошибка, если она возникла (если нет ошибки, то- null).
Заключение
Протокол Stratum — это эффективный и масштабируемый способ обмена данными между майнерами и пулами. Он использует структуру JSON-RPC для обмена сообщениями и включает в себя команды для подписки, авторизации, задания сложности, уведомления о новых задачах и отправки решений. Этот протокол стал де-факто стандартом в индустрии майнинга благодаря своей простоте, скорости и поддержке множества майнинговых платформ.
