commit ee4de40c375b5ec0bfa247e8dd39eea804bfdcf1
parent e20e40829d6795b6aa80b131b4102609b025af22
Author: thomasv <thomasv@gitorious>
Date: Fri, 26 Oct 2012 10:02:09 +0200
use WalletVerifier.add() method to register transactions
Diffstat:
3 files changed, 21 insertions(+), 11 deletions(-)
diff --git a/electrum b/electrum
@@ -207,8 +207,8 @@ if __name__ == '__main__':
if not found:
exit(1)
- verifier = WalletVerifier(interface, config, wallet.get_tx_hashes)
- wallet.verifier = verifier
+ verifier = WalletVerifier(interface, config)
+ wallet.set_verifier(verifier)
verifier.start()
gui.main(url)
diff --git a/lib/verifier.py b/lib/verifier.py
@@ -26,12 +26,12 @@ from bitcoin import *
class WalletVerifier(threading.Thread):
- def __init__(self, interface, config, get_transactions):
+ def __init__(self, interface, config):
threading.Thread.__init__(self)
self.daemon = True
self.config = config
self.interface = interface
- self.get_transactions = get_transactions
+ self.transactions = [] # monitored transactions
self.interface.register_channel('verifier')
self.verified_tx = config.get('verified_tx',{})
self.merkle_roots = config.get('merkle_roots',{}) # hashed by me
@@ -45,6 +45,11 @@ class WalletVerifier(threading.Thread):
def get_confirmations(self, tx):
return (self.local_height - self.verified_tx[tx] + 1) if tx in self.verified_tx else 0
+ def add(self, tx):
+ with self.lock:
+ if tx not in self.transactions:
+ self.transactions.append(tx)
+
def run(self):
requested_merkle = []
requested_chunks = []
@@ -75,8 +80,7 @@ class WalletVerifier(threading.Thread):
requested_headers.append(i)
# request missing tx merkle
- txlist = self.get_transactions()
- for tx in txlist:
+ for tx in self.transactions:
if tx not in self.verified_tx:
if tx not in requested_merkle:
requested_merkle.append(tx)
diff --git a/lib/wallet.py b/lib/wallet.py
@@ -80,6 +80,9 @@ class Wallet:
self.was_updated = True
self.banner = ''
+ # spv
+ self.verifier = None
+
# there is a difference between wallet.up_to_date and interface.is_up_to_date()
# interface.is_up_to_date() returns true when all requests have been answered and processed
# wallet.up_to_date is true when the wallet is synchronized (stronger requirement)
@@ -498,11 +501,6 @@ class Wallet:
lines = sorted(lines, key=operator.itemgetter("timestamp"))
return lines
- def get_tx_hashes(self):
- with self.lock:
- hashes = self.tx_history.keys()
- return hashes
-
def get_transactions_at_height(self, height):
with self.lock:
values = self.tx_history.values()[:]
@@ -522,6 +520,7 @@ class Wallet:
tx_hash = tx['tx_hash']
line = self.tx_history.get(tx_hash)
if not line:
+ if self.verifier: self.verifier.add(tx_hash)
self.tx_history[tx_hash] = copy.copy(tx)
line = self.tx_history.get(tx_hash)
else:
@@ -816,6 +815,13 @@ class Wallet:
self.config.set_key(k,v)
self.config.save()
+ def set_verifier(self, verifier):
+ self.verifier = verifier
+ with self.lock:
+ for tx in self.tx_history.keys():
+ self.verifier.add(tx)
+
+