Don't label transactions "Open" while catching up

Since the default `nSequence` is `0xFFFFFFFE` and locktime is enabled,
the checking `wtx.is_final` is meaningless until the syncing has
completed.
This commit is contained in:
Hennadii Stepanov 2018-10-23 22:02:20 +03:00
parent bfd7e54097
commit fb3ce75807
No known key found for this signature in database
GPG key ID: 410108112E7EA81F
7 changed files with 27 additions and 14 deletions

View file

@ -18,7 +18,7 @@
* Maximum amount of time that a block timestamp is allowed to exceed the * Maximum amount of time that a block timestamp is allowed to exceed the
* current network-adjusted time before the block will be accepted. * current network-adjusted time before the block will be accepted.
*/ */
static const int64_t MAX_FUTURE_BLOCK_TIME = 2 * 60 * 60; static constexpr int64_t MAX_FUTURE_BLOCK_TIME = 2 * 60 * 60;
/** /**
* Timestamp window used as a grace period by code that compares external * Timestamp window used as a grace period by code that compares external
@ -26,7 +26,15 @@ static const int64_t MAX_FUTURE_BLOCK_TIME = 2 * 60 * 60;
* to block timestamps. This should be set at least as high as * to block timestamps. This should be set at least as high as
* MAX_FUTURE_BLOCK_TIME. * MAX_FUTURE_BLOCK_TIME.
*/ */
static const int64_t TIMESTAMP_WINDOW = MAX_FUTURE_BLOCK_TIME; static constexpr int64_t TIMESTAMP_WINDOW = MAX_FUTURE_BLOCK_TIME;
/**
* Maximum gap between node time and block time used
* for the "Catching up..." mode in GUI.
*
* Ref: https://github.com/bitcoin/bitcoin/pull/1026
*/
static constexpr int64_t MAX_BLOCK_TIME_GAP = 90 * 60;
class CBlockFileInfo class CBlockFileInfo
{ {

View file

@ -318,7 +318,8 @@ public:
} }
bool tryGetTxStatus(const uint256& txid, bool tryGetTxStatus(const uint256& txid,
interfaces::WalletTxStatus& tx_status, interfaces::WalletTxStatus& tx_status,
int& num_blocks) override int& num_blocks,
int64_t& block_time) override
{ {
auto locked_chain = m_wallet.chain().lock(true /* try_lock */); auto locked_chain = m_wallet.chain().lock(true /* try_lock */);
if (!locked_chain) { if (!locked_chain) {
@ -333,6 +334,7 @@ public:
return false; return false;
} }
num_blocks = ::chainActive.Height(); num_blocks = ::chainActive.Height();
block_time = ::chainActive.Tip()->GetBlockTime();
tx_status = MakeWalletTxStatus(*locked_chain, mi->second); tx_status = MakeWalletTxStatus(*locked_chain, mi->second);
return true; return true;
} }

View file

@ -178,7 +178,8 @@ public:
//! Try to get updated status for a particular transaction, if possible without blocking. //! Try to get updated status for a particular transaction, if possible without blocking.
virtual bool tryGetTxStatus(const uint256& txid, virtual bool tryGetTxStatus(const uint256& txid,
WalletTxStatus& tx_status, WalletTxStatus& tx_status,
int& num_blocks) = 0; int& num_blocks,
int64_t& block_time) = 0;
//! Get transaction details. //! Get transaction details.
virtual WalletTx getWalletTxDetails(const uint256& txid, virtual WalletTx getWalletTxDetails(const uint256& txid,

View file

@ -28,6 +28,7 @@
#include <qt/macdockiconhandler.h> #include <qt/macdockiconhandler.h>
#endif #endif
#include <chain.h>
#include <chainparams.h> #include <chainparams.h>
#include <interfaces/handler.h> #include <interfaces/handler.h>
#include <interfaces/node.h> #include <interfaces/node.h>
@ -903,8 +904,7 @@ void BitcoinGUI::setNumBlocks(int count, const QDateTime& blockDate, double nVer
tooltip = tr("Processed %n block(s) of transaction history.", "", count); tooltip = tr("Processed %n block(s) of transaction history.", "", count);
// Set icon state: spinning if catching up, tick otherwise // Set icon state: spinning if catching up, tick otherwise
if(secs < 90*60) if (secs < MAX_BLOCK_TIME_GAP) {
{
tooltip = tr("Up to date") + QString(".<br>") + tooltip; tooltip = tr("Up to date") + QString(".<br>") + tooltip;
labelBlocksIcon->setPixmap(platformStyle->SingleColorIcon(":/icons/synced").pixmap(STATUSBAR_ICONSIZE, STATUSBAR_ICONSIZE)); labelBlocksIcon->setPixmap(platformStyle->SingleColorIcon(":/icons/synced").pixmap(STATUSBAR_ICONSIZE, STATUSBAR_ICONSIZE));

View file

@ -4,6 +4,7 @@
#include <qt/transactionrecord.h> #include <qt/transactionrecord.h>
#include <chain.h>
#include <consensus/consensus.h> #include <consensus/consensus.h>
#include <interfaces/wallet.h> #include <interfaces/wallet.h>
#include <key_io.h> #include <key_io.h>
@ -12,6 +13,7 @@
#include <stdint.h> #include <stdint.h>
#include <QDateTime>
/* Return positive answer if transaction should be shown in list. /* Return positive answer if transaction should be shown in list.
*/ */
@ -158,7 +160,7 @@ QList<TransactionRecord> TransactionRecord::decomposeTransaction(const interface
return parts; return parts;
} }
void TransactionRecord::updateStatus(const interfaces::WalletTxStatus& wtx, int numBlocks) void TransactionRecord::updateStatus(const interfaces::WalletTxStatus& wtx, int numBlocks, int64_t block_time)
{ {
// Determine transaction status // Determine transaction status
@ -172,10 +174,9 @@ void TransactionRecord::updateStatus(const interfaces::WalletTxStatus& wtx, int
status.depth = wtx.depth_in_main_chain; status.depth = wtx.depth_in_main_chain;
status.cur_num_blocks = numBlocks; status.cur_num_blocks = numBlocks;
if (!wtx.is_final) const bool up_to_date = ((int64_t)QDateTime::currentMSecsSinceEpoch() / 1000 - block_time < MAX_BLOCK_TIME_GAP);
{ if (up_to_date && !wtx.is_final) {
if (wtx.lock_time < LOCKTIME_THRESHOLD) if (wtx.lock_time < LOCKTIME_THRESHOLD) {
{
status.status = TransactionStatus::OpenUntilBlock; status.status = TransactionStatus::OpenUntilBlock;
status.open_for = wtx.lock_time - numBlocks; status.open_for = wtx.lock_time - numBlocks;
} }

View file

@ -138,7 +138,7 @@ public:
/** Update status from core wallet tx. /** Update status from core wallet tx.
*/ */
void updateStatus(const interfaces::WalletTxStatus& wtx, int numBlocks); void updateStatus(const interfaces::WalletTxStatus& wtx, int numBlocks, int64_t block_time);
/** Return whether a status update is needed. /** Return whether a status update is needed.
*/ */

View file

@ -193,8 +193,9 @@ public:
// simply re-use the cached status. // simply re-use the cached status.
interfaces::WalletTxStatus wtx; interfaces::WalletTxStatus wtx;
int numBlocks; int numBlocks;
if (wallet.tryGetTxStatus(rec->hash, wtx, numBlocks) && rec->statusUpdateNeeded(numBlocks)) { int64_t block_time;
rec->updateStatus(wtx, numBlocks); if (wallet.tryGetTxStatus(rec->hash, wtx, numBlocks, block_time) && rec->statusUpdateNeeded(numBlocks)) {
rec->updateStatus(wtx, numBlocks, block_time);
} }
return rec; return rec;
} }