Merge pull request #2833

b0426d4c Fixes #759 Add sanity check on restore height (Cifrado)
This commit is contained in:
Riccardo Spagni 2017-12-02 09:25:53 +02:00
commit 81fb832082
No known key found for this signature in database
GPG key ID: 55432DF31CCD4FCD
3 changed files with 44 additions and 20 deletions

View file

@ -1801,7 +1801,17 @@ bool simple_wallet::init(const boost::program_options::variables_map& vm)
} }
} }
if (m_restoring) if (m_restoring)
{
uint64_t estimate_height = m_wallet->estimate_blockchain_height();
if (m_restore_height >= estimate_height)
{
success_msg_writer() << tr("Restore height ") << m_restore_height << (" is not yet reached. The current estimated height is ") << estimate_height;
std::string confirm = input_line(tr("Still apply restore height? (Y/Yes/N/No): "));
if (std::cin.eof() || command_line::is_no(confirm))
m_restore_height = 0;
}
m_wallet->set_refresh_from_block_height(m_restore_height); m_wallet->set_refresh_from_block_height(m_restore_height);
}
} }
else else
{ {

View file

@ -2476,26 +2476,7 @@ crypto::secret_key wallet2::generate(const std::string& wallet_, const std::stri
// try asking the daemon first // try asking the daemon first
if(m_refresh_from_block_height == 0 && !recover){ if(m_refresh_from_block_height == 0 && !recover){
std::string err; uint64_t height = estimate_blockchain_height();
uint64_t height = 0;
// we get the max of approximated height and known height
// approximated height is the least of daemon target height
// (the max of what the other daemons are claiming is their
// height) and the theoretical height based on the local
// clock. This will be wrong only if both the local clock
// is bad *and* a peer daemon claims a highest height than
// the real chain.
// known height is the height the local daemon is currently
// synced to, it will be lower than the real chain height if
// the daemon is currently syncing.
height = get_approximate_blockchain_height();
uint64_t target_height = get_daemon_blockchain_target_height(err);
if (err.empty() && target_height < height)
height = target_height;
uint64_t local_height = get_daemon_blockchain_height(err);
if (err.empty() && local_height > height)
height = local_height;
m_refresh_from_block_height = height >= blocks_per_month ? height - blocks_per_month : 0; m_refresh_from_block_height = height >= blocks_per_month ? height - blocks_per_month : 0;
} }
@ -2514,6 +2495,38 @@ crypto::secret_key wallet2::generate(const std::string& wallet_, const std::stri
return retval; return retval;
} }
uint64_t wallet2::estimate_blockchain_height()
{
// -1 month for fluctuations in block time and machine date/time setup.
// avg seconds per block
const int seconds_per_block = DIFFICULTY_TARGET_V2;
// ~num blocks per month
const uint64_t blocks_per_month = 60*60*24*30/seconds_per_block;
// try asking the daemon first
std::string err;
uint64_t height = 0;
// we get the max of approximated height and known height
// approximated height is the least of daemon target height
// (the max of what the other daemons are claiming is their
// height) and the theoretical height based on the local
// clock. This will be wrong only if both the local clock
// is bad *and* a peer daemon claims a highest height than
// the real chain.
// known height is the height the local daemon is currently
// synced to, it will be lower than the real chain height if
// the daemon is currently syncing.
height = get_approximate_blockchain_height();
uint64_t target_height = get_daemon_blockchain_target_height(err);
if (err.empty() && target_height < height)
height = target_height;
uint64_t local_height = get_daemon_blockchain_height(err);
if (err.empty() && local_height > height)
height = local_height;
return height;
}
/*! /*!
* \brief Creates a watch only wallet from a public address and a view secret key. * \brief Creates a watch only wallet from a public address and a view secret key.
* \param wallet_ Name of wallet file * \param wallet_ Name of wallet file

View file

@ -742,6 +742,7 @@ namespace tools
* \brief Calculates the approximate blockchain height from current date/time. * \brief Calculates the approximate blockchain height from current date/time.
*/ */
uint64_t get_approximate_blockchain_height() const; uint64_t get_approximate_blockchain_height() const;
uint64_t estimate_blockchain_height();
std::vector<size_t> select_available_outputs_from_histogram(uint64_t count, bool atleast, bool unlocked, bool allow_rct, bool trusted_daemon); std::vector<size_t> select_available_outputs_from_histogram(uint64_t count, bool atleast, bool unlocked, bool allow_rct, bool trusted_daemon);
std::vector<size_t> select_available_outputs(const std::function<bool(const transfer_details &td)> &f); std::vector<size_t> select_available_outputs(const std::function<bool(const transfer_details &td)> &f);
std::vector<size_t> select_available_unmixable_outputs(bool trusted_daemon); std::vector<size_t> select_available_unmixable_outputs(bool trusted_daemon);