|
|
|
@ -1506,13 +1506,15 @@ uint64_t Blockchain::get_current_cumulative_block_weight_median() const
|
|
|
|
|
// in a lot of places. That flag is not referenced in any of the code
|
|
|
|
|
// nor any of the makefiles, howeve. Need to look into whether or not it's
|
|
|
|
|
// necessary at all.
|
|
|
|
|
bool Blockchain::create_block_template(block& b, const crypto::hash *from_block, const account_public_address& miner_address, difficulty_type& diffic, uint64_t& height, uint64_t& expected_reward, const blobdata& ex_nonce)
|
|
|
|
|
bool Blockchain::create_block_template(block& b, const crypto::hash *from_block, const account_public_address& miner_address, difficulty_type& diffic, uint64_t& height, uint64_t& expected_reward, const blobdata& ex_nonce, uint64_t &seed_height, crypto::hash &seed_hash)
|
|
|
|
|
{
|
|
|
|
|
LOG_PRINT_L3("Blockchain::" << __func__);
|
|
|
|
|
size_t median_weight;
|
|
|
|
|
uint64_t already_generated_coins;
|
|
|
|
|
uint64_t pool_cookie;
|
|
|
|
|
|
|
|
|
|
seed_hash = crypto::null_hash;
|
|
|
|
|
|
|
|
|
|
m_tx_pool.lock();
|
|
|
|
|
const auto unlock_guard = epee::misc_utils::create_scope_leave_handler([&]() { m_tx_pool.unlock(); });
|
|
|
|
|
CRITICAL_REGION_LOCAL(m_blockchain_lock);
|
|
|
|
@ -1531,6 +1533,8 @@ bool Blockchain::create_block_template(block& b, const crypto::hash *from_block,
|
|
|
|
|
diffic = m_btc_difficulty;
|
|
|
|
|
height = m_btc_height;
|
|
|
|
|
expected_reward = m_btc_expected_reward;
|
|
|
|
|
seed_height = m_btc_seed_height;
|
|
|
|
|
seed_hash = m_btc_seed_hash;
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
MDEBUG("Not using cached template: address " << (!memcmp(&miner_address, &m_btc_address, sizeof(cryptonote::account_public_address))) << ", nonce " << (m_btc_nonce == ex_nonce) << ", cookie " << (m_btc_pool_cookie == m_tx_pool.cookie()) << ", from_block " << (!!from_block));
|
|
|
|
@ -1564,10 +1568,34 @@ bool Blockchain::create_block_template(block& b, const crypto::hash *from_block,
|
|
|
|
|
CHECK_AND_ASSERT_MES(get_block_by_hash(*from_block, prev_block), false, "From block not found"); // TODO
|
|
|
|
|
uint64_t from_block_height = cryptonote::get_block_height(prev_block);
|
|
|
|
|
height = from_block_height + 1;
|
|
|
|
|
if (m_hardfork->get_current_version() >= RX_BLOCK_VERSION)
|
|
|
|
|
{
|
|
|
|
|
uint64_t next_height;
|
|
|
|
|
crypto::rx_seedheights(height, &seed_height, &next_height);
|
|
|
|
|
seed_hash = get_block_id_by_height(seed_height);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
height = alt_chain.back().height + 1;
|
|
|
|
|
uint64_t next_height;
|
|
|
|
|
crypto::rx_seedheights(height, &seed_height, &next_height);
|
|
|
|
|
|
|
|
|
|
if (alt_chain.size() && alt_chain.front().height <= seed_height)
|
|
|
|
|
{
|
|
|
|
|
for (auto it=alt_chain.begin(); it != alt_chain.end(); it++)
|
|
|
|
|
{
|
|
|
|
|
if (it->height == seed_height+1)
|
|
|
|
|
{
|
|
|
|
|
seed_hash = it->bl.prev_id;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
seed_hash = get_block_id_by_height(seed_height);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
b.major_version = m_hardfork->get_ideal_version(height);
|
|
|
|
|
b.minor_version = m_hardfork->get_ideal_version();
|
|
|
|
@ -1602,6 +1630,12 @@ bool Blockchain::create_block_template(block& b, const crypto::hash *from_block,
|
|
|
|
|
median_weight = m_current_block_cumul_weight_limit / 2;
|
|
|
|
|
diffic = get_difficulty_for_next_block();
|
|
|
|
|
already_generated_coins = m_db->get_block_already_generated_coins(height - 1);
|
|
|
|
|
if (m_hardfork->get_current_version() >= RX_BLOCK_VERSION)
|
|
|
|
|
{
|
|
|
|
|
uint64_t next_height;
|
|
|
|
|
crypto::rx_seedheights(height, &seed_height, &next_height);
|
|
|
|
|
seed_hash = get_block_id_by_height(seed_height);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
b.timestamp = time(NULL);
|
|
|
|
|
|
|
|
|
@ -1734,16 +1768,16 @@ bool Blockchain::create_block_template(block& b, const crypto::hash *from_block,
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
if (!from_block)
|
|
|
|
|
cache_block_template(b, miner_address, ex_nonce, diffic, height, expected_reward, pool_cookie);
|
|
|
|
|
cache_block_template(b, miner_address, ex_nonce, diffic, height, expected_reward, seed_height, seed_hash, pool_cookie);
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
LOG_ERROR("Failed to create_block_template with " << 10 << " tries");
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
//------------------------------------------------------------------
|
|
|
|
|
bool Blockchain::create_block_template(block& b, const account_public_address& miner_address, difficulty_type& diffic, uint64_t& height, uint64_t& expected_reward, const blobdata& ex_nonce)
|
|
|
|
|
bool Blockchain::create_block_template(block& b, const account_public_address& miner_address, difficulty_type& diffic, uint64_t& height, uint64_t& expected_reward, const blobdata& ex_nonce, uint64_t &seed_height, crypto::hash &seed_hash)
|
|
|
|
|
{
|
|
|
|
|
return create_block_template(b, NULL, miner_address, diffic, height, expected_reward, ex_nonce);
|
|
|
|
|
return create_block_template(b, NULL, miner_address, diffic, height, expected_reward, ex_nonce, seed_height, seed_hash);
|
|
|
|
|
}
|
|
|
|
|
//------------------------------------------------------------------
|
|
|
|
|
// for an alternate chain, get the timestamps from the main chain to complete
|
|
|
|
@ -5391,7 +5425,7 @@ void Blockchain::invalidate_block_template_cache()
|
|
|
|
|
m_btc_valid = false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void Blockchain::cache_block_template(const block &b, const cryptonote::account_public_address &address, const blobdata &nonce, const difficulty_type &diff, uint64_t height, uint64_t expected_reward, uint64_t pool_cookie)
|
|
|
|
|
void Blockchain::cache_block_template(const block &b, const cryptonote::account_public_address &address, const blobdata &nonce, const difficulty_type &diff, uint64_t height, uint64_t expected_reward, uint64_t seed_height, const crypto::hash &seed_hash, uint64_t pool_cookie)
|
|
|
|
|
{
|
|
|
|
|
MDEBUG("Setting block template cache");
|
|
|
|
|
m_btc = b;
|
|
|
|
@ -5400,6 +5434,8 @@ void Blockchain::cache_block_template(const block &b, const cryptonote::account_
|
|
|
|
|
m_btc_difficulty = diff;
|
|
|
|
|
m_btc_height = height;
|
|
|
|
|
m_btc_expected_reward = expected_reward;
|
|
|
|
|
m_btc_seed_hash = seed_hash;
|
|
|
|
|
m_btc_seed_height = seed_height;
|
|
|
|
|
m_btc_pool_cookie = pool_cookie;
|
|
|
|
|
m_btc_valid = true;
|
|
|
|
|
}
|
|
|
|
|