Protocolul stratum este în prezent cel mai utilizat protocol de comunicare TCP între mineri și pool-uri de minerit. Să explicăm pe scurt arhitectura rețelelor în minerit.
1. Arhitectura rețelei de minerit
Bitcoin este o arhitectură de rețea descentralizată care redirecționează noi tranzacții și blocuri prin instalarea de noduri cu demoni Bitcoin. Mașinile de minerit și pool-urile de minerit formează, de asemenea, o altă rețea, pe care o numim rețeaua minerilor.
Rețeaua de mineri este împărțită în mai multe părți principale, cum ar fi mașini de minerit, pool-uri de minerit, portofele etc., iar uneori software-ul pool-ului de mining este instalat împreună cu portofelul, ceea ce poate fi denumit colectiv pool de minerit.
Protocolul de comunicare dintre mașina de mining și software-ul pool-ului de mining este stratum, în timp ce comunicarea dintre software-ul pool-ului de mining și portofel este interfața bitcoinrpc.
stratum este formatul de date JSON, iar protocolul specific este următorul:
2. Acordul stratului
1. Abonament la sarcini
Când mașina de minerit pornește, se conectează mai întâi la pool-ul de minerit folosind metoda mining.subscribe pentru a se abona la lucrare.
Pool-ul returnează numărul de abonament, ExtraNonce1, și ExtraNonce2_size în mining.notify.
Client:{"id":1,"method":"mining.subscribe","params":[]}
Server:{"id":1,"result":[["mining.notify","ae6812eb4cd7735a302a8a9dd95cf71f"],"08000002",4],"error":null} Printre acestea:
AE6812eb4cd7735a302a8a9dd95CF71F este numărul de abonament;
08000002 este ExtraNonce1, care este folosit pentru a construi tranzacții coibase;
ExtraNonce2_size este 4, numărul de octeți al contorului miner ExtraNonce2.
2. Alocarea sarcinilor
Această comandă este trimisă periodic minerului de către pool-ul de minerit, iar când mașina de minerit se înregistrează cu metoda mining.subscribe, pool-ul ar trebui să returneze imediat sarcina ca mining.notify.
Server:{"params":["bf","4d16b6f85af6e2198f44ae2a6de67f78487ae5611b77c6c0440b921e00000000", "010000000100000000000000000000000000000000000000000000000000000000000000 00ffffffff20020862062f503253482f04b8864e5008", "072f736c7573682f000000000100f2052a010000001976a914d23fcdf86f7e756a64a7a9688ef9903327048ed988ac00000000",["c5bd77249e27c2d3a3602dd35c3364a7983900b64a34644d03b930bfdb19c0e5", "049b4e78e2d0b24f7c6a2856aa7b41811ed961ee52ae75527df9e80043fd2f12"], "00000002","1c2ac4af","504e86b9",false],"id":null,"method":"mining.notify"} Printre acestea:
Numărul sarcinii: "bf";
Blocul anterior HASH:
"4d16b6f85af6e2198f44ae2a6de67f78487ae5611b77c6c0440b921e00000000"; Coinbase Partea I:
"010000000100000000000000000000000000000000000000000000000 00000000000000000ffffffff20020862062f503253482f04b8864e5008"; Coinbase Partea 2:
"072f736c7573682f000000000100f2052a010000001976a914d23fcdf86f7 e756a64a7a9688ef9903327048ed988ac00000000"; Lista ID-urilor tranzacțiilor:
["c5bd77249e27c2d3a3602dd35c3364a7983900b64a34644d03b930bfdb19c0e5", "049b4e78e2d0b24f7c6a2856aa7b41811ed961ee52ae75527df9e80043fd2f12"]; Numărul versiunii blocului: "00000002";
nBit:”1c2ac4af”;
Ora actuală: "504e86b9";
Sarcini de curățare: Dacă este adevărat, minerul va anula toate sarcinile și va începe imediat o nouă sarcină. Dacă este fals, așteaptă până se termină sarcina curentă înainte de a începe o nouă sarcină.
3. Autentificare la mașina de minerit
Minerul folosește metoda mining.authorize pentru a se conecta în pool-ul de minerit cu un anumit cont și parolă, parola poate fi goală, iar pool-ul de minerit revine corect pentru a se conecta cu succes. Această metodă trebuie făcută imediat după inițializarea conexiunii, altfel minerul nu va primi sarcina pool-ului.
Client:{"params":["miner1","password"],"id":2,"method":"mining.authorize"}
Server:{"error":null,"id":2,"result":true} 4. Trimiteți rezultatele
Când un miner găsește o cotă legitimă, trimite o sarcină către pool folosind metoda "mining.submit". Dacă pool-ul returnează true, commit-ul este reușit, iar dacă eșuează, există un motiv specific pentru eroare.
Client:{"params":["miner1","bf","00000001","504e86ed","b2957c02"],"id":4,"method":"mining.submit"}
Server:{"error":null,"id":4,"result":true} Printre acestea:
Nume de utilizator: "miner1";
Numărul sarcinii: "bf";
ExtraNonce2:"00000001";
Ora actuală: "504e86ed";
nonce:”b2957c02″;
5. Ajustarea dificultății
Ajustarea dificultății este emisă de pool-ul de minerit către mașina de minerit pentru a ajusta dificultatea mining.set_difficulty mod, iar valoarea dificultății este în parametri.
Server:{"id":null,"method":"mining.set_difficulty","params":[2]} Minerul va aplica noua dificultate la următoarea sarcină, iar pool-ul va emite uneori o nouă sarcină imediat și va seta sarcina de curățare pe true, astfel încât minerul să poată lucra imediat la noua dificultate.
3. Procesul general de comunicare
Procesul general de comunicare între mașina de minerit și pool-ul de minerit este următorul:
|