cryptonote: set tx hash on newly parsed txes when known

release-v0.5.0
moneromooo-monero 6 years ago committed by wowario
parent f97b2edb3c
commit 7bb6c00b5e
No known key found for this signature in database
GPG Key ID: 24DCBE762DE9C111

@ -211,6 +211,8 @@ namespace cryptonote
void set_hash_valid(bool v) const { hash_valid.store(v,std::memory_order_release); } void set_hash_valid(bool v) const { hash_valid.store(v,std::memory_order_release); }
bool is_blob_size_valid() const { return blob_size_valid.load(std::memory_order_acquire); } bool is_blob_size_valid() const { return blob_size_valid.load(std::memory_order_acquire); }
void set_blob_size_valid(bool v) const { blob_size_valid.store(v,std::memory_order_release); } void set_blob_size_valid(bool v) const { blob_size_valid.store(v,std::memory_order_release); }
void set_hash(const crypto::hash &h) { hash = h; set_hash_valid(true); }
void set_blob_size(size_t sz) { blob_size = sz; set_blob_size_valid(true); }
BEGIN_SERIALIZE_OBJECT() BEGIN_SERIALIZE_OBJECT()
if (!typename Archive<W>::is_saving()) if (!typename Archive<W>::is_saving())

@ -204,6 +204,7 @@ namespace cryptonote
CHECK_AND_ASSERT_MES(r, false, "Failed to parse transaction from blob"); CHECK_AND_ASSERT_MES(r, false, "Failed to parse transaction from blob");
CHECK_AND_ASSERT_MES(expand_transaction_1(tx, false), false, "Failed to expand transaction data"); CHECK_AND_ASSERT_MES(expand_transaction_1(tx, false), false, "Failed to expand transaction data");
tx.invalidate_hashes(); tx.invalidate_hashes();
tx.set_blob_size(tx_blob.size());
return true; return true;
} }
//--------------------------------------------------------------- //---------------------------------------------------------------

@ -480,6 +480,10 @@ namespace cryptonote
MERROR("Failed to parse tx from txpool"); MERROR("Failed to parse tx from txpool");
return false; return false;
} }
else
{
tx.set_hash(id);
}
tx_weight = meta.weight; tx_weight = meta.weight;
fee = meta.fee; fee = meta.fee;
relayed = meta.relayed; relayed = meta.relayed;
@ -782,6 +786,7 @@ namespace cryptonote
// continue // continue
return true; return true;
} }
tx.set_hash(txid);
txi.tx_json = obj_to_json_str(tx); txi.tx_json = obj_to_json_str(tx);
txi.blob_size = bd->size(); txi.blob_size = bd->size();
txi.weight = meta.weight; txi.weight = meta.weight;
@ -847,14 +852,13 @@ namespace cryptonote
m_blockchain.for_all_txpool_txes([&tx_infos, key_image_infos](const crypto::hash &txid, const txpool_tx_meta_t &meta, const cryptonote::blobdata *bd){ m_blockchain.for_all_txpool_txes([&tx_infos, key_image_infos](const crypto::hash &txid, const txpool_tx_meta_t &meta, const cryptonote::blobdata *bd){
cryptonote::rpc::tx_in_pool txi; cryptonote::rpc::tx_in_pool txi;
txi.tx_hash = txid; txi.tx_hash = txid;
transaction tx; if (!parse_and_validate_tx_from_blob(*bd, txi.tx))
if (!parse_and_validate_tx_from_blob(*bd, tx))
{ {
MERROR("Failed to parse tx from txpool"); MERROR("Failed to parse tx from txpool");
// continue // continue
return true; return true;
} }
txi.tx = tx; txi.tx.set_hash(txid);
txi.blob_size = bd->size(); txi.blob_size = bd->size();
txi.weight = meta.weight; txi.weight = meta.weight;
txi.fee = meta.fee; txi.fee = meta.fee;
@ -990,21 +994,23 @@ namespace cryptonote
{ {
struct transction_parser struct transction_parser
{ {
transction_parser(const cryptonote::blobdata &txblob, transaction &tx): txblob(txblob), tx(tx), parsed(false) {} transction_parser(const cryptonote::blobdata &txblob, const crypto::hash &txid, transaction &tx): txblob(txblob), txid(txid), tx(tx), parsed(false) {}
cryptonote::transaction &operator()() cryptonote::transaction &operator()()
{ {
if (!parsed) if (!parsed)
{ {
if (!parse_and_validate_tx_from_blob(txblob, tx)) if (!parse_and_validate_tx_from_blob(txblob, tx))
throw std::runtime_error("failed to parse transaction blob"); throw std::runtime_error("failed to parse transaction blob");
tx.set_hash(txid);
parsed = true; parsed = true;
} }
return tx; return tx;
} }
const cryptonote::blobdata &txblob; const cryptonote::blobdata &txblob;
const crypto::hash &txid;
transaction &tx; transaction &tx;
bool parsed; bool parsed;
} lazy_tx(txblob, tx); } lazy_tx(txblob, txid, tx);
//not the best implementation at this time, sorry :( //not the best implementation at this time, sorry :(
//check is ring_signature already checked ? //check is ring_signature already checked ?

Loading…
Cancel
Save