tie confirmation icons to payment verifier

This commit is contained in:
ThomasV 2012-10-26 00:40:19 +02:00
parent 46eabd1dab
commit 2a06a5b493
7 changed files with 33 additions and 43 deletions

View File

@ -191,7 +191,10 @@ if __name__ == '__main__':
interface.start()
WalletSynchronizer(wallet, config).start()
WalletVerifier(interface, config, wallet.get_tx_hashes).start()
verifier = WalletVerifier(interface, config, wallet.get_tx_hashes)
verifier.start()
wallet.verifier = verifier
try:
found = config.wallet_file_exists

View File

@ -325,7 +325,7 @@ def run_network_dialog( wallet, parent ):
interface = wallet.interface
if parent:
if interface.is_connected:
status = "Connected to %s:%d\n%d blocks"%(interface.host, interface.port, wallet.blocks)
status = "Connected to %s:%d\n%d blocks"%(interface.host, interface.port, wallet.verifier.height)
else:
status = "Not connected"
else:
@ -1164,25 +1164,19 @@ class ElectrumWindow:
if self.funds_error:
text = "Not enough funds"
elif interface and interface.is_connected:
self.network_button.set_tooltip_text("Connected to %s:%d.\n%d blocks"%(interface.host, interface.port, self.wallet.blocks))
if self.wallet.blocks == -1:
self.status_image.set_from_stock(gtk.STOCK_NO, gtk.ICON_SIZE_MENU)
text = "Connecting..."
elif self.wallet.blocks == 0:
self.status_image.set_from_stock(gtk.STOCK_NO, gtk.ICON_SIZE_MENU)
text = "Server not ready"
elif not self.wallet.up_to_date:
self.network_button.set_tooltip_text("Connected to %s:%d.\n%d blocks"%(interface.host, interface.port, self.wallet.verifier.height))
if not self.wallet.up_to_date:
self.status_image.set_from_stock(gtk.STOCK_REFRESH, gtk.ICON_SIZE_MENU)
text = "Synchronizing..."
else:
self.status_image.set_from_stock(gtk.STOCK_YES, gtk.ICON_SIZE_MENU)
self.network_button.set_tooltip_text("Connected to %s:%d.\n%d blocks"%(interface.host, interface.port, self.wallet.blocks))
self.network_button.set_tooltip_text("Connected to %s:%d.\n%d blocks"%(interface.host, interface.port, self.wallet.verifier.height))
c, u = self.wallet.get_balance()
text = "Balance: %s "%( format_satoshis(c,False,self.wallet.num_zeros) )
if u: text += "[%s unconfirmed]"%( format_satoshis(u,True,self.wallet.num_zeros).strip() )
else:
self.status_image.set_from_stock(gtk.STOCK_NO, gtk.ICON_SIZE_MENU)
self.network_button.set_tooltip_text("Trying to contact %s.\n%d blocks"%(interface.server, self.wallet.blocks))
self.network_button.set_tooltip_text("Not connected.")
text = "Not connected"
self.status_bar.pop(self.context_id)
@ -1231,7 +1225,7 @@ class ElectrumWindow:
for tx in self.wallet.get_tx_history():
tx_hash = tx['tx_hash']
if tx['height']:
conf = self.wallet.blocks - tx['height'] + 1
conf = self.wallet.verifier.get_confirmations(tx_hash)
time_str = datetime.datetime.fromtimestamp( tx['timestamp']).isoformat(' ')[:-3]
conf_icon = gtk.STOCK_APPLY
else:

View File

@ -821,8 +821,6 @@ class MiniDriver(QObject):
self.initializing()
elif not self.wallet.interface.is_connected:
self.connecting()
elif not self.wallet.blocks == -1:
self.connecting()
elif not self.wallet.up_to_date:
self.synchronizing()
else:

View File

@ -277,13 +277,7 @@ class ElectrumWindow(QMainWindow):
def update_wallet(self):
if self.wallet.interface and self.wallet.interface.is_connected:
if self.wallet.blocks == -1:
text = _( "Connecting..." )
icon = QIcon(":icons/status_disconnected.png")
elif self.wallet.blocks == 0:
text = _( "Server not ready" )
icon = QIcon(":icons/status_disconnected.png")
elif not self.wallet.up_to_date:
if not self.wallet.up_to_date:
text = _( "Synchronizing..." )
icon = QIcon(":icons/status_waiting.png")
else:
@ -339,7 +333,7 @@ class ElectrumWindow(QMainWindow):
tx = self.wallet.tx_history.get(tx_hash)
if tx['height']:
conf = self.wallet.blocks - tx['height'] + 1
conf = self.wallet.verifier.get_confirmations(tx_hash)
time_str = datetime.datetime.fromtimestamp( tx['timestamp']).isoformat(' ')[:-3]
else:
conf = 0
@ -441,7 +435,7 @@ class ElectrumWindow(QMainWindow):
for tx in self.wallet.get_tx_history():
tx_hash = tx['tx_hash']
if tx['height']:
conf = self.wallet.blocks - tx['height'] + 1
conf = self.wallet.verifier.get_confirmations(tx_hash)
time_str = datetime.datetime.fromtimestamp( tx['timestamp']).isoformat(' ')[:-3]
if conf < 6:
icon = QIcon(":icons/clock%d.png"%conf)
@ -1367,7 +1361,7 @@ class ElectrumWindow(QMainWindow):
interface = wallet.interface
if parent:
if interface.is_connected:
status = _("Connected to")+" %s\n%d blocks"%(interface.host, wallet.blocks)
status = _("Connected to")+" %s\n%d blocks"%(interface.host, wallet.verifier.height)
else:
status = _("Not connected")
else:

View File

@ -104,8 +104,12 @@ class SimpleConfig:
# try to fix the type
if default is not None and type(out) != type(default):
import ast
out = ast.literal_eval(out)
try:
out = ast.literal_eval(out)
except:
print "type error, using default value"
out = default
return out

View File

@ -33,17 +33,17 @@ class WalletVerifier(threading.Thread):
self.interface = interface
self.get_transactions = get_transactions
self.interface.register_channel('verifier')
self.verified_tx = config.get('verified_tx',[])
self.verified_tx = config.get('verified_tx',{})
self.merkle_roots = config.get('merkle_roots',{}) # hashed by me
self.targets = config.get('targets',{}) # compute targets
self.lock = threading.Lock()
self.pending_headers = [] # headers that have not been verified
self.height = 0
self.local_height = 0
self.set_local_numblocks()
self.set_local_height()
def get_confirmations(self, tx):
return (self.local_height - self.verified_tx[tx] + 1) if tx in self.verified_tx else None
def run(self):
requested_merkle = []
@ -138,7 +138,7 @@ class WalletVerifier(threading.Thread):
header = self.read_header(tx_height)
if header:
assert header.get('merkle_root') == self.merkle_roots[tx_hash]
self.verified_tx.append(tx_hash)
self.verified_tx[tx_hash] = tx_height
print "verified", tx_hash
self.config.set_key('verified_tx', self.verified_tx, True)
@ -257,7 +257,7 @@ class WalletVerifier(threading.Thread):
f.seek(index*2016*80)
h = f.write(chunk)
f.close()
self.set_local_numblocks()
self.set_local_height()
def save_header(self, header):
data = self.header_to_string(header).decode('hex')
@ -268,13 +268,16 @@ class WalletVerifier(threading.Thread):
f.seek(height*80)
h = f.write(data)
f.close()
self.set_local_numblocks()
self.set_local_height()
def set_local_numblocks(self):
def set_local_height(self):
name = self.path()
if os.path.exists(name):
self.local_height = os.path.getsize(name)/80 - 1
# print "local height", self.local_height, os.path.getsize(name)/80.
h = os.path.getsize(name)/80 - 1
if self.local_height != h:
self.local_height = h
self.interface.trigger_callback('updated')
def read_header(self, block_height):

View File

@ -78,7 +78,6 @@ class Wallet:
self.receipt = None # next receipt
self.tx_history = {}
self.was_updated = True
self.blocks = -1
self.banner = ''
# there is a difference between wallet.up_to_date and interface.is_up_to_date()
@ -868,7 +867,6 @@ class WalletSynchronizer(threading.Thread):
self.interface.send([('server.banner',[])],'synchronizer')
# subscriptions
self.interface.send([('blockchain.numblocks.subscribe',[])], 'synchronizer')
self.interface.send([('server.peers.subscribe',[])],'synchronizer')
self.subscribe_to_addresses(self.wallet.all_addresses())
@ -903,10 +901,6 @@ class WalletSynchronizer(threading.Thread):
self.wallet.tx_result = result
self.wallet.tx_event.set()
elif method == 'blockchain.numblocks.subscribe':
self.wallet.blocks = result
self.wallet.was_updated = True
elif method == 'server.version':
pass