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

mining.notify и mining.submit: Основной рабочий цикл

После рукопожатия начинается основная работа: пул отправляет задания, майнер вычисляет хеши и возвращает результаты. Этот цикл повторяется тысячи раз в день.

Пул отправляет 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 — можно доработать текущее задание.

coinbase = coinbase1 + extraNonce1 + extraNonce2 + coinbase2
coinbase_hash = SHA256(SHA256(coinbase))
current = coinbase_hash
для каждого branch в merkle_branches:
current = SHA256(SHA256(current + branch))
merkle_root = current
header = version (4 байта)
+ prevhash (32 байта)
+ merkle_root (32 байта)
+ ntime (4 байта)
+ nbits (4 байта)
+ nonce (4 байта)
hash = SHA256(SHA256(header))

Если хеш ниже порога сложности пула — это валидная шара. Отправляем!

{
"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]}
  1. Пул: mining.notify (новое задание)
  2. Майнер: строит coinbase → Меркл → заголовок
  3. ASIC-чипы: перебирают nonce (миллиарды в секунду)
  4. Nonce исчерпан → инкремент extraNonce2 → пересчёт с шага 2
  5. Найдена валидная шара → mining.submit
  6. Повторять до следующего mining.notify