diff options
author | Riccardo Spagni <ric@spagni.net> | 2017-12-02 09:25:53 +0200 |
---|---|---|
committer | Riccardo Spagni <ric@spagni.net> | 2017-12-02 09:25:53 +0200 |
commit | 81fb8320821d23ac0d4fb7a9be2ef9477562d2a4 (patch) | |
tree | 86dc193f529e69f59256fdd995cab9b00ca97e8c /src/wallet | |
parent | Merge pull request #2854 (diff) | |
parent | Fixes #759 Add sanity check on restore height (diff) | |
download | monero-81fb8320821d23ac0d4fb7a9be2ef9477562d2a4.tar.xz |
Merge pull request #2833
b0426d4c Fixes #759 Add sanity check on restore height (Cifrado)
Diffstat (limited to 'src/wallet')
-rw-r--r-- | src/wallet/wallet2.cpp | 53 | ||||
-rw-r--r-- | src/wallet/wallet2.h | 1 |
2 files changed, 34 insertions, 20 deletions
diff --git a/src/wallet/wallet2.cpp b/src/wallet/wallet2.cpp index 425fb746a..181bb1852 100644 --- a/src/wallet/wallet2.cpp +++ b/src/wallet/wallet2.cpp @@ -2476,26 +2476,7 @@ crypto::secret_key wallet2::generate(const std::string& wallet_, const std::stri // try asking the daemon first if(m_refresh_from_block_height == 0 && !recover){ - 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; + uint64_t height = estimate_blockchain_height(); 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; } + 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. * \param wallet_ Name of wallet file diff --git a/src/wallet/wallet2.h b/src/wallet/wallet2.h index ce0c67fc3..eeec7c338 100644 --- a/src/wallet/wallet2.h +++ b/src/wallet/wallet2.h @@ -742,6 +742,7 @@ namespace tools * \brief Calculates the approximate blockchain height from current date/time. */ 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(const std::function<bool(const transfer_details &td)> &f); std::vector<size_t> select_available_unmixable_outputs(bool trusted_daemon); |