mirror of
https://git.wownero.com/wownero/wownero.git
synced 2024-08-15 01:03:23 +00:00
Merge pull request #1534
1607cb7e
tx_pool: better block template filling algorithm (moneromooo-monero)9731b4e5
rpc: add block size to GET_BLOCK_HEADER RPC (moneromooo-monero)9188b346
rpc: add current block size to the getinfo call (moneromooo-monero)
This commit is contained in:
commit
15dcc5afd3
6 changed files with 46 additions and 22 deletions
|
@ -1085,7 +1085,7 @@ bool Blockchain::create_block_template(block& b, const account_public_address& m
|
||||||
|
|
||||||
size_t txs_size;
|
size_t txs_size;
|
||||||
uint64_t fee;
|
uint64_t fee;
|
||||||
if (!m_tx_pool.fill_block_template(b, median_size, already_generated_coins, txs_size, fee))
|
if (!m_tx_pool.fill_block_template(b, median_size, already_generated_coins, txs_size, fee, m_hardfork->get_current_version()))
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
|
@ -60,6 +60,7 @@ namespace cryptonote
|
||||||
size_t const TRANSACTION_SIZE_LIMIT_V2 = (((CRYPTONOTE_BLOCK_GRANTED_FULL_REWARD_ZONE_V2 * 125) / 100) - CRYPTONOTE_COINBASE_BLOB_RESERVED_SIZE);
|
size_t const TRANSACTION_SIZE_LIMIT_V2 = (((CRYPTONOTE_BLOCK_GRANTED_FULL_REWARD_ZONE_V2 * 125) / 100) - CRYPTONOTE_COINBASE_BLOB_RESERVED_SIZE);
|
||||||
time_t const MIN_RELAY_TIME = (60 * 5); // only start re-relaying transactions after that many seconds
|
time_t const MIN_RELAY_TIME = (60 * 5); // only start re-relaying transactions after that many seconds
|
||||||
time_t const MAX_RELAY_TIME = (60 * 60 * 4); // at most that many seconds between resends
|
time_t const MAX_RELAY_TIME = (60 * 60 * 4); // at most that many seconds between resends
|
||||||
|
float const ACCEPT_THRESHOLD = 0.99f;
|
||||||
|
|
||||||
// a kind of increasing backoff within min/max bounds
|
// a kind of increasing backoff within min/max bounds
|
||||||
time_t get_relay_delay(time_t now, time_t received)
|
time_t get_relay_delay(time_t now, time_t received)
|
||||||
|
@ -69,6 +70,11 @@ namespace cryptonote
|
||||||
d = MAX_RELAY_TIME;
|
d = MAX_RELAY_TIME;
|
||||||
return d;
|
return d;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint64_t template_accept_threshold(uint64_t amount)
|
||||||
|
{
|
||||||
|
return amount * ACCEPT_THRESHOLD;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
//---------------------------------------------------------------------------------
|
//---------------------------------------------------------------------------------
|
||||||
//---------------------------------------------------------------------------------
|
//---------------------------------------------------------------------------------
|
||||||
|
@ -587,7 +593,7 @@ namespace cryptonote
|
||||||
}
|
}
|
||||||
//---------------------------------------------------------------------------------
|
//---------------------------------------------------------------------------------
|
||||||
//TODO: investigate whether boolean return is appropriate
|
//TODO: investigate whether boolean return is appropriate
|
||||||
bool tx_memory_pool::fill_block_template(block &bl, size_t median_size, uint64_t already_generated_coins, size_t &total_size, uint64_t &fee)
|
bool tx_memory_pool::fill_block_template(block &bl, size_t median_size, uint64_t already_generated_coins, size_t &total_size, uint64_t &fee, uint8_t version)
|
||||||
{
|
{
|
||||||
// Warning: This function takes already_generated_
|
// Warning: This function takes already_generated_
|
||||||
// coins as an argument and appears to do nothing
|
// coins as an argument and appears to do nothing
|
||||||
|
@ -595,47 +601,51 @@ namespace cryptonote
|
||||||
|
|
||||||
CRITICAL_REGION_LOCAL(m_transactions_lock);
|
CRITICAL_REGION_LOCAL(m_transactions_lock);
|
||||||
|
|
||||||
|
uint64_t best_coinbase = 0;
|
||||||
total_size = 0;
|
total_size = 0;
|
||||||
fee = 0;
|
fee = 0;
|
||||||
|
|
||||||
// Maximum block size is 130% of the median block size. This gives a
|
size_t max_total_size = 2 * median_size - CRYPTONOTE_COINBASE_BLOB_RESERVED_SIZE;
|
||||||
// little extra headroom for the max size transaction.
|
|
||||||
size_t max_total_size = (130 * median_size) / 100 - CRYPTONOTE_COINBASE_BLOB_RESERVED_SIZE;
|
|
||||||
std::unordered_set<crypto::key_image> k_images;
|
std::unordered_set<crypto::key_image> k_images;
|
||||||
|
|
||||||
|
LOG_PRINT_L2("Filling block template, median size " << median_size << ", " << m_txs_by_fee.size() << " txes in the pool");
|
||||||
auto sorted_it = m_txs_by_fee.begin();
|
auto sorted_it = m_txs_by_fee.begin();
|
||||||
while (sorted_it != m_txs_by_fee.end())
|
while (sorted_it != m_txs_by_fee.end())
|
||||||
{
|
{
|
||||||
auto tx_it = m_transactions.find(sorted_it->second);
|
auto tx_it = m_transactions.find(sorted_it->second);
|
||||||
|
LOG_PRINT_L2("Considering " << tx_it->first << ", size " << tx_it->second.blob_size << ", current block size " << total_size << "/" << max_total_size << ", current coinbase " << print_money(best_coinbase));
|
||||||
|
|
||||||
// Can not exceed maximum block size
|
// Can not exceed maximum block size
|
||||||
if (max_total_size < total_size + tx_it->second.blob_size)
|
if (max_total_size < total_size + tx_it->second.blob_size)
|
||||||
{
|
{
|
||||||
|
LOG_PRINT_L2(" would exceed maximum block size");
|
||||||
sorted_it++;
|
sorted_it++;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
// If adding this tx will make the block size
|
// If we're getting lower coinbase tx,
|
||||||
// greater than CRYPTONOTE_GETBLOCKTEMPLATE_MAX
|
|
||||||
// _BLOCK_SIZE bytes, reject the tx; this will
|
|
||||||
// keep block sizes from becoming too unwieldly
|
|
||||||
// to propagate at 60s block times.
|
|
||||||
if ( (total_size + tx_it->second.blob_size) > CRYPTONOTE_GETBLOCKTEMPLATE_MAX_BLOCK_SIZE )
|
|
||||||
{
|
|
||||||
sorted_it++;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
// If we've exceeded the penalty free size,
|
|
||||||
// stop including more tx
|
// stop including more tx
|
||||||
if (total_size > median_size)
|
uint64_t block_reward;
|
||||||
break;
|
if(!get_block_reward(median_size, total_size + tx_it->second.blob_size, already_generated_coins, block_reward, version))
|
||||||
|
{
|
||||||
|
LOG_PRINT_L2(" would exceed maximum block size");
|
||||||
|
sorted_it++;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
uint64_t coinbase = block_reward + fee;
|
||||||
|
if (coinbase < template_accept_threshold(best_coinbase))
|
||||||
|
{
|
||||||
|
LOG_PRINT_L2(" would decrease coinbase to " << print_money(coinbase));
|
||||||
|
sorted_it++;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
// Skip transactions that are not ready to be
|
// Skip transactions that are not ready to be
|
||||||
// included into the blockchain or that are
|
// included into the blockchain or that are
|
||||||
// missing key images
|
// missing key images
|
||||||
if (!is_transaction_ready_to_go(tx_it->second) || have_key_images(k_images, tx_it->second.tx))
|
if (!is_transaction_ready_to_go(tx_it->second) || have_key_images(k_images, tx_it->second.tx))
|
||||||
{
|
{
|
||||||
|
LOG_PRINT_L2(" not ready to go, or key images already seen");
|
||||||
sorted_it++;
|
sorted_it++;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
@ -643,10 +653,15 @@ namespace cryptonote
|
||||||
bl.tx_hashes.push_back(tx_it->first);
|
bl.tx_hashes.push_back(tx_it->first);
|
||||||
total_size += tx_it->second.blob_size;
|
total_size += tx_it->second.blob_size;
|
||||||
fee += tx_it->second.fee;
|
fee += tx_it->second.fee;
|
||||||
|
best_coinbase = coinbase;
|
||||||
append_key_images(k_images, tx_it->second.tx);
|
append_key_images(k_images, tx_it->second.tx);
|
||||||
sorted_it++;
|
sorted_it++;
|
||||||
|
LOG_PRINT_L2(" added, new block size " << total_size << "/" << max_total_size << ", coinbase " << print_money(best_coinbase));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
LOG_PRINT_L2("Block template filled with " << bl.tx_hashes.size() << " txes, size "
|
||||||
|
<< total_size << "/" << max_total_size << ", coinbase " << print_money(best_coinbase)
|
||||||
|
<< " (including " << print_money(fee) << " in fees)");
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
//---------------------------------------------------------------------------------
|
//---------------------------------------------------------------------------------
|
||||||
|
|
|
@ -216,10 +216,11 @@ namespace cryptonote
|
||||||
* @param already_generated_coins the current total number of coins "minted"
|
* @param already_generated_coins the current total number of coins "minted"
|
||||||
* @param total_size return-by-reference the total size of the new block
|
* @param total_size return-by-reference the total size of the new block
|
||||||
* @param fee return-by-reference the total of fees from the included transactions
|
* @param fee return-by-reference the total of fees from the included transactions
|
||||||
|
* @param version hard fork version to use for consensus rules
|
||||||
*
|
*
|
||||||
* @return true
|
* @return true
|
||||||
*/
|
*/
|
||||||
bool fill_block_template(block &bl, size_t median_size, uint64_t already_generated_coins, size_t &total_size, uint64_t &fee);
|
bool fill_block_template(block &bl, size_t median_size, uint64_t already_generated_coins, size_t &total_size, uint64_t &fee, uint8_t version);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief get a list of all transactions in the pool
|
* @brief get a list of all transactions in the pool
|
||||||
|
|
|
@ -473,8 +473,9 @@ bool t_rpc_command_executor::print_blockchain_info(uint64_t start_block_index, u
|
||||||
if (!first)
|
if (!first)
|
||||||
std::cout << std::endl;
|
std::cout << std::endl;
|
||||||
std::cout
|
std::cout
|
||||||
|
<< "height: " << header.height << ", timestamp: " << header.timestamp << ", difficulty: " << header.difficulty
|
||||||
|
<< ", size: " << header.block_size << std::endl
|
||||||
<< "major version: " << (unsigned)header.major_version << ", minor version: " << (unsigned)header.minor_version << std::endl
|
<< "major version: " << (unsigned)header.major_version << ", minor version: " << (unsigned)header.minor_version << std::endl
|
||||||
<< "height: " << header.height << ", timestamp: " << header.timestamp << ", difficulty: " << header.difficulty << std::endl
|
|
||||||
<< "block id: " << header.hash << ", previous block id: " << header.prev_hash << std::endl
|
<< "block id: " << header.hash << ", previous block id: " << header.prev_hash << std::endl
|
||||||
<< "difficulty: " << header.difficulty << ", nonce " << header.nonce << ", reward " << cryptonote::print_money(header.reward) << std::endl;
|
<< "difficulty: " << header.difficulty << ", nonce " << header.nonce << ", reward " << cryptonote::print_money(header.reward) << std::endl;
|
||||||
first = false;
|
first = false;
|
||||||
|
|
|
@ -143,6 +143,7 @@ namespace cryptonote
|
||||||
res.grey_peerlist_size = m_p2p.get_peerlist_manager().get_gray_peers_count();
|
res.grey_peerlist_size = m_p2p.get_peerlist_manager().get_gray_peers_count();
|
||||||
res.testnet = m_testnet;
|
res.testnet = m_testnet;
|
||||||
res.cumulative_difficulty = m_core.get_blockchain_storage().get_db().get_block_cumulative_difficulty(res.height - 1);
|
res.cumulative_difficulty = m_core.get_blockchain_storage().get_db().get_block_cumulative_difficulty(res.height - 1);
|
||||||
|
res.block_size_limit = m_core.get_blockchain_storage().get_current_cumulative_blocksize_limit();
|
||||||
res.status = CORE_RPC_STATUS_OK;
|
res.status = CORE_RPC_STATUS_OK;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -891,6 +892,7 @@ namespace cryptonote
|
||||||
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);
|
response.difficulty = m_core.get_blockchain_storage().block_difficulty(height);
|
||||||
response.reward = get_block_reward(blk);
|
response.reward = get_block_reward(blk);
|
||||||
|
response.block_size = m_core.get_blockchain_storage().get_db().get_block_size(height);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
//------------------------------------------------------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------------------------------------------------------
|
||||||
|
@ -1161,6 +1163,7 @@ namespace cryptonote
|
||||||
res.grey_peerlist_size = m_p2p.get_peerlist_manager().get_gray_peers_count();
|
res.grey_peerlist_size = m_p2p.get_peerlist_manager().get_gray_peers_count();
|
||||||
res.testnet = m_testnet;
|
res.testnet = m_testnet;
|
||||||
res.cumulative_difficulty = m_core.get_blockchain_storage().get_db().get_block_cumulative_difficulty(res.height - 1);
|
res.cumulative_difficulty = m_core.get_blockchain_storage().get_db().get_block_cumulative_difficulty(res.height - 1);
|
||||||
|
res.block_size_limit = m_core.get_blockchain_storage().get_current_cumulative_blocksize_limit();
|
||||||
res.status = CORE_RPC_STATUS_OK;
|
res.status = CORE_RPC_STATUS_OK;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
|
@ -49,7 +49,7 @@ namespace cryptonote
|
||||||
// advance which version they will stop working with
|
// advance which version they will stop working with
|
||||||
// Don't go over 32767 for any of these
|
// Don't go over 32767 for any of these
|
||||||
#define CORE_RPC_VERSION_MAJOR 1
|
#define CORE_RPC_VERSION_MAJOR 1
|
||||||
#define CORE_RPC_VERSION_MINOR 0
|
#define CORE_RPC_VERSION_MINOR 3
|
||||||
#define CORE_RPC_VERSION (((CORE_RPC_VERSION_MAJOR)<<16)|(CORE_RPC_VERSION_MINOR))
|
#define CORE_RPC_VERSION (((CORE_RPC_VERSION_MAJOR)<<16)|(CORE_RPC_VERSION_MINOR))
|
||||||
|
|
||||||
struct COMMAND_RPC_GET_HEIGHT
|
struct COMMAND_RPC_GET_HEIGHT
|
||||||
|
@ -512,6 +512,7 @@ namespace cryptonote
|
||||||
bool testnet;
|
bool testnet;
|
||||||
std::string top_block_hash;
|
std::string top_block_hash;
|
||||||
uint64_t cumulative_difficulty;
|
uint64_t cumulative_difficulty;
|
||||||
|
uint64_t block_size_limit;
|
||||||
|
|
||||||
BEGIN_KV_SERIALIZE_MAP()
|
BEGIN_KV_SERIALIZE_MAP()
|
||||||
KV_SERIALIZE(status)
|
KV_SERIALIZE(status)
|
||||||
|
@ -529,6 +530,7 @@ namespace cryptonote
|
||||||
KV_SERIALIZE(testnet)
|
KV_SERIALIZE(testnet)
|
||||||
KV_SERIALIZE(top_block_hash)
|
KV_SERIALIZE(top_block_hash)
|
||||||
KV_SERIALIZE(cumulative_difficulty)
|
KV_SERIALIZE(cumulative_difficulty)
|
||||||
|
KV_SERIALIZE(block_size_limit)
|
||||||
END_KV_SERIALIZE_MAP()
|
END_KV_SERIALIZE_MAP()
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
@ -693,6 +695,7 @@ namespace cryptonote
|
||||||
std::string hash;
|
std::string hash;
|
||||||
difficulty_type difficulty;
|
difficulty_type difficulty;
|
||||||
uint64_t reward;
|
uint64_t reward;
|
||||||
|
uint64_t block_size;
|
||||||
|
|
||||||
BEGIN_KV_SERIALIZE_MAP()
|
BEGIN_KV_SERIALIZE_MAP()
|
||||||
KV_SERIALIZE(major_version)
|
KV_SERIALIZE(major_version)
|
||||||
|
@ -706,6 +709,7 @@ namespace cryptonote
|
||||||
KV_SERIALIZE(hash)
|
KV_SERIALIZE(hash)
|
||||||
KV_SERIALIZE(difficulty)
|
KV_SERIALIZE(difficulty)
|
||||||
KV_SERIALIZE(reward)
|
KV_SERIALIZE(reward)
|
||||||
|
KV_SERIALIZE(block_size)
|
||||||
END_KV_SERIALIZE_MAP()
|
END_KV_SERIALIZE_MAP()
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue