@ -70,6 +70,13 @@ namespace
{
{
return ( value + quantum - 1 ) / quantum * quantum ;
return ( value + quantum - 1 ) / quantum * quantum ;
}
}
void store_difficulty ( cryptonote : : difficulty_type difficulty , uint64_t & sdiff , std : : string & swdiff , uint64_t & stop64 )
{
sdiff = ( difficulty < < 64 > > 64 ) . convert_to < uint64_t > ( ) ;
swdiff = difficulty . convert_to < std : : string > ( ) ;
stop64 = ( difficulty > > 64 ) . convert_to < uint64_t > ( ) ;
}
}
}
namespace cryptonote
namespace cryptonote
@ -219,7 +226,7 @@ namespace cryptonote
+ + res . height ; // turn top block height into blockchain height
+ + res . height ; // turn top block height into blockchain height
res . top_block_hash = string_tools : : pod_to_hex ( top_hash ) ;
res . top_block_hash = string_tools : : pod_to_hex ( top_hash ) ;
res . target_height = m_core . get_target_blockchain_height ( ) ;
res . target_height = m_core . get_target_blockchain_height ( ) ;
res. difficulty = m_core . get_blockchain_storage ( ) . get_difficulty_for_next_block ( ) ;
store_difficulty( m_core . get_blockchain_storage ( ) . get_difficulty_for_next_block ( ) , res . difficulty , res . wide_difficulty , res . difficulty_top64 ) ;
res . target = m_core . get_blockchain_storage ( ) . get_difficulty_target ( ) ;
res . target = m_core . get_blockchain_storage ( ) . get_difficulty_target ( ) ;
res . tx_count = m_core . get_blockchain_storage ( ) . get_total_transactions ( ) - res . height ; //without coinbase
res . tx_count = m_core . get_blockchain_storage ( ) . get_total_transactions ( ) - res . height ; //without coinbase
res . tx_pool_size = m_core . get_pool_transactions_count ( ) ;
res . tx_pool_size = m_core . get_pool_transactions_count ( ) ;
@ -236,7 +243,8 @@ namespace cryptonote
res . testnet = net_type = = TESTNET ;
res . testnet = net_type = = TESTNET ;
res . stagenet = net_type = = STAGENET ;
res . stagenet = net_type = = STAGENET ;
res . nettype = net_type = = MAINNET ? " mainnet " : net_type = = TESTNET ? " testnet " : net_type = = STAGENET ? " stagenet " : " fakechain " ;
res . nettype = net_type = = MAINNET ? " mainnet " : net_type = = TESTNET ? " testnet " : net_type = = STAGENET ? " stagenet " : " fakechain " ;
res . cumulative_difficulty = m_core . get_blockchain_storage ( ) . get_db ( ) . get_block_cumulative_difficulty ( res . height - 1 ) ;
store_difficulty ( m_core . get_blockchain_storage ( ) . get_db ( ) . get_block_cumulative_difficulty ( res . height - 1 ) ,
res . cumulative_difficulty , res . wide_cumulative_difficulty , res . cumulative_difficulty_top64 ) ;
res . block_size_limit = res . block_weight_limit = m_core . get_blockchain_storage ( ) . get_current_cumulative_block_weight_limit ( ) ;
res . block_size_limit = res . block_weight_limit = m_core . get_blockchain_storage ( ) . get_current_cumulative_block_weight_limit ( ) ;
res . block_size_median = res . block_weight_median = m_core . get_blockchain_storage ( ) . get_current_cumulative_block_weight_median ( ) ;
res . block_size_median = res . block_weight_median = m_core . get_blockchain_storage ( ) . get_current_cumulative_block_weight_median ( ) ;
res . status = CORE_RPC_STATUS_OK ;
res . status = CORE_RPC_STATUS_OK ;
@ -1196,13 +1204,15 @@ namespace cryptonote
block b ;
block b ;
cryptonote : : blobdata blob_reserve ;
cryptonote : : blobdata blob_reserve ;
blob_reserve . resize ( req . reserve_size , 0 ) ;
blob_reserve . resize ( req . reserve_size , 0 ) ;
if ( ! m_core . get_block_template ( b , info . address , res . difficulty , res . height , res . expected_reward , blob_reserve ) )
cryptonote : : difficulty_type wdiff ;
if ( ! m_core . get_block_template ( b , info . address , wdiff , res . height , res . expected_reward , blob_reserve ) )
{
{
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 " ;
LOG_ERROR ( " Failed to create block template " ) ;
LOG_ERROR ( " Failed to create block template " ) ;
return false ;
return false ;
}
}
store_difficulty ( wdiff , res . difficulty , res . wide_difficulty , res . difficulty_top64 ) ;
blobdata block_blob = t_serializable_object_to_blob ( b ) ;
blobdata block_blob = t_serializable_object_to_blob ( b ) ;
crypto : : public_key tx_pub_key = cryptonote : : get_tx_pub_key_from_extra ( b . miner_tx ) ;
crypto : : public_key tx_pub_key = cryptonote : : get_tx_pub_key_from_extra ( b . miner_tx ) ;
if ( tx_pub_key = = crypto : : null_pkey )
if ( tx_pub_key = = crypto : : null_pkey )
@ -1375,8 +1385,10 @@ namespace cryptonote
response . height = height ;
response . height = height ;
response . depth = m_core . get_current_blockchain_height ( ) - height - 1 ;
response . depth = m_core . get_current_blockchain_height ( ) - height - 1 ;
response . hash = string_tools : : pod_to_hex ( hash ) ;
response . hash = string_tools : : pod_to_hex ( hash ) ;
response . difficulty = m_core . get_blockchain_storage ( ) . block_difficulty ( height ) ;
store_difficulty ( m_core . get_blockchain_storage ( ) . block_difficulty ( height ) ,
response . cumulative_difficulty = response . block_weight = m_core . get_blockchain_storage ( ) . get_db ( ) . get_block_cumulative_difficulty ( height ) ;
response . difficulty , response . wide_difficulty , response . difficulty_top64 ) ;
store_difficulty ( m_core . get_blockchain_storage ( ) . get_db ( ) . get_block_cumulative_difficulty ( height ) ,
response . cumulative_difficulty , response . wide_cumulative_difficulty , response . cumulative_difficulty_top64 ) ;
response . reward = get_block_reward ( blk ) ;
response . reward = get_block_reward ( blk ) ;
response . block_size = response . block_weight = m_core . get_blockchain_storage ( ) . get_db ( ) . get_block_weight ( height ) ;
response . block_size = response . block_weight = m_core . get_blockchain_storage ( ) . get_db ( ) . get_block_weight ( height ) ;
response . num_txes = blk . tx_hashes . size ( ) ;
response . num_txes = blk . tx_hashes . size ( ) ;
@ -1707,7 +1719,8 @@ namespace cryptonote
+ + res . height ; // turn top block height into blockchain height
+ + res . height ; // turn top block height into blockchain height
res . top_block_hash = string_tools : : pod_to_hex ( top_hash ) ;
res . top_block_hash = string_tools : : pod_to_hex ( top_hash ) ;
res . target_height = m_core . get_target_blockchain_height ( ) ;
res . target_height = m_core . get_target_blockchain_height ( ) ;
res . difficulty = m_core . get_blockchain_storage ( ) . get_difficulty_for_next_block ( ) ;
store_difficulty ( m_core . get_blockchain_storage ( ) . get_difficulty_for_next_block ( ) ,
res . difficulty , res . wide_difficulty , res . difficulty_top64 ) ;
res . target = m_core . get_blockchain_storage ( ) . get_current_hard_fork_version ( ) < 2 ? DIFFICULTY_TARGET_V1 : DIFFICULTY_TARGET_V2 ;
res . target = m_core . get_blockchain_storage ( ) . get_current_hard_fork_version ( ) < 2 ? DIFFICULTY_TARGET_V1 : DIFFICULTY_TARGET_V2 ;
res . tx_count = m_core . get_blockchain_storage ( ) . get_total_transactions ( ) - res . height ; //without coinbase
res . tx_count = m_core . get_blockchain_storage ( ) . get_total_transactions ( ) - res . height ; //without coinbase
res . tx_pool_size = m_core . get_pool_transactions_count ( ) ;
res . tx_pool_size = m_core . get_pool_transactions_count ( ) ;
@ -1725,7 +1738,8 @@ namespace cryptonote
res . stagenet = net_type = = STAGENET ;
res . stagenet = net_type = = STAGENET ;
res . nettype = net_type = = MAINNET ? " mainnet " : net_type = = TESTNET ? " testnet " : net_type = = STAGENET ? " stagenet " : " fakechain " ;
res . nettype = net_type = = MAINNET ? " mainnet " : net_type = = TESTNET ? " testnet " : net_type = = STAGENET ? " stagenet " : " fakechain " ;
res . cumulative_difficulty = m_core . get_blockchain_storage ( ) . get_db ( ) . get_block_cumulative_difficulty ( res . height - 1 ) ;
store_difficulty ( m_core . get_blockchain_storage ( ) . get_db ( ) . get_block_cumulative_difficulty ( res . height - 1 ) ,
res . cumulative_difficulty , res . wide_cumulative_difficulty , res . cumulative_difficulty_top64 ) ;
res . block_size_limit = res . block_weight_limit = m_core . get_blockchain_storage ( ) . get_current_cumulative_block_weight_limit ( ) ;
res . block_size_limit = res . block_weight_limit = m_core . get_blockchain_storage ( ) . get_current_cumulative_block_weight_limit ( ) ;
res . block_size_median = res . block_weight_median = m_core . get_blockchain_storage ( ) . get_current_cumulative_block_weight_median ( ) ;
res . block_size_median = res . block_weight_median = m_core . get_blockchain_storage ( ) . get_current_cumulative_block_weight_median ( ) ;
res . status = CORE_RPC_STATUS_OK ;
res . status = CORE_RPC_STATUS_OK ;
@ -1947,7 +1961,9 @@ namespace cryptonote
std : : list < std : : pair < Blockchain : : block_extended_info , std : : vector < crypto : : hash > > > chains = m_core . get_blockchain_storage ( ) . get_alternative_chains ( ) ;
std : : list < std : : pair < Blockchain : : block_extended_info , std : : vector < crypto : : hash > > > chains = m_core . get_blockchain_storage ( ) . get_alternative_chains ( ) ;
for ( const auto & i : chains )
for ( const auto & i : chains )
{
{
res . chains . push_back ( COMMAND_RPC_GET_ALTERNATE_CHAINS : : chain_info { epee : : string_tools : : pod_to_hex ( get_block_hash ( i . first . bl ) ) , i . first . height , i . second . size ( ) , i . first . cumulative_difficulty , { } , std : : string ( ) } ) ;
difficulty_type wdiff = i . first . cumulative_difficulty ;
res . chains . push_back ( COMMAND_RPC_GET_ALTERNATE_CHAINS : : chain_info { epee : : string_tools : : pod_to_hex ( get_block_hash ( i . first . bl ) ) , i . first . height , i . second . size ( ) , 0 , " " , 0 , { } , std : : string ( ) } ) ;
store_difficulty ( wdiff , res . chains . back ( ) . difficulty , res . chains . back ( ) . wide_difficulty , res . chains . back ( ) . difficulty_top64 ) ;
res . chains . back ( ) . block_hashes . reserve ( i . second . size ( ) ) ;
res . chains . back ( ) . block_hashes . reserve ( i . second . size ( ) ) ;
for ( const crypto : : hash & block_id : i . second )
for ( const crypto : : hash & block_id : i . second )
res . chains . back ( ) . block_hashes . push_back ( epee : : string_tools : : pod_to_hex ( block_id ) ) ;
res . chains . back ( ) . block_hashes . push_back ( epee : : string_tools : : pod_to_hex ( block_id ) ) ;