core: fix mining from a block that's not the current top
This commit is contained in:
parent
c695470cff
commit
9d42649d58
|
@ -169,7 +169,9 @@ namespace cryptonote
|
||||||
extra_nonce = m_extra_messages[m_config.current_extra_message_index];
|
extra_nonce = m_extra_messages[m_config.current_extra_message_index];
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!m_phandler->get_block_template(bl, m_mine_address, di, height, expected_reward, extra_nonce))
|
uint64_t seed_height;
|
||||||
|
crypto::hash seed_hash;
|
||||||
|
if(!m_phandler->get_block_template(bl, m_mine_address, di, height, expected_reward, extra_nonce, seed_height, seed_hash))
|
||||||
{
|
{
|
||||||
LOG_ERROR("Failed to get_block_template(), stopping mining");
|
LOG_ERROR("Failed to get_block_template(), stopping mining");
|
||||||
return false;
|
return false;
|
||||||
|
@ -471,12 +473,12 @@ namespace cryptonote
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
//-----------------------------------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------------------------------
|
||||||
bool miner::find_nonce_for_given_block(const get_block_hash_t &gbh, block& bl, const difficulty_type& diffic, uint64_t height)
|
bool miner::find_nonce_for_given_block(const get_block_hash_t &gbh, block& bl, const difficulty_type& diffic, uint64_t height, const crypto::hash *seed_hash)
|
||||||
{
|
{
|
||||||
for(; bl.nonce != std::numeric_limits<uint32_t>::max(); bl.nonce++)
|
for(; bl.nonce != std::numeric_limits<uint32_t>::max(); bl.nonce++)
|
||||||
{
|
{
|
||||||
crypto::hash h;
|
crypto::hash h;
|
||||||
gbh(bl, height, diffic <= 100 ? 0 : tools::get_max_concurrency(), h);
|
gbh(bl, height, seed_hash, diffic <= 100 ? 0 : tools::get_max_concurrency(), h);
|
||||||
|
|
||||||
if(check_hash(h, diffic))
|
if(check_hash(h, diffic))
|
||||||
{
|
{
|
||||||
|
@ -572,7 +574,7 @@ namespace cryptonote
|
||||||
|
|
||||||
b.nonce = nonce;
|
b.nonce = nonce;
|
||||||
crypto::hash h;
|
crypto::hash h;
|
||||||
m_gbh(b, height, tools::get_max_concurrency(), h);
|
m_gbh(b, height, NULL, tools::get_max_concurrency(), h);
|
||||||
|
|
||||||
if(check_hash(h, local_diff))
|
if(check_hash(h, local_diff))
|
||||||
{
|
{
|
||||||
|
|
|
@ -47,12 +47,12 @@ namespace cryptonote
|
||||||
struct i_miner_handler
|
struct i_miner_handler
|
||||||
{
|
{
|
||||||
virtual bool handle_block_found(block& b, block_verification_context &bvc) = 0;
|
virtual bool handle_block_found(block& b, block_verification_context &bvc) = 0;
|
||||||
virtual bool get_block_template(block& b, const account_public_address& adr, difficulty_type& diffic, uint64_t& height, uint64_t& expected_reward, const blobdata& ex_nonce) = 0;
|
virtual bool get_block_template(block& b, const account_public_address& adr, difficulty_type& diffic, uint64_t& height, uint64_t& expected_reward, const blobdata& ex_nonce, uint64_t &seed_height, crypto::hash &seed_hash) = 0;
|
||||||
protected:
|
protected:
|
||||||
~i_miner_handler(){};
|
~i_miner_handler(){};
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef std::function<bool(const cryptonote::block&, uint64_t, unsigned int, crypto::hash&)> get_block_hash_t;
|
typedef std::function<bool(const cryptonote::block&, uint64_t, const crypto::hash*, unsigned int, crypto::hash&)> get_block_hash_t;
|
||||||
|
|
||||||
/************************************************************************/
|
/************************************************************************/
|
||||||
/* */
|
/* */
|
||||||
|
@ -76,7 +76,7 @@ namespace cryptonote
|
||||||
bool on_idle();
|
bool on_idle();
|
||||||
void on_synchronized();
|
void on_synchronized();
|
||||||
//synchronous analog (for fast calls)
|
//synchronous analog (for fast calls)
|
||||||
static bool find_nonce_for_given_block(const get_block_hash_t &gbh, block& bl, const difficulty_type& diffic, uint64_t height);
|
static bool find_nonce_for_given_block(const get_block_hash_t &gbh, block& bl, const difficulty_type& diffic, uint64_t height, const crypto::hash *seed_hash = NULL);
|
||||||
void pause();
|
void pause();
|
||||||
void resume();
|
void resume();
|
||||||
void do_print_hashrate(bool do_hr);
|
void do_print_hashrate(bool do_hr);
|
||||||
|
|
|
@ -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
|
// 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
|
// nor any of the makefiles, howeve. Need to look into whether or not it's
|
||||||
// necessary at all.
|
// 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__);
|
LOG_PRINT_L3("Blockchain::" << __func__);
|
||||||
size_t median_weight;
|
size_t median_weight;
|
||||||
uint64_t already_generated_coins;
|
uint64_t already_generated_coins;
|
||||||
uint64_t pool_cookie;
|
uint64_t pool_cookie;
|
||||||
|
|
||||||
|
seed_hash = crypto::null_hash;
|
||||||
|
|
||||||
m_tx_pool.lock();
|
m_tx_pool.lock();
|
||||||
const auto unlock_guard = epee::misc_utils::create_scope_leave_handler([&]() { m_tx_pool.unlock(); });
|
const auto unlock_guard = epee::misc_utils::create_scope_leave_handler([&]() { m_tx_pool.unlock(); });
|
||||||
CRITICAL_REGION_LOCAL(m_blockchain_lock);
|
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;
|
diffic = m_btc_difficulty;
|
||||||
height = m_btc_height;
|
height = m_btc_height;
|
||||||
expected_reward = m_btc_expected_reward;
|
expected_reward = m_btc_expected_reward;
|
||||||
|
seed_height = m_btc_seed_height;
|
||||||
|
seed_hash = m_btc_seed_hash;
|
||||||
return true;
|
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));
|
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
|
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);
|
uint64_t from_block_height = cryptonote::get_block_height(prev_block);
|
||||||
height = from_block_height + 1;
|
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
|
else
|
||||||
{
|
{
|
||||||
height = alt_chain.back().height + 1;
|
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.major_version = m_hardfork->get_ideal_version(height);
|
||||||
b.minor_version = m_hardfork->get_ideal_version();
|
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;
|
median_weight = m_current_block_cumul_weight_limit / 2;
|
||||||
diffic = get_difficulty_for_next_block();
|
diffic = get_difficulty_for_next_block();
|
||||||
already_generated_coins = m_db->get_block_already_generated_coins(height - 1);
|
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);
|
b.timestamp = time(NULL);
|
||||||
|
|
||||||
|
@ -1734,16 +1768,16 @@ bool Blockchain::create_block_template(block& b, const crypto::hash *from_block,
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (!from_block)
|
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;
|
return true;
|
||||||
}
|
}
|
||||||
LOG_ERROR("Failed to create_block_template with " << 10 << " tries");
|
LOG_ERROR("Failed to create_block_template with " << 10 << " tries");
|
||||||
return false;
|
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
|
// 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;
|
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");
|
MDEBUG("Setting block template cache");
|
||||||
m_btc = b;
|
m_btc = b;
|
||||||
|
@ -5400,6 +5434,8 @@ void Blockchain::cache_block_template(const block &b, const cryptonote::account_
|
||||||
m_btc_difficulty = diff;
|
m_btc_difficulty = diff;
|
||||||
m_btc_height = height;
|
m_btc_height = height;
|
||||||
m_btc_expected_reward = expected_reward;
|
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_pool_cookie = pool_cookie;
|
||||||
m_btc_valid = true;
|
m_btc_valid = true;
|
||||||
}
|
}
|
||||||
|
|
|
@ -366,8 +366,8 @@ namespace cryptonote
|
||||||
*
|
*
|
||||||
* @return true if block template filled in successfully, else false
|
* @return true if block template filled in successfully, else false
|
||||||
*/
|
*/
|
||||||
bool create_block_template(block& b, const account_public_address& miner_address, difficulty_type& di, uint64_t& height, uint64_t& expected_reward, const blobdata& ex_nonce);
|
bool create_block_template(block& b, const account_public_address& miner_address, difficulty_type& di, uint64_t& height, uint64_t& expected_reward, const blobdata& ex_nonce, uint64_t &seed_height, crypto::hash &seed_hash);
|
||||||
bool create_block_template(block& b, const crypto::hash *from_block, const account_public_address& miner_address, difficulty_type& di, uint64_t& height, uint64_t& expected_reward, const blobdata& ex_nonce);
|
bool create_block_template(block& b, const crypto::hash *from_block, const account_public_address& miner_address, difficulty_type& di, uint64_t& height, uint64_t& expected_reward, const blobdata& ex_nonce, uint64_t &seed_height, crypto::hash &seed_hash);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief checks if a block is known about with a given hash
|
* @brief checks if a block is known about with a given hash
|
||||||
|
@ -1124,6 +1124,8 @@ namespace cryptonote
|
||||||
uint64_t m_btc_height;
|
uint64_t m_btc_height;
|
||||||
uint64_t m_btc_pool_cookie;
|
uint64_t m_btc_pool_cookie;
|
||||||
uint64_t m_btc_expected_reward;
|
uint64_t m_btc_expected_reward;
|
||||||
|
crypto::hash m_btc_seed_hash;
|
||||||
|
uint64_t m_btc_seed_height;
|
||||||
bool m_btc_valid;
|
bool m_btc_valid;
|
||||||
|
|
||||||
|
|
||||||
|
@ -1520,6 +1522,6 @@ namespace cryptonote
|
||||||
*
|
*
|
||||||
* At some point, may be used to push an update to miners
|
* At some point, may be used to push an update to miners
|
||||||
*/
|
*/
|
||||||
void 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 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);
|
||||||
};
|
};
|
||||||
} // namespace cryptonote
|
} // namespace cryptonote
|
||||||
|
|
|
@ -226,8 +226,8 @@ namespace cryptonote
|
||||||
core::core(i_cryptonote_protocol* pprotocol):
|
core::core(i_cryptonote_protocol* pprotocol):
|
||||||
m_mempool(m_blockchain_storage),
|
m_mempool(m_blockchain_storage),
|
||||||
m_blockchain_storage(m_mempool),
|
m_blockchain_storage(m_mempool),
|
||||||
m_miner(this, [this](const cryptonote::block &b, uint64_t height, unsigned int threads, crypto::hash &hash) {
|
m_miner(this, [this](const cryptonote::block &b, uint64_t height, const crypto::hash *seed_hash, unsigned int threads, crypto::hash &hash) {
|
||||||
return cryptonote::get_block_longhash(&m_blockchain_storage, b, hash, height, threads);
|
return cryptonote::get_block_longhash(&m_blockchain_storage, b, hash, height, seed_hash, threads);
|
||||||
}),
|
}),
|
||||||
m_starter_message_showed(false),
|
m_starter_message_showed(false),
|
||||||
m_target_blockchain_height(0),
|
m_target_blockchain_height(0),
|
||||||
|
@ -1357,14 +1357,14 @@ namespace cryptonote
|
||||||
m_mempool.set_relayed(epee::to_span(tx_hashes), tx_relay);
|
m_mempool.set_relayed(epee::to_span(tx_hashes), tx_relay);
|
||||||
}
|
}
|
||||||
//-----------------------------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------------------------
|
||||||
bool core::get_block_template(block& b, const account_public_address& adr, difficulty_type& diffic, uint64_t& height, uint64_t& expected_reward, const blobdata& ex_nonce)
|
bool core::get_block_template(block& b, const account_public_address& adr, difficulty_type& diffic, uint64_t& height, uint64_t& expected_reward, const blobdata& ex_nonce, uint64_t &seed_height, crypto::hash &seed_hash)
|
||||||
{
|
{
|
||||||
return m_blockchain_storage.create_block_template(b, adr, diffic, height, expected_reward, ex_nonce);
|
return m_blockchain_storage.create_block_template(b, adr, diffic, height, expected_reward, ex_nonce, seed_height, seed_hash);
|
||||||
}
|
}
|
||||||
//-----------------------------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------------------------
|
||||||
bool core::get_block_template(block& b, const crypto::hash *prev_block, const account_public_address& adr, difficulty_type& diffic, uint64_t& height, uint64_t& expected_reward, const blobdata& ex_nonce)
|
bool core::get_block_template(block& b, const crypto::hash *prev_block, const account_public_address& adr, difficulty_type& diffic, uint64_t& height, uint64_t& expected_reward, const blobdata& ex_nonce, uint64_t &seed_height, crypto::hash &seed_hash)
|
||||||
{
|
{
|
||||||
return m_blockchain_storage.create_block_template(b, prev_block, adr, diffic, height, expected_reward, ex_nonce);
|
return m_blockchain_storage.create_block_template(b, prev_block, adr, diffic, height, expected_reward, ex_nonce, seed_height, seed_hash);
|
||||||
}
|
}
|
||||||
//-----------------------------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------------------------
|
||||||
bool core::find_blockchain_supplement(const std::list<crypto::hash>& qblock_ids, bool clip_pruned, NOTIFY_RESPONSE_CHAIN_ENTRY::request& resp) const
|
bool core::find_blockchain_supplement(const std::list<crypto::hash>& qblock_ids, bool clip_pruned, NOTIFY_RESPONSE_CHAIN_ENTRY::request& resp) const
|
||||||
|
|
|
@ -231,8 +231,8 @@ namespace cryptonote
|
||||||
*
|
*
|
||||||
* @note see Blockchain::create_block_template
|
* @note see Blockchain::create_block_template
|
||||||
*/
|
*/
|
||||||
virtual bool get_block_template(block& b, const account_public_address& adr, difficulty_type& diffic, uint64_t& height, uint64_t& expected_reward, const blobdata& ex_nonce);
|
virtual bool get_block_template(block& b, const account_public_address& adr, difficulty_type& diffic, uint64_t& height, uint64_t& expected_reward, const blobdata& ex_nonce, uint64_t &seed_height, crypto::hash &seed_hash);
|
||||||
virtual bool get_block_template(block& b, const crypto::hash *prev_block, const account_public_address& adr, difficulty_type& diffic, uint64_t& height, uint64_t& expected_reward, const blobdata& ex_nonce);
|
virtual bool get_block_template(block& b, const crypto::hash *prev_block, const account_public_address& adr, difficulty_type& diffic, uint64_t& height, uint64_t& expected_reward, const blobdata& ex_nonce, uint64_t &seed_height, crypto::hash &seed_hash);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief called when a transaction is relayed.
|
* @brief called when a transaction is relayed.
|
||||||
|
|
|
@ -663,9 +663,9 @@ namespace cryptonote
|
||||||
bl.minor_version = CURRENT_BLOCK_MINOR_VERSION;
|
bl.minor_version = CURRENT_BLOCK_MINOR_VERSION;
|
||||||
bl.timestamp = 0;
|
bl.timestamp = 0;
|
||||||
bl.nonce = nonce;
|
bl.nonce = nonce;
|
||||||
miner::find_nonce_for_given_block([](const cryptonote::block &b, uint64_t height, unsigned int threads, crypto::hash &hash){
|
miner::find_nonce_for_given_block([](const cryptonote::block &b, uint64_t height, const crypto::hash *seed_hash, unsigned int threads, crypto::hash &hash){
|
||||||
return cryptonote::get_block_longhash(NULL, b, hash, height, threads);
|
return cryptonote::get_block_longhash(NULL, b, hash, height, seed_hash, threads);
|
||||||
}, bl, 1, 0);
|
}, bl, 1, 0, NULL);
|
||||||
bl.invalidate_hashes();
|
bl.invalidate_hashes();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -676,7 +676,7 @@ namespace cryptonote
|
||||||
rx_slow_hash(main_height, seed_height, seed_hash.data, bd.data(), bd.size(), res.data, 0, 1);
|
rx_slow_hash(main_height, seed_height, seed_hash.data, bd.data(), bd.size(), res.data, 0, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool get_block_longhash(const Blockchain *pbc, const block& b, crypto::hash& res, const uint64_t height, const int miners)
|
bool get_block_longhash(const Blockchain *pbc, const block& b, crypto::hash& res, const uint64_t height, const crypto::hash *seed_hash, const int miners)
|
||||||
{
|
{
|
||||||
// block 202612 bug workaround
|
// block 202612 bug workaround
|
||||||
if (height == 202612)
|
if (height == 202612)
|
||||||
|
@ -693,7 +693,7 @@ namespace cryptonote
|
||||||
if (pbc != NULL)
|
if (pbc != NULL)
|
||||||
{
|
{
|
||||||
seed_height = rx_seedheight(height);
|
seed_height = rx_seedheight(height);
|
||||||
hash = pbc->get_pending_block_id_by_height(seed_height);
|
hash = seed_hash ? *seed_hash : pbc->get_pending_block_id_by_height(seed_height);
|
||||||
main_height = pbc->get_current_blockchain_height();
|
main_height = pbc->get_current_blockchain_height();
|
||||||
} else
|
} else
|
||||||
{
|
{
|
||||||
|
@ -701,7 +701,7 @@ namespace cryptonote
|
||||||
seed_height = 0;
|
seed_height = 0;
|
||||||
main_height = 0;
|
main_height = 0;
|
||||||
}
|
}
|
||||||
rx_slow_hash(main_height, seed_height, hash.data, bd.data(), bd.size(), res.data, miners, 0);
|
rx_slow_hash(main_height, seed_height, hash.data, bd.data(), bd.size(), res.data, seed_hash ? 0 : miners, !!seed_hash);
|
||||||
} else {
|
} else {
|
||||||
const int pow_variant = b.major_version >= 7 ? b.major_version - 6 : 0;
|
const int pow_variant = b.major_version >= 7 ? b.major_version - 6 : 0;
|
||||||
crypto::cn_slow_hash(bd.data(), bd.size(), res, pow_variant, height);
|
crypto::cn_slow_hash(bd.data(), bd.size(), res, pow_variant, height);
|
||||||
|
@ -709,6 +709,11 @@ namespace cryptonote
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool get_block_longhash(const Blockchain *pbc, const block& b, crypto::hash& res, const uint64_t height, const int miners)
|
||||||
|
{
|
||||||
|
return get_block_longhash(pbc, b, res, height, NULL, miners);
|
||||||
|
}
|
||||||
|
|
||||||
crypto::hash get_block_longhash(const Blockchain *pbc, const block& b, const uint64_t height, const int miners)
|
crypto::hash get_block_longhash(const Blockchain *pbc, const block& b, const uint64_t height, const int miners)
|
||||||
{
|
{
|
||||||
crypto::hash p = crypto::null_hash;
|
crypto::hash p = crypto::null_hash;
|
||||||
|
|
|
@ -134,6 +134,7 @@ namespace cryptonote
|
||||||
|
|
||||||
class Blockchain;
|
class Blockchain;
|
||||||
bool get_block_longhash(const Blockchain *pb, const block& b, crypto::hash& res, const uint64_t height, const int miners);
|
bool get_block_longhash(const Blockchain *pb, const block& b, crypto::hash& res, const uint64_t height, const int miners);
|
||||||
|
bool get_block_longhash(const Blockchain *pb, const block& b, crypto::hash& res, const uint64_t height, const crypto::hash *seed_hash, const int miners);
|
||||||
void get_altblock_longhash(const block& b, crypto::hash& res, const uint64_t main_height, const uint64_t height,
|
void get_altblock_longhash(const block& b, crypto::hash& res, const uint64_t main_height, const uint64_t height,
|
||||||
const uint64_t seed_height, const crypto::hash& seed_hash);
|
const uint64_t seed_height, const crypto::hash& seed_hash);
|
||||||
crypto::hash get_block_longhash(const Blockchain *pb, const block& b, const uint64_t height, const int miners);
|
crypto::hash get_block_longhash(const Blockchain *pb, const block& b, const uint64_t height, const int miners);
|
||||||
|
|
|
@ -1642,7 +1642,7 @@ namespace cryptonote
|
||||||
bool core_rpc_server::get_block_template(const account_public_address &address, const crypto::hash *prev_block, const cryptonote::blobdata &extra_nonce, size_t &reserved_offset, cryptonote::difficulty_type &difficulty, uint64_t &height, uint64_t &expected_reward, block &b, uint64_t &seed_height, crypto::hash &seed_hash, crypto::hash &next_seed_hash, epee::json_rpc::error &error_resp)
|
bool core_rpc_server::get_block_template(const account_public_address &address, const crypto::hash *prev_block, const cryptonote::blobdata &extra_nonce, size_t &reserved_offset, cryptonote::difficulty_type &difficulty, uint64_t &height, uint64_t &expected_reward, block &b, uint64_t &seed_height, crypto::hash &seed_hash, crypto::hash &next_seed_hash, epee::json_rpc::error &error_resp)
|
||||||
{
|
{
|
||||||
b = boost::value_initialized<cryptonote::block>();
|
b = boost::value_initialized<cryptonote::block>();
|
||||||
if(!m_core.get_block_template(b, prev_block, address, difficulty, height, expected_reward, extra_nonce))
|
if(!m_core.get_block_template(b, prev_block, address, difficulty, height, expected_reward, extra_nonce, seed_height, seed_hash))
|
||||||
{
|
{
|
||||||
error_resp.code = CORE_RPC_ERROR_CODE_INTERNAL_ERROR;
|
error_resp.code = CORE_RPC_ERROR_CODE_INTERNAL_ERROR;
|
||||||
error_resp.message = "Internal error: failed to create block template";
|
error_resp.message = "Internal error: failed to create block template";
|
||||||
|
@ -1659,17 +1659,6 @@ namespace cryptonote
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (b.major_version >= RX_BLOCK_VERSION)
|
|
||||||
{
|
|
||||||
uint64_t next_height;
|
|
||||||
crypto::rx_seedheights(height, &seed_height, &next_height);
|
|
||||||
seed_hash = m_core.get_block_id_by_height(seed_height);
|
|
||||||
if (next_height != seed_height)
|
|
||||||
next_seed_hash = m_core.get_block_id_by_height(next_height);
|
|
||||||
else
|
|
||||||
next_seed_hash = seed_hash;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (extra_nonce.empty())
|
if (extra_nonce.empty())
|
||||||
{
|
{
|
||||||
reserved_offset = 0;
|
reserved_offset = 0;
|
||||||
|
@ -1897,9 +1886,16 @@ namespace cryptonote
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
b.nonce = req.starting_nonce;
|
b.nonce = req.starting_nonce;
|
||||||
miner::find_nonce_for_given_block([this](const cryptonote::block &b, uint64_t height, unsigned int threads, crypto::hash &hash) {
|
crypto::hash seed_hash = crypto::null_hash;
|
||||||
return cryptonote::get_block_longhash(&(m_core.get_blockchain_storage()), b, hash, height, threads);
|
if (b.major_version >= RX_BLOCK_VERSION && !epee::string_tools::hex_to_pod(template_res.seed_hash, seed_hash))
|
||||||
}, b, template_res.difficulty, template_res.height);
|
{
|
||||||
|
error_resp.code = CORE_RPC_ERROR_CODE_INTERNAL_ERROR;
|
||||||
|
error_resp.message = "Error converting seed hash";
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
miner::find_nonce_for_given_block([this](const cryptonote::block &b, uint64_t height, const crypto::hash *seed_hash, unsigned int threads, crypto::hash &hash) {
|
||||||
|
return cryptonote::get_block_longhash(&(m_core.get_blockchain_storage()), b, hash, height, seed_hash, threads);
|
||||||
|
}, b, template_res.difficulty, template_res.height, &seed_hash);
|
||||||
|
|
||||||
submit_req.front() = string_tools::buff_to_hex_nodelimer(block_to_blob(b));
|
submit_req.front() = string_tools::buff_to_hex_nodelimer(block_to_blob(b));
|
||||||
r = on_submitblock(submit_req, submit_res, error_resp, ctx);
|
r = on_submitblock(submit_req, submit_res, error_resp, ctx);
|
||||||
|
|
|
@ -407,9 +407,9 @@ void test_generator::fill_nonce(cryptonote::block& blk, const difficulty_type& d
|
||||||
}
|
}
|
||||||
|
|
||||||
blk.nonce = 0;
|
blk.nonce = 0;
|
||||||
while (!miner::find_nonce_for_given_block([blockchain](const cryptonote::block &b, uint64_t height, unsigned int threads, crypto::hash &hash){
|
while (!miner::find_nonce_for_given_block([blockchain](const cryptonote::block &b, uint64_t height, const crypto::hash *seed_hash, unsigned int threads, crypto::hash &hash){
|
||||||
return cryptonote::get_block_longhash(blockchain, b, hash, height, threads);
|
return cryptonote::get_block_longhash(blockchain, b, hash, height, seed_hash, threads);
|
||||||
}, blk, diffic, height)) {
|
}, blk, diffic, height, NULL)) {
|
||||||
blk.timestamp++;
|
blk.timestamp++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue