Latar belakang
Pasti sudah banyak yang mengenal istilah GPU Mining, tetapi apakah ada yang mengetahui detail dari kegiatan Gpu mining itu seperti apa ?
Bagaimana sebuah GPU bekerja sehingga bisa muncul sebuah hashrate ?
Bagaimana sebuah GPU bisa terkoneksi dengan jaringan blockchain ?
Bagaimana proses komputasi tersebut dilakukan ?
Intro
●
BlockBlock adalah sebuah wadah berbagai transaksi yang telah dikirimkan pada sebuah jaringan dan untuk memproses sebuah block pada konsensus PoW dibutuhkan peran Miner.
●
HashrateSatuan pada proses hash function yang digunakan dalam kegiatan mining, sebagai penanda kecepatan komputasi dari sebuah node miner setiap detiknya.
Satuan yang digunakan = hash/second (H/s)
●
MiningProses komputasi untuk membuat sebuah block dalam jaringan blockchain, dan untuk setiap block valid yang dibuat akan mendapatkan reward sesuai dengan porsi hashrate-nya masing-masing.
Dalam kegiatan mining, GPU digunakan sebagai salah satu perangkat elektronik yang bisa melakukan proses mining. Dengan kombinasi dari beberapa perangkat lunak dan perangkat keras lainnya, maka perangkat sistem ini akan menjadi sebuah node aktif yang bisa ikut berperan dalam proses kegiatan mining pada sebuah jaringan blockchain (P2P).
Detail GPU Mining
●
Struktur GPUhttps://en.wikipedia.org/wiki/File:Generic_block_diagram_of_a_GPU.svg●
Driver dan FrameworkDriverSebuah program yang berfungsi untuk melakukan kontrol dan menjalankan sebuah perangkat tertentu yang terpasang pada sebuah sistem komputer (PC, Laptop). Program ini menyediakan antarmuka perangkat lunak (software) ke perangkat keras (hardware), sehingga memungkinkan sebuah OS dan program-program yang ada didalamnya, untuk bisa mengakses fungsi dari hardware tersebut.
FrameworkGPU mendukung API extensions yang bisa digunakan pada bahasa pemrograman C, seperti OpenCL. Sehingga sebuah GPU bisa melakukan proses komputasi umum seperti layaknya sebuah CPU.
Nvidia menggunakan framework yang disebut CUDA dan AMD menggunakan AMD APP SDK, dengan teknologi tersebut memungkinkan terjadinya proses komputasi (compute kernels) dari bahasa pemrograman (C, C++, Python) untuk dijalankan pada stream processors sebuah GPU, dan mengakses fungsi-fungsi yang ada pada sebuah GPU secara langsung.
●
Program miningProgram mining rata-rata menggunakan bahasa pemrograman C, C++ dan Python. Sehingga untuk melakukan proses komputasi pada kegiatan mining menggunakan GPU, dibutuhkan software frameworks seperti OpenCL, Cuda dan AMD SDK.
Pada program mining ada parameter-parameter yang mesti ditambahkan pada bagian config atau .bat file. Supaya proses mining bisa berjalan sesuai dengan target yang diinginkan, maka parameter-parameter seperti : Pool URL, Algoritma coin, Address mining reward, dll harus disesuaikan terlebih dahulu.
Beberapa contoh Program Mining :
- CCMiner
- SGMiner
- Claymore
- Xmr-Stak
●
Algoritma miningFungsi hash khusus dalam bentuk algoritma matematika, yang digunakan pada setiap proses komputasi (menghasilkan hash) dalam memproduksi sebuah block pada mekanisme Proof of Work.
Contoh algoritma mining :
●
HashingProses komputasi pada GPU menggunakan algoritma mining tertentu, dalam merumuskan suatu permasalahan matematika yang komplek sehingga bisa dihasilkan sebuah hash yang valid. Proses hashing dalam kegiatan mining selalu berkaitan dengan difficulty, yakni tingkat kesulitan pada level tertentu dalam memproduksi hash sesuai dengan ketentuan target yang ada.
Elemen-elemen tersebut mempengaruhi berapa lama (waktu yang dibutuhkan) sebuah block dapat diselesaikan, dengan ketentuan block time berbanding lurus dengan difficulty dan berbanding terbalik dengan hashing. Jadi semakin besar nilai difficulty maka waktu untuk memproses sebuah block juga akan semakin lama. Begitu juga sebaliknya, semakin besar kemampuan hashing sebuah node miner maka nilai block time akan semakin kecil.
●
Proses GPU mining- 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://bitcointalksearch.org/topic/m.46549453- 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
Note :
- Post spam, dan out of topic akan saya hapus
- Jika ada yang salah, mohon dikoreksi
- Jika ada bagian yang kurang mengerti silahkan ditanyakan
- Buat yang ingin menambahkan informasi (sesuai topik), saya persilahkan
References :
https://en.wikipedia.org/wiki/Graphics_processing_unithttps://en.wikipedia.org/wiki/Cryptographic_hash_functionhttps://en.wikipedia.org/wiki/Device_driver