diff options
Diffstat (limited to 'src/wallet')
-rw-r--r-- | src/wallet/CMakeLists.txt | 2 | ||||
-rw-r--r-- | src/wallet/api/address_book.cpp | 2 | ||||
-rw-r--r-- | src/wallet/api/address_book.h | 2 | ||||
-rw-r--r-- | src/wallet/api/wallet.cpp | 67 | ||||
-rw-r--r-- | src/wallet/api/wallet.h | 11 | ||||
-rw-r--r-- | src/wallet/wallet2.cpp | 4 | ||||
-rw-r--r-- | src/wallet/wallet2.h | 2 | ||||
-rw-r--r-- | src/wallet/wallet2_api.h | 17 |
8 files changed, 75 insertions, 32 deletions
diff --git a/src/wallet/CMakeLists.txt b/src/wallet/CMakeLists.txt index ba5c6b5ac..056a1ca10 100644 --- a/src/wallet/CMakeLists.txt +++ b/src/wallet/CMakeLists.txt @@ -34,7 +34,6 @@ set(wallet_sources password_container.cpp wallet2.cpp wallet_args.cpp - wallet_rpc_server.cpp api/wallet.cpp api/wallet_manager.cpp api/transaction_info.cpp @@ -103,6 +102,7 @@ if (NOT BUILD_GUI_DEPS) target_link_libraries(wallet_rpc_server PRIVATE wallet + epee rpc cryptonote_core crypto diff --git a/src/wallet/api/address_book.cpp b/src/wallet/api/address_book.cpp index 1847e1496..bbf96c81a 100644 --- a/src/wallet/api/address_book.cpp +++ b/src/wallet/api/address_book.cpp @@ -94,7 +94,7 @@ void AddressBookImpl::refresh() } -bool AddressBookImpl::deleteRow(int rowId) +bool AddressBookImpl::deleteRow(std::size_t rowId) { LOG_PRINT_L2("Deleting address book row " << rowId); bool r = m_wallet->m_wallet->delete_address_book_row(rowId); diff --git a/src/wallet/api/address_book.h b/src/wallet/api/address_book.h index c3a24eff9..7f30e4387 100644 --- a/src/wallet/api/address_book.h +++ b/src/wallet/api/address_book.h @@ -46,7 +46,7 @@ public: void refresh(); std::vector<AddressBookRow*> getAll() const; bool addRow(const std::string &dst_addr , const std::string &payment_id, const std::string &description); - bool deleteRow(int rowId); + bool deleteRow(std::size_t rowId); // Error codes. See AddressBook:ErrorCode enum in wallet2_api.h std::string errorString() const {return m_errorString;} diff --git a/src/wallet/api/wallet.cpp b/src/wallet/api/wallet.cpp index 6d8e48deb..3a4493ec3 100644 --- a/src/wallet/api/wallet.cpp +++ b/src/wallet/api/wallet.cpp @@ -204,6 +204,7 @@ WalletImpl::WalletImpl(bool testnet) , m_recoveringFromSeed(false) , m_synchronized(false) , m_rebuildWalletCache(false) + , m_is_connected(false) { m_wallet = new tools::wallet2(testnet); m_history = new TransactionHistoryImpl(this); @@ -224,11 +225,19 @@ WalletImpl::WalletImpl(bool testnet) WalletImpl::~WalletImpl() { + + LOG_PRINT_L1(__FUNCTION__); + // Pause refresh thread - prevents refresh from starting again + pauseRefresh(); + // Close wallet - stores cache and stops ongoing refresh operation + close(); + // Stop refresh thread stopRefresh(); + delete m_wallet2Callback; delete m_history; delete m_addressBook; delete m_wallet; - delete m_wallet2Callback; + LOG_PRINT_L1(__FUNCTION__ << " finished"); } bool WalletImpl::create(const std::string &path, const std::string &password, const std::string &language) @@ -329,7 +338,7 @@ bool WalletImpl::close() { bool result = false; - LOG_PRINT_L3("closing wallet..."); + LOG_PRINT_L1("closing wallet..."); try { // Do not store wallet with invalid status // Status Critical refers to errors on opening or creating wallets. @@ -337,10 +346,10 @@ bool WalletImpl::close() m_wallet->store(); else LOG_PRINT_L3("Status_Critical - not storing wallet"); - LOG_PRINT_L3("wallet::store done"); - LOG_PRINT_L3("Calling wallet::stop..."); + LOG_PRINT_L1("wallet::store done"); + LOG_PRINT_L1("Calling wallet::stop..."); m_wallet->stop(); - LOG_PRINT_L3("wallet::stop done"); + LOG_PRINT_L1("wallet::stop done"); result = true; clearStatus(); } catch (const std::exception &e) { @@ -487,6 +496,8 @@ uint64_t WalletImpl::approximateBlockChainHeight() const } uint64_t WalletImpl::daemonBlockChainHeight() const { + if (!m_is_connected) + return 0; std::string err; uint64_t result = m_wallet->get_daemon_blockchain_height(err); if (!err.empty()) { @@ -504,6 +515,8 @@ uint64_t WalletImpl::daemonBlockChainHeight() const uint64_t WalletImpl::daemonBlockChainTargetHeight() const { + if (!m_is_connected) + return 0; std::string err; uint64_t result = m_wallet->get_daemon_blockchain_target_height(err); if (!err.empty()) { @@ -516,9 +529,20 @@ uint64_t WalletImpl::daemonBlockChainTargetHeight() const m_status = Status_Ok; m_errorString = ""; } + // Target height can be 0 when daemon is synced. Use blockchain height instead. + if(result == 0) + result = daemonBlockChainHeight(); return result; } +bool WalletImpl::daemonSynced() const +{ + if(connected() == Wallet::ConnectionStatus_Disconnected) + return false; + uint64_t blockChainHeight = daemonBlockChainHeight(); + return (blockChainHeight >= daemonBlockChainTargetHeight() && blockChainHeight > 1); +} + bool WalletImpl::synchronized() const { return m_synchronized; @@ -924,8 +948,8 @@ bool WalletImpl::connectToDaemon() Wallet::ConnectionStatus WalletImpl::connected() const { uint32_t version = 0; - bool is_connected = m_wallet->check_connection(&version); - if (!is_connected) + m_is_connected = m_wallet->check_connection(&version); + if (!m_is_connected) return Wallet::ConnectionStatus_Disconnected; if ((version >> 16) != CORE_RPC_VERSION_MAJOR) return Wallet::ConnectionStatus_WrongVersion; @@ -970,7 +994,7 @@ void WalletImpl::refreshThreadFunc() LOG_PRINT_L3(__FUNCTION__ << ": refresh lock acquired..."); LOG_PRINT_L3(__FUNCTION__ << ": m_refreshEnabled: " << m_refreshEnabled); LOG_PRINT_L3(__FUNCTION__ << ": m_status: " << m_status); - if (m_refreshEnabled /*&& m_status == Status_Ok*/) { + if (m_refreshEnabled) { LOG_PRINT_L3(__FUNCTION__ << ": refreshing..."); doRefresh(); } @@ -983,16 +1007,23 @@ void WalletImpl::doRefresh() // synchronizing async and sync refresh calls boost::lock_guard<boost::mutex> guarg(m_refreshMutex2); try { - m_wallet->refresh(); - if (!m_synchronized) { - m_synchronized = true; - } - // assuming if we have empty history, it wasn't initialized yet - // for futher history changes client need to update history in - // "on_money_received" and "on_money_sent" callbacks - if (m_history->count() == 0) { - m_history->refresh(); - } + // Syncing daemon and refreshing wallet simultaneously is very resource intensive. + // Disable refresh if wallet is disconnected or daemon isn't synced. + if (daemonSynced()) { + // Use fast refresh for new wallets + if (isNewWallet()) + m_wallet->set_refresh_from_block_height(daemonBlockChainHeight()); + m_wallet->refresh(); + if (!m_synchronized) { + m_synchronized = true; + } + // assuming if we have empty history, it wasn't initialized yet + // for futher history changes client need to update history in + // "on_money_received" and "on_money_sent" callbacks + if (m_history->count() == 0) { + m_history->refresh(); + } + } } catch (const std::exception &e) { m_status = Status_Error; m_errorString = e.what(); diff --git a/src/wallet/api/wallet.h b/src/wallet/api/wallet.h index 5046fbf0f..d245a78d0 100644 --- a/src/wallet/api/wallet.h +++ b/src/wallet/api/wallet.h @@ -107,14 +107,15 @@ public: virtual std::string getTxKey(const std::string &txid) const; virtual std::string signMessage(const std::string &message); virtual bool verifySignedMessage(const std::string &message, const std::string &address, const std::string &signature) const; + virtual void startRefresh(); + virtual void pauseRefresh(); private: void clearStatus(); void refreshThreadFunc(); void doRefresh(); - void startRefresh(); + bool daemonSynced() const; void stopRefresh(); - void pauseRefresh(); bool isNewWallet() const; void doInit(const std::string &daemon_address, uint64_t upper_transaction_size_limit); @@ -148,9 +149,11 @@ private: // flag indicating wallet is recovering from seed // so it shouldn't be considered as new and pull blocks (slow-refresh) // instead of pulling hashes (fast-refresh) - bool m_recoveringFromSeed; + std::atomic<bool> m_recoveringFromSeed; std::atomic<bool> m_synchronized; - bool m_rebuildWalletCache; + std::atomic<bool> m_rebuildWalletCache; + // cache connection status to avoid unnecessary RPC calls + mutable std::atomic<bool> m_is_connected; }; diff --git a/src/wallet/wallet2.cpp b/src/wallet/wallet2.cpp index 60fa1d266..db4fae557 100644 --- a/src/wallet/wallet2.cpp +++ b/src/wallet/wallet2.cpp @@ -1569,14 +1569,14 @@ bool wallet2::add_address_book_row(const cryptonote::account_public_address &add a.m_payment_id = payment_id; a.m_description = description; - int old_size = m_address_book.size(); + auto old_size = m_address_book.size(); m_address_book.push_back(a); if(m_address_book.size() == old_size+1) return true; return false; } -bool wallet2::delete_address_book_row(int row_id) { +bool wallet2::delete_address_book_row(std::size_t row_id) { if(m_address_book.size() <= row_id) return false; diff --git a/src/wallet/wallet2.h b/src/wallet/wallet2.h index 36b9b3d1f..c3381730b 100644 --- a/src/wallet/wallet2.h +++ b/src/wallet/wallet2.h @@ -525,7 +525,7 @@ namespace tools */ std::vector<address_book_row> get_address_book() const { return m_address_book; } bool add_address_book_row(const cryptonote::account_public_address &address, const crypto::hash &payment_id, const std::string &description); - bool delete_address_book_row(int row_id); + bool delete_address_book_row(std::size_t row_id); uint64_t get_num_rct_outputs(); const transfer_details &get_transfer_details(size_t idx) const; diff --git a/src/wallet/wallet2_api.h b/src/wallet/wallet2_api.h index cd2e7230a..6651b876d 100644 --- a/src/wallet/wallet2_api.h +++ b/src/wallet/wallet2_api.h @@ -137,14 +137,14 @@ struct TransactionHistory */ struct AddressBookRow { public: - AddressBookRow(int _rowId, const std::string &_address, const std::string &_paymentId, const std::string &_description): + AddressBookRow(std::size_t _rowId, const std::string &_address, const std::string &_paymentId, const std::string &_description): m_rowId(_rowId), m_address(_address), m_paymentId(_paymentId), m_description(_description) {} private: - int m_rowId; + std::size_t m_rowId; std::string m_address; std::string m_paymentId; std::string m_description; @@ -153,7 +153,7 @@ public: std::string getAddress() const {return m_address;} std::string getDescription() const {return m_description;} std::string getPaymentId() const {return m_paymentId;} - int getRowId() const {return m_rowId;} + std::size_t getRowId() const {return m_rowId;} }; /** @@ -171,7 +171,7 @@ struct AddressBook virtual ~AddressBook() = 0; virtual std::vector<AddressBookRow*> getAll() const = 0; virtual bool addRow(const std::string &dst_addr , const std::string &payment_id, const std::string &description) = 0; - virtual bool deleteRow(int rowId) = 0; + virtual bool deleteRow(std::size_t rowId) = 0; virtual void refresh() = 0; virtual std::string errorString() const = 0; virtual int errorCode() const = 0; @@ -364,6 +364,15 @@ struct Wallet static std::string paymentIdFromAddress(const std::string &str, bool testnet); static uint64_t maximumAllowedAmount(); + /** + * @brief StartRefresh - Start/resume refresh thread (refresh every 10 seconds) + */ + virtual void startRefresh() = 0; + /** + * @brief pauseRefresh - pause refresh thread + */ + virtual void pauseRefresh() = 0; + /** * @brief refresh - refreshes the wallet, updating transactions from daemon * @return - true if refreshed successfully; |