## How do you hash data for mining?

0

I was examining the block hashing algorithm and I tried to hash some blocks with my c++ sha256 to check results.

The hashes were wrong all the time so I thought I couldn't build the block header properly but then I took the data from wiki https://en.bitcoin.it/wiki/Block_hashing_algorithm and concatenated the values from the example and the result is still wrong (I tried it also in online sha-256 calculator so the function is ok).

Of course I must be missing something like coding but if I understand it right, sha is a function where you give a message and it takes the ascii codes of the message and does the math operations on these codes. But how can I pass a block header as a string? Or do I have to find an implementation of sha that interpretes the input differently?

I'm sorry, I know it's a noob question but this doesn't seem so obvious to me.

Edit:

The code is quite complex, but what I have at this moment is basically a made up block header that I packed in a string and for the example from the wiki page I mentioned above the string looks like

0100000081cd02ab7e569e8bcd9317e2fe99f2de44d49ab2b8851ba4a308000000000000e320b6c2 fffc8d750423db8b1eb942ae710e951ed797f7affc8892b0f1fc122bc7f5d74df2b9441a42a14695

I also have a sha function that takes a string as an input so the hash should be

1dbd981fe6985776b644b173a4d0385ddc1aa2a829688d1e0000000000000000

but it's

cf5397ae292d5d37a0df81aa7f89f9fc7e1c43329e441ce2294f0a72e542c7d9

I also checked it on http://www.xorbin.com/tools/sha256-hash-calculator so I think the code is ok but I must just be missing something here.

Maybe it will help if you post your code and sample input. – Nate Eldredge – 2017-01-15T18:43:42.113

I tried a couple of wrong ways of doing it, and none of them match your output. Could you post the code? – Nick ODell – 2017-01-15T19:21:36.790

Do you want me to paste the whole sha implementation?? Check the link with the hash calculator and it shows the same output (it's the double sha, I've been comparing it with the real block hash, which I pasted above) – M-guy – 2017-01-15T19:34:45.273

Also your title (but not body) mentions mining. I hope you realize that anything programmable in C++ cannot mine bitcoin competively since about 5 years ago. – dave_thompson_085 – 2017-01-15T20:52:46.620

@dave_thompson_085 yup I do. – M-guy – 2017-01-15T21:14:12.110

1

sha is a function where you give a message and it takes the ascii codes of the message and does the math operations on these codes.

Wrong. sha256 is a hash function. This means it takes data of (fairly, there can be a granularity) arbitrary length and returns data of constant length. In the case of sha256, the granularity is 1 bit (though the granularity of most implementations of it is 1 Byte; Thank you, dave_thompson_085) and the data it returns is always 256 bit = 32 Byte. No ASCII encoding required.

You feed your hash function the wrong data. You feed it a string containing the ASCII-encoded hexadecimal representation of the data you're supposed to feed into the function.

If you have a hexadecimal representation encoded in ASCII, you first have to convert it to the data it represents and then feed that into the hash function.

Ok, I get it... partly. So my mistake was that I had a piece of data for example 0xab and I was passing string "ab" to the function which is entirely wrong. But still, the sha function takes a string as an input so when I have a block header encoded as abshould I find a character that has code 1010 1011 and pass it to the function?... No, I think there must be another way and I apparently still get it wrong. – M-guy – 2017-01-15T19:54:24.550

Remember to hash it twice (hash it, then copy the SHA2-256 result back to the input box and hash again) – k-l – 2017-01-15T20:05:29.117

3@M-guy You can't use a sha256sum function which only accept a string as its input. Use an implementation of sha256 which accepts arbitrary data. – UTF-8 – 2017-01-15T20:18:40.867

2Nitpick: SHA-256 itself (in fact all the SHA-2 family, and SHA-1, and the MD hashes before them, and SHA-3 also) is defined for bit granularity. However, practically all software implementations limit to bytes, and all bitcoin hashing only needs bytes. @M-guy: all good C++ (or C) crypto libs I've seen support arbitrary bytes; if you identify which one you're using and how it may be that you're just using it wrong. – dave_thompson_085 – 2017-01-15T20:48:38.667

@dave_thompson_085 I didn't use a library, I was using this implementation: http://www.zedwood.com/article/cpp-sha256-function

– M-guy – 2017-01-15T21:16:25.357

2That code is okay except the silly std::string wrapper is useless for bitcoin. Do something like unsigned char hdr[80], hash[32]; SHA256 ctx = SHA256(); /* fill in hdr */ ctx.init(); ctx.update(hdr,80); ctx.final(hash); ctx.init(); ctx.update(hash,32); ctx.final(hash); /* (reverse and) use results in hash, possibly converted to hex or whatever you need */ – dave_thompson_085 – 2017-01-16T01:34:28.783

@dave_thompson_085 The std::string wrapper is fine. There's no problem with using a std::string to hold arbitrary binary data. – David Schwartz – 2017-08-15T05:59:11.057

@DavidSchwartz: that wrapper (in the cited sourcefile) converts to hex (presumably for display or output) which is badly wrong if used for both steps of bitcoin's double-hash. You could do the inner hash 'C-style' and the outer hash with string but that's just ugly. For at least some other applications it's okay. – dave_thompson_085 – 2017-08-16T09:36:42.050