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