Протокол stratum в настоящее время является самым распространённым TCP-протоколом связи между майнерами и майнинговыми пулами. Давайте кратко объясним архитектуру сети майнинга.
1. Архитектура сети майнинга
Биткоин — это децентрализованная сетевая архитектура, которая пересылает новые транзакции и блоки, устанавливая узлы с демонами биткоина. Майнинговые машины и майнинг-пулы также образуют другую сеть, которую мы называем майнерской сетью.
Сеть майнеров разделена на несколько основных частей, таких как майнинговые машины, майнинговые пулы, кошельки и т.д., и иногда программное обеспечение майнинг-пула устанавливается вместе с кошельком, который в совокупности называется майнинговым пулом.
Протокол связи между майнинговой машиной и программным обеспечением майнингового пула является stratum, а связь между майнинговым пулом и кошельком — интерфейсом bitcoinrpc.
stratum — это формат данных JSON, а конкретный протокол выглядит следующим образом:
2. Соглашение о страте
1. Подписка на задачи
Когда майнинг-машина запускается, она сначала подключается к пулу майнинга с помощью метода mining.subscribe, чтобы подписаться на работу.
Пул возвращает номер подписки, ExtraNonce1 и ExtraNonce2_size в mining.notify.
Client:{"id":1,"method":"mining.subscribe","params":[]}
Server:{"id":1,"result":[["mining.notify","ae6812eb4cd7735a302a8a9dd95cf71f"],"08000002",4],"error":null} Среди них:
ae6812eb4cd7735a302a8a9dd95cf71f — это номер подписки;
08000002 — ExtraNonce1, который используется для создания транзакций на coibase;
ExtraNonce2_size — 4, количество байт счётчика ExtraNonce2 майнера.
2. Распределение задач
Эта команда периодически отправляется майнеру пулом майнинга, и когда майнинг-машина регистрируется с методом mining.subscribe, пул майнинга должен немедленно вернуть задачу как mining.notify.
Server:{"params":["bf","4d16b6f85af6e2198f44ae2a6de67f78487ae5611b77c6c0440b921e00000000", "010000000100000000000000000000000000000000000000000000000000000000000000 00ffffffff20020862062f503253482f04b8864e5008", "072f736c7573682f000000000100f2052a010000001976a914d23fcdf86f7e756a64a7a9688ef9903327048ed988ac00000000",["c5bd77249e27c2d3a3602dd35c3364a7983900b64a34644d03b930bfdb19c0e5", "049b4e78e2d0b24f7c6a2856aa7b41811ed961ee52ae75527df9e80043fd2f12"], "00000002","1c2ac4af","504e86b9",false],"id":null,"method":"mining.notify"} Среди них:
Номер задачи: «bf»;
Предыдущий блок HASH:
«4D16B6F85af6E2198F44ae2a6de67F78487ae5611B77C6C0440b921E000000000»; Coinbase Часть I:
«010000000100000000000000000000000000000000000000000000000 00000000000000000ffffffff20020862062f503253482f04b8864e5008»; Coinbase Часть 2:
"072f736c7573682f000000000100f2052a01000001976a914d23fcdf86f7 e756a64a7a9688ef9903327048ed98ac0000000000"; Список идентификаторов транзакций:
["c5bd77249e27c2d3a3602dd35c3364a7983900b64a34644d03b930bfdb19c0e5", "049b4e78e2d0b24f7c6a2856a7b41811ed961ee52ae75527df9e80043fd2f12"]; Номер версии блока: «00000002»;
nBit:”1c2ac4af”;
Текущее время: «504e86b9»;
Задачи по очистке: если это правда, майнер сразу же прекратит все задачи и начнёт новую задачу. Если ошибка, дождитесь окончания текущей задачи, прежде чем начинать новое.
3. Вход в горнодобывающую машину
Майнер использует метод mining.authorize для входа в пул майнинга с определённым аккаунтом и паролем, пароль может быть пустым, и пул возвратит true для успешного входа. Этот метод должен выполняться сразу после инициализации соединения, иначе майнер не получит задачу пула.
Client:{"params":["miner1","password"],"id":2,"method":"mining.authorize"}
Server:{"error":null,"id":2,"result":true} 4. Отправьте результаты
Когда майнер находит легитимную долю, он отправляет задачу в пул с помощью метода "mining.submit". Если пул возвращает true, коммит успешен, а если ошибка — есть конкретная причина ошибки.
Client:{"params":["miner1","bf","00000001","504e86ed","b2957c02"],"id":4,"method":"mining.submit"}
Server:{"error":null,"id":4,"result":true} Среди них:
Имя пользователя: "miner1";
Номер задачи: «bf»;
ExtraNonce2:"00000001";
Текущее время: «504e86ed»;
nonce:”b2957c02″;
5. Корректировка сложности
Настройка сложности выдаётся пулом майнинга в майнинг-машине, чтобы mining.set_difficulty образом корректировать сложность, а значение сложности отображается в параметрах.
Server:{"id":null,"method":"mining.set_difficulty","params":[2]} Майнер применяет новую сложность к следующему заданию, а пул иногда сразу же выдает новое задание и устанавливает задачу очистки на true, чтобы майнер мог сразу заняться новой сложностью.
3. Общий процесс коммуникации
Общий процесс коммуникации между майнинговой машиной и пулом майнинга выглядит следующим образом:
|