Misalnya data penuh untuk scrypt Stratum-klien

chmood



ย ย ย 
Saya mencoba untuk menulis klien Pertambangan untuk pertambangan scrypt berbasis menggunakan Stratum Komunikasi. Sampai sekarang, saya memiliki beberapa kesulitan memverifikasi semua perintah bit dan urutan. Hash Aku menghasilkan mendapatkan selalu ditolak karena tidak memenuhi target.

Apa yang saya cari adalah urutan penuh data, mulai dari informasi yang saya dapatkan dari server strata (coinbases, merkles, ...) untuk hash final.

Saya sudah bisa memverifikasi bagian dari algoritma (terutama dari input ke Merkle-akar valid, menggunakan informasi dari http://mining.bitcoin.cz/stratum-mining/, dan hashing scrypt, menggunakan blok header dari https: //litecoin.info/Scrypt), tapi saya kira ada beberapa masalah endian di antara, atau sesuatu yang sama sekali berbeda, saya tidak tahu ... Dengan alur kerja penuh saya bisa memverifikasi mana kesalahan terjadi.

Apakah ada yang tahu di mana untuk mendapatkan data tersebut, atau bagaimana untuk menghasilkan mereka sendiri?
Tanggapan divalidasi

Baiklah, saya akhirnya berhasil memperbaiki bug saya dan mendapatkan jemput penuh. Berikut adalah contoh untuk komunikasi penuh kolam renang a. Saya tidak menjelaskan semuanya secara detail sebagai deskripsi API dapat ditemukan di tempat lain.

a) Suscription

{"id": 1, "metode": "mining.subscribe", "params": []}
{"error": null, "id": 1, "hasil": [["mining.notify",
"ae6812eb4cd7735a302a8a9dd95cf71f"], "f8002c90", 4]}

Kami suscribe dengan server. Ini tidak memiliki parameter. Akibatnya, kami menerima beberapa Suscription ID, dan kami Extranonce1 + extranonce2 ukuran, yang kita butuhkan untuk nanti. b) otorisasi

{"params": ["Pengguna", "password"], "id": 2, "metode": "mining.authorize"}
{"error": null, "id": 2, "hasil": true}

Otorisasi pekerja dengan Username + password. Tidak ada parameter untuk menyimpan dari hasil. c) Server -> kesulitan

{"params": [32], "id": null, "metode": "mining.set_difficulty"}

Set kesulitan untuk 32, mendefinisikan target kami. Kesulitan yang dihasilkan dapat dihitung sebagai

0x0000FFFF00000000000000000000000000000000000000000000000000000000 / 32 =
0x000007fff8000000000000000000000000000000000000000000000000000000

Sekarang, bagian yang menyenangkan: d) Blok Info

{"params": ["b3ba", "7dcf1304b04e7902406
6cd9481aa464e2fe17966e19edf6f33970e1fe0b60277", "0100000001000000000000000000000000000000000000
0000000000000000000000000000ffffffff270362f401062f5
03253482f049b8f175308", "0d2f7374726174756d506f6f6c2f0000000001008685910521
00001976a91431482118f1d7504daf1c001cbfaf91ad580d176d88ac00000000",
["57351e8569cb9d036187a79fd1844fd930c1309efcd16c46af9bb9713b6ee734", "936ab9c33420f187acae660fcdb07ffdffa081273674f0f41e6ecc1347451d23"], "00000002", "1b44dfdb", "53178f9b", benar], "id": null, "metode": "mining.notify"}

Saya membagi parameter dan menetapkan mereka untuk variabel

job_id = "b3ba"
prevhash = "7dcf1304b04e79024066cd9481aa464e2fe17966e19edf6f33970e1fe0b60277"
coinb1 = "010000000100000000000000000000000000000000
00000000000000000000000000000000ffffffff270362f401062f503253482f049b8f175308"
coinb2 = "0d2f7374726174756d506f6f6c2f0000000001008685
91052100001976a91431482118f1d7504daf1c001cbfaf91ad580d176d88ac00000000"
Merklebranches = [
ย ย ย ย 
"57351e8569cb9d036187a79fd1844fd930c1309efcd16c46af9bb9713b6ee734",
ย ย ย ย 
"936ab9c33420f187acae660fcdb07ffdffa081273674f0f41e6ecc1347451d23"
ย ย ย ย 
]
Versi = "00000002"
nbits = "1b44dfdb"
ntime = "53178f9b"
clean_jobs = true // Tidak diperlukan untuk blok, hanya untuk kelengkapan

Apa yang kita butuhkan adalah juga extranonce1 dan extranonce 2:

extranonce1 = "f8002c90" // dari sebelumnya
extranonce2 = "00000002" // bisa apa saja, tapi 4 byte

Dengan ini, kita bisa mulai membangun akar Merkle kami: Pertama, coinbase yang:

coinbase = coinb1 + extranonce1 + extranonce2 + coinb2;
coinbase = "010000000100000000000000000000000000000
00000000000000000000000000000000000ffffffff270362f40106
2f503253482f049b8f175308f8002c90000000020d2f7374726174756d
506f6f6c2f000000000100868591052100001976a91431482118f1d7504d
af1c001cbfaf91ad580d176d88ac00000000"

Sekarang, kita mengubah coinbase ini ke biner. Tidak ada membalik atau konversi BE-LE diperlukan, langsung dari kiri ke kanan. Dihasilkan data biner hash dengan SHA256 (SHA256 (data)). Dari sini, saya akan posting biner sebagai representasi hex, tapi seperti: Dari kiri ke kanan, tidak ada konversi endianess

hash yang dihasilkan: 280b3927f6763b1ed90cae2a3cef4d27c743f6a7d91e3901dc3816a46acacf36

Ini adalah awal untuk concatination Merkle. Concatinating berarti hanya bergabung dengan mereka. 32 byte untuk hash dan 32 byte untuk setiap hasil merkleroot di 64 byte data untuk hash.

untuk setiap Merkle_branch
ย ย ย ย 
byte [64] = hash + merkle_branch
ย ย ย ย 
hash = SHA256 (SHA256 (byte))
akhir

Misalnya terlihat seperti ini:

byte = 280b3927f6763b1ed90cae2a3cef4d27c743f6a7d91e3901dc3816a46acacf36 +

57351e8569cb9d036187a79fd1844fd930c1309efcd16c46af9bb9713b6ee734

hash = e6df228610b9f0e96a42a4877565627a3e1e133e984b6c46ff6e44b7dc9dc056

byte = e6df228610b9f0e96a42a4877565627a3e1e133e984b6c46ff6e44b7dc9dc056 + 936ab9c33420f187acae660fcdb07ffdffa081273674f0f41e6ecc1347451d23
hash = 0b1edc1ccf82d3214423fc68234f4946119e39df2cc2137e31ebc186191d5422

yang merupakan merkle_root final. Tidak perlu mengubah kembali ke hex, dapat disimpan dalam format biner untuk langkah berikutnya

e) Blok sundulan Blok header membangun dengan semua informasi sebelumnya + yang Merkle akar dihitung. Hasilnya 80 byte Data

blockHeader {
ย ย ย ย 
Versi [4]
ย ย ย ย 
prevhash [32]
ย ย ย ย 
merkle_root [32]
ย ย ย ย 
ntime [4]
ย ย ย ย 
nbit [4]
ย ย ย ย 
Nonce [4]
}

Di sini, urutan byte mendapat sedikit rumit: Semua 4 jenis byte yang kecil endian, dan byte harus membalik. Merkleroot dapat disalin 1: 1, tanpa membalik byte. prevhash adalah apa yang paling mengejutkan saya. Hal ini dapat dilihat sebagai terbaik array 8 4byte int, di mana masing-masing int tersebut harus dikonversi ke LE, tapi order terus kiri ke kanan. Saya menunjukkannya pada contoh:

Versi: 00000002 -> 02000000
prevhash: 7dcf1304 b04e7902 4066cd94 81aa464e 2fe17966 e19edf6f 33970e1f e0b60277
ย ย ย ย ย ย ย ย 
-> 0413cf7d 02794eb0 94cd6640 4e46aa81 6679e12f 6fdf9ee1 1f0e9733 7702b6e0 // 8 int kiri ke kanan, masing-masing membalik
Merkle: 0b1edc1c cf82d321 4423fc68 234f4946 119e39df 2cc2137e 31ebc186 191d5422 // tidak ada yang berubah
ntime: 53178f9b -> 9b8f1753
nbits: 1b44dfdb -> dbdf441b

Hasil di bytestream berikut:

020000000413cf7d02794eb094cd66404e46aa816
679e12f6fdf9ee11f0e97337702b6e00b1edc1ccf82d32144
23fc68234f4946119e39df2cc2137e31ebc186191d54229b8f1753dbdf441b00000000

Perhatikan bahwa kita tidak perlu padding atau apa pun, seperti implementasi bitcoin memiliki, 80 byte semua yang kita butuhkan. Sekarang, mari kita hash itu f) hashing dan hasil yang mengirimkan ini melalui hasil siklus scrypt di hash berikut:

f6f13e350aa4f251e192ab8a78690ee99f1cc2d930d4ae16c4172a0a8aefddd0

Nah, ini bukan hash yang kita cari ... Jadi kita mulai bermain dengan Nonce pertama, dan jika thats tidak cukup kita dapat meningkatkan ntime tersebut. Sampai akhirnya, setelah waktu yang lama, kami mencoba

Nonce = "00007f8a" // BigEndian
Waktu = "53178f9f" // BigEndian

Ini memberi kita Blok berikut dan hash yang dihasilkan:

blok = 020000000413cf7d02794eb094cd66404e46aa816679e
12f6fdf9ee11f0e97337702b6e00b1edc1ccf82d3214423fc68234f
4946119e39df2cc2137e31ebc186191d54229f8f1753dbdf441b8a7f0000
hash = 7441207b6390054623bc5e659ffe2581356dafc5ec41db44d27de85035000000

Terlihat agak tinggi, tapi di sini lagi, endianess harus dipertimbangkan. Untuk membandingkannya dengan Target kami, kami harus membandingkan tinggi ke rendah. Dan, tidak lupa bahwa kita harus mengubah urutan byte dari target kami:

menargetkan = 0x000007fff8000000000000000000000000000000000000000000000000000000
ย ย ย 
---> 0x000000000000000000000000000000000000000000000000000000f8ff070000

Sekarang jika kita membandingkan mereka:

000000000000000000000000000000000000000000000000000000f8ff070000
7441207b6390054623bc5e659ffe2581356dafc5ec41db44d27de85035000000

Kita melihat bahwa hash bawah target kami, dan kami dapat mengirimkannya. Atau kita dapat melihat mereka dalam urutan byte lain (di mana ia dicetak sebagian besar waktu)

000007fff8000000000000000000000000000000000000000000000000000000
0000003550e87dd244db41ecc5af6d358125fe9f655ebc23460590637b204174

Yang terlihat sama, sebagian besar. Hal ini membawa kita ke langkah terakhir kami: g) Menyerahkan Share Sekarang kami kumpulkan parameter variabel yang kita gunakan, dan mengirimkannya ke server.

user = "user"
job_id = "b3ba"
extranonce2 = "00000002" // ada byte swapping diperlukan. Its bagaimana kita meletakkannya di coinbase yang
ntime = "53178f9f" // ini adalah Big Endian. The ntime di block_header adalah little endian. JIKA Anda membacanya dari block_header Anda, jangan lupa untuk swap
Nonce = "00007f8a" // Sama di sini. Mengkonversi Untuk BigEndian sebelum mengirim

Kami berkemas data ini dalam JSON bungkus rapi, dan mengirimnya ke server:

{"params": ["Pengguna", "b3ba", "00000002", "53178f9f", "00007f8a"], "id": 4, "metode": "mining.submit"}

Dan, jika semua bekerja dengan baik, dan kita tidak memiliki masalah lain (seperti saham basi atau apa pun), kita mendapatkan respon positif:

{"error": null, "id": 4, "hasil": true}

Dan itu! Untuk saham lebih ulangi sesering inginkan


Komentar