Протокол stratum наразі є найпоширенішим TCP-комунікаційним протоколом між майнерами та майнінговими пулами. Давайте коротко пояснимо архітектуру мережі майнінгу.
1. Архітектура мережі майнінгу
Біткоїн — це децентралізована мережева архітектура, яка пересилає нові транзакції та блоки шляхом встановлення вузлів із біткойн-демонами. Майнінгові машини та майнінгові пули також утворюють іншу мережу, яку ми називаємо майнерською мережею.
Майнерська мережа поділена на кілька основних частин, таких як майнінгові машини, майнінгові пули, гаманці тощо, і іноді програмне забезпечення майнінг-пулу встановлюється разом із гаманцем, який разом можна назвати майнінг-пулом.
Протокол зв'язку між майнінг-машиною та програмним забезпеченням для майнінгу є stratum, а комунікація між майнінг-пулом і гаманцем — це інтерфейс bitcoinrpc.
stratum — це формат даних JSON, а конкретний протокол виглядає так:
2. Угода про страт
1. Підписка на завдання
Коли майнінг-машина запускається, вона спочатку підключається до майнінг-пулу за допомогою методу mining.subscribe, щоб підписатися на роботу.
Пул повертає номер підписки, ExtraNonce1 та ExtraNonce2_size in 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:
"4d16b6f85af6e2198f44ae2a6de67f78487ae5611b77c6c0440b921e00000000"; Coinbase Частина I:
«010000000100000000000000000000000000000000000000000000000 00000000000000000ffffffff20020862062f503253482f04b8864e5008»; Coinbase Частина 2:
"072f736c7573682f000000000100f2052a010000001976a914d23fcdf86f7 e756a64a7a9688ef9903327048ed98ac000000000"; Список ідентифікаторів транзакцій:
["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. Загальний процес комунікації
Загальний процес комунікації між майнінг-машиною та пулом майнінгу виглядає так:
|