Skip to content

Commit

Permalink
Add files via upload
Browse files Browse the repository at this point in the history
  • Loading branch information
M5M400 committed Dec 19, 2016
1 parent 55a1dde commit 37f50f9
Show file tree
Hide file tree
Showing 2 changed files with 57 additions and 1 deletion.
57 changes: 56 additions & 1 deletion src/cryptonote_core/cryptonote_format_utils.cpp
Expand Up @@ -613,10 +613,65 @@ namespace cryptonote
return get_object_hash(static_cast<const bb_transaction_prefix&>(t), res, blob_size);
}

//---------------------------------------------------------------
bool get_transaction_hash(const transaction& t, crypto::hash& res, size_t* blob_size)
{
// v1 transactions hash the entire blob
if (t.version == 1)
{
size_t ignored_blob_size, &blob_size_ref = blob_size ? *blob_size : ignored_blob_size;
return get_object_hash(t, res, blob_size_ref);
}

// v2 transactions hash different parts together, than hash the set of those hashes
crypto::hash hashes[3];

// prefix
get_transaction_prefix_hash(t, hashes[0]);

transaction &tt = const_cast<transaction&>(t);

// base rct
{
std::stringstream ss;
binary_archive<true> ba(ss);
const size_t inputs = t.vin.size();
const size_t outputs = t.vout.size();
bool r = tt.rct_signatures.serialize_rctsig_base(ba, inputs, outputs);
CHECK_AND_ASSERT_MES(r, false, "Failed to serialize rct signatures base");
cryptonote::get_blob_hash(ss.str(), hashes[1]);
}

// prunable rct
if (t.rct_signatures.type == rct::RCTTypeNull)
{
hashes[2] = cryptonote::null_hash;
}
else
{
std::stringstream ss;
binary_archive<true> ba(ss);
const size_t inputs = t.vin.size();
const size_t outputs = t.vout.size();
const size_t mixin = t.vin.empty() ? 0 : t.vin[0].type() == typeid(txin_to_key) ? boost::get<txin_to_key>(t.vin[0]).key_offsets.size() - 1 : 0;
bool r = tt.rct_signatures.p.serialize_rctsig_prunable(ba, t.rct_signatures.type, inputs, outputs, mixin);
CHECK_AND_ASSERT_MES(r, false, "Failed to serialize rct signatures prunable");
cryptonote::get_blob_hash(ss.str(), hashes[2]);
}

// the tx hash is the hash of the 3 hashes
res = cn_fast_hash(hashes, sizeof(hashes));

// we still need the size
if (blob_size)
*blob_size = get_object_blobsize(t);

return true;
}
//---------------------------------------------------------------
bool get_transaction_hash(const transaction& t, crypto::hash& res, size_t& blob_size)
{
return get_object_hash(t, res, blob_size);
return get_transaction_hash(t, res, &blob_size);
}
//---------------------------------------------------------------
bool get_block_hashing_blob(const block& b, blobdata& blob)
Expand Down
1 change: 1 addition & 0 deletions src/cryptonote_core/cryptonote_format_utils.h
Expand Up @@ -77,6 +77,7 @@ namespace cryptonote
crypto::hash get_transaction_hash(const transaction& t);
bool get_transaction_hash(const transaction& t, crypto::hash& res);
bool get_transaction_hash(const transaction& t, crypto::hash& res, size_t& blob_size);
bool get_transaction_hash(const transaction& t, crypto::hash& res, size_t* blob_size);
bool get_block_hashing_blob(const block& b, blobdata& blob);
bool get_bytecoin_block_hashing_blob(const block& b, blobdata& blob);
blobdata get_block_hashing_blob(const bb_block& b);
Expand Down

0 comments on commit 37f50f9

Please sign in to comment.