mining.notify и mining.submit: Основной рабочий цикл
После рукопожатия начинается основная работа: пул отправляет задания, майнер вычисляет хеши и возвращает результаты. Этот цикл повторяется тысячи раз в день.
mining.notify: задание от пула
Заголовок раздела «mining.notify: задание от пула»Пул отправляет mining.notify каждый раз, когда появляется новая работа:
{ "id": null, "method": "mining.notify", "params": [ "bf", "4d16b6f85af6e2198f44ae2a6de67f78487ae5611b32aba40000000000000000", "01000000010000000000000000000000000000000000000000000000000000000000000000ffffffff2c0342fe0c", "ffffffff0100f2052a010000001976a914904a49878c0adfc3aa05de7afad2cc15f483a56a88ac00000000", ["f0dbfe210e0e2e7ef4a6c8e58b3e4e6e3f3e2e1d1c1b1a191817161514131211"], "20000000", "1903a30c", "649c3a21", true ]}Параметры (по порядку)
Заголовок раздела «Параметры (по порядку)»1. job_id ("bf") — идентификатор задания. Майнер указывает его при отправке шары.
2. prevhash — хеш предыдущего блока. Когда кто-то в сети находит новый блок, это значение меняется.
3. coinbase1 — первая часть coinbase-транзакции (до extraNonce).
4. coinbase2 — вторая часть coinbase-транзакции (после extraNonce).
5. merkle_branches — массив хешей для вычисления корня Меркла. Пул уже построил дерево Меркла из всех транзакций блока; майнеру нужны только эти “ветви-соседи” для подъёма от coinbase до корня.
6. version ("20000000") — версия блока. При version rolling майнер может менять определённые биты.
7. nbits ("1903a30c") — закодированная сложность сети.
8. ntime ("649c3a21") — временная метка блока.
9. clean_jobs (true) — критически важный флаг. Если true — немедленно бросить всю текущую работу и переключиться на это задание. Обычно означает, что найден новый блок в сети. Если false — можно доработать текущее задание.
Как майнер строит заголовок блока
Заголовок раздела «Как майнер строит заголовок блока»Шаг 1: Собрать coinbase-транзакцию
Заголовок раздела «Шаг 1: Собрать coinbase-транзакцию»coinbase = coinbase1 + extraNonce1 + extraNonce2 + coinbase2Шаг 2: Захешировать coinbase
Заголовок раздела «Шаг 2: Захешировать coinbase»coinbase_hash = SHA256(SHA256(coinbase))Шаг 3: Вычислить корень Меркла
Заголовок раздела «Шаг 3: Вычислить корень Меркла»current = coinbase_hashдля каждого branch в merkle_branches: current = SHA256(SHA256(current + branch))merkle_root = currentШаг 4: Собрать 80-байтный заголовок
Заголовок раздела «Шаг 4: Собрать 80-байтный заголовок»header = version (4 байта) + prevhash (32 байта) + merkle_root (32 байта) + ntime (4 байта) + nbits (4 байта) + nonce (4 байта)Шаг 5: Хешировать и проверить
Заголовок раздела «Шаг 5: Хешировать и проверить»hash = SHA256(SHA256(header))Если хеш ниже порога сложности пула — это валидная шара. Отправляем!
mining.submit: отправка результата
Заголовок раздела «mining.submit: отправка результата»{ "id": 4, "method": "mining.submit", "params": [ "worker1.rig01", "bf", "00000002", "649c3a25", "6a909d70" ]}Параметры: имя воркера, job_id, extraNonce2, ntime, nonce.
При включённом version rolling добавляется шестой параметр — битовая маска версии.
Ответ пула
Заголовок раздела «Ответ пула»Успех:
{"id": 4, "result": true, "error": null}Ошибка:
{"id": 4, "result": null, "error": [21, "Job not found", null]}Цикл работы
Заголовок раздела «Цикл работы»- Пул:
mining.notify(новое задание) - Майнер: строит coinbase → Меркл → заголовок
- ASIC-чипы: перебирают nonce (миллиарды в секунду)
- Nonce исчерпан → инкремент extraNonce2 → пересчёт с шага 2
- Найдена валидная шара →
mining.submit - Повторять до следующего
mining.notify