@ -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
@ -5443,7 +5477,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 ;
@ -5452,6 +5486,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 ;
}