Fix optimistic request
This commit is contained in:
parent
fa912e9771
commit
38edde0ffb
1 changed files with 37 additions and 12 deletions
|
|
@ -515,33 +515,58 @@ bool nano::bootstrap_service::request (nano::account account, size_t count, std:
|
||||||
// Check if the account picked has blocks, if it does, start the pull from the highest block
|
// Check if the account picked has blocks, if it does, start the pull from the highest block
|
||||||
if (auto info = ledger.store.account.get (transaction, account))
|
if (auto info = ledger.store.account.get (transaction, account))
|
||||||
{
|
{
|
||||||
tag.type = query_type::blocks_by_hash;
|
|
||||||
|
|
||||||
// Probabilistically choose between requesting blocks from account frontier or confirmed frontier
|
// Probabilistically choose between requesting blocks from account frontier or confirmed frontier
|
||||||
// Optimistic requests start from the (possibly unconfirmed) account frontier and are vulnerable to bootstrap poisoning
|
// Optimistic requests start from the (possibly unconfirmed) account frontier and are vulnerable to bootstrap poisoning
|
||||||
// Safe requests start from the confirmed frontier and given enough time will eventually resolve forks
|
// Safe requests start from the confirmed frontier and given enough time will eventually resolve forks
|
||||||
bool optimistic_reuest = rng.random (100) < config.optimistic_request_percentage;
|
bool optimistic_reuest = rng.random (100) < config.optimistic_request_percentage;
|
||||||
if (!optimistic_reuest)
|
|
||||||
{
|
if (optimistic_reuest) // Optimistic request case
|
||||||
if (auto conf_info = ledger.store.confirmation_height.get (transaction, account))
|
|
||||||
{
|
|
||||||
stats.inc (nano::stat::type::bootstrap_request_blocks, nano::stat::detail::safe);
|
|
||||||
tag.start = conf_info->frontier;
|
|
||||||
tag.hash = conf_info->height;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (tag.start.is_zero ())
|
|
||||||
{
|
{
|
||||||
stats.inc (nano::stat::type::bootstrap_request_blocks, nano::stat::detail::optimistic);
|
stats.inc (nano::stat::type::bootstrap_request_blocks, nano::stat::detail::optimistic);
|
||||||
|
|
||||||
|
tag.type = query_type::blocks_by_hash;
|
||||||
tag.start = info->head;
|
tag.start = info->head;
|
||||||
tag.hash = info->head;
|
tag.hash = info->head;
|
||||||
|
|
||||||
|
logger.debug (nano::log::type::bootstrap, "Requesting blocks for {} starting from account frontier: {} (optimistic: {})",
|
||||||
|
account.to_account (), // TODO: Lazy eval
|
||||||
|
tag.start.to_string (), // TODO: Lazy eval
|
||||||
|
optimistic_reuest);
|
||||||
|
}
|
||||||
|
else // Pessimistic (safe) request case
|
||||||
|
{
|
||||||
|
stats.inc (nano::stat::type::bootstrap_request_blocks, nano::stat::detail::safe);
|
||||||
|
|
||||||
|
if (auto conf_info = ledger.store.confirmation_height.get (transaction, account))
|
||||||
|
{
|
||||||
|
tag.type = query_type::blocks_by_hash;
|
||||||
|
tag.start = conf_info->frontier;
|
||||||
|
tag.hash = conf_info->height;
|
||||||
|
|
||||||
|
logger.debug (nano::log::type::bootstrap, "Requesting blocks for {} starting from confirmation frontier: {} (optimistic: {})",
|
||||||
|
account.to_account (), // TODO: Lazy eval
|
||||||
|
tag.start.to_string (), // TODO: Lazy eval
|
||||||
|
optimistic_reuest);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
tag.type = query_type::blocks_by_account;
|
||||||
|
tag.start = account;
|
||||||
|
|
||||||
|
logger.debug (nano::log::type::bootstrap, "Requesting blocks for {} starting from account root (optimistic: {})",
|
||||||
|
account.to_account (), // TODO: Lazy eval
|
||||||
|
optimistic_reuest);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
stats.inc (nano::stat::type::bootstrap_request_blocks, nano::stat::detail::base);
|
stats.inc (nano::stat::type::bootstrap_request_blocks, nano::stat::detail::base);
|
||||||
|
|
||||||
tag.type = query_type::blocks_by_account;
|
tag.type = query_type::blocks_by_account;
|
||||||
tag.start = account;
|
tag.start = account;
|
||||||
|
|
||||||
|
logger.debug (nano::log::type::bootstrap, "Requesting blocks for {}", account.to_account ()); // TODO: Lazy eval
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue