Sunday, April 13, 2014

Rudarenje bitcoina: protokol Stratum


Protokol Stratum služi za komunikaciju između rudara i bazena, a zasnovan je na JSON-RPC-u. Bazen mora učinkovito raposređivati posao među rudarima i brzo prikupljati rezultate. Bazen također mora osigurati da rudari ne dupliciraju posao te da ne rade na blokovima koji su već izrudareni.

Jedan problem predstavljaju brzi rudari kojim prolete kroz sve kombinacije noncea prije nego bazen stigne poslati novi blok. Stratum to rješava tako što rudarima omogućuje da lokalno kreiraju coinbase transakciju i prema potrebi modificiraju njezino polje extranonce (promjena coinbase transakcije automatski znači da se promijenilo i zaglavlje bloka budući da se promijenilo Merkleovo stablo transakcija).

Poruke u protokolu

 

Da bi započeo rudarenje u nekom bazenu pomoću Stratum protokola, rudar prvo mora poslati bazenu registracijsku poruku na koju mu bazen odgovori podacima za registraciju:


id
1
set_difficulty
b4b6693b72a50c7116db18d6497cac52
notify
ae6812eb4cd7735a302a8a9dd95cf71f
extranonce1
45fadd2d
extranonce2_size
4
error
null

 

Bazen javlja koja je težina rudarenja u tom bazenu, koji je hash bloka na kojem se trenutačno radi, vrijednost extranonce1 koja osigurava da svi klijenti generiraju jedinstvene blokove te duljinu polja extranonce2 koju će generirati rudar.


Rudar zatim pošalje zahtjev za početak rudarenja, a bazen mu odgovara porukom koja sadrži osnovne podatke za kreiranje bloka:

job_id
2dddaca8
prev_hash
c3a8a906d58a374d5092ba6792ab4d5e38c932f01dc4dcd6000000
0000000000
coinb1
01000000010000000000000000000000000000000000000000000
000000000000000000000ffffffff4803da8204062f503253482f0472b
b4a5308
coinb2
2e522cfabe6d6d4183475fab25720b7274cc7decea671073d97e050
abeababf0a80b44241a3bf804000000000000000000000001eccb6b
95000000001976a91480ad90d403581fa3bf46086a91b2d9d4125db
6c188ac00000000
merkle_branch
c69d0e3aed71cd90f681fa8178766ca3a234f854a0dac42e3ce4a4b1
c51e8e5f, ...
version
00000002
nbits
1900b3aa
ntime
534abb71
clean_jobs
false

 
job_id predstavlja identifikator rudara koji on mora poslati bazenu kad šalje rješenje bloka, prev_hash je hash prethodnog bloka, coinb1 i coinb2 su početni i završni dio coinbase transakcije. Merkle_branch sadrži osnovne grane potrebne za generiranje merkleovog korijena, version je verzija bloka, nbits je meta, ntime je trenutačno vrijeme, a clean_jobs zastavica čije značenje trenutačno nije bitno.

Kreiranje coinbase transakcije

 

Rudar sad ima sve podatke potrebne za generiranje coinbase transakcije: coinb1, extranonce1, extranonce2 (koji je sam generirao) i coinb2. Transakcija se dobiva konkateniranjem tih vrijednosti:


Version
01000000
Input count
01
Previous hash
0000000000000000000000000000000000000000000000000000000
000000000
Index
ffffffff
Scriptlen
0x48 (72)
Script
03da8204062f503253482f0472bb4a530845fadd2d000017e42e522cfa
be6d6d4183475fab25720b7274cc7decea671073d97e050abeababf0a8
0b44241a3bf80400000000000000
Sequence
00000000
Output count
01
Value
eccb6b9500000000
Scriptlen
19
Script
76a91480ad90d403581fa3bf46086a91b2d9d4125db6c188ac
Lock time
00000000

 

Zaglavlje bloka dobiva se na sličan način: iz podataka poslanih od bazena (verzija bloka, hash prethodnog bloka, Merkleov korijen (dobiven iz grana i coinbase transakcije), vremenska oznaka, meta i nonce.

No comments:

Post a Comment