core: avoid calculating tx prefix hash when we don't need it
This commit is contained in:
parent
b044d03a51
commit
f75d51abda
@ -210,7 +210,7 @@ namespace cryptonote
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
//---------------------------------------------------------------
|
//---------------------------------------------------------------
|
||||||
bool parse_and_validate_tx_from_blob(const blobdata& tx_blob, transaction& tx, crypto::hash& tx_hash, crypto::hash& tx_prefix_hash)
|
bool parse_and_validate_tx_from_blob(const blobdata& tx_blob, transaction& tx, crypto::hash& tx_hash)
|
||||||
{
|
{
|
||||||
std::stringstream ss;
|
std::stringstream ss;
|
||||||
ss << tx_blob;
|
ss << tx_blob;
|
||||||
@ -222,6 +222,13 @@ namespace cryptonote
|
|||||||
//TODO: validate tx
|
//TODO: validate tx
|
||||||
|
|
||||||
get_transaction_hash(tx, tx_hash);
|
get_transaction_hash(tx, tx_hash);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
//---------------------------------------------------------------
|
||||||
|
bool parse_and_validate_tx_from_blob(const blobdata& tx_blob, transaction& tx, crypto::hash& tx_hash, crypto::hash& tx_prefix_hash)
|
||||||
|
{
|
||||||
|
if (!parse_and_validate_tx_from_blob(tx_blob, tx, tx_hash))
|
||||||
|
return false;
|
||||||
get_transaction_prefix_hash(tx, tx_prefix_hash);
|
get_transaction_prefix_hash(tx, tx_prefix_hash);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -51,6 +51,7 @@ namespace cryptonote
|
|||||||
crypto::hash get_transaction_prefix_hash(const transaction_prefix& tx);
|
crypto::hash get_transaction_prefix_hash(const transaction_prefix& tx);
|
||||||
bool parse_and_validate_tx_prefix_from_blob(const blobdata& tx_blob, transaction_prefix& tx);
|
bool parse_and_validate_tx_prefix_from_blob(const blobdata& tx_blob, transaction_prefix& tx);
|
||||||
bool parse_and_validate_tx_from_blob(const blobdata& tx_blob, transaction& tx, crypto::hash& tx_hash, crypto::hash& tx_prefix_hash);
|
bool parse_and_validate_tx_from_blob(const blobdata& tx_blob, transaction& tx, crypto::hash& tx_hash, crypto::hash& tx_prefix_hash);
|
||||||
|
bool parse_and_validate_tx_from_blob(const blobdata& tx_blob, transaction& tx, crypto::hash& tx_hash);
|
||||||
bool parse_and_validate_tx_from_blob(const blobdata& tx_blob, transaction& tx);
|
bool parse_and_validate_tx_from_blob(const blobdata& tx_blob, transaction& tx);
|
||||||
bool parse_and_validate_tx_base_from_blob(const blobdata& tx_blob, transaction& tx);
|
bool parse_and_validate_tx_base_from_blob(const blobdata& tx_blob, transaction& tx);
|
||||||
bool is_v1_tx(const blobdata_ref& tx_blob);
|
bool is_v1_tx(const blobdata_ref& tx_blob);
|
||||||
|
@ -724,7 +724,7 @@ namespace cryptonote
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
//-----------------------------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------------------------
|
||||||
bool core::handle_incoming_tx_pre(const blobdata& tx_blob, tx_verification_context& tvc, cryptonote::transaction &tx, crypto::hash &tx_hash, crypto::hash &tx_prefixt_hash, bool keeped_by_block, bool relayed, bool do_not_relay)
|
bool core::handle_incoming_tx_pre(const blobdata& tx_blob, tx_verification_context& tvc, cryptonote::transaction &tx, crypto::hash &tx_hash, bool keeped_by_block, bool relayed, bool do_not_relay)
|
||||||
{
|
{
|
||||||
tvc = boost::value_initialized<tx_verification_context>();
|
tvc = boost::value_initialized<tx_verification_context>();
|
||||||
|
|
||||||
@ -737,9 +737,8 @@ namespace cryptonote
|
|||||||
}
|
}
|
||||||
|
|
||||||
tx_hash = crypto::null_hash;
|
tx_hash = crypto::null_hash;
|
||||||
tx_prefixt_hash = crypto::null_hash;
|
|
||||||
|
|
||||||
if(!parse_tx_from_blob(tx, tx_hash, tx_prefixt_hash, tx_blob))
|
if(!parse_tx_from_blob(tx, tx_hash, tx_blob))
|
||||||
{
|
{
|
||||||
LOG_PRINT_L1("WRONG TRANSACTION BLOB, Failed to parse, rejected");
|
LOG_PRINT_L1("WRONG TRANSACTION BLOB, Failed to parse, rejected");
|
||||||
tvc.m_verifivation_failed = true;
|
tvc.m_verifivation_failed = true;
|
||||||
@ -772,7 +771,7 @@ namespace cryptonote
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
//-----------------------------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------------------------
|
||||||
bool core::handle_incoming_tx_post(const blobdata& tx_blob, tx_verification_context& tvc, cryptonote::transaction &tx, crypto::hash &tx_hash, crypto::hash &tx_prefixt_hash, bool keeped_by_block, bool relayed, bool do_not_relay)
|
bool core::handle_incoming_tx_post(const blobdata& tx_blob, tx_verification_context& tvc, cryptonote::transaction &tx, crypto::hash &tx_hash, bool keeped_by_block, bool relayed, bool do_not_relay)
|
||||||
{
|
{
|
||||||
if(!check_tx_syntax(tx))
|
if(!check_tx_syntax(tx))
|
||||||
{
|
{
|
||||||
@ -906,7 +905,7 @@ namespace cryptonote
|
|||||||
TRY_ENTRY();
|
TRY_ENTRY();
|
||||||
CRITICAL_REGION_LOCAL(m_incoming_tx_lock);
|
CRITICAL_REGION_LOCAL(m_incoming_tx_lock);
|
||||||
|
|
||||||
struct result { bool res; cryptonote::transaction tx; crypto::hash hash; crypto::hash prefix_hash; };
|
struct result { bool res; cryptonote::transaction tx; crypto::hash hash; };
|
||||||
std::vector<result> results(tx_blobs.size());
|
std::vector<result> results(tx_blobs.size());
|
||||||
|
|
||||||
tvc.resize(tx_blobs.size());
|
tvc.resize(tx_blobs.size());
|
||||||
@ -917,7 +916,7 @@ namespace cryptonote
|
|||||||
tpool.submit(&waiter, [&, i, it] {
|
tpool.submit(&waiter, [&, i, it] {
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
results[i].res = handle_incoming_tx_pre(*it, tvc[i], results[i].tx, results[i].hash, results[i].prefix_hash, keeped_by_block, relayed, do_not_relay);
|
results[i].res = handle_incoming_tx_pre(*it, tvc[i], results[i].tx, results[i].hash, keeped_by_block, relayed, do_not_relay);
|
||||||
}
|
}
|
||||||
catch (const std::exception &e)
|
catch (const std::exception &e)
|
||||||
{
|
{
|
||||||
@ -947,7 +946,7 @@ namespace cryptonote
|
|||||||
tpool.submit(&waiter, [&, i, it] {
|
tpool.submit(&waiter, [&, i, it] {
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
results[i].res = handle_incoming_tx_post(*it, tvc[i], results[i].tx, results[i].hash, results[i].prefix_hash, keeped_by_block, relayed, do_not_relay);
|
results[i].res = handle_incoming_tx_post(*it, tvc[i], results[i].tx, results[i].hash, keeped_by_block, relayed, do_not_relay);
|
||||||
}
|
}
|
||||||
catch (const std::exception &e)
|
catch (const std::exception &e)
|
||||||
{
|
{
|
||||||
@ -983,7 +982,7 @@ namespace cryptonote
|
|||||||
continue;
|
continue;
|
||||||
|
|
||||||
const size_t weight = get_transaction_weight(results[i].tx, it->size());
|
const size_t weight = get_transaction_weight(results[i].tx, it->size());
|
||||||
ok &= add_new_tx(results[i].tx, results[i].hash, tx_blobs[i], results[i].prefix_hash, weight, tvc[i], keeped_by_block, relayed, do_not_relay);
|
ok &= add_new_tx(results[i].tx, results[i].hash, tx_blobs[i], weight, tvc[i], keeped_by_block, relayed, do_not_relay);
|
||||||
if(tvc[i].m_verifivation_failed)
|
if(tvc[i].m_verifivation_failed)
|
||||||
{MERROR_VER("Transaction verification failed: " << results[i].hash);}
|
{MERROR_VER("Transaction verification failed: " << results[i].hash);}
|
||||||
else if(tvc[i].m_verifivation_impossible)
|
else if(tvc[i].m_verifivation_impossible)
|
||||||
@ -1197,11 +1196,10 @@ namespace cryptonote
|
|||||||
bool core::add_new_tx(transaction& tx, tx_verification_context& tvc, bool keeped_by_block, bool relayed, bool do_not_relay)
|
bool core::add_new_tx(transaction& tx, tx_verification_context& tvc, bool keeped_by_block, bool relayed, bool do_not_relay)
|
||||||
{
|
{
|
||||||
crypto::hash tx_hash = get_transaction_hash(tx);
|
crypto::hash tx_hash = get_transaction_hash(tx);
|
||||||
crypto::hash tx_prefix_hash = get_transaction_prefix_hash(tx);
|
|
||||||
blobdata bl;
|
blobdata bl;
|
||||||
t_serializable_object_to_blob(tx, bl);
|
t_serializable_object_to_blob(tx, bl);
|
||||||
size_t tx_weight = get_transaction_weight(tx, bl.size());
|
size_t tx_weight = get_transaction_weight(tx, bl.size());
|
||||||
return add_new_tx(tx, tx_hash, bl, tx_prefix_hash, tx_weight, tvc, keeped_by_block, relayed, do_not_relay);
|
return add_new_tx(tx, tx_hash, bl, tx_weight, tvc, keeped_by_block, relayed, do_not_relay);
|
||||||
}
|
}
|
||||||
//-----------------------------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------------------------
|
||||||
size_t core::get_blockchain_total_transactions() const
|
size_t core::get_blockchain_total_transactions() const
|
||||||
@ -1209,7 +1207,7 @@ namespace cryptonote
|
|||||||
return m_blockchain_storage.get_total_transactions();
|
return m_blockchain_storage.get_total_transactions();
|
||||||
}
|
}
|
||||||
//-----------------------------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------------------------
|
||||||
bool core::add_new_tx(transaction& tx, const crypto::hash& tx_hash, const cryptonote::blobdata &blob, const crypto::hash& tx_prefix_hash, size_t tx_weight, tx_verification_context& tvc, bool keeped_by_block, bool relayed, bool do_not_relay)
|
bool core::add_new_tx(transaction& tx, const crypto::hash& tx_hash, const cryptonote::blobdata &blob, size_t tx_weight, tx_verification_context& tvc, bool keeped_by_block, bool relayed, bool do_not_relay)
|
||||||
{
|
{
|
||||||
if(m_mempool.have_tx(tx_hash))
|
if(m_mempool.have_tx(tx_hash))
|
||||||
{
|
{
|
||||||
@ -1250,8 +1248,8 @@ namespace cryptonote
|
|||||||
{
|
{
|
||||||
std::vector<std::pair<crypto::hash, cryptonote::blobdata>> txs;
|
std::vector<std::pair<crypto::hash, cryptonote::blobdata>> txs;
|
||||||
cryptonote::transaction tx;
|
cryptonote::transaction tx;
|
||||||
crypto::hash tx_hash, tx_prefix_hash;
|
crypto::hash tx_hash;
|
||||||
if (!parse_and_validate_tx_from_blob(tx_blob, tx, tx_hash, tx_prefix_hash))
|
if (!parse_and_validate_tx_from_blob(tx_blob, tx, tx_hash))
|
||||||
{
|
{
|
||||||
LOG_ERROR("Failed to parse relayed transaction");
|
LOG_ERROR("Failed to parse relayed transaction");
|
||||||
return;
|
return;
|
||||||
@ -1466,9 +1464,9 @@ namespace cryptonote
|
|||||||
return m_blockchain_storage.have_block(id);
|
return m_blockchain_storage.have_block(id);
|
||||||
}
|
}
|
||||||
//-----------------------------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------------------------
|
||||||
bool core::parse_tx_from_blob(transaction& tx, crypto::hash& tx_hash, crypto::hash& tx_prefix_hash, const blobdata& blob) const
|
bool core::parse_tx_from_blob(transaction& tx, crypto::hash& tx_hash, const blobdata& blob) const
|
||||||
{
|
{
|
||||||
return parse_and_validate_tx_from_blob(blob, tx, tx_hash, tx_prefix_hash);
|
return parse_and_validate_tx_from_blob(blob, tx, tx_hash);
|
||||||
}
|
}
|
||||||
//-----------------------------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------------------------
|
||||||
bool core::check_tx_syntax(const transaction& tx) const
|
bool core::check_tx_syntax(const transaction& tx) const
|
||||||
|
@ -829,13 +829,12 @@ namespace cryptonote
|
|||||||
*
|
*
|
||||||
* @param tx_hash the transaction's hash
|
* @param tx_hash the transaction's hash
|
||||||
* @param blob the transaction as a blob
|
* @param blob the transaction as a blob
|
||||||
* @param tx_prefix_hash the transaction prefix' hash
|
|
||||||
* @param tx_weight the weight of the transaction
|
* @param tx_weight the weight of the transaction
|
||||||
* @param relayed whether or not the transaction was relayed to us
|
* @param relayed whether or not the transaction was relayed to us
|
||||||
* @param do_not_relay whether to prevent the transaction from being relayed
|
* @param do_not_relay whether to prevent the transaction from being relayed
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
bool add_new_tx(transaction& tx, const crypto::hash& tx_hash, const cryptonote::blobdata &blob, const crypto::hash& tx_prefix_hash, size_t tx_weight, tx_verification_context& tvc, bool keeped_by_block, bool relayed, bool do_not_relay);
|
bool add_new_tx(transaction& tx, const crypto::hash& tx_hash, const cryptonote::blobdata &blob, size_t tx_weight, tx_verification_context& tvc, bool keeped_by_block, bool relayed, bool do_not_relay);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief add a new transaction to the transaction pool
|
* @brief add a new transaction to the transaction pool
|
||||||
@ -875,7 +874,7 @@ namespace cryptonote
|
|||||||
*
|
*
|
||||||
* @note see parse_tx_from_blob(transaction&, crypto::hash&, crypto::hash&, const blobdata&) const
|
* @note see parse_tx_from_blob(transaction&, crypto::hash&, crypto::hash&, const blobdata&) const
|
||||||
*/
|
*/
|
||||||
bool parse_tx_from_blob(transaction& tx, crypto::hash& tx_hash, crypto::hash& tx_prefix_hash, const blobdata& blob) const;
|
bool parse_tx_from_blob(transaction& tx, crypto::hash& tx_hash, const blobdata& blob) const;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief check a transaction's syntax
|
* @brief check a transaction's syntax
|
||||||
@ -908,8 +907,8 @@ namespace cryptonote
|
|||||||
bool check_tx_semantic(const transaction& tx, bool keeped_by_block) const;
|
bool check_tx_semantic(const transaction& tx, bool keeped_by_block) const;
|
||||||
void set_semantics_failed(const crypto::hash &tx_hash);
|
void set_semantics_failed(const crypto::hash &tx_hash);
|
||||||
|
|
||||||
bool handle_incoming_tx_pre(const blobdata& tx_blob, tx_verification_context& tvc, cryptonote::transaction &tx, crypto::hash &tx_hash, crypto::hash &tx_prefixt_hash, bool keeped_by_block, bool relayed, bool do_not_relay);
|
bool handle_incoming_tx_pre(const blobdata& tx_blob, tx_verification_context& tvc, cryptonote::transaction &tx, crypto::hash &tx_hash, bool keeped_by_block, bool relayed, bool do_not_relay);
|
||||||
bool handle_incoming_tx_post(const blobdata& tx_blob, tx_verification_context& tvc, cryptonote::transaction &tx, crypto::hash &tx_hash, crypto::hash &tx_prefixt_hash, bool keeped_by_block, bool relayed, bool do_not_relay);
|
bool handle_incoming_tx_post(const blobdata& tx_blob, tx_verification_context& tvc, cryptonote::transaction &tx, crypto::hash &tx_hash, bool keeped_by_block, bool relayed, bool do_not_relay);
|
||||||
struct tx_verification_batch_info { const cryptonote::transaction *tx; crypto::hash tx_hash; tx_verification_context &tvc; bool &result; };
|
struct tx_verification_batch_info { const cryptonote::transaction *tx; crypto::hash tx_hash; tx_verification_context &tvc; bool &result; };
|
||||||
bool handle_incoming_tx_accumulated_batch(std::vector<tx_verification_batch_info> &tx_info, bool keeped_by_block);
|
bool handle_incoming_tx_accumulated_batch(std::vector<tx_verification_batch_info> &tx_info, bool keeped_by_block);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user