aboutsummaryrefslogtreecommitdiff
path: root/src/wallet/wallet2.cpp
diff options
context:
space:
mode:
authorHoward Chu <hyc@symas.com>2018-02-16 14:15:41 +0000
committerHoward Chu <hyc@symas.com>2018-02-16 14:17:36 +0000
commitf3b74e75b098687392fb5674c6ea3b1f288cba85 (patch)
tree27bb6fc083cee56dd602752d132f16c697de33ae /src/wallet/wallet2.cpp
parentMerge pull request #3196 (diff)
downloadmonero-f3b74e75b098687392fb5674c6ea3b1f288cba85.tar.xz
Fix refresh height estimation
Since commit b0426d4c refresh height for a newly created wallet connected to a sync'd daemon was off by a month. Now we only use the 1 month safety margin if we're unable to talk to a daemon.
Diffstat (limited to 'src/wallet/wallet2.cpp')
-rw-r--r--src/wallet/wallet2.cpp29
1 files changed, 16 insertions, 13 deletions
diff --git a/src/wallet/wallet2.cpp b/src/wallet/wallet2.cpp
index d97e53011..5dc3ea2d1 100644
--- a/src/wallet/wallet2.cpp
+++ b/src/wallet/wallet2.cpp
@@ -2846,16 +2846,9 @@ crypto::secret_key wallet2::generate(const std::string& wallet_, const epee::wip
m_multisig_threshold = 0;
m_multisig_signers.clear();
- // -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
+ // calculate a starting refresh height
if(m_refresh_from_block_height == 0 && !recover){
- uint64_t height = estimate_blockchain_height();
- m_refresh_from_block_height = height >= blocks_per_month ? height - blocks_per_month : 0;
+ m_refresh_from_block_height = estimate_blockchain_height();
}
if (!wallet_.empty())
@@ -2890,20 +2883,30 @@ crypto::secret_key wallet2::generate(const std::string& wallet_, const epee::wip
std::string err;
uint64_t height = 0;
- // we get the max of approximated height and known height
+ // we get the max of approximated height and local 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
+ // local 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.
+ // If we use the approximate height we subtract one month as
+ // a safety margin.
height = get_approximate_blockchain_height();
uint64_t target_height = get_daemon_blockchain_target_height(err);
- if (err.empty() && target_height < height)
- height = target_height;
+ if (err.empty()) {
+ if (target_height < height)
+ height = target_height;
+ } else {
+ // if we couldn't talk to the daemon, check safety margin.
+ if (height > blocks_per_month)
+ height -= blocks_per_month;
+ else
+ height = 0;
+ }
uint64_t local_height = get_daemon_blockchain_height(err);
if (err.empty() && local_height > height)
height = local_height;