Browse Source

wallet: towards restoring previous performance

sqlite_db
SomberNight 6 years ago
parent
commit
2ad73050b3
No known key found for this signature in database GPG Key ID: B33B5F232C6271E9
  1. 21
      electrum/address_synchronizer.py
  2. 7
      electrum/json_db.py
  3. 1
      electrum/storage.py
  4. 2
      electrum/synchronizer.py
  5. 4
      electrum/wallet.py

21
electrum/address_synchronizer.py

@ -183,7 +183,7 @@ class AddressSynchronizer(PrintError):
if spending_tx_hash is None: if spending_tx_hash is None:
continue continue
# this outpoint has already been spent, by spending_tx # this outpoint has already been spent, by spending_tx
assert spending_tx_hash in self.db.list_transactions() assert self.db.get_transaction(spending_tx_hash)
conflicting_txns |= {spending_tx_hash} conflicting_txns |= {spending_tx_hash}
if tx_hash in conflicting_txns: if tx_hash in conflicting_txns:
# this tx is already in history, so it conflicts with itself # this tx is already in history, so it conflicts with itself
@ -374,22 +374,21 @@ class AddressSynchronizer(PrintError):
def remove_local_transactions_we_dont_have(self): def remove_local_transactions_we_dont_have(self):
for txid in itertools.chain(self.db.list_txi(), self.db.list_txo()): for txid in itertools.chain(self.db.list_txi(), self.db.list_txo()):
tx_height = self.get_tx_height(txid).height tx_height = self.get_tx_height(txid).height
if tx_height == TX_HEIGHT_LOCAL and txid not in self.db.list_transactions(): if tx_height == TX_HEIGHT_LOCAL and not self.db.get_transaction(txid):
self.remove_transaction(txid) self.remove_transaction(txid)
def clear_history(self): def clear_history(self):
with self.lock: with self.lock:
with self.transaction_lock: with self.transaction_lock:
self.db.clear_history() self.db.clear_history()
self.storage.modified = True # FIXME hack..
self.storage.write() self.storage.write()
def get_txpos(self, tx_hash): def get_txpos(self, tx_hash):
"""Returns (height, txpos) tuple, even if the tx is unverified.""" """Returns (height, txpos) tuple, even if the tx is unverified."""
with self.lock: with self.lock:
if tx_hash in self.db.list_verified_tx(): verified_tx_mined_info = self.db.get_verified_tx(tx_hash)
info = self.db.get_verified_tx(tx_hash) if verified_tx_mined_info:
return info.height, info.txpos return verified_tx_mined_info.height, verified_tx_mined_info.txpos
elif tx_hash in self.unverified_tx: elif tx_hash in self.unverified_tx:
height = self.unverified_tx[tx_hash] height = self.unverified_tx[tx_hash]
return (height, 0) if height > 0 else ((1e9 - height), 0) return (height, 0) if height > 0 else ((1e9 - height), 0)
@ -485,7 +484,7 @@ class AddressSynchronizer(PrintError):
await self._address_history_changed_events[addr].wait() await self._address_history_changed_events[addr].wait()
def add_unverified_tx(self, tx_hash, tx_height): def add_unverified_tx(self, tx_hash, tx_height):
if tx_hash in self.db.list_verified_tx(): if self.db.is_in_verified_tx(tx_hash):
if tx_height in (TX_HEIGHT_UNCONFIRMED, TX_HEIGHT_UNCONF_PARENT): if tx_height in (TX_HEIGHT_UNCONFIRMED, TX_HEIGHT_UNCONF_PARENT):
with self.lock: with self.lock:
self.db.remove_verified_tx(tx_hash) self.db.remove_verified_tx(tx_hash)
@ -548,10 +547,10 @@ class AddressSynchronizer(PrintError):
def get_tx_height(self, tx_hash: str) -> TxMinedInfo: def get_tx_height(self, tx_hash: str) -> TxMinedInfo:
with self.lock: with self.lock:
if tx_hash in self.db.list_verified_tx(): verified_tx_mined_info = self.db.get_verified_tx(tx_hash)
info = self.db.get_verified_tx(tx_hash) if verified_tx_mined_info:
conf = max(self.get_local_height() - info.height + 1, 0) conf = max(self.get_local_height() - verified_tx_mined_info.height + 1, 0)
return info._replace(conf=conf) return verified_tx_mined_info._replace(conf=conf)
elif tx_hash in self.unverified_tx: elif tx_hash in self.unverified_tx:
height = self.unverified_tx[tx_hash] height = self.unverified_tx[tx_hash]
return TxMinedInfo(height=height, conf=0) return TxMinedInfo(height=height, conf=0)

7
electrum/json_db.py

@ -28,7 +28,7 @@ import json
import copy import copy
import threading import threading
from collections import defaultdict from collections import defaultdict
from typing import Dict from typing import Dict, Optional
from . import util, bitcoin from . import util, bitcoin
from .util import PrintError, profiler, WalletFileException, multisig_type, TxMinedInfo from .util import PrintError, profiler, WalletFileException, multisig_type, TxMinedInfo
@ -585,7 +585,7 @@ class JsonDB(PrintError):
return Transaction(tx) if tx else None return Transaction(tx) if tx else None
@locked @locked
def get_transaction(self, tx_hash): def get_transaction(self, tx_hash) -> Optional[Transaction]:
tx = self.transactions.get(tx_hash) tx = self.transactions.get(tx_hash)
return Transaction(tx) if tx else None return Transaction(tx) if tx else None
@ -632,6 +632,9 @@ class JsonDB(PrintError):
def remove_verified_tx(self, txid): def remove_verified_tx(self, txid):
self.verified_tx.pop(txid, None) self.verified_tx.pop(txid, None)
def is_in_verified_tx(self, txid):
return txid in self.verified_tx
@modifier @modifier
def update_tx_fees(self, d): def update_tx_fees(self, d):
return self.tx_fees.update(d) return self.tx_fees.update(d)

1
electrum/storage.py

@ -234,7 +234,6 @@ class WalletStorage(PrintError):
storage = WalletStorage(path) storage = WalletStorage(path)
storage.db.data = data storage.db.data = data
storage.db.upgrade() storage.db.upgrade()
storage.modified = True
storage.write() storage.write()
out.append(path) out.append(path)
return out return out

2
electrum/synchronizer.py

@ -175,7 +175,7 @@ class Synchronizer(SynchronizerBase):
for tx_hash, tx_height in hist: for tx_hash, tx_height in hist:
if tx_hash in self.requested_tx: if tx_hash in self.requested_tx:
continue continue
if tx_hash in self.wallet.db.list_transactions(): if self.wallet.db.get_transaction(tx_hash):
continue continue
transaction_hashes.append(tx_hash) transaction_hashes.append(tx_hash)
self.requested_tx[tx_hash] = tx_height self.requested_tx[tx_hash] = tx_height

4
electrum/wallet.py

@ -278,7 +278,7 @@ class Abstract_Wallet(AddressSynchronizer):
return changed return changed
def set_fiat_value(self, txid, ccy, text, fx, value_sat): def set_fiat_value(self, txid, ccy, text, fx, value_sat):
if txid not in self.db.list_transactions(): if not self.db.get_transaction(txid):
return return
# since fx is inserting the thousands separator, # since fx is inserting the thousands separator,
# and not util, also have fx remove it # and not util, also have fx remove it
@ -360,7 +360,7 @@ class Abstract_Wallet(AddressSynchronizer):
height = conf = timestamp = None height = conf = timestamp = None
tx_hash = tx.txid() tx_hash = tx.txid()
if tx.is_complete(): if tx.is_complete():
if tx_hash in self.db.list_transactions(): if self.db.get_transaction(tx_hash):
label = self.get_label(tx_hash) label = self.get_label(tx_hash)
tx_mined_status = self.get_tx_height(tx_hash) tx_mined_status = self.get_tx_height(tx_hash)
height, conf = tx_mined_status.height, tx_mined_status.conf height, conf = tx_mined_status.height, tx_mined_status.conf

Loading…
Cancel
Save