Cryptocurrency mining pool written in C++ for speed. Supports Stratum.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

57 lines
1.5 KiB

#include "Block.h"
namespace Bitcoin
{
void Block::BuildMerkleTree()
{
merkleTree.clear();
// Add transactions
for (uint64 i = 0; i < tx.size(); ++i)
merkleTree.push_back(tx[i].GetHash());
uint32 j = 0;
for (uint32 size = tx.size(); size > 1; size = (size+1)/2)
{
for (uint32 i = 0; i < size; i += 2)
{
uint32 i2 = std::min(i+1, size-1);
merkleTree.push_back(Crypto::GOSTD(Util::Join(merkleTree[j+i], merkleTree[j+i2])));
}
j += size;
}
// Last hash is merkle root
merkleRootHash = merkleTree[merkleTree.size()-1];
}
void Block::RebuildMerkleTree()
{
// Set coinbase tx hash
merkleTree[0] = tx[0].GetHash();
// Only rebuild left side of the tree
uint32 j = 0;
for (uint32 size = tx.size(); size > 1; size = (size+1)/2)
{
merkleTree[j+size] = Crypto::GOSTD(Util::Join(merkleTree[j], merkleTree[j+1]));
j += size;
}
// Last hash is merkle root
merkleRootHash = merkleTree[merkleTree.size()-1];
}
BinaryData Block::GetHash()
{
ByteBuffer buf;
buf << version;
buf << prevBlockHash;
buf << merkleRootHash;
buf << time;
buf << bits;
buf << nonce;
return Crypto::GOSTD(buf.Binary());
}
}