Title: Stratum protocol - problem with implementation in python Post by: kapmick on January 07, 2020, 03:32:41 PM Hello everyone :)
For a couple of days I'm trying to write simple script in python to communicate with stratum pool server. I'm using simplified code of NightMiner (https://github.com/ricmoo/nightminer/) and some testnet I've foud ( stratum+tcp://pool.bitcoincloud.net:4008), but I can't get the proper result. Maybe someone more experienced could help me. Below I show each step of my script (step, no python source code). 1. connect to the server, authorize, get the job data After connecting to the server I send this requests: Code: b'{"id": 1, "method": "mining.subscribe", "params": []}\n' and get the following response: Code: {"id":1,"result":[[["mining.set_difficulty","deadbeefcafebabea200000000000000"],["mining.notify","deadbeefcafebabea200000000000000"]],"40000004",4],"error":null} 2. get the coinbase and merkle root With this data and extranounce='00000000' I can build the coinbase (in byte form, but I will show as hex in this example): Code: coinbase=coinb1+extranounce1+extranounce2+coinb2 Next thing to do is double hash the coinbase with SHA256 algo, which gives me the following bytes: Code: b'9b9c9ab0b1c92844e4fed3f895f9443fefcda5ae02cc5a8ad4444f9303081a23' There is no merkle branches (merkle branches array is empty), so hash above is our merkle root. 3. building the header With merkle root and data received in step 1, I can start building a header: Code: header= version + prevhash + merkle root + ntime + nbits + nonce I use the values as follows: Code: version - received '20000000', after little-endian conversion it is '0000002' So the header is Code: b'0000002063bf28417b38570f415be2007eb71b9d36407e66e8fed8a756010000000000009b9c9ab0b1c92844e4fed3f895f9443fefcda5ae02cc5a8ad4444f9303081a238c8a145e98b0021a' + nonce 4. search nonce the difficulty is 0.01, so my target is Code: 00000063ff9c0000000000000000000000000000000000000000000000000000 after some calculations, I find this 4 bytes to use it as a nonce: Code: b'd0cf1040' so my complete header is now Code: b'0000002063bf28417b38570f415be2007eb71b9d36407e66e8fed8a756010000000000009b9c9ab0b1c92844e4fed3f895f9443fefcda5ae02cc5a8ad4444f9303081a238c8a145e98b0021ad0cf1040' after double-hashing it with SHA256 algo and reverse bytes order I get this hash: Code: 000000032f201567fc4d02fa468bf2dc6a5c21ae70098c124e99ee7d2520ca26 which is below my target, so 'd0cf1040' should be the correct nonce. 5. submit nonce last thing to do is submitting the results, so I send this request to the server: Code: b'{"id":2, "method":"mining.submit","params":["testuser","4ca","00000000","5e148a8c","d0cf1040"]}\n' and this is response I get: Code: {"id":2,"result":false,"error":null} I have no idea why I get result=false. I can only suppose there is a mistake in step 3 (building header) and this mistake is related to byte-order of some values, but I can't find this mistake (I have tried many variants of byte-order, but never get the response result=true). I will be much obliged if anyone can check this calculations and give me some tips. Title: Re: Stratum protocol - problem with implementation in python Post by: kapmick on January 08, 2020, 05:48:15 PM Ok, I have found the mistake, here are some details: https://bitcoin.stackexchange.com/questions/92705/stratum-protocol-problem-with-implementation-in-python/92722#92722
Title: Re: Stratum protocol - problem with implementation in python Post by: NotFuzzyWarm on January 08, 2020, 06:48:34 PM Ok, I have found the mistake, here are some details: https://bitcoin.stackexchange.com/questions/92705/stratum-protocol-problem-with-implementation-in-python/92722#92722 Merit given for reporting back that you found the solution! |