aboutsummaryrefslogtreecommitdiff
path: root/src/cryptonote_core
diff options
context:
space:
mode:
Diffstat (limited to 'src/cryptonote_core')
-rw-r--r--src/cryptonote_core/blockchain.cpp48
-rw-r--r--src/cryptonote_core/blockchain.h5
-rw-r--r--src/cryptonote_core/cryptonote_basic_impl.cpp2
-rw-r--r--src/cryptonote_core/cryptonote_core.cpp6
-rw-r--r--src/cryptonote_core/cryptonote_format_utils.cpp2
-rw-r--r--src/cryptonote_core/tx_pool.cpp2
6 files changed, 54 insertions, 11 deletions
diff --git a/src/cryptonote_core/blockchain.cpp b/src/cryptonote_core/blockchain.cpp
index c2ccf3db0..df9c0f3f3 100644
--- a/src/cryptonote_core/blockchain.cpp
+++ b/src/cryptonote_core/blockchain.cpp
@@ -73,6 +73,9 @@ extern "C" void slow_hash_free_state();
DISABLE_VS_WARNINGS(4267)
+// used to overestimate the block reward when estimating a per kB to use
+#define BLOCK_REWARD_OVERESTIMATE (10 * 1000000000000)
+
static const struct {
uint8_t version;
uint64_t height;
@@ -118,7 +121,7 @@ static const uint64_t testnet_hard_fork_version_1_till = 624633;
//------------------------------------------------------------------
Blockchain::Blockchain(tx_memory_pool& tx_pool) :
m_db(), m_tx_pool(tx_pool), m_hardfork(NULL), m_timestamps_and_difficulties_height(0), m_current_block_cumul_sz_limit(0), m_is_in_checkpoint_zone(false),
- m_is_blockchain_storing(false), m_enforce_dns_checkpoints(false), m_max_prepare_blocks_threads(4), m_db_blocks_per_sync(1), m_db_sync_mode(db_async), m_fast_sync(true), m_show_time_stats(false), m_sync_counter(0)
+ m_is_blockchain_storing(false), m_enforce_dns_checkpoints(false), m_max_prepare_blocks_threads(4), m_db_blocks_per_sync(1), m_db_sync_mode(db_async), m_fast_sync(true), m_show_time_stats(false), m_sync_counter(0), m_cancel(false)
{
LOG_PRINT_L3("Blockchain::" << __func__);
}
@@ -1146,7 +1149,7 @@ bool Blockchain::create_block_template(block& b, const account_public_address& m
uint8_t hf_version = m_hardfork->get_current_version();
size_t max_outs = hf_version >= 4 ? 1 : 11;
bool r = construct_miner_tx(height, median_size, already_generated_coins, txs_size, fee, miner_address, b.miner_tx, ex_nonce, max_outs, hf_version);
- CHECK_AND_ASSERT_MES(r, false, "Failed to construc miner tx, first chance");
+ CHECK_AND_ASSERT_MES(r, false, "Failed to construct miner tx, first chance");
size_t cumulative_size = txs_size + get_object_blobsize(b.miner_tx);
#if defined(DEBUG_CREATE_BLOCK_TEMPLATE)
LOG_PRINT_L1("Creating block template: miner tx size " << get_object_blobsize(b.miner_tx) <<
@@ -1156,7 +1159,7 @@ bool Blockchain::create_block_template(block& b, const account_public_address& m
{
r = construct_miner_tx(height, median_size, already_generated_coins, cumulative_size, fee, miner_address, b.miner_tx, ex_nonce, max_outs, hf_version);
- CHECK_AND_ASSERT_MES(r, false, "Failed to construc miner tx, second chance");
+ CHECK_AND_ASSERT_MES(r, false, "Failed to construct miner tx, second chance");
size_t coinbase_blob_size = get_object_blobsize(b.miner_tx);
if (coinbase_blob_size > cumulative_size - txs_size)
{
@@ -1799,7 +1802,7 @@ bool Blockchain::find_blockchain_supplement(const std::list<crypto::hash>& qbloc
auto gen_hash = m_db->get_block_hash_from_height(0);
if(qblock_ids.back() != gen_hash)
{
- LOG_PRINT_L1("Client sent wrong NOTIFY_REQUEST_CHAIN: genesis block missmatch: " << std::endl << "id: " << qblock_ids.back() << ", " << std::endl << "expected: " << gen_hash << "," << std::endl << " dropping connection");
+ LOG_PRINT_L1("Client sent wrong NOTIFY_REQUEST_CHAIN: genesis block mismatch: " << std::endl << "id: " << qblock_ids.back() << ", " << std::endl << "expected: " << gen_hash << "," << std::endl << " dropping connection");
m_db->block_txn_abort();
return false;
}
@@ -2231,6 +2234,19 @@ bool Blockchain::check_tx_outputs(const transaction& tx, tx_verification_context
}
}
+ // from v4, forbid invalid pubkeys
+ if (m_hardfork->get_current_version() >= 4) {
+ for (const auto &o: tx.vout) {
+ if (o.target.type() == typeid(txout_to_key)) {
+ const txout_to_key& out_to_key = boost::get<txout_to_key>(o.target);
+ if (!crypto::check_key(out_to_key.key)) {
+ tvc.m_invalid_output = true;
+ return false;
+ }
+ }
+ }
+ }
+
return true;
}
//------------------------------------------------------------------
@@ -2783,7 +2799,10 @@ uint64_t Blockchain::get_dynamic_per_kb_fee_estimate(uint64_t grace_blocks) cons
uint64_t already_generated_coins = m_db->height() ? m_db->get_block_already_generated_coins(m_db->height() - 1) : 0;
uint64_t base_reward;
if (!get_block_reward(median, 1, already_generated_coins, base_reward, version))
- return false;
+ {
+ LOG_PRINT_L1("Failed to determine block reward, using placeholder " << print_money(BLOCK_REWARD_OVERESTIMATE) << " as a high bound");
+ base_reward = BLOCK_REWARD_OVERESTIMATE;
+ }
uint64_t fee = get_dynamic_per_kb_fee(base_reward, median);
LOG_PRINT_L2("Estimating " << grace_blocks << "-block fee at " << print_money(fee) << "/kB");
@@ -3436,6 +3455,8 @@ void Blockchain::block_longhash_worker(const uint64_t height, const std::vector<
// the height of the block passed to it
for (const auto & block : blocks)
{
+ if (m_cancel)
+ return;
crypto::hash id = get_block_hash(block);
crypto::hash pow = get_block_longhash(block, height);
map.emplace(id, pow);
@@ -3611,6 +3632,9 @@ bool Blockchain::prepare_handle_incoming_blocks(const std::list<block_complete_e
thread_list.clear();
+ if (m_cancel)
+ return false;
+
for (const auto & map : maps)
{
m_blocks_longhash_table.insert(map.begin(), map.end());
@@ -3618,6 +3642,9 @@ bool Blockchain::prepare_handle_incoming_blocks(const std::list<block_complete_e
}
}
+ if (m_cancel)
+ return false;
+
if (blocks_exist)
{
LOG_PRINT_L0("Skipping prepare blocks. Blocks exist.");
@@ -3655,6 +3682,9 @@ bool Blockchain::prepare_handle_incoming_blocks(const std::list<block_complete_e
// generate sorted tables for all amounts and absolute offsets
for (const auto &entry : blocks_entry)
{
+ if (m_cancel)
+ return false;
+
for (const auto &tx_blob : entry.txs)
{
crypto::hash tx_hash = null_hash;
@@ -3763,6 +3793,9 @@ bool Blockchain::prepare_handle_incoming_blocks(const std::list<block_complete_e
// now generate a table for each tx_prefix and k_image hashes
for (const auto &entry : blocks_entry)
{
+ if (m_cancel)
+ return false;
+
for (const auto &tx_blob : entry.txs)
{
crypto::hash tx_hash = null_hash;
@@ -3844,6 +3877,11 @@ std::map<uint64_t, std::tuple<uint64_t, uint64_t, uint64_t>> Blockchain:: get_ou
return m_db->get_output_histogram(amounts, unlocked, recent_cutoff);
}
+void Blockchain::cancel()
+{
+ m_cancel = true;
+}
+
#if defined(PER_BLOCK_CHECKPOINT)
void Blockchain::load_compiled_in_block_hashes()
{
diff --git a/src/cryptonote_core/blockchain.h b/src/cryptonote_core/blockchain.h
index f9ae9d8aa..9afc22657 100644
--- a/src/cryptonote_core/blockchain.h
+++ b/src/cryptonote_core/blockchain.h
@@ -843,6 +843,9 @@ namespace cryptonote
*/
void block_longhash_worker(const uint64_t height, const std::vector<block> &blocks,
std::unordered_map<crypto::hash, crypto::hash> &map) const;
+
+ void cancel();
+
private:
// TODO: evaluate whether or not each of these typedefs are left over from blockchain_storage
@@ -912,6 +915,8 @@ namespace cryptonote
bool m_testnet;
+ std::atomic<bool> m_cancel;
+
/**
* @brief collects the keys for all outputs being "spent" as an input
*
diff --git a/src/cryptonote_core/cryptonote_basic_impl.cpp b/src/cryptonote_core/cryptonote_basic_impl.cpp
index 74f44e2af..4f35b8298 100644
--- a/src/cryptonote_core/cryptonote_basic_impl.cpp
+++ b/src/cryptonote_core/cryptonote_basic_impl.cpp
@@ -199,7 +199,7 @@ namespace cryptonote {
uint64_t prefix;
if (!tools::base58::decode_addr(str, prefix, data))
{
- LOG_PRINT_L1("Invalid address format");
+ LOG_PRINT_L2("Invalid address format");
return false;
}
diff --git a/src/cryptonote_core/cryptonote_core.cpp b/src/cryptonote_core/cryptonote_core.cpp
index 84a41cfbf..3ddda9efb 100644
--- a/src/cryptonote_core/cryptonote_core.cpp
+++ b/src/cryptonote_core/cryptonote_core.cpp
@@ -123,7 +123,7 @@ namespace cryptonote
//-----------------------------------------------------------------------------------
void core::stop()
{
- graceful_exit();
+ m_blockchain_storage.cancel();
}
//-----------------------------------------------------------------------------------
void core::init_options(boost::program_options::options_description& desc)
@@ -315,7 +315,7 @@ namespace cryptonote
}
else
{
- LOG_ERROR("Attempted to use non-existant database type");
+ LOG_ERROR("Attempted to use non-existent database type");
return false;
}
@@ -716,7 +716,7 @@ namespace cryptonote
crypto::hash tx_hash, tx_prefix_hash;
if (!parse_and_validate_tx_from_blob(tx_blob, tx, tx_hash, tx_prefix_hash))
{
- LOG_ERROR("Failed to parse relayed tranasction");
+ LOG_ERROR("Failed to parse relayed transaction");
return;
}
txs.push_back(std::make_pair(tx_hash, std::move(tx)));
diff --git a/src/cryptonote_core/cryptonote_format_utils.cpp b/src/cryptonote_core/cryptonote_format_utils.cpp
index d88f66e3b..394a43831 100644
--- a/src/cryptonote_core/cryptonote_format_utils.cpp
+++ b/src/cryptonote_core/cryptonote_format_utils.cpp
@@ -553,7 +553,7 @@ namespace cryptonote
//check that derivated key is equal with real output key
if( !(in_ephemeral.pub == src_entr.outputs[src_entr.real_output].second.dest) )
{
- LOG_ERROR("derived public key missmatch with output public key! "<< ENDL << "derived_key:"
+ LOG_ERROR("derived public key mismatch with output public key! "<< ENDL << "derived_key:"
<< string_tools::pod_to_hex(in_ephemeral.pub) << ENDL << "real output_public_key:"
<< string_tools::pod_to_hex(src_entr.outputs[src_entr.real_output].second) );
return false;
diff --git a/src/cryptonote_core/tx_pool.cpp b/src/cryptonote_core/tx_pool.cpp
index e72a592ca..4cfd61f9f 100644
--- a/src/cryptonote_core/tx_pool.cpp
+++ b/src/cryptonote_core/tx_pool.cpp
@@ -205,7 +205,7 @@ namespace cryptonote
{
//update transactions container
auto txd_p = m_transactions.insert(transactions_container::value_type(id, txd));
- CHECK_AND_ASSERT_MES(txd_p.second, false, "intrnal error: transaction already exists at inserting in memorypool");
+ CHECK_AND_ASSERT_MES(txd_p.second, false, "internal error: transaction already exists at inserting in memorypool");
txd_p.first->second.blob_size = blob_size;
txd_p.first->second.kept_by_block = kept_by_block;
txd_p.first->second.fee = fee;