electrum

Electrum Bitcoin wallet
git clone https://git.parazyd.org/electrum
Log | Files | Refs | Submodules

commit 29b9ffac4a3c7d4b353559cd5e580879f0fb17c7
parent 3dc967782290198467b07088b7ec63dace3e6bf0
Author: ecdsa <ecdsa@github>
Date:   Sun, 24 Mar 2013 07:34:28 +0100

transaction lock

Diffstat:
Mlib/wallet.py | 58++++++++++++++++++++++++++++------------------------------
1 file changed, 28 insertions(+), 30 deletions(-)

diff --git a/lib/wallet.py b/lib/wallet.py @@ -113,6 +113,7 @@ class Wallet: self.up_to_date = False self.lock = threading.Lock() + self.transaction_lock = threading.Lock() self.tx_event = threading.Event() if self.seed_version != SEED_VERSION: @@ -432,8 +433,7 @@ class Wallet: for item in tx.outputs: addr, value = item key = tx_hash+ ':%d'%i - with self.lock: - self.prevout_values[key] = value + self.prevout_values[key] = value i += 1 for item in tx.inputs: @@ -607,19 +607,17 @@ class Wallet: def receive_tx_callback(self, tx_hash, tx, tx_height): + if not self.check_new_tx(tx_hash, tx): # may happen due to pruning print_error("received transaction that is no longer referenced in history", tx_hash) return - with self.lock: + with self.transaction_lock: self.transactions[tx_hash] = tx - - #tx_height = tx.get('height') - if self.verifier and tx_height>0: - self.verifier.add(tx_hash, tx_height) - - self.update_tx_outputs(tx_hash) + if self.verifier and tx_height>0: + self.verifier.add(tx_hash, tx_height) + self.update_tx_outputs(tx_hash) self.save() @@ -641,29 +639,29 @@ class Wallet: def get_tx_history(self): - with self.lock: + with self.transaction_lock: history = self.transactions.items() - history.sort(key = lambda x: self.verifier.verified_tx.get(x[0]) if self.verifier.verified_tx.get(x[0]) else (1e12,0,0)) - result = [] + history.sort(key = lambda x: self.verifier.verified_tx.get(x[0]) if self.verifier.verified_tx.get(x[0]) else (1e12,0,0)) + result = [] - balance = 0 - for tx_hash, tx in history: - is_mine, v, fee = self.get_tx_value(tx) - if v is not None: balance += v - c, u = self.get_balance() - - if balance != c+u: - v_str = format_satoshis( c+u - balance, True, self.num_zeros) - result.append( ('', 1000, 0, c+u-balance, None, c+u-balance, None ) ) - - balance = c + u - balance - for tx_hash, tx in history: - conf, timestamp = self.verifier.get_confirmations(tx_hash) if self.verifier else (None, None) - is_mine, value, fee = self.get_tx_value(tx) - if value is not None: - balance += value - - result.append( (tx_hash, conf, is_mine, value, fee, balance, timestamp) ) + balance = 0 + for tx_hash, tx in history: + is_mine, v, fee = self.get_tx_value(tx) + if v is not None: balance += v + c, u = self.get_balance() + + if balance != c+u: + v_str = format_satoshis( c+u - balance, True, self.num_zeros) + result.append( ('', 1000, 0, c+u-balance, None, c+u-balance, None ) ) + + balance = c + u - balance + for tx_hash, tx in history: + conf, timestamp = self.verifier.get_confirmations(tx_hash) if self.verifier else (None, None) + is_mine, value, fee = self.get_tx_value(tx) + if value is not None: + balance += value + + result.append( (tx_hash, conf, is_mine, value, fee, balance, timestamp) ) return result