Request bang .. kalok berkenan skalian dikupas bagaimana proses kerja seorang miner mendapatkan job mining, data apa saja yg ada didalamnya dan peran kerja miner dalam memproses job tsb.
smoga penjelasannya dapat memberikan pencerahan bwat miner pemula seperti ane ini.
Akan saya coba jabarkan langkah-langkah kerja pada sebuah jaringan mining Pool (cmiiw)
- Saat miner terhubung dengan jaringan pool, berarti miner tsb menyatakan telah siap untuk menerima job baru dengan mengirimkan sebuah perintah subscribe
{"id": 1, "method": "mining.subscribe", "params": ["user agent/version"]}
user agent : Nama program mining
Version : Versi program mining
- Setelah itu Pool akan merespon permintaan tersebut dengan memberikan data-data : pool difficulty, 2 hash penanda subscribe dari miner, nilai extranonce1 yg ditentukan oleh pool (masing-masing miner menerima extranonce1 yg berbeda-beda), ukuran format extranonce2 yg digunakan (bytes)
{"id": 1, "result": [[["mining.set_difficulty", "subscription id 1"], ["mining.notify", "subscription id 1"]], "extranonce1", extranonce2_size], "error": null}\n
- Lalu miner akan melakukan proses authorize dengan mengirimkan data-data : username (address wallet atau worker ID) dan password yang digunakan.
{"id": 2, "method": "mining.authorize", "params": ["username", "password"]}
- Jika proses authorize berhasil maka pool akan mengirimkan pesan kepada miner
{"id":2, "result":true,"error":null}
- Jika memungkinkan miner bisa merubah nilai difficulty secara manual dengan mengirimkan perintah sebagai berikut
{"id":null, "method":"mining.set_difficulty","params":[value]}
Tetapi tidak semua pool mengijinkan untuk dilakukan pengaturan difficulty secara manual, jadi difficulty yg digunakan sesuai dengan ketentuan dari Pool tersebut.
- Lalu pool akan mulai mengirimkan sebuah job baru kepada masing-masing miner yang bergabung dalam jaringannya
{"id":null, "method":"params": ["Job_ID", "PrevHash", "CoinBase1", "CoinBase2", [Merkle_Branch], "version", "nBits", "nTime", CleanJobs]}
Job_ID : Hash dari job yg diterima miner
PrevHash : Hash dari block sebelumnya
CoinBase1 : bagian awal dari transaksi coinbase yang dibikin oleh miner
CoinBase2 : bagian akhir dari transaksi coinbase
Merkle_Branch : berisi list dari hash transaksi yg ditentukan oleh pool untuk membuat merkle root
Version : versi block
nBits = Target dalam format compact (4 bytes)
nTime = timestamps
CleanJobs = true atau false
- Setelah semua data yg dibutuhkan oleh miner lengkap, maka miner akan memulai proses hashing pada block template (data-data) tadi. Pertama-tama miner akan membuat transaksi coinbase dengan menggabungkan :
Coinbase1 + Extranonce1 + Extranonce2 + Coinbase2 (sesuai urutan) dan melakukan hash pada data tersebut.
- Saat hash coinbase didapat, maka langkah selanjutnya ialah membuat sebuah merkle root dengan memasangkan semua list hash transaksi sampai didapatkan sebuah hash merkle root (dimulai dengan melakukan hash pada penggabungan hash (coinbase) + hash transaksi pertama pada merkle_branch, dan diteruskan pada hash-hash transaksi selanjutnya). Untuk penjelasan singkat mengenai merkle root bisa dilihat disini
https://bitcointalk.org/index.php?topic=5041577.msg46549453#msg46549453- Langkah selanjutnya ialah membuat sebuah block header dengan melakukan hashing pada :
version + prevhash + merkle_root + ntime + nbits + nonceDari proses hashing ini hasil yg didapatkan akan dibandingkan dengan target (berdasarkan pool difficulty), jika hasil masih belum sesuai (dibawah) target maka akan digunakan nonce atau extranonce2 lainnya sampai didapatkan hash yang sesuai/dibawah target.
- Setelah itu miner akan mengirimkan share tersebut ke jaringan pool dengan data sebagai berikut :
{"id": 4, "method": "mining.submit", "params": ["username", "job id", "ExtraNonce2", "nTime", "nonce"]}
- Pool akan memberi respon terhadap share tersebut dengan memberikan status : true (diterima) atau false (ditolak)
{"id":4,"result":true/false,"error":null}

Note : Data-data diatas mengacu pada stratum protocol pada jaringan Bitcoin. Karena masing-masing mining Pool mempunyai stratum protocol yang tidak jauh berbeda, maka secara garis besar stratum protocol dari Bitcoin bisa dijadikan contoh untuk penjelasan proses kerja sebuah jaringan mining pool.
Reference :
https://en.bitcoin.it/wiki/Stratum_mining_protocol ;
https://en.bitcoin.it/wiki/Block_hashing_algorithm ;
https://arxiv.org/pdf/1703.06545.pdf