electrum

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

commit 7e501115cd4a6790be5b13ff6b4499115b350562
parent 7816edc3428f7148de1b2c4b567408b68c1d25cb
Author: ThomasV <thomasv@electrum.org>
Date:   Sat,  3 Mar 2018 09:59:04 +0100

Merge pull request #4005 from SomberNight/trezor_segwit_offline_signing

trezor: segwit offline signing
Diffstat:
Mlib/network.py | 3++-
Mlib/util.py | 10++++++++++
Mlib/wallet.py | 17++++++++++++-----
Mplugins/trezor/trezor.py | 3+++
4 files changed, 27 insertions(+), 6 deletions(-)

diff --git a/lib/network.py b/lib/network.py @@ -40,6 +40,7 @@ from .bitcoin import * from .interface import Connection, Interface from . import blockchain from .version import ELECTRUM_VERSION, PROTOCOL_VERSION +from .i18n import _ NODES_RETRY_INTERVAL = 60 @@ -1069,7 +1070,7 @@ class Network(util.DaemonThread): try: r = q.get(True, timeout) except queue.Empty: - raise BaseException('Server did not answer') + raise util.TimeoutException(_('Server did not answer')) if r.get('error'): raise BaseException(r.get('error')) return r.get('result') diff --git a/lib/util.py b/lib/util.py @@ -74,6 +74,16 @@ class FileExportFailed(Exception): return _("Failed to export to file.") + "\n" + self.message +class TimeoutException(Exception): + def __init__(self, message=''): + self.message = str(message) + + def __str__(self): + if not self.message: + return _("Operation timed out.") + return self.message + + # Throw this exception to unwind the stack like when an error occurs. # However unlike other exceptions the user won't be informed. class UserCancelled(Exception): diff --git a/lib/wallet.py b/lib/wallet.py @@ -44,7 +44,7 @@ import sys from .i18n import _ from .util import (NotEnoughFunds, PrintError, UserCancelled, profiler, - format_satoshis, NoDynamicFeeEstimates) + format_satoshis, NoDynamicFeeEstimates, TimeoutException) from .bitcoin import * from .version import * @@ -1401,21 +1401,28 @@ class Abstract_Wallet(PrintError): return True return False - def get_input_tx(self, tx_hash): + def get_input_tx(self, tx_hash, ignore_timeout=False): # First look up an input transaction in the wallet where it # will likely be. If co-signing a transaction it may not have # all the input txs, in which case we ask the network. - tx = self.transactions.get(tx_hash) + tx = self.transactions.get(tx_hash, None) if not tx and self.network: request = ('blockchain.transaction.get', [tx_hash]) - tx = Transaction(self.network.synchronous_get(request)) + try: + tx = Transaction(self.network.synchronous_get(request)) + except TimeoutException as e: + self.print_error('getting input txn from network timed out for {}'.format(tx_hash)) + if not ignore_timeout: + raise e return tx def add_hw_info(self, tx): # add previous tx for hw wallets for txin in tx.inputs(): tx_hash = txin['prevout_hash'] - txin['prev_tx'] = self.get_input_tx(tx_hash) + # segwit inputs might not be needed for some hw wallets + ignore_timeout = Transaction.is_segwit_input(txin) + txin['prev_tx'] = self.get_input_tx(tx_hash, ignore_timeout) # add output info for hw wallets info = {} xpubs = self.get_master_public_keys() diff --git a/plugins/trezor/trezor.py b/plugins/trezor/trezor.py @@ -434,6 +434,9 @@ class TrezorPlugin(HW_PluginBase): def electrum_tx_to_txtype(self, tx): t = self.types.TransactionType() + if tx is None: + # probably for segwit input and we don't need this prev txn + return t d = deserialize(tx.raw) t.version = d['version'] t.lock_time = d['lockTime']