So im trying to hash a header in C++ and I am having some trouble. I have tried different libraries (cryptopp, openssl) can't seem to hash the header correctly.
This is the block which I am testing: https://www.blockchain.com/btc/block/669892
header.version = 1073676288; // 3ff0000
header.previous_block = "000000000000000000069237bbafea14ba06f7bdc5e192aa38875ca3fc0d0cd9";
header.tx_merkle_root = "b0a2b9b8a0063e5b6818a8725ac567977805c77b6bba11f03a0c33a0cdd866ad";
header.timestamp = 1612900436; // 6022e854
header.bits = "170d21b9";
header.nonce = 2792790281; // a6769909
I have a class/function which will format them into a hex string, which i get as: 0000ff3fd90c0dfca35c8738aa92e1c5bdf706ba14eaafbb379206000000000000000000ad66d8cda0330c3af011ba6b7bc705789767c55a72a818685b3e06a0b8b9a2b054e82260b9210d17099976a6
And the expected final hash of 000000000000000000064ec839564cc03166184f0a404d82cad9c655f714d886
I then use this hash function, and similar to get the final computed hash SHA256(SHA256(blockheader))
static std::string SHA256(std::string data, int size)
{
// convert hex string to char
unsigned char tmp;
Crypto::hexStringToCharBinary(&tmp, &data, size);
unsigned char hash[SHA256_DIGEST_LENGTH];
SHA256_CTX sha256;
SHA256_Init(&sha256);
SHA256_Update(&sha256, &tmp, size);
SHA256_Final(hash, &sha256);
std::stringstream ss;
for(int i = 0; i < SHA256_DIGEST_LENGTH; i++)
{
ss << std::hex << std::setw(2) << std::setfill('0') << (int)hash[i];
}
std::cout << "digest: " << ss.str() << std::endl;
return ss.str();
}
I know that I am supposed to give the sha256 the bits and not the string of hex, because it works on a bit basis, but I dont know how to do that. I am not the best at byte manipulation in C++, or hashing, does anyone know how to do this nice and easy, if that's possible?
hash
back to SHA256; notss.str()
.