From 059a4fff5c85588b69bb9bf6a0d920bd37b832e4 Mon Sep 17 00:00:00 2001 From: zebra-lucky Date: Sun, 5 Aug 2018 23:30:58 +0300 Subject: [PATCH 001/138] fix ecc_fast.py for win64 (#4606) --- electrum/ecc_fast.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/electrum/ecc_fast.py b/electrum/ecc_fast.py index 72f9b143..77673027 100644 --- a/electrum/ecc_fast.py +++ b/electrum/ecc_fast.py @@ -72,6 +72,9 @@ def load_library(): secp256k1.secp256k1_ecdsa_signature_parse_compact.argtypes = [c_void_p, c_char_p, c_char_p] secp256k1.secp256k1_ecdsa_signature_parse_compact.restype = c_int + secp256k1.secp256k1_ecdsa_signature_normalize.argtypes = [c_void_p, c_char_p, c_char_p] + secp256k1.secp256k1_ecdsa_signature_normalize.restype = c_int + secp256k1.secp256k1_ecdsa_signature_serialize_compact.argtypes = [c_void_p, c_char_p, c_char_p] secp256k1.secp256k1_ecdsa_signature_serialize_compact.restype = c_int From 91bcc5f560d1ac692069b4179755365388c81131 Mon Sep 17 00:00:00 2001 From: tiagotrs Date: Tue, 7 Aug 2018 16:33:58 +0200 Subject: [PATCH 002/138] fix problems with hidpi monitors issue #4576, ensure PNGS are precise the same size. --- electrum/plugins/revealer/qt.py | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/electrum/plugins/revealer/qt.py b/electrum/plugins/revealer/qt.py index 198d1cc4..36b7de09 100644 --- a/electrum/plugins/revealer/qt.py +++ b/electrum/plugins/revealer/qt.py @@ -263,20 +263,21 @@ class Plugin(BasePlugin): painter.begin(bitmap) QFontDatabase.addApplicationFont(os.path.join(os.path.dirname(__file__), 'SourceSansPro-Bold.otf') ) if len(txt) < 102 : - fontsize = 12 + fontsize = 15 linespace = 15 max_letters = 17 max_lines = 6 max_words = 3 else: - fontsize = 9 + fontsize = 12 linespace = 10 - max_letters = 24 + max_letters = 23 max_lines = 9 max_words = int(max_letters/4) font = QFont('Source Sans Pro', fontsize, QFont.Bold) font.setLetterSpacing(QFont.PercentageSpacing, 100) + font.setPixelSize(fontsize) painter.setFont(font) seed_array = txt.split(' ') @@ -339,8 +340,9 @@ class Plugin(BasePlugin): revealer = self.pixelcode_2x2(self.rawnoise) revealer.invertPixels() revealer = QBitmap.fromImage(revealer) + revealer = revealer.scaled(self.f_size, Qt.KeepAspectRatio) revealer = self.overlay_marks(revealer) - revealer = revealer.scaled(1014, 642) + self.filename = 'Revealer - ' revealer.save(self.base_dir + self.filename + self.version+'_'+self.code_id + '.png') self.toPdf(QImage(revealer)) @@ -519,6 +521,7 @@ class Plugin(BasePlugin): f_size = 37 QFontDatabase.addApplicationFont(os.path.join(os.path.dirname(__file__), 'DejaVuSansMono-Bold.ttf')) font = QFont("DejaVu Sans Mono", f_size-11, QFont.Bold) + font.setPixelSize(35) painter.setFont(font) if not calibration_sheet: From deee29228ea31e47bc6b24167b5139e42e72a11b Mon Sep 17 00:00:00 2001 From: Johann Bauer Date: Thu, 9 Aug 2018 20:42:48 +0200 Subject: [PATCH 003/138] Travis: Use 3.7 to run tests too --- .travis.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 63dde547..6f28247b 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,8 +1,10 @@ -sudo: false +sudo: true +dist: xenial language: python python: - 3.5 - 3.6 + - 3.7 addons: apt: sources: From 820316e74526524dcdd138cfeff322bb728a16e4 Mon Sep 17 00:00:00 2001 From: SomberNight Date: Tue, 14 Aug 2018 13:33:32 +0200 Subject: [PATCH 004/138] safe_t: disable udp transport as it was interfering with trezor emulator --- electrum/plugins/safe_t/transport.py | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/electrum/plugins/safe_t/transport.py b/electrum/plugins/safe_t/transport.py index 59dc915f..3753434d 100644 --- a/electrum/plugins/safe_t/transport.py +++ b/electrum/plugins/safe_t/transport.py @@ -24,11 +24,11 @@ class SafeTTransport(PrintError): transports.append(HidTransport) except BaseException: pass - try: - from safetlib.transport_udp import UdpTransport - transports.append(UdpTransport) - except BaseException: - pass + #try: + # from safetlib.transport_udp import UdpTransport + # transports.append(UdpTransport) + #except BaseException: + # pass try: from safetlib.transport_webusb import WebUsbTransport transports.append(WebUsbTransport) @@ -47,11 +47,11 @@ class SafeTTransport(PrintError): transports.append(HidTransport) except BaseException: pass - try: - from safetlib.transport.udp import UdpTransport - transports.append(UdpTransport) - except BaseException: - pass + #try: + # from safetlib.transport.udp import UdpTransport + # transports.append(UdpTransport) + #except BaseException: + # pass try: from safetlib.transport.webusb import WebUsbTransport transports.append(WebUsbTransport) From 93578d9be22720780616e06805241aa6935b5def Mon Sep 17 00:00:00 2001 From: SomberNight Date: Tue, 14 Aug 2018 14:59:55 +0200 Subject: [PATCH 005/138] wallet: is_mine should not depend on history keys this makes clear_history work --- electrum/wallet.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/electrum/wallet.py b/electrum/wallet.py index c9fef88b..1cf486cf 100644 --- a/electrum/wallet.py +++ b/electrum/wallet.py @@ -272,8 +272,6 @@ class Abstract_Wallet(AddressSynchronizer): return def is_mine(self, address): - if not super().is_mine(address): - return False try: self.get_address_index(address) except KeyError: From 52a4810752c37312aeb7cb4739b5462dfdde2c58 Mon Sep 17 00:00:00 2001 From: SomberNight Date: Tue, 14 Aug 2018 15:02:31 +0200 Subject: [PATCH 006/138] trezor: add "show address" option in addresses tab context menu for all trezors in case of a multisig wallet, with multiple trezors, previously only one of the trezors could be used --- electrum/plugins/safe_t/qt.py | 6 +++--- electrum/plugins/trezor/qt.py | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/electrum/plugins/safe_t/qt.py b/electrum/plugins/safe_t/qt.py index b9580aa1..a9114f2d 100644 --- a/electrum/plugins/safe_t/qt.py +++ b/electrum/plugins/safe_t/qt.py @@ -76,10 +76,10 @@ class QtPlugin(QtPluginBase): return for keystore in wallet.get_keystores(): if type(keystore) == self.keystore_class: - def show_address(): + def show_address(keystore=keystore): keystore.thread.add(partial(self.show_address, wallet, addrs[0], keystore)) - menu.addAction(_("Show on {}").format(self.device), show_address) - break + device_name = "{} ({})".format(self.device, keystore.label) + menu.addAction(_("Show on {}").format(device_name), show_address) def show_settings_dialog(self, window, keystore): device_id = self.choose_device(window, keystore) diff --git a/electrum/plugins/trezor/qt.py b/electrum/plugins/trezor/qt.py index 53340b94..04632817 100644 --- a/electrum/plugins/trezor/qt.py +++ b/electrum/plugins/trezor/qt.py @@ -171,10 +171,10 @@ class QtPlugin(QtPluginBase): return for keystore in wallet.get_keystores(): if type(keystore) == self.keystore_class: - def show_address(): + def show_address(keystore=keystore): keystore.thread.add(partial(self.show_address, wallet, addrs[0], keystore)) - menu.addAction(_("Show on {}").format(self.device), show_address) - break + device_name = "{} ({})".format(self.device, keystore.label) + menu.addAction(_("Show on {}").format(device_name), show_address) def show_settings_dialog(self, window, keystore): device_id = self.choose_device(window, keystore) From b4b1de088ab88fe0e01b9f19ff48da9d71eac334 Mon Sep 17 00:00:00 2001 From: SomberNight Date: Tue, 14 Aug 2018 18:19:16 +0200 Subject: [PATCH 007/138] move TrezorClient.expand_path to bitcoin.py and allow its input to end with a '/' slash --- electrum/base_wizard.py | 1 + electrum/bitcoin.py | 20 +++++++++++++++++++- electrum/plugins/keepkey/clientbase.py | 18 ++---------------- electrum/plugins/safe_t/clientbase.py | 18 ++---------------- electrum/plugins/trezor/clientbase.py | 18 ++---------------- electrum/tests/test_bitcoin.py | 7 ++++++- 6 files changed, 32 insertions(+), 50 deletions(-) diff --git a/electrum/base_wizard.py b/electrum/base_wizard.py index 8e130a7a..fa8193fd 100644 --- a/electrum/base_wizard.py +++ b/electrum/base_wizard.py @@ -346,6 +346,7 @@ class BaseWizard(object): except ScriptTypeNotSupported: raise # this is handled in derivation_dialog except BaseException as e: + traceback.print_exc(file=sys.stderr) self.show_error(e) return d = { diff --git a/electrum/bitcoin.py b/electrum/bitcoin.py index 1fe405fe..f1025f47 100644 --- a/electrum/bitcoin.py +++ b/electrum/bitcoin.py @@ -24,7 +24,7 @@ # SOFTWARE. import hashlib -import hmac +from typing import List from .util import bfh, bh2u, BitcoinException, print_error, assert_bytes, to_bytes, inv_dict from . import version @@ -708,6 +708,24 @@ def bip32_derivation(s): i = int(n[:-1]) + BIP32_PRIME if n[-1] == "'" else int(n) yield i +def convert_bip32_path_to_list_of_uint32(n: str) -> List[int]: + """Convert bip32 path to list of uint32 integers with prime flags + m/0/-1/1' -> [0, 0x80000001, 0x80000001] + + based on code in trezorlib + """ + path = [] + for x in n.split('/')[1:]: + if x == '': continue + prime = 0 + if x.endswith("'"): + x = x.replace('\'', '') + prime = BIP32_PRIME + if x.startswith('-'): + prime = BIP32_PRIME + path.append(abs(int(x)) | prime) + return path + def is_bip32_derivation(x): try: [ i for i in bip32_derivation(x)] diff --git a/electrum/plugins/keepkey/clientbase.py b/electrum/plugins/keepkey/clientbase.py index e1c7b2aa..f4e46d15 100644 --- a/electrum/plugins/keepkey/clientbase.py +++ b/electrum/plugins/keepkey/clientbase.py @@ -4,7 +4,7 @@ from struct import pack from electrum.i18n import _ from electrum.util import PrintError, UserCancelled from electrum.keystore import bip39_normalize_passphrase -from electrum.bitcoin import serialize_xpub +from electrum.bitcoin import serialize_xpub, convert_bip32_path_to_list_of_uint32 class GuiMixin(object): @@ -141,21 +141,7 @@ class KeepKeyClientBase(GuiMixin, PrintError): @staticmethod def expand_path(n): - '''Convert bip32 path to list of uint32 integers with prime flags - 0/-1/1' -> [0, 0x80000001, 0x80000001]''' - # This code is similar to code in trezorlib where it unfortunately - # is not declared as a staticmethod. Our n has an extra element. - PRIME_DERIVATION_FLAG = 0x80000000 - path = [] - for x in n.split('/')[1:]: - prime = 0 - if x.endswith("'"): - x = x.replace('\'', '') - prime = PRIME_DERIVATION_FLAG - if x.startswith('-'): - prime = PRIME_DERIVATION_FLAG - path.append(abs(int(x)) | prime) - return path + return convert_bip32_path_to_list_of_uint32(n) def cancel(self): '''Provided here as in keepkeylib but not trezorlib.''' diff --git a/electrum/plugins/safe_t/clientbase.py b/electrum/plugins/safe_t/clientbase.py index 68a4544c..da383809 100644 --- a/electrum/plugins/safe_t/clientbase.py +++ b/electrum/plugins/safe_t/clientbase.py @@ -4,7 +4,7 @@ from struct import pack from electrum.i18n import _ from electrum.util import PrintError, UserCancelled from electrum.keystore import bip39_normalize_passphrase -from electrum.bitcoin import serialize_xpub +from electrum.bitcoin import serialize_xpub, convert_bip32_path_to_list_of_uint32 class GuiMixin(object): @@ -143,21 +143,7 @@ class SafeTClientBase(GuiMixin, PrintError): @staticmethod def expand_path(n): - '''Convert bip32 path to list of uint32 integers with prime flags - 0/-1/1' -> [0, 0x80000001, 0x80000001]''' - # This code is similar to code in safetlib where it unfortunately - # is not declared as a staticmethod. Our n has an extra element. - PRIME_DERIVATION_FLAG = 0x80000000 - path = [] - for x in n.split('/')[1:]: - prime = 0 - if x.endswith("'"): - x = x.replace('\'', '') - prime = PRIME_DERIVATION_FLAG - if x.startswith('-'): - prime = PRIME_DERIVATION_FLAG - path.append(abs(int(x)) | prime) - return path + return convert_bip32_path_to_list_of_uint32(n) def cancel(self): '''Provided here as in keepkeylib but not safetlib.''' diff --git a/electrum/plugins/trezor/clientbase.py b/electrum/plugins/trezor/clientbase.py index b91e4af4..cb6ccc5e 100644 --- a/electrum/plugins/trezor/clientbase.py +++ b/electrum/plugins/trezor/clientbase.py @@ -4,7 +4,7 @@ from struct import pack from electrum.i18n import _ from electrum.util import PrintError, UserCancelled from electrum.keystore import bip39_normalize_passphrase -from electrum.bitcoin import serialize_xpub +from electrum.bitcoin import serialize_xpub, convert_bip32_path_to_list_of_uint32 class GuiMixin(object): @@ -152,21 +152,7 @@ class TrezorClientBase(GuiMixin, PrintError): @staticmethod def expand_path(n): - '''Convert bip32 path to list of uint32 integers with prime flags - 0/-1/1' -> [0, 0x80000001, 0x80000001]''' - # This code is similar to code in trezorlib where it unfortunately - # is not declared as a staticmethod. Our n has an extra element. - PRIME_DERIVATION_FLAG = 0x80000000 - path = [] - for x in n.split('/')[1:]: - prime = 0 - if x.endswith("'"): - x = x.replace('\'', '') - prime = PRIME_DERIVATION_FLAG - if x.startswith('-'): - prime = PRIME_DERIVATION_FLAG - path.append(abs(int(x)) | prime) - return path + return convert_bip32_path_to_list_of_uint32(n) def cancel(self): '''Provided here as in keepkeylib but not trezorlib.''' diff --git a/electrum/tests/test_bitcoin.py b/electrum/tests/test_bitcoin.py index 8c01f774..c63592d6 100644 --- a/electrum/tests/test_bitcoin.py +++ b/electrum/tests/test_bitcoin.py @@ -11,7 +11,7 @@ from electrum.bitcoin import ( deserialize_privkey, serialize_privkey, is_segwit_address, is_b58_address, address_to_scripthash, is_minikey, is_compressed, is_xpub, xpub_type, is_xprv, is_bip32_derivation, seed_type, EncodeBase58Check, - script_num_to_hex, push_script, add_number_to_script, int_to_hex) + script_num_to_hex, push_script, add_number_to_script, int_to_hex, convert_bip32_path_to_list_of_uint32) from electrum import ecc, crypto, constants from electrum.ecc import number_to_string, string_to_number from electrum.transaction import opcodes @@ -470,6 +470,11 @@ class Test_xprv_xpub(SequentialTestCase): self.assertFalse(is_bip32_derivation("")) self.assertFalse(is_bip32_derivation("m/q8462")) + def test_convert_bip32_path_to_list_of_uint32(self): + self.assertEqual([0, 0x80000001, 0x80000001], convert_bip32_path_to_list_of_uint32("m/0/-1/1'")) + self.assertEqual([], convert_bip32_path_to_list_of_uint32("m/")) + self.assertEqual([2147483692, 2147488889, 221], convert_bip32_path_to_list_of_uint32("m/44'/5241'/221")) + def test_xtype_from_derivation(self): self.assertEqual('standard', xtype_from_derivation("m/44'")) self.assertEqual('standard', xtype_from_derivation("m/44'/")) From 5f3408dd70f39db363abe7296df814e2cb100332 Mon Sep 17 00:00:00 2001 From: SomberNight Date: Tue, 14 Aug 2018 19:15:15 +0200 Subject: [PATCH 008/138] transaction.py: introduce TxOutputHwInfo namedtuple --- electrum/plugins/digitalbitbox/digitalbitbox.py | 2 +- electrum/plugins/hw_wallet/plugin.py | 2 +- electrum/plugins/keepkey/keepkey.py | 7 +++---- electrum/plugins/ledger/ledger.py | 2 +- electrum/plugins/safe_t/safe_t.py | 7 +++---- electrum/plugins/trezor/trezor.py | 7 +++---- electrum/transaction.py | 7 ++++++- electrum/wallet.py | 5 +++-- 8 files changed, 21 insertions(+), 18 deletions(-) diff --git a/electrum/plugins/digitalbitbox/digitalbitbox.py b/electrum/plugins/digitalbitbox/digitalbitbox.py index 441d33b2..c2ccdc4e 100644 --- a/electrum/plugins/digitalbitbox/digitalbitbox.py +++ b/electrum/plugins/digitalbitbox/digitalbitbox.py @@ -538,7 +538,7 @@ class DigitalBitbox_KeyStore(Hardware_KeyStore): assert o.type == TYPE_ADDRESS info = tx.output_info.get(o.address) if info is not None: - index, xpubs, m = info + index = info.address_index changePath = self.get_derivation() + "/%d/%d" % index changePubkey = self.derive_pubkey(index[0], index[1]) pubkeyarray_i = {'pubkey': changePubkey, 'keypath': changePath} diff --git a/electrum/plugins/hw_wallet/plugin.py b/electrum/plugins/hw_wallet/plugin.py index 9d2e32ac..bde6928c 100644 --- a/electrum/plugins/hw_wallet/plugin.py +++ b/electrum/plugins/hw_wallet/plugin.py @@ -85,7 +85,7 @@ def is_any_tx_output_on_change_branch(tx): for _type, address, amount in tx.outputs(): info = tx.output_info.get(address) if info is not None: - index, xpubs, m = info + index, xpubs, m = info.address_index, info.sorted_xpubs, info.num_sig if index[0] == 1: return True return False diff --git a/electrum/plugins/keepkey/keepkey.py b/electrum/plugins/keepkey/keepkey.py index 66a208a4..097aea33 100644 --- a/electrum/plugins/keepkey/keepkey.py +++ b/electrum/plugins/keepkey/keepkey.py @@ -351,8 +351,7 @@ class KeepKeyPlugin(HW_PluginBase): def tx_outputs(self, derivation, tx, segwit=False): - def create_output_by_derivation(info): - index, xpubs, m = info + def create_output_by_derivation(): if len(xpubs) == 1: script_type = self.types.PAYTOP2SHWITNESS if segwit else self.types.PAYTOADDRESS address_n = self.client_class.expand_path(derivation + "/%d/%d" % index) @@ -407,7 +406,7 @@ class KeepKeyPlugin(HW_PluginBase): info = tx.output_info.get(address) if info is not None and not has_change: - index, xpubs, m = info + index, xpubs, m = info.address_index, info.sorted_xpubs, info.num_sig on_change_branch = index[0] == 1 # prioritise hiding outputs on the 'change' branch from user # because no more than one change address allowed @@ -416,7 +415,7 @@ class KeepKeyPlugin(HW_PluginBase): has_change = True if use_create_by_derivation: - txoutputtype = create_output_by_derivation(info) + txoutputtype = create_output_by_derivation() else: txoutputtype = create_output_by_address() outputs.append(txoutputtype) diff --git a/electrum/plugins/ledger/ledger.py b/electrum/plugins/ledger/ledger.py index 939a7a5a..cdac591e 100644 --- a/electrum/plugins/ledger/ledger.py +++ b/electrum/plugins/ledger/ledger.py @@ -399,7 +399,7 @@ class Ledger_KeyStore(Hardware_KeyStore): info = tx.output_info.get(o.address) if (info is not None) and len(tx.outputs()) > 1 \ and not has_change: - index, xpubs, m = info + index = info.address_index on_change_branch = index[0] == 1 # prioritise hiding outputs on the 'change' branch from user # because no more than one change address allowed diff --git a/electrum/plugins/safe_t/safe_t.py b/electrum/plugins/safe_t/safe_t.py index 22008977..07073cbc 100644 --- a/electrum/plugins/safe_t/safe_t.py +++ b/electrum/plugins/safe_t/safe_t.py @@ -413,8 +413,7 @@ class SafeTPlugin(HW_PluginBase): def tx_outputs(self, derivation, tx, script_gen=SCRIPT_GEN_LEGACY): - def create_output_by_derivation(info): - index, xpubs, m = info + def create_output_by_derivation(): if len(xpubs) == 1: if script_gen == SCRIPT_GEN_NATIVE_SEGWIT: script_type = self.types.OutputScriptType.PAYTOWITNESS @@ -469,7 +468,7 @@ class SafeTPlugin(HW_PluginBase): info = tx.output_info.get(address) if info is not None and not has_change: - index, xpubs, m = info + index, xpubs, m = info.address_index, info.sorted_xpubs, info.num_sig on_change_branch = index[0] == 1 # prioritise hiding outputs on the 'change' branch from user # because no more than one change address allowed @@ -480,7 +479,7 @@ class SafeTPlugin(HW_PluginBase): has_change = True if use_create_by_derivation: - txoutputtype = create_output_by_derivation(info) + txoutputtype = create_output_by_derivation() else: txoutputtype = create_output_by_address() outputs.append(txoutputtype) diff --git a/electrum/plugins/trezor/trezor.py b/electrum/plugins/trezor/trezor.py index e9893824..e39b08f8 100644 --- a/electrum/plugins/trezor/trezor.py +++ b/electrum/plugins/trezor/trezor.py @@ -424,8 +424,7 @@ class TrezorPlugin(HW_PluginBase): def tx_outputs(self, derivation, tx, script_gen=SCRIPT_GEN_LEGACY): - def create_output_by_derivation(info): - index, xpubs, m = info + def create_output_by_derivation(): if len(xpubs) == 1: if script_gen == SCRIPT_GEN_NATIVE_SEGWIT: script_type = self.types.OutputScriptType.PAYTOWITNESS @@ -480,7 +479,7 @@ class TrezorPlugin(HW_PluginBase): info = tx.output_info.get(address) if info is not None and not has_change: - index, xpubs, m = info + index, xpubs, m = info.address_index, info.sorted_xpubs, info.num_sig on_change_branch = index[0] == 1 # prioritise hiding outputs on the 'change' branch from user # because no more than one change address allowed @@ -491,7 +490,7 @@ class TrezorPlugin(HW_PluginBase): has_change = True if use_create_by_derivation: - txoutputtype = create_output_by_derivation(info) + txoutputtype = create_output_by_derivation() else: txoutputtype = create_output_by_address() outputs.append(txoutputtype) diff --git a/electrum/transaction.py b/electrum/transaction.py index 8fcce24c..fb25e15b 100644 --- a/electrum/transaction.py +++ b/electrum/transaction.py @@ -27,7 +27,7 @@ # Note: The deserialization code originally comes from ABE. -from typing import Sequence, Union, NamedTuple +from typing import Sequence, Union, NamedTuple, Tuple, Optional, Iterable from .util import print_error, profiler @@ -63,6 +63,11 @@ TxOutput = NamedTuple("TxOutput", [('type', int), ('address', str), ('value', Un # ^ value is str when the output is set to max: '!' +TxOutputHwInfo = NamedTuple("TxOutputHwInfo", [('address_index', Tuple), + ('sorted_xpubs', Iterable[str]), + ('num_sig', Optional[int])]) + + class BCDataStream(object): def __init__(self): self.input = None diff --git a/electrum/wallet.py b/electrum/wallet.py index 1cf486cf..3da8aaf0 100644 --- a/electrum/wallet.py +++ b/electrum/wallet.py @@ -51,7 +51,7 @@ from .keystore import load_keystore, Hardware_KeyStore from .storage import multisig_type, STO_EV_PLAINTEXT, STO_EV_USER_PW, STO_EV_XPUB_PW from . import transaction, bitcoin, coinchooser, paymentrequest, contacts -from .transaction import Transaction, TxOutput +from .transaction import Transaction, TxOutput, TxOutputHwInfo from .plugin import run_hook from .address_synchronizer import (AddressSynchronizer, TX_HEIGHT_LOCAL, TX_HEIGHT_UNCONF_PARENT, TX_HEIGHT_UNCONFIRMED) @@ -786,7 +786,8 @@ class Abstract_Wallet(AddressSynchronizer): pubkeys = self.get_public_keys(addr) # sort xpubs using the order of pubkeys sorted_pubkeys, sorted_xpubs = zip(*sorted(zip(pubkeys, xpubs))) - info[addr] = index, sorted_xpubs, self.m if isinstance(self, Multisig_Wallet) else None + num_sig = self.m if isinstance(self, Multisig_Wallet) else None + info[addr] = TxOutputHwInfo(index, sorted_xpubs, num_sig) tx.output_info = info def sign_transaction(self, tx, password): From 88fc62e8f788b9e610f5c2e1850009f701e904fe Mon Sep 17 00:00:00 2001 From: SomberNight Date: Tue, 14 Aug 2018 19:38:19 +0200 Subject: [PATCH 009/138] fix #4626 --- electrum/plugins/safe_t/safe_t.py | 72 +++++++++++++------------------ electrum/plugins/trezor/trezor.py | 72 +++++++++++++------------------ electrum/transaction.py | 3 +- electrum/wallet.py | 2 +- 4 files changed, 61 insertions(+), 88 deletions(-) diff --git a/electrum/plugins/safe_t/safe_t.py b/electrum/plugins/safe_t/safe_t.py index 07073cbc..983ddf59 100644 --- a/electrum/plugins/safe_t/safe_t.py +++ b/electrum/plugins/safe_t/safe_t.py @@ -9,7 +9,7 @@ from electrum import constants from electrum.i18n import _ from electrum.plugin import BasePlugin, Device from electrum.transaction import deserialize, Transaction -from electrum.keystore import Hardware_KeyStore, is_xpubkey, parse_xpubkey, xtype_from_derivation +from electrum.keystore import Hardware_KeyStore, is_xpubkey, parse_xpubkey from electrum.base_wizard import ScriptTypeNotSupported from ..hw_wallet import HW_PluginBase @@ -19,9 +19,6 @@ from ..hw_wallet.plugin import is_any_tx_output_on_change_branch, trezor_validat # Safe-T mini initialization methods TIM_NEW, TIM_RECOVER, TIM_MNEMONIC, TIM_PRIVKEY = range(0, 4) -# script "generation" -SCRIPT_GEN_LEGACY, SCRIPT_GEN_P2SH_SEGWIT, SCRIPT_GEN_NATIVE_SEGWIT = range(0, 3) - class SafeTKeyStore(Hardware_KeyStore): hw_type = 'safe_t' @@ -30,15 +27,6 @@ class SafeTKeyStore(Hardware_KeyStore): def get_derivation(self): return self.derivation - def get_script_gen(self): - xtype = xtype_from_derivation(self.derivation) - if xtype in ('p2wpkh', 'p2wsh'): - return SCRIPT_GEN_NATIVE_SEGWIT - elif xtype in ('p2wpkh-p2sh', 'p2wsh-p2sh'): - return SCRIPT_GEN_P2SH_SEGWIT - else: - return SCRIPT_GEN_LEGACY - def get_client(self, force_pair=True): return self.plugin.get_client(self, force_pair) @@ -294,23 +282,34 @@ class SafeTPlugin(HW_PluginBase): client.used() return xpub - def get_safet_input_script_type(self, script_gen, is_multisig): - if script_gen == SCRIPT_GEN_NATIVE_SEGWIT: + def get_safet_input_script_type(self, electrum_txin_type: str): + if electrum_txin_type in ('p2wpkh', 'p2wsh'): return self.types.InputScriptType.SPENDWITNESS - elif script_gen == SCRIPT_GEN_P2SH_SEGWIT: + if electrum_txin_type in ('p2wpkh-p2sh', 'p2wsh-p2sh'): return self.types.InputScriptType.SPENDP2SHWITNESS - else: - if is_multisig: - return self.types.InputScriptType.SPENDMULTISIG - else: - return self.types.InputScriptType.SPENDADDRESS + if electrum_txin_type in ('p2pkh', ): + return self.types.InputScriptType.SPENDADDRESS + if electrum_txin_type in ('p2sh', ): + return self.types.InputScriptType.SPENDMULTISIG + raise ValueError('unexpected txin type: {}'.format(electrum_txin_type)) + + def get_safet_output_script_type(self, electrum_txin_type: str): + if electrum_txin_type in ('p2wpkh', 'p2wsh'): + return self.types.OutputScriptType.PAYTOWITNESS + if electrum_txin_type in ('p2wpkh-p2sh', 'p2wsh-p2sh'): + return self.types.OutputScriptType.PAYTOP2SHWITNESS + if electrum_txin_type in ('p2pkh', ): + return self.types.OutputScriptType.PAYTOADDRESS + if electrum_txin_type in ('p2sh', ): + return self.types.OutputScriptType.PAYTOMULTISIG + raise ValueError('unexpected txin type: {}'.format(electrum_txin_type)) def sign_transaction(self, keystore, tx, prev_tx, xpub_path): self.prev_tx = prev_tx self.xpub_path = xpub_path client = self.get_client(keystore) - inputs = self.tx_inputs(tx, True, keystore.get_script_gen()) - outputs = self.tx_outputs(keystore.get_derivation(), tx, keystore.get_script_gen()) + inputs = self.tx_inputs(tx, True) + outputs = self.tx_outputs(keystore.get_derivation(), tx) signatures = client.sign_tx(self.get_coin_name(), inputs, outputs, lock_time=tx.locktime)[0] signatures = [(bh2u(x) + '01') for x in signatures] tx.update_signatures(signatures) @@ -330,8 +329,7 @@ class SafeTPlugin(HW_PluginBase): address_n = client.expand_path(address_path) xpubs = wallet.get_master_public_keys() if len(xpubs) == 1: - script_gen = keystore.get_script_gen() - script_type = self.get_safet_input_script_type(script_gen, is_multisig=False) + script_type = self.get_safet_input_script_type(wallet.txin_type) client.get_address(self.get_coin_name(), address_n, True, script_type=script_type) else: def f(xpub): @@ -345,11 +343,10 @@ class SafeTPlugin(HW_PluginBase): signatures=[b''] * wallet.n, m=wallet.m, ) - script_gen = keystore.get_script_gen() - script_type = self.get_safet_input_script_type(script_gen, is_multisig=True) + script_type = self.get_safet_input_script_type(wallet.txin_type) client.get_address(self.get_coin_name(), address_n, True, multisig=multisig, script_type=script_type) - def tx_inputs(self, tx, for_sig=False, script_gen=SCRIPT_GEN_LEGACY): + def tx_inputs(self, tx, for_sig=False): inputs = [] for txin in tx.inputs(): txinputtype = self.types.TxInputType() @@ -364,7 +361,7 @@ class SafeTPlugin(HW_PluginBase): xpub, s = parse_xpubkey(x_pubkey) xpub_n = self.client_class.expand_path(self.xpub_path[xpub]) txinputtype._extend_address_n(xpub_n + s) - txinputtype.script_type = self.get_safet_input_script_type(script_gen, is_multisig=False) + txinputtype.script_type = self.get_safet_input_script_type(txin['type']) else: def f(x_pubkey): if is_xpubkey(x_pubkey): @@ -379,7 +376,7 @@ class SafeTPlugin(HW_PluginBase): signatures=list(map(lambda x: bfh(x)[:-1] if x else b'', txin.get('signatures'))), m=txin.get('num_sig'), ) - script_type = self.get_safet_input_script_type(script_gen, is_multisig=True) + script_type = self.get_safet_input_script_type(txin['type']) txinputtype = self.types.TxInputType( script_type=script_type, multisig=multisig @@ -411,16 +408,11 @@ class SafeTPlugin(HW_PluginBase): return inputs - def tx_outputs(self, derivation, tx, script_gen=SCRIPT_GEN_LEGACY): + def tx_outputs(self, derivation, tx): def create_output_by_derivation(): + script_type = self.get_trezor_output_script_type(info.script_type) if len(xpubs) == 1: - if script_gen == SCRIPT_GEN_NATIVE_SEGWIT: - script_type = self.types.OutputScriptType.PAYTOWITNESS - elif script_gen == SCRIPT_GEN_P2SH_SEGWIT: - script_type = self.types.OutputScriptType.PAYTOP2SHWITNESS - else: - script_type = self.types.OutputScriptType.PAYTOADDRESS address_n = self.client_class.expand_path(derivation + "/%d/%d" % index) txoutputtype = self.types.TxOutputType( amount=amount, @@ -428,12 +420,6 @@ class SafeTPlugin(HW_PluginBase): address_n=address_n, ) else: - if script_gen == SCRIPT_GEN_NATIVE_SEGWIT: - script_type = self.types.OutputScriptType.PAYTOWITNESS - elif script_gen == SCRIPT_GEN_P2SH_SEGWIT: - script_type = self.types.OutputScriptType.PAYTOP2SHWITNESS - else: - script_type = self.types.OutputScriptType.PAYTOMULTISIG address_n = self.client_class.expand_path("/%d/%d" % index) pubkeys = [self._make_node_path(xpub, address_n) for xpub in xpubs] multisig = self.types.MultisigRedeemScriptType( diff --git a/electrum/plugins/trezor/trezor.py b/electrum/plugins/trezor/trezor.py index e39b08f8..be0090eb 100644 --- a/electrum/plugins/trezor/trezor.py +++ b/electrum/plugins/trezor/trezor.py @@ -9,7 +9,7 @@ from electrum import constants from electrum.i18n import _ from electrum.plugin import BasePlugin, Device from electrum.transaction import deserialize, Transaction -from electrum.keystore import Hardware_KeyStore, is_xpubkey, parse_xpubkey, xtype_from_derivation +from electrum.keystore import Hardware_KeyStore, is_xpubkey, parse_xpubkey from electrum.base_wizard import ScriptTypeNotSupported from ..hw_wallet import HW_PluginBase @@ -20,9 +20,6 @@ from ..hw_wallet.plugin import is_any_tx_output_on_change_branch, trezor_validat TIM_NEW, TIM_RECOVER, TIM_MNEMONIC, TIM_PRIVKEY = range(0, 4) RECOVERY_TYPE_SCRAMBLED_WORDS, RECOVERY_TYPE_MATRIX = range(0, 2) -# script "generation" -SCRIPT_GEN_LEGACY, SCRIPT_GEN_P2SH_SEGWIT, SCRIPT_GEN_NATIVE_SEGWIT = range(0, 3) - class TrezorKeyStore(Hardware_KeyStore): hw_type = 'trezor' @@ -31,15 +28,6 @@ class TrezorKeyStore(Hardware_KeyStore): def get_derivation(self): return self.derivation - def get_script_gen(self): - xtype = xtype_from_derivation(self.derivation) - if xtype in ('p2wpkh', 'p2wsh'): - return SCRIPT_GEN_NATIVE_SEGWIT - elif xtype in ('p2wpkh-p2sh', 'p2wsh-p2sh'): - return SCRIPT_GEN_P2SH_SEGWIT - else: - return SCRIPT_GEN_LEGACY - def get_client(self, force_pair=True): return self.plugin.get_client(self, force_pair) @@ -305,23 +293,34 @@ class TrezorPlugin(HW_PluginBase): client.used() return xpub - def get_trezor_input_script_type(self, script_gen, is_multisig): - if script_gen == SCRIPT_GEN_NATIVE_SEGWIT: + def get_trezor_input_script_type(self, electrum_txin_type: str): + if electrum_txin_type in ('p2wpkh', 'p2wsh'): return self.types.InputScriptType.SPENDWITNESS - elif script_gen == SCRIPT_GEN_P2SH_SEGWIT: + if electrum_txin_type in ('p2wpkh-p2sh', 'p2wsh-p2sh'): return self.types.InputScriptType.SPENDP2SHWITNESS - else: - if is_multisig: - return self.types.InputScriptType.SPENDMULTISIG - else: - return self.types.InputScriptType.SPENDADDRESS + if electrum_txin_type in ('p2pkh', ): + return self.types.InputScriptType.SPENDADDRESS + if electrum_txin_type in ('p2sh', ): + return self.types.InputScriptType.SPENDMULTISIG + raise ValueError('unexpected txin type: {}'.format(electrum_txin_type)) + + def get_trezor_output_script_type(self, electrum_txin_type: str): + if electrum_txin_type in ('p2wpkh', 'p2wsh'): + return self.types.OutputScriptType.PAYTOWITNESS + if electrum_txin_type in ('p2wpkh-p2sh', 'p2wsh-p2sh'): + return self.types.OutputScriptType.PAYTOP2SHWITNESS + if electrum_txin_type in ('p2pkh', ): + return self.types.OutputScriptType.PAYTOADDRESS + if electrum_txin_type in ('p2sh', ): + return self.types.OutputScriptType.PAYTOMULTISIG + raise ValueError('unexpected txin type: {}'.format(electrum_txin_type)) def sign_transaction(self, keystore, tx, prev_tx, xpub_path): self.prev_tx = prev_tx self.xpub_path = xpub_path client = self.get_client(keystore) - inputs = self.tx_inputs(tx, True, keystore.get_script_gen()) - outputs = self.tx_outputs(keystore.get_derivation(), tx, keystore.get_script_gen()) + inputs = self.tx_inputs(tx, True) + outputs = self.tx_outputs(keystore.get_derivation(), tx) signatures = client.sign_tx(self.get_coin_name(), inputs, outputs, lock_time=tx.locktime)[0] signatures = [(bh2u(x) + '01') for x in signatures] tx.update_signatures(signatures) @@ -341,8 +340,7 @@ class TrezorPlugin(HW_PluginBase): address_n = client.expand_path(address_path) xpubs = wallet.get_master_public_keys() if len(xpubs) == 1: - script_gen = keystore.get_script_gen() - script_type = self.get_trezor_input_script_type(script_gen, is_multisig=False) + script_type = self.get_trezor_input_script_type(wallet.txin_type) client.get_address(self.get_coin_name(), address_n, True, script_type=script_type) else: def f(xpub): @@ -356,11 +354,10 @@ class TrezorPlugin(HW_PluginBase): signatures=[b''] * wallet.n, m=wallet.m, ) - script_gen = keystore.get_script_gen() - script_type = self.get_trezor_input_script_type(script_gen, is_multisig=True) + script_type = self.get_trezor_input_script_type(wallet.txin_type) client.get_address(self.get_coin_name(), address_n, True, multisig=multisig, script_type=script_type) - def tx_inputs(self, tx, for_sig=False, script_gen=SCRIPT_GEN_LEGACY): + def tx_inputs(self, tx, for_sig=False): inputs = [] for txin in tx.inputs(): txinputtype = self.types.TxInputType() @@ -375,7 +372,7 @@ class TrezorPlugin(HW_PluginBase): xpub, s = parse_xpubkey(x_pubkey) xpub_n = self.client_class.expand_path(self.xpub_path[xpub]) txinputtype._extend_address_n(xpub_n + s) - txinputtype.script_type = self.get_trezor_input_script_type(script_gen, is_multisig=False) + txinputtype.script_type = self.get_trezor_input_script_type(txin['type']) else: def f(x_pubkey): if is_xpubkey(x_pubkey): @@ -390,7 +387,7 @@ class TrezorPlugin(HW_PluginBase): signatures=list(map(lambda x: bfh(x)[:-1] if x else b'', txin.get('signatures'))), m=txin.get('num_sig'), ) - script_type = self.get_trezor_input_script_type(script_gen, is_multisig=True) + script_type = self.get_trezor_input_script_type(txin['type']) txinputtype = self.types.TxInputType( script_type=script_type, multisig=multisig @@ -422,16 +419,11 @@ class TrezorPlugin(HW_PluginBase): return inputs - def tx_outputs(self, derivation, tx, script_gen=SCRIPT_GEN_LEGACY): + def tx_outputs(self, derivation, tx): def create_output_by_derivation(): + script_type = self.get_trezor_output_script_type(info.script_type) if len(xpubs) == 1: - if script_gen == SCRIPT_GEN_NATIVE_SEGWIT: - script_type = self.types.OutputScriptType.PAYTOWITNESS - elif script_gen == SCRIPT_GEN_P2SH_SEGWIT: - script_type = self.types.OutputScriptType.PAYTOP2SHWITNESS - else: - script_type = self.types.OutputScriptType.PAYTOADDRESS address_n = self.client_class.expand_path(derivation + "/%d/%d" % index) txoutputtype = self.types.TxOutputType( amount=amount, @@ -439,12 +431,6 @@ class TrezorPlugin(HW_PluginBase): address_n=address_n, ) else: - if script_gen == SCRIPT_GEN_NATIVE_SEGWIT: - script_type = self.types.OutputScriptType.PAYTOWITNESS - elif script_gen == SCRIPT_GEN_P2SH_SEGWIT: - script_type = self.types.OutputScriptType.PAYTOP2SHWITNESS - else: - script_type = self.types.OutputScriptType.PAYTOMULTISIG address_n = self.client_class.expand_path("/%d/%d" % index) pubkeys = [self._make_node_path(xpub, address_n) for xpub in xpubs] multisig = self.types.MultisigRedeemScriptType( diff --git a/electrum/transaction.py b/electrum/transaction.py index fb25e15b..fe056985 100644 --- a/electrum/transaction.py +++ b/electrum/transaction.py @@ -65,7 +65,8 @@ TxOutput = NamedTuple("TxOutput", [('type', int), ('address', str), ('value', Un TxOutputHwInfo = NamedTuple("TxOutputHwInfo", [('address_index', Tuple), ('sorted_xpubs', Iterable[str]), - ('num_sig', Optional[int])]) + ('num_sig', Optional[int]), + ('script_type', str)]) class BCDataStream(object): diff --git a/electrum/wallet.py b/electrum/wallet.py index 3da8aaf0..70aac4be 100644 --- a/electrum/wallet.py +++ b/electrum/wallet.py @@ -787,7 +787,7 @@ class Abstract_Wallet(AddressSynchronizer): # sort xpubs using the order of pubkeys sorted_pubkeys, sorted_xpubs = zip(*sorted(zip(pubkeys, xpubs))) num_sig = self.m if isinstance(self, Multisig_Wallet) else None - info[addr] = TxOutputHwInfo(index, sorted_xpubs, num_sig) + info[addr] = TxOutputHwInfo(index, sorted_xpubs, num_sig, self.txin_type) tx.output_info = info def sign_transaction(self, tx, password): From b7178f2d21c96ba483894a2f70ea2ef27e5a2182 Mon Sep 17 00:00:00 2001 From: SomberNight Date: Tue, 14 Aug 2018 21:50:59 +0200 Subject: [PATCH 010/138] coinchooser: small clean-up (use TxOutput.value) --- electrum/coinchooser.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/electrum/coinchooser.py b/electrum/coinchooser.py index 7dc355d5..5a69cccf 100644 --- a/electrum/coinchooser.py +++ b/electrum/coinchooser.py @@ -117,7 +117,7 @@ class CoinChooserBase(PrintError): def change_amounts(self, tx, count, fee_estimator, dust_threshold): # Break change up if bigger than max_change - output_amounts = [o[2] for o in tx.outputs()] + output_amounts = [o.value for o in tx.outputs()] # Don't split change of less than 0.02 BTC max_change = max(max(output_amounts) * 1.25, 0.02 * COIN) @@ -354,9 +354,9 @@ class CoinChooserPrivacy(CoinChooserRandom): return [coin['address'] for coin in coins] def penalty_func(self, tx): - min_change = min(o[2] for o in tx.outputs()) * 0.75 - max_change = max(o[2] for o in tx.outputs()) * 1.33 - spent_amount = sum(o[2] for o in tx.outputs()) + min_change = min(o.value for o in tx.outputs()) * 0.75 + max_change = max(o.value for o in tx.outputs()) * 1.33 + spent_amount = sum(o.value for o in tx.outputs()) def penalty(buckets): badness = len(buckets) - 1 From f7166e95c4119e67667dbda7fe573b3147b7bce7 Mon Sep 17 00:00:00 2001 From: SomberNight Date: Tue, 14 Aug 2018 21:53:05 +0200 Subject: [PATCH 011/138] wallet: move get_depending_transactions to AddressSynchronizer and resolve TODO --- electrum/address_synchronizer.py | 8 ++++++++ electrum/wallet.py | 11 ----------- 2 files changed, 8 insertions(+), 11 deletions(-) diff --git a/electrum/address_synchronizer.py b/electrum/address_synchronizer.py index 2d6a70cc..b1de5ab6 100644 --- a/electrum/address_synchronizer.py +++ b/electrum/address_synchronizer.py @@ -319,6 +319,14 @@ class AddressSynchronizer(PrintError): self.txi.pop(tx_hash, None) self.txo.pop(tx_hash, None) + def get_depending_transactions(self, tx_hash): + """Returns all (grand-)children of tx_hash in this wallet.""" + children = set() + for other_hash in self.spent_outpoints[tx_hash].values(): + children.add(other_hash) + children |= self.get_depending_transactions(other_hash) + return children + def receive_tx_callback(self, tx_hash, tx, tx_height): self.add_unverified_tx(tx_hash, tx_height) self.add_transaction(tx_hash, tx, allow_unrelated=True) diff --git a/electrum/wallet.py b/electrum/wallet.py index 70aac4be..0277e6aa 100644 --- a/electrum/wallet.py +++ b/electrum/wallet.py @@ -1068,17 +1068,6 @@ class Abstract_Wallet(AddressSynchronizer): index = self.get_address_index(addr) return self.keystore.decrypt_message(index, message, password) - def get_depending_transactions(self, tx_hash): - """Returns all (grand-)children of tx_hash in this wallet.""" - children = set() - # TODO rewrite this to use self.spent_outpoints - for other_hash, tx in self.transactions.items(): - for input in (tx.inputs()): - if input["prevout_hash"] == tx_hash: - children.add(other_hash) - children |= self.get_depending_transactions(other_hash) - return children - def txin_value(self, txin): txid = txin['prevout_hash'] prev_n = txin['prevout_n'] From 3089edd3a2533ea22896e253f981bac42f85c7bc Mon Sep 17 00:00:00 2001 From: SomberNight Date: Tue, 14 Aug 2018 21:54:11 +0200 Subject: [PATCH 012/138] wallet: remove method get_num_tx --- electrum/address_synchronizer.py | 5 +---- electrum/wallet.py | 2 +- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/electrum/address_synchronizer.py b/electrum/address_synchronizer.py index b1de5ab6..88ef82f2 100644 --- a/electrum/address_synchronizer.py +++ b/electrum/address_synchronizer.py @@ -102,6 +102,7 @@ class AddressSynchronizer(PrintError): return h def get_address_history_len(self, addr: str) -> int: + """Return number of transactions where address is involved.""" return len(self._history_local.get(addr, ())) def get_txin_address(self, txi): @@ -617,10 +618,6 @@ class AddressSynchronizer(PrintError): def is_up_to_date(self): with self.lock: return self.up_to_date - def get_num_tx(self, address): - """ return number of transactions where address is involved """ - return len(self.history.get(address, [])) - def get_tx_delta(self, tx_hash, address): "effect of tx on address" delta = 0 diff --git a/electrum/wallet.py b/electrum/wallet.py index 0277e6aa..ef661b46 100644 --- a/electrum/wallet.py +++ b/electrum/wallet.py @@ -563,7 +563,7 @@ class Abstract_Wallet(AddressSynchronizer): # confirmations. Select the unused addresses within the # gap limit; if none take one at random change_addrs = [addr for addr in addrs if - self.get_num_tx(addr) == 0] + self.get_address_history_len(addr) == 0] if not change_addrs: change_addrs = [random.choice(addrs)] else: From db834800c0672b7d0b75aa4255e64919ad1c9e91 Mon Sep 17 00:00:00 2001 From: SomberNight Date: Wed, 15 Aug 2018 13:22:24 +0200 Subject: [PATCH 013/138] wine-build: clarify to use docker for reproducible builds. move parts of readme. --- contrib/build-wine/README.md | 49 ++--------------------------- contrib/build-wine/docker/README.md | 49 +++++++++++++++++++++++++++++ 2 files changed, 51 insertions(+), 47 deletions(-) diff --git a/contrib/build-wine/README.md b/contrib/build-wine/README.md index 9f1ab6e3..c6348c97 100644 --- a/contrib/build-wine/README.md +++ b/contrib/build-wine/README.md @@ -2,7 +2,8 @@ Windows Binary Builds ===================== These scripts can be used for cross-compilation of Windows Electrum executables from Linux/Wine. -Produced binaries are deterministic, so you should be able to generate binaries that match the official releases. + +For reproducible builds, see the `docker` folder. Usage: @@ -34,49 +35,3 @@ The binaries are also built by Travis CI, so if you are having problems, 2. Make sure `/opt` is writable by the current user. 3. Run `build.sh`. 4. The generated binaries are in `./dist`. - - -Code Signing -============ - -Electrum Windows builds are signed with a Microsoft Authenticodeā„¢ code signing -certificate in addition to the GPG-based signatures. - -The advantage of using Authenticode is that Electrum users won't receive a -Windows SmartScreen warning when starting it. - -The release signing procedure involves a signer (the holder of the -certificate/key) and one or multiple trusted verifiers: - - -| Signer | Verifier | -|-----------------------------------------------------------|-----------------------------------| -| Build .exe files using `build.sh` | | -| Sign .exe with `./sign.sh` | | -| Upload signed files to download server | | -| | Build .exe files using `build.sh` | -| | Compare files using `unsign.sh` | -| | Sign .exe file using `gpg -b` | - -| Signer and verifiers: -| Upload signatures to 'electrum-signatures' repo, as `$version/$filename.$builder.asc` | - - - - -Verify Integrity of signed binary -================================= - -Every user can verify that the official binary was created from the source code in this -repository. To do so, the Authenticode signature needs to be stripped since the signature -is not reproducible. - -This procedure removes the differences between the signed and unsigned binary: - -1. Remove the signature from the signed binary using osslsigncode or signtool. -2. Set the COFF image checksum for the signed binary to 0x0. This is necessary - because pyinstaller doesn't generate a checksum. -3. Append null bytes to the _unsigned_ binary until the byte count is a multiple - of 8. - -The script `unsign.sh` performs these steps. diff --git a/contrib/build-wine/docker/README.md b/contrib/build-wine/docker/README.md index 7cab0f58..0df96ea5 100644 --- a/contrib/build-wine/docker/README.md +++ b/contrib/build-wine/docker/README.md @@ -1,6 +1,9 @@ Deterministic Windows binaries with Docker ========================================== +Produced binaries are deterministic, so you should be able to generate +binaries that match the official releases. + This assumes an Ubuntu host, but it should not be too hard to adapt to another similar system. The docker commands should be executed in the project's root folder. @@ -39,3 +42,49 @@ folder. Note: the `setup` binary (NSIS installer) is not deterministic yet. + + +Code Signing +============ + +Electrum Windows builds are signed with a Microsoft Authenticodeā„¢ code signing +certificate in addition to the GPG-based signatures. + +The advantage of using Authenticode is that Electrum users won't receive a +Windows SmartScreen warning when starting it. + +The release signing procedure involves a signer (the holder of the +certificate/key) and one or multiple trusted verifiers: + + +| Signer | Verifier | +|-----------------------------------------------------------|-----------------------------------| +| Build .exe files using `build.sh` | | +| Sign .exe with `./sign.sh` | | +| Upload signed files to download server | | +| | Build .exe files using `build.sh` | +| | Compare files using `unsign.sh` | +| | Sign .exe file using `gpg -b` | + +| Signer and verifiers: | +|-----------------------------------------------------------------------------------------------| +| Upload signatures to 'electrum-signatures' repo, as `$version/$filename.$builder.asc` | + + + +Verify Integrity of signed binary +================================= + +Every user can verify that the official binary was created from the source code in this +repository. To do so, the Authenticode signature needs to be stripped since the signature +is not reproducible. + +This procedure removes the differences between the signed and unsigned binary: + +1. Remove the signature from the signed binary using osslsigncode or signtool. +2. Set the COFF image checksum for the signed binary to 0x0. This is necessary + because pyinstaller doesn't generate a checksum. +3. Append null bytes to the _unsigned_ binary until the byte count is a multiple + of 8. + +The script `unsign.sh` performs these steps. From f3f5b8a5d69040cc7203bff7a210fd85a18c8951 Mon Sep 17 00:00:00 2001 From: SomberNight Date: Wed, 15 Aug 2018 13:43:19 +0200 Subject: [PATCH 014/138] fix #4312 --- electrum/paymentrequest.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/electrum/paymentrequest.py b/electrum/paymentrequest.py index 7010b93f..78df7566 100644 --- a/electrum/paymentrequest.py +++ b/electrum/paymentrequest.py @@ -92,7 +92,8 @@ def get_payment_request(url): data = None error = "payment URL not pointing to a valid file" else: - raise Exception("unknown scheme", url) + data = None + error = "Unknown scheme for payment request. URL: {}".format(url) pr = PaymentRequest(data, error) return pr From 941df4153bebb97834ddb12dc5e5f8367e691d74 Mon Sep 17 00:00:00 2001 From: ghost43 Date: Wed, 15 Aug 2018 14:33:12 +0200 Subject: [PATCH 015/138] wallet: try to plug gap limit for change addresses (#4530) --- electrum/wallet.py | 40 ++++++++++++++++++++++++++++------------ 1 file changed, 28 insertions(+), 12 deletions(-) diff --git a/electrum/wallet.py b/electrum/wallet.py index ef661b46..eeddc69f 100644 --- a/electrum/wallet.py +++ b/electrum/wallet.py @@ -179,6 +179,8 @@ class Abstract_Wallet(AddressSynchronizer): self.fiat_value = storage.get('fiat_value', {}) self.receive_requests = storage.get('payment_requests', {}) + self.calc_unused_change_addresses() + # save wallet type the first time if self.storage.get('wallet_type') is None: self.storage.put('wallet_type', self.wallet_type) @@ -225,6 +227,16 @@ class Abstract_Wallet(AddressSynchronizer): def synchronize(self): pass + def calc_unused_change_addresses(self): + with self.lock: + if hasattr(self, '_unused_change_addresses'): + addrs = self._unused_change_addresses + else: + addrs = self.get_change_addresses() + self._unused_change_addresses = [addr for addr in addrs if + self.get_address_history_len(addr) == 0] + return list(self._unused_change_addresses) + def is_deterministic(self): return self.keystore.is_deterministic() @@ -554,21 +566,22 @@ class Abstract_Wallet(AddressSynchronizer): self.add_input_info(item) # change address + # if we leave it empty, coin_chooser will set it + change_addrs = [] if change_addr: change_addrs = [change_addr] - else: - addrs = self.get_change_addresses()[-self.gap_limit_for_change:] - if self.use_change and addrs: - # New change addresses are created only after a few - # confirmations. Select the unused addresses within the - # gap limit; if none take one at random - change_addrs = [addr for addr in addrs if - self.get_address_history_len(addr) == 0] - if not change_addrs: - change_addrs = [random.choice(addrs)] + elif self.use_change: + # Recalc and get unused change addresses + addrs = self.calc_unused_change_addresses() + # New change addresses are created only after a few + # confirmations. + if addrs: + # if there are any unused, select all + change_addrs = addrs else: - # coin_chooser will set change address - change_addrs = [] + # if there are none, take one randomly from the last few + addrs = self.get_change_addresses()[-self.gap_limit_for_change:] + change_addrs = [random.choice(addrs)] if addrs else [] # Fee estimator if fixed_fee is None: @@ -1420,6 +1433,9 @@ class Deterministic_Wallet(Abstract_Wallet): self._addr_to_addr_index[address] = (for_change, n) self.save_addresses() self.add_address(address) + if for_change: + # note: if it's actually used, it will get filtered later + self._unused_change_addresses.append(address) return address def synchronize_sequence(self, for_change): From 7044f1145f3a20f3a72d8ec7e93435ebc541f226 Mon Sep 17 00:00:00 2001 From: SomberNight Date: Fri, 17 Aug 2018 16:01:03 +0200 Subject: [PATCH 016/138] ecc_fast: clarify fallback message --- electrum/ecc_fast.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/electrum/ecc_fast.py b/electrum/ecc_fast.py index 77673027..10ed3009 100644 --- a/electrum/ecc_fast.py +++ b/electrum/ecc_fast.py @@ -184,7 +184,9 @@ def _prepare_monkey_patching_of_python_ecdsa_internals_with_libsecp256k1(): def do_monkey_patching_of_python_ecdsa_internals_with_libsecp256k1(): if not _libsecp256k1: - print_error('[ecc] warning: libsecp256k1 library not available, falling back to python-ecdsa') + # FIXME print_error will always print as 'verbosity' is not yet initialised + print_error('[ecc] info: libsecp256k1 library not available, falling back to python-ecdsa. ' + 'This means signing operations will be slower.') return if not _patched_functions.prepared_to_patch: raise Exception("can't patch python-ecdsa without preparations") From bc6010303a0010c9c027b99d8c65c68481d2c585 Mon Sep 17 00:00:00 2001 From: SomberNight Date: Wed, 22 Aug 2018 17:05:48 +0200 Subject: [PATCH 017/138] fix #4651 --- electrum/commands.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/electrum/commands.py b/electrum/commands.py index 2240f57c..7a9c0857 100644 --- a/electrum/commands.py +++ b/electrum/commands.py @@ -187,7 +187,7 @@ class Commands: def listunspent(self): """List unspent outputs. Returns the list of unspent transaction outputs in your wallet.""" - l = copy.deepcopy(self.wallet.get_utxos(exclude_frozen=False)) + l = copy.deepcopy(self.wallet.get_utxos()) for i in l: v = i["value"] i["value"] = str(Decimal(v)/COIN) if v is not None else None From 0bcea80bdff10c89147ff5bb1db61ea01836d1dd Mon Sep 17 00:00:00 2001 From: "Peter D. Gray" Date: Tue, 26 Jun 2018 22:33:04 +0200 Subject: [PATCH 018/138] Support for new hardware wallet: Coldcard build-wine/deterministic.spec: add Coldcard plugin and ckcc-protocol dependancy Require version 0.7.2 of ckcc-protocol (window fixes) Rework import paths to new standards Updated icons New minimum version, for latest PSBT constants Upgrade to final PSBT (BIP 174) standard encoding Remove log noise Show bootloader version number as well Handle case where libraries are missing better Remove noise about missing packages, for rest of world Add reference to ckcc-protocol module/data Remove dead code Beef up the README more Slightly better looking Add version numbers and upgrade firmware feature Split out DFU support into own file First pass at adding Coinkite Coldcard hardware wallet to Electrum --- contrib/build-osx/osx.spec | 3 + contrib/build-wine/deterministic.spec | 3 + .../deterministic-build/requirements-hw.txt | 5 + contrib/requirements/requirements-hw.txt | 1 + electrum/plugins/coldcard/README.md | 65 ++ electrum/plugins/coldcard/__init__.py | 7 + electrum/plugins/coldcard/cmdline.py | 47 ++ electrum/plugins/coldcard/coldcard.py | 668 ++++++++++++++++++ electrum/plugins/coldcard/qt.py | 242 +++++++ electrum/transaction.py | 4 +- icons.qrc | 2 + icons/coldcard.png | Bin 0 -> 528 bytes icons/coldcard_unpaired.png | Bin 0 -> 788 bytes 13 files changed, 1045 insertions(+), 2 deletions(-) create mode 100644 electrum/plugins/coldcard/README.md create mode 100644 electrum/plugins/coldcard/__init__.py create mode 100644 electrum/plugins/coldcard/cmdline.py create mode 100644 electrum/plugins/coldcard/coldcard.py create mode 100644 electrum/plugins/coldcard/qt.py create mode 100644 icons/coldcard.png create mode 100644 icons/coldcard_unpaired.png diff --git a/contrib/build-osx/osx.spec b/contrib/build-osx/osx.spec index 0cd01c66..2de6bfaf 100644 --- a/contrib/build-osx/osx.spec +++ b/contrib/build-osx/osx.spec @@ -27,6 +27,7 @@ hiddenimports += collect_submodules('safetlib') hiddenimports += collect_submodules('btchip') hiddenimports += collect_submodules('keepkeylib') hiddenimports += collect_submodules('websocket') +hiddenimports += collect_submodules('ckcc') datas = [ (electrum+'electrum/*.json', PYPKG), @@ -37,6 +38,7 @@ datas += collect_data_files('trezorlib') datas += collect_data_files('safetlib') datas += collect_data_files('btchip') datas += collect_data_files('keepkeylib') +datas += collect_data_files('ckcc') # Add libusb so Trezor and Safe-T mini will work binaries = [(electrum + "contrib/build-osx/libusb-1.0.dylib", ".")] @@ -63,6 +65,7 @@ a = Analysis([electrum+ MAIN_SCRIPT, electrum+'electrum/plugins/safe_t/qt.py', electrum+'electrum/plugins/keepkey/qt.py', electrum+'electrum/plugins/ledger/qt.py', + electrum+'electrum/plugins/coldcard/qt.py', ], binaries=binaries, datas=datas, diff --git a/contrib/build-wine/deterministic.spec b/contrib/build-wine/deterministic.spec index ae3fba80..63d75c2c 100644 --- a/contrib/build-wine/deterministic.spec +++ b/contrib/build-wine/deterministic.spec @@ -22,6 +22,7 @@ hiddenimports += collect_submodules('safetlib') hiddenimports += collect_submodules('btchip') hiddenimports += collect_submodules('keepkeylib') hiddenimports += collect_submodules('websocket') +hiddenimports += collect_submodules('ckcc') # Add libusb binary binaries = [(PYHOME+"/libusb-1.0.dll", ".")] @@ -41,6 +42,7 @@ datas += collect_data_files('trezorlib') datas += collect_data_files('safetlib') datas += collect_data_files('btchip') datas += collect_data_files('keepkeylib') +datas += collect_data_files('ckcc') # We don't put these files in to actually include them in the script but to make the Analysis method scan them for imports a = Analysis([home+'run_electrum', @@ -60,6 +62,7 @@ a = Analysis([home+'run_electrum', home+'electrum/plugins/safe_t/qt.py', home+'electrum/plugins/keepkey/qt.py', home+'electrum/plugins/ledger/qt.py', + home+'electrum/plugins/coldcard/qt.py', #home+'packages/requests/utils.py' ], binaries=binaries, diff --git a/contrib/deterministic-build/requirements-hw.txt b/contrib/deterministic-build/requirements-hw.txt index f06b43e1..ea2d9119 100644 --- a/contrib/deterministic-build/requirements-hw.txt +++ b/contrib/deterministic-build/requirements-hw.txt @@ -115,3 +115,8 @@ websocket-client==0.48.0 \ wheel==0.31.1 \ --hash=sha256:0a2e54558a0628f2145d2fc822137e322412115173e8a2ddbe1c9024338ae83c \ --hash=sha256:80044e51ec5bbf6c894ba0bc48d26a8c20a9ba629f4ca19ea26ecfcf87685f5f +pyaes==1.6.1 \ + --hash=sha256:02c1b1405c38d3c370b085fb952dd8bea3fadcee6411ad99f312cc129c536d8f +ckcc-protocol==0.7.2 \ + --hash=sha256:498db4ccdda018cd9f40210f5bd02ddcc98e7df583170b2eab4035c86c3cc03b \ + --hash=sha256:31ee5178cfba8895eb2a6b8d06dc7830b51461a0ff767a670a64707c63e6b264 diff --git a/contrib/requirements/requirements-hw.txt b/contrib/requirements/requirements-hw.txt index 4fe6477f..a6ae0a3a 100644 --- a/contrib/requirements/requirements-hw.txt +++ b/contrib/requirements/requirements-hw.txt @@ -3,5 +3,6 @@ trezor[hidapi]>=0.9.0 safet[hidapi]>=0.1.0 keepkey btchip-python +ckcc-protocol>=0.7.2 websocket-client hidapi diff --git a/electrum/plugins/coldcard/README.md b/electrum/plugins/coldcard/README.md new file mode 100644 index 00000000..651cd804 --- /dev/null +++ b/electrum/plugins/coldcard/README.md @@ -0,0 +1,65 @@ + +# Coldcard Hardware Wallet Plugin + +## Just the glue please + +This code connects the public USB API and Electrum. Leverages all +the good work that's been done by the Electrum team to support +hardware wallets. + +## Background + +The Coldcard has a larger screen (128x64) and a number pad. For +this reason, all PIN code entry is done directly on the device. +Coldcard does not appear on the USB bus until unlocked with appropriate +PIN. Initial setup, and seed generation must be done offline. + +Coldcard uses an emerging standard for unsigned tranasctions: + +PSBT = Partially Signed Bitcoin Transaction = BIP174 + +However, this spec is still under heavy discussion and in flux. At +this point, the PSBT files generated will only be compatible with +Coldcard. + +The Coldcard can be used 100% offline: it can generate a skeleton +Electrum wallet and save it to MicroSD card. Transport that file +to Electrum and it will fetch history, blockchain details and then +operate in "unpaired" mode. + +Spending transactions can be saved to MicroSD using the "Export PSBT" +button on the transaction preview dialog (when this plugin is +owner of the wallet). That PSBT can be signed on the Coldcard +(again using MicroSD both ways). The result is a ready-to-transmit +bitcoin transaction, which can be transmitted using Tools > Load +Transaction > From File in Electrum or really any tool. + + + +## TODO Items + +- No effort yet to support translations or languages other than English, sorry. +- Coldcard PSBT format is not likely to be compatible with other devices, because the BIP174 is still in flux. +- Segwit support not 100% complete: can pay to them, but cannot setup wallet to receive them. +- Limited support for segwit wrapped in P2SH. +- Someday we could support multisig hardware wallets based on PSBT where each participant + is using different devices/systems for signing, however, that belongs in an independant + plugin that is PSBT focused and might not require a Coldcard to be present. + +### Ctags + +- I find this command useful (at top level) ... but I'm a VIM user. + + ctags -f .tags electrum `find . -name ENV -prune -o -name \*.py` + + +### Working with latest ckcc-protocol + +- at top level, do this: + + pip install -e git+ssh://git@github.com/Coldcard/ckcc-protocol.git#egg=ckcc-protocol + +- but you'll need the https version of that, not ssh like I can. +- also a branch name would be good in there +- do `pip uninstall ckcc` first +- see diff --git a/electrum/plugins/coldcard/__init__.py b/electrum/plugins/coldcard/__init__.py new file mode 100644 index 00000000..7cb033f4 --- /dev/null +++ b/electrum/plugins/coldcard/__init__.py @@ -0,0 +1,7 @@ +from electrum.i18n import _ + +fullname = 'Coldcard Wallet' +description = 'Provides support for the Coldcard hardware wallet from Coinkite' +requires = [('ckcc-protocol', 'github.com/Coldcard/ckcc-protocol')] +registers_keystore = ('hardware', 'coldcard', _("Coldcard Wallet")) +available_for = ['qt', 'cmdline'] diff --git a/electrum/plugins/coldcard/cmdline.py b/electrum/plugins/coldcard/cmdline.py new file mode 100644 index 00000000..5fddd02a --- /dev/null +++ b/electrum/plugins/coldcard/cmdline.py @@ -0,0 +1,47 @@ +from electrum.plugin import hook +from .coldcard import ColdcardPlugin +from electrum.util import print_msg, print_error, raw_input, print_stderr + +class ColdcardCmdLineHandler: + + def get_passphrase(self, msg, confirm): + raise NotImplementedError + + def get_pin(self, msg): + raise NotImplementedError + + def prompt_auth(self, msg): + raise NotImplementedError + + def yes_no_question(self, msg): + print_msg(msg) + return raw_input() in 'yY' + + def stop(self): + pass + + def show_message(self, msg, on_cancel=None): + print_stderr(msg) + + def show_error(self, msg, blocking=False): + print_error(msg) + + def update_status(self, b): + print_error('hw device status', b) + + def finished(self): + pass + +class Plugin(ColdcardPlugin): + handler = ColdcardCmdLineHandler() + + @hook + def init_keystore(self, keystore): + if not isinstance(keystore, self.keystore_class): + return + keystore.handler = self.handler + + def create_handler(self, window): + return self.handler + +# EOF diff --git a/electrum/plugins/coldcard/coldcard.py b/electrum/plugins/coldcard/coldcard.py new file mode 100644 index 00000000..fd307de2 --- /dev/null +++ b/electrum/plugins/coldcard/coldcard.py @@ -0,0 +1,668 @@ +# +# Coldcard Electrum plugin main code. +# +# +from struct import pack, unpack +import hashlib +import os, sys, time, io +import traceback + +from electrum import bitcoin +from electrum.bitcoin import TYPE_ADDRESS, int_to_hex +from electrum.i18n import _ +from electrum.plugin import BasePlugin, Device +from electrum.keystore import Hardware_KeyStore, xpubkey_to_pubkey +from electrum.transaction import Transaction +from electrum.wallet import Standard_Wallet +from electrum.crypto import hash_160 +from ..hw_wallet import HW_PluginBase +from ..hw_wallet.plugin import is_any_tx_output_on_change_branch +from electrum.util import print_error, bfh, bh2u, versiontuple +from electrum.base_wizard import ScriptTypeNotSupported + +try: + import hid + from ckcc.protocol import CCProtocolPacker, CCProtocolUnpacker + from ckcc.protocol import CCProtoError, CCUserRefused, CCBusyError + from ckcc.constants import (MAX_MSG_LEN, MAX_BLK_LEN, MSG_SIGNING_MAX_LENGTH, MAX_TXN_LEN, + AF_CLASSIC, AF_P2SH, AF_P2WPKH, AF_P2WSH, AF_P2WPKH_P2SH, AF_P2WSH_P2SH) + from ckcc.constants import ( + PSBT_GLOBAL_UNSIGNED_TX, PSBT_IN_NON_WITNESS_UTXO, PSBT_IN_WITNESS_UTXO, + PSBT_IN_SIGHASH_TYPE, PSBT_IN_REDEEM_SCRIPT, PSBT_IN_WITNESS_SCRIPT, + PSBT_IN_BIP32_DERIVATION, PSBT_OUT_BIP32_DERIVATION) + + from ckcc.client import ColdcardDevice, COINKITE_VID, CKCC_PID, CKCC_SIMULATOR_PATH + + requirements_ok = True + + + class ElectrumColdcardDevice(ColdcardDevice): + # avoid use of pycoin for MiTM message signature test + def mitm_verify(self, sig, expect_xpub): + # verify a signature (65 bytes) over the session key, using the master bip32 node + # - customized to use specific EC library of Electrum. + from electrum.ecc import ECPubkey + + xtype, depth, parent_fingerprint, child_number, chain_code, K_or_k \ + = bitcoin.deserialize_xpub(expect_xpub) + + pubkey = ECPubkey(K_or_k) + try: + pubkey.verify_message_hash(sig[1:65], self.session_key) + return True + except: + return False + +except ImportError: + requirements_ok = False + + COINKITE_VID = 0xd13e + CKCC_PID = 0xcc10 + +CKCC_SIMULATED_PID = CKCC_PID ^ 0x55aa + +def my_var_int(l): + # Bitcoin serialization of integers... directly into binary! + if l < 253: + return pack("B", l) + elif l < 0x10000: + return pack("' % (self.dev.master_fingerprint, + self.label()) + + def verify_connection(self, expected_xfp, expected_xpub): + ex = (expected_xfp, expected_xpub) + + if self._expected_device == ex: + # all is as expected + return + + if ( (self._expected_device is not None) + or (self.dev.master_fingerprint != expected_xfp) + or (self.dev.master_xpub != expected_xpub)): + # probably indicating programing error, not hacking + raise RuntimeError("Expecting 0x%08x but that's not whats connected?!" % + expected_xfp) + + # check signature over session key + # - mitm might have lied about xfp and xpub up to here + # - important that we use value capture at wallet creation time, not some value + # we read over USB today + self.dev.check_mitm(expected_xpub=expected_xpub) + + self._expected_device = ex + + print_error("[coldcard]", "Successfully verified against MiTM") + + def is_pairable(self): + # can't do anything w/ devices that aren't setup (but not normally reachable) + return bool(self.dev.master_xpub) + + def timeout(self, cutoff): + # nothing to do? + pass + + def close(self): + # close the HID device (so can be reused) + self.dev.close() + self.dev = None + + def is_initialized(self): + return bool(self.dev.master_xpub) + + def label(self): + # 'label' of this Coldcard. Warning: gets saved into wallet file, which might + # not be encrypted, so better for privacy if based on xpub/fingerprint rather than + # USB serial number. + if self.dev.is_simulator: + lab = 'Coldcard Simulator 0x%08x' % self.dev.master_fingerprint + elif not self.dev.master_fingerprint: + # failback; not expected + lab = 'Coldcard #' + self.dev.serial + else: + lab = 'Coldcard 0x%08x' % self.dev.master_fingerprint + + # Hack zone: during initial setup I need the xfp and master xpub but + # very few objects are passed between the various steps of base_wizard. + # Solution: return a string with some hidden metadata + # - see + # - needs to work w/ deepcopy + class LabelStr(str): + def __new__(cls, s, xfp=None, xpub=None): + self = super().__new__(cls, str(s)) + self.xfp = getattr(s, 'xfp', xfp) + self.xpub = getattr(s, 'xpub', xpub) + return self + + return LabelStr(lab, self.dev.master_fingerprint, self.dev.master_xpub) + + def has_usable_connection_with_device(self): + # Do end-to-end ping test + try: + self.ping_check() + return True + except: + return False + + def get_xpub(self, bip32_path, xtype): + # TODO: xtype? .. might not be able to support anything but classic p2pkh? + print_error('[coldcard]', 'Derive xtype = %r' % xtype) + return self.dev.send_recv(CCProtocolPacker.get_xpub(bip32_path), timeout=5000) + + def ping_check(self): + # check connection is working + assert self.dev.session_key, 'not encrypted?' + req = b'1234 Electrum Plugin 4321' # free up to 59 bytes + try: + echo = self.dev.send_recv(CCProtocolPacker.ping(req)) + assert echo == req + except: + raise RuntimeError("Communication trouble with Coldcard") + + def show_address(self, path, addr_fmt): + # prompt user w/ addres, also returns it immediately. + return self.dev.send_recv(CCProtocolPacker.show_address(path, addr_fmt), timeout=None) + + def get_version(self): + # gives list of strings + return self.dev.send_recv(CCProtocolPacker.version(), timeout=1000).split('\n') + + def sign_message_start(self, path, msg): + # this starts the UX experience. + self.dev.send_recv(CCProtocolPacker.sign_message(msg, path), timeout=None) + + def sign_message_poll(self): + # poll device... if user has approved, will get tuple: (addr, sig) else None + return self.dev.send_recv(CCProtocolPacker.get_signed_msg(), timeout=None) + + def sign_transaction_start(self, raw_psbt, finalize=True): + # Multiple steps to sign: + # - upload binary + # - start signing UX + # - wait for coldcard to complete process, or have it refused. + # - download resulting txn + assert 20 <= len(raw_psbt) < MAX_TXN_LEN, 'PSBT is too big' + dlen, chk = self.dev.upload_file(raw_psbt) + + resp = self.dev.send_recv(CCProtocolPacker.sign_transaction(dlen, chk, finalize=finalize), + timeout=None) + + if resp != None: + raise ValueError(resp) + + def sign_transaction_poll(self): + # poll device... if user has approved, will get tuple: (legnth, checksum) else None + return self.dev.send_recv(CCProtocolPacker.get_signed_txn(), timeout=None) + + def download_file(self, length, checksum, file_number=1): + # get a file + return self.dev.download_file(length, checksum, file_number=file_number) + + + +class Coldcard_KeyStore(Hardware_KeyStore): + hw_type = 'coldcard' + device = 'Coldcard' + + def __init__(self, d): + Hardware_KeyStore.__init__(self, d) + # Errors and other user interaction is done through the wallet's + # handler. The handler is per-window and preserved across + # device reconnects + self.force_watching_only = False + self.ux_busy = False + + # Seems like only the derivation path and resulting **derived** xpub is stored in + # the wallet file... however, we need to know at least the fingerprint of the master + # xpub to verify against MiTM, and also so we can put the right value into the subkey paths + # of PSBT files that might be generated offline. + # - save the fingerprint of the master xpub, as "xfp" + # - it's a LE32 int, but hex more natural way to see it + # - device reports these value during encryption setup process + lab = d['label'] + if hasattr(lab, 'xfp'): + # initial setup + self.ckcc_xfp = lab.xfp + self.ckcc_xpub = lab.xpub + else: + # wallet load: fatal if missing, we need them! + self.ckcc_xfp = d['ckcc_xfp'] + self.ckcc_xpub = d['ckcc_xpub'] + + def dump(self): + # our additions to the stored data about keystore -- only during creation? + d = Hardware_KeyStore.dump(self) + + d['ckcc_xfp'] = self.ckcc_xfp + d['ckcc_xpub'] = self.ckcc_xpub + + return d + + def get_derivation(self): + return self.derivation + + def get_client(self): + # called when user tries to do something like view address, sign somthing. + # - not called during probing/setup + rv = self.plugin.get_client(self) + if rv: + rv.verify_connection(self.ckcc_xfp, self.ckcc_xpub) + + return rv + + def give_error(self, message, clear_client=False): + print_error(message) + if not self.ux_busy: + self.handler.show_error(message) + else: + self.ux_busy = False + if clear_client: + self.client = None + raise Exception(message) + + def wrap_busy(func): + # decorator: function takes over the UX on the device. + def wrapper(self, *args, **kwargs): + try: + self.ux_busy = True + return func(self, *args, **kwargs) + finally: + self.ux_busy = False + return wrapper + + def decrypt_message(self, pubkey, message, password): + raise RuntimeError(_('Encryption and decryption are currently not supported for {}').format(self.device)) + + @wrap_busy + def sign_message(self, sequence, message, password): + # Sign a message on device. Since we have big screen, of course we + # have to show the message unabiguously there first! + try: + msg = message.encode('ascii', errors='strict') + assert 1 <= len(msg) <= MSG_SIGNING_MAX_LENGTH + except (UnicodeError, AssertionError): + # there are other restrictions on message content, + # but let the device enforce and report those + self.handler.show_error('Only short (%d max) ASCII messages can be signed.' + % MSG_SIGNING_MAX_LENGTH) + return b'' + + client = self.get_client() + path = self.get_derivation() + ("/%d/%d" % sequence) + try: + cl = self.get_client() + try: + self.handler.show_message("Signing message (using %s)..." % path) + + cl.sign_message_start(path, msg) + + while 1: + # How to kill some time, without locking UI? + time.sleep(0.250) + + resp = cl.sign_message_poll() + if resp is not None: + break + + finally: + self.handler.finished() + + assert len(resp) == 2 + addr, raw_sig = resp + + # already encoded in Bitcoin fashion, binary. + assert 40 < len(raw_sig) <= 65 + + return raw_sig + + except (CCUserRefused, CCBusyError) as exc: + self.handler.show_error(str(exc)) + except CCProtoError as exc: + traceback.print_exc(file=sys.stderr) + self.handler.show_error('{}\n\n{}'.format( + _('Error showing address') + ':', str(exc))) + except Exception as e: + self.give_error(e, True) + + # give empty bytes for error cases; it seems to clear the old signature box + return b'' + + def build_psbt(self, tx, wallet=None, xfp=None): + # Render a PSBT file, for upload to Coldcard. + # + if xfp is None: + # need fingerprint of MASTER xpub, not the derived key + xfp = self.ckcc_xfp + + inputs = tx.inputs() + + if 'prev_tx' not in inputs[0]: + # fetch info about inputs, if needed? + # - needed during export PSBT flow, not normal online signing + assert wallet, 'need wallet reference' + wallet.add_hw_info(tx) + + # wallet.add_hw_info installs this attr + assert hasattr(tx, 'output_info'), 'need data about outputs' + + # Build map of pubkey needed as derivation from master, in PSBT binary format + # 1) binary version of the common subpath for all keys + # m/ => fingerprint LE32 + # a/b/c => ints + base_path = pack(' not multisig, must be bip32 + if type(wallet) is not Standard_Wallet: + keystore.handler.show_error(_('This function is only available for standard wallets when using {}.').format(self.device)) + return + + sequence = wallet.get_address_index(address) + txin_type = wallet.get_txin_type(address) + keystore.show_address(sequence, txin_type) + +# EOF diff --git a/electrum/plugins/coldcard/qt.py b/electrum/plugins/coldcard/qt.py new file mode 100644 index 00000000..7e9c897f --- /dev/null +++ b/electrum/plugins/coldcard/qt.py @@ -0,0 +1,242 @@ +import time + +from electrum.i18n import _ +from electrum.plugin import hook +from electrum.wallet import Standard_Wallet +from electrum.gui.qt.util import * + +from .coldcard import ColdcardPlugin +from ..hw_wallet.qt import QtHandlerBase, QtPluginBase + + +class Plugin(ColdcardPlugin, QtPluginBase): + icon_unpaired = ":icons/coldcard_unpaired.png" + icon_paired = ":icons/coldcard.png" + + def create_handler(self, window): + return Coldcard_Handler(window) + + @hook + def receive_menu(self, menu, addrs, wallet): + if type(wallet) is not Standard_Wallet: + return + keystore = wallet.get_keystore() + if type(keystore) == self.keystore_class and len(addrs) == 1: + def show_address(): + keystore.thread.add(partial(self.show_address, wallet, addrs[0])) + menu.addAction(_("Show on Coldcard"), show_address) + + @hook + def transaction_dialog(self, dia): + # see gui/qt/transaction_dialog.py + + keystore = dia.wallet.get_keystore() + if type(keystore) != self.keystore_class: + # not a Coldcard wallet, hide feature + return + + # - add a new button, near "export" + btn = QPushButton(_("Save PSBT")) + btn.clicked.connect(lambda unused: self.export_psbt(dia)) + if dia.tx.is_complete(): + # but disable it for signed transactions (nothing to do if already signed) + btn.setDisabled(True) + + dia.sharing_buttons.append(btn) + + def export_psbt(self, dia): + # Called from hook in transaction dialog + tx = dia.tx + + if tx.is_complete(): + # if they sign while dialog is open, it can transition from unsigned to signed, + # which we don't support here, so do nothing + return + + # can only expect Coldcard wallets to work with these files (right now) + keystore = dia.wallet.get_keystore() + assert type(keystore) == self.keystore_class + + # convert to PSBT + raw_psbt = keystore.build_psbt(tx, wallet=dia.wallet) + + name = (dia.wallet.basename() + time.strftime('-%y%m%d-%H%M.psbt')).replace(' ', '-') + fileName = dia.main_window.getSaveFileName(_("Select where to save the PSBT file"), + name, "*.psbt") + if fileName: + with open(fileName, "wb+") as f: + f.write(raw_psbt) + dia.show_message(_("Transaction exported successfully")) + dia.saved = True + + def show_settings_dialog(self, window, keystore): + # When they click on the icon for CC we come here. + device_id = self.choose_device(window, keystore) + if device_id: + CKCCSettingsDialog(window, self, keystore, device_id).exec_() + + +class Coldcard_Handler(QtHandlerBase): + setup_signal = pyqtSignal() + #auth_signal = pyqtSignal(object) + + def __init__(self, win): + super(Coldcard_Handler, self).__init__(win, 'Coldcard') + self.setup_signal.connect(self.setup_dialog) + #self.auth_signal.connect(self.auth_dialog) + + + def message_dialog(self, msg): + self.clear_dialog() + self.dialog = dialog = WindowModalDialog(self.top_level_window(), _("Coldcard Status")) + l = QLabel(msg) + vbox = QVBoxLayout(dialog) + vbox.addWidget(l) + dialog.show() + + def get_setup(self): + self.done.clear() + self.setup_signal.emit() + self.done.wait() + return + + def setup_dialog(self): + self.show_error(_('Please initialization your Coldcard while disconnected.')) + return + +class CKCCSettingsDialog(WindowModalDialog): + '''This dialog doesn't require a device be paired with a wallet. + We want users to be able to wipe a device even if they've forgotten + their PIN.''' + + def __init__(self, window, plugin, keystore, device_id): + title = _("{} Settings").format(plugin.device) + super(CKCCSettingsDialog, self).__init__(window, title) + self.setMaximumWidth(540) + + devmgr = plugin.device_manager() + config = devmgr.config + handler = keystore.handler + self.thread = thread = keystore.thread + + def connect_and_doit(): + client = devmgr.client_by_id(device_id) + if not client: + raise RuntimeError("Device not connected") + return client + + body = QWidget() + body_layout = QVBoxLayout(body) + grid = QGridLayout() + grid.setColumnStretch(2, 1) + + # see + title = QLabel('''
+Coldcard Wallet +
from Coinkite Inc. +
coldcardwallet.com''') + title.setTextInteractionFlags(Qt.LinksAccessibleByMouse) + + grid.addWidget(title , 0,0, 1,2, Qt.AlignHCenter) + y = 3 + + rows = [ + ('fw_version', _("Firmware Version")), + ('fw_built', _("Build Date")), + ('bl_version', _("Bootloader")), + ('xfp', _("Master Fingerprint")), + ('serial', _("USB Serial")), + ] + for row_num, (member_name, label) in enumerate(rows): + widget = QLabel('000000000000') + widget.setTextInteractionFlags(Qt.TextSelectableByMouse | Qt.TextSelectableByKeyboard) + + grid.addWidget(QLabel(label), y, 0, 1,1, Qt.AlignRight) + grid.addWidget(widget, y, 1, 1, 1, Qt.AlignLeft) + setattr(self, member_name, widget) + y += 1 + body_layout.addLayout(grid) + + upg_btn = QPushButton('Upgrade') + #upg_btn.setDefault(False) + def _start_upgrade(): + thread.add(connect_and_doit, on_success=self.start_upgrade) + upg_btn.clicked.connect(_start_upgrade) + + y += 3 + grid.addWidget(upg_btn, y, 0) + grid.addWidget(CloseButton(self), y, 1) + + dialog_vbox = QVBoxLayout(self) + dialog_vbox.addWidget(body) + + # Fetch values and show them + thread.add(connect_and_doit, on_success=self.show_values) + + def show_values(self, client): + dev = client.dev + + self.xfp.setText('0x%08x' % dev.master_fingerprint) + self.serial.setText('%s' % dev.serial) + + # ask device for versions: allow extras for future + fw_date, fw_rel, bl_rel, *rfu = client.get_version() + + self.fw_version.setText('%s' % fw_rel) + self.fw_built.setText('%s' % fw_date) + self.bl_version.setText('%s' % bl_rel) + + def start_upgrade(self, client): + # ask for a filename (must have already downloaded it) + mw = get_parent_main_window(self) + dev = client.dev + + fileName = mw.getOpenFileName("Select upgraded firmware file", "*.dfu") + if not fileName: + return + + from ckcc.utils import dfu_parse + from ckcc.sigheader import FW_HEADER_SIZE, FW_HEADER_OFFSET, FW_HEADER_MAGIC + from ckcc.protocol import CCProtocolPacker + from hashlib import sha256 + import struct + + try: + with open(fileName, 'rb') as fd: + + # unwrap firmware from the DFU + offset, size, *ignored = dfu_parse(fd) + + fd.seek(offset) + firmware = fd.read(size) + + hpos = FW_HEADER_OFFSET + hdr = bytes(firmware[hpos:hpos + FW_HEADER_SIZE]) # needed later too + magic = struct.unpack_from("icons/speaker.png icons/trezor_unpaired.png icons/trezor.png + icons/coldcard.png + icons/coldcard_unpaired.png icons/trustedcoin-status.png icons/trustedcoin-wizard.png icons/unconfirmed.png diff --git a/icons/coldcard.png b/icons/coldcard.png new file mode 100644 index 0000000000000000000000000000000000000000..74104d76ec3745dac1461c5ad439c5bf32e249b6 GIT binary patch literal 528 zcmeAS@N?(olHy`uVBq!ia0vp^0U*r51|<6gKdl8)k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+7&m#kIEGZ*dNap2uh~Grt?>s#?vk8My&+5F7Iw=t9xiJ1 zht9Gp`_KeYE z%y@X$PKtHU?TRA;-B%vk_PJgP-Kb8o9oGt2jDCf(W_Jw)$qzN0!dVhLBiZpYCm z`997?uaug88Ql^t_PM$&u5sVt%O@^osO`3WzqjGr*N-#z&Jv$mzWQwA?#uUPudmzw?Cer&$e=AH>YV~lthEa-qy8k=>@@kQ(}%* z@D{xJaOvN_oQ8Et84qtfKcMOU{BU~A(SXJ^hZtOLF)UwG1L3aBS@PE2KE3(1mYRmT zl4Qqfi6{yE9`R$`%6kmrW^l169O8c5deh@^>&HV|4B|jiZWW1p48r&tIP}kGffPP& z%>)X7q&^%9Q2WP)zp{4Y-2{Cgc!sp-8@)*WB_Xe@^`3&pG)E@IOkbVXNFu;4fN`VK4 zxa=KX0??r3XX z`gmxec~A|o+%6QDs;p66PCP(FVCm1R2!MpZilLDJ^ef-1n3k@Np-&8r8!+|?48b2M zj;+1NOHvEhB)9;0&2fyq0y}Ripu6SNF3cSm8o+0DCHFX%*uCbnY%gG=^RbT542c4{ zrxz8#QfO5ZD>@_Xe*dUrUC9a9GiU})ffL2C8elk!NTKpL$FVA4!7EGVZ96G!>NrN3 z#)x!Fueexkm&@hnwd9|PmI`obTa$(XENfo_1x&;ox8Fet!vfLoHq zv6*UNvh+d{z&jN%$g^aQ08!lXS#Ab-mdpttid&{7W(fS;4lG$Nz*1n&OJHYnVN|!A*-+0129<@D+SYU7SJtBst5rBwSejx;R2&H4 zRt^^4iy`IIQIp_O^%<_f8g)S?Le+;P2KxQ6ut%mgU^9X18EN(axt@`pCXLyHi8~_= z9g8YZVkM#g)y4s&s%uBr!m2>dd7#$9gzhZ57Veq*jkexnwA=@%X^aB=yB0V;?j`9$ ziFhuxS0UG2gDeta3%qI Date: Wed, 22 Aug 2018 19:04:01 +0200 Subject: [PATCH 019/138] minor fixes for prev use TxOutputHwInfo namedtuple warn user if device is set to wrong chain undo parts of prev re testnet. fix p2wpkh. testnet support. and minor stuff --- electrum/bitcoin.py | 7 +++-- electrum/plugins/coldcard/coldcard.py | 40 +++++++++++++++++++-------- electrum/transaction.py | 4 +-- 3 files changed, 35 insertions(+), 16 deletions(-) diff --git a/electrum/bitcoin.py b/electrum/bitcoin.py index f1025f47..df05fdd0 100644 --- a/electrum/bitcoin.py +++ b/electrum/bitcoin.py @@ -626,6 +626,9 @@ def serialize_xpub(xtype, c, cK, depth=0, fingerprint=b'\x00'*4, return EncodeBase58Check(xpub) +class InvalidMasterKeyVersionBytes(BitcoinException): pass + + def deserialize_xkey(xkey, prv, *, net=None): if net is None: net = constants.net @@ -640,8 +643,8 @@ def deserialize_xkey(xkey, prv, *, net=None): header = int('0x' + bh2u(xkey[0:4]), 16) headers = net.XPRV_HEADERS if prv else net.XPUB_HEADERS if header not in headers.values(): - raise BitcoinException('Invalid extended key format: {}' - .format(hex(header))) + raise InvalidMasterKeyVersionBytes('Invalid extended key format: {}' + .format(hex(header))) xtype = list(headers.keys())[list(headers.values()).index(header)] n = 33 if prv else 32 K_or_k = xkey[13+n:] diff --git a/electrum/plugins/coldcard/coldcard.py b/electrum/plugins/coldcard/coldcard.py index fd307de2..5c99991d 100644 --- a/electrum/plugins/coldcard/coldcard.py +++ b/electrum/plugins/coldcard/coldcard.py @@ -8,10 +8,12 @@ import os, sys, time, io import traceback from electrum import bitcoin +from electrum.bitcoin import serialize_xpub, deserialize_xpub, InvalidMasterKeyVersionBytes +from electrum import constants from electrum.bitcoin import TYPE_ADDRESS, int_to_hex from electrum.i18n import _ from electrum.plugin import BasePlugin, Device -from electrum.keystore import Hardware_KeyStore, xpubkey_to_pubkey +from electrum.keystore import Hardware_KeyStore, xpubkey_to_pubkey, Xpub from electrum.transaction import Transaction from electrum.wallet import Standard_Wallet from electrum.crypto import hash_160 @@ -85,7 +87,8 @@ class CKCCClient: # Challenge: I haven't found anywhere that defines a base class for this 'client', # nor an API (interface) to be met. Winging it. Gets called from lib/plugins.py mostly? - def __init__(self, handler, dev_path, is_simulator=False): + def __init__(self, plugin, handler, dev_path, is_simulator=False): + self.device = plugin.device self.handler = handler # if we know what the (xfp, xpub) "should be" then track it here @@ -183,9 +186,19 @@ class CKCCClient: return False def get_xpub(self, bip32_path, xtype): - # TODO: xtype? .. might not be able to support anything but classic p2pkh? + assert xtype in ColdcardPlugin.SUPPORTED_XTYPES print_error('[coldcard]', 'Derive xtype = %r' % xtype) - return self.dev.send_recv(CCProtocolPacker.get_xpub(bip32_path), timeout=5000) + xpub = self.dev.send_recv(CCProtocolPacker.get_xpub(bip32_path), timeout=5000) + # TODO handle timeout? + # change type of xpub to the requested type + try: + __, depth, fingerprint, child_number, c, cK = deserialize_xpub(xpub) + except InvalidMasterKeyVersionBytes: + raise Exception(_('Invalid xpub magic. Make sure your {} device is set to the correct chain.') + .format(self.device)) from None + if xtype != 'standard': + xpub = serialize_xpub(xtype, c, cK, depth, fingerprint, child_number) + return xpub def ping_check(self): # check connection is working @@ -435,7 +448,11 @@ class Coldcard_KeyStore(Hardware_KeyStore): # global section: just the unsigned txn - unsigned = bfh(tx.serialize_to_network(blank_scripts=True)) + class CustomTXSerialization(Transaction): + @classmethod + def input_script(cls, txin, estimate_size=False): + return '' + unsigned = bfh(CustomTXSerialization(tx.serialize()).serialize_to_network(witness=False)) write_kv(PSBT_GLOBAL_UNSIGNED_TX, unsigned) # end globals section @@ -457,13 +474,13 @@ class Coldcard_KeyStore(Hardware_KeyStore): out_fd.write(b'\x00') # outputs section - for _type, address, amount in tx.outputs(): + for o in tx.outputs(): # can be empty, but must be present, and helpful to show change inputs # wallet.add_hw_info() adds some data about change outputs into tx.output_info - if address in tx.output_info: + if o.address in tx.output_info: # this address "is_mine" but might not be change (I like to sent to myself) - # - index, xpubs, _multisig = tx.output_info.get(address) + output_info = tx.output_info.get(o.address) + index, xpubs = output_info.address_index, output_info.sorted_xpubs if index[0] == 1 and len(index) == 2: # it is a change output (based on our standard derivation path) @@ -581,7 +598,6 @@ class ColdcardPlugin(HW_PluginBase): SUPPORTED_XTYPES = ('standard', 'p2wpkh') def __init__(self, parent, config, name): - self.segwit = config.get("segwit") HW_PluginBase.__init__(self, parent, config, name) if self.libraries_available: @@ -608,11 +624,11 @@ class ColdcardPlugin(HW_PluginBase): # Not sure why not we aren't just given a HID library handle, but # the 'path' is unabiguous, so we'll use that. try: - rv = CKCCClient(handler, device.path, + rv = CKCCClient(self, handler, device.path, is_simulator=(device.product_key[1] == CKCC_SIMULATED_PID)) return rv except: - print_error('[coldcard]', 'late failure connecting to device?') + self.print_error('late failure connecting to device?') return None def setup_device(self, device_info, wizard, purpose): diff --git a/electrum/transaction.py b/electrum/transaction.py index 11909029..fe056985 100644 --- a/electrum/transaction.py +++ b/electrum/transaction.py @@ -1030,12 +1030,12 @@ class Transaction: else: return network_ser - def serialize_to_network(self, estimate_size=False, witness=True, blank_scripts=False): + def serialize_to_network(self, estimate_size=False, witness=True): nVersion = int_to_hex(self.version, 4) nLocktime = int_to_hex(self.locktime, 4) inputs = self.inputs() outputs = self.outputs() - txins = var_int(len(inputs)) + ''.join(self.serialize_input(txin, self.input_script(txin, estimate_size) if not blank_scripts else '') for txin in inputs) + txins = var_int(len(inputs)) + ''.join(self.serialize_input(txin, self.input_script(txin, estimate_size)) for txin in inputs) txouts = var_int(len(outputs)) + ''.join(self.serialize_output(o) for o in outputs) use_segwit_ser_for_estimate_size = estimate_size and self.is_segwit(guess_for_address=True) use_segwit_ser_for_actual_use = not estimate_size and \ From 2a5f108d4ab2145c5784934063293bc2decce67a Mon Sep 17 00:00:00 2001 From: tiagotrs Date: Wed, 22 Aug 2018 22:25:12 +0200 Subject: [PATCH 020/138] change prng, add warning against encrypting multiple secrets (#4649) * substitute python prng generator with hmac_drbg * add warning, change version * brick cards version 0 * separate python-drbg module, include tests and license * import to match PEP 8 * fix line break, minor changes in wording * fixes noise_seed formatting errors * fix import, include license exclude tests drbg module --- electrum/plugins/revealer/hmac_drbg.py | 51 ++++++++++++++++++++++++++ electrum/plugins/revealer/qt.py | 39 ++++++++++++++------ 2 files changed, 79 insertions(+), 11 deletions(-) create mode 100644 electrum/plugins/revealer/hmac_drbg.py diff --git a/electrum/plugins/revealer/hmac_drbg.py b/electrum/plugins/revealer/hmac_drbg.py new file mode 100644 index 00000000..ca533469 --- /dev/null +++ b/electrum/plugins/revealer/hmac_drbg.py @@ -0,0 +1,51 @@ +''' +Copyright (c) 2014 David Lazar + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +''' + +import hashlib +import hmac + +class DRBG(object): + def __init__(self, seed): + self.key = b'\x00' * 64 + self.val = b'\x01' * 64 + self.reseed(seed) + + def hmac(self, key, val): + return hmac.new(key, val, hashlib.sha512).digest() + + def reseed(self, data=b''): + self.key = self.hmac(self.key, self.val + b'\x00' + data) + self.val = self.hmac(self.key, self.val) + + if data: + self.key = self.hmac(self.key, self.val + b'\x01' + data) + self.val = self.hmac(self.key, self.val) + + def generate(self, n): + xs = b'' + while len(xs) < n: + self.val = self.hmac(self.key, self.val) + xs += self.val + + self.reseed() + + return xs[:n] diff --git a/electrum/plugins/revealer/qt.py b/electrum/plugins/revealer/qt.py index 36b7de09..d64dc585 100644 --- a/electrum/plugins/revealer/qt.py +++ b/electrum/plugins/revealer/qt.py @@ -22,16 +22,17 @@ import qrcode import traceback from hashlib import sha256 from decimal import Decimal +import binascii from PyQt5.QtPrintSupport import QPrinter from electrum.plugin import BasePlugin, hook from electrum.i18n import _ from electrum.util import to_bytes, make_dir - from electrum.gui.qt.util import * from electrum.gui.qt.qrtextedit import ScanQRTextEdit +from .hmac_drbg import DRBG class Plugin(BasePlugin): @@ -47,7 +48,7 @@ class Plugin(BasePlugin): self.calibration_h = self.config.get('calibration_h') self.calibration_v = self.config.get('calibration_v') - self.version = '0' + self.version = '1' self.size = (159, 97) self.f_size = QSize(1014*2, 642*2) self.abstand_h = 21 @@ -130,7 +131,7 @@ class Plugin(BasePlugin): s = self.get_noise() b = self.is_noise(s) if b: - self.noise_seed = s[:-3] + self.noise_seed = s[1:-3] self.user_input = True self.next_button.setEnabled(b) @@ -155,6 +156,9 @@ class Plugin(BasePlugin): else: return False else: + + if (len(txt)>0 and txt[0]=='0'): + self.d.show_message(''.join(["",_("Warning: "), "", _("Revealers starting with 0 had a vulnerability and are not supported.")])) self.user_input = False return False @@ -211,12 +215,12 @@ class Plugin(BasePlugin): grid = QGridLayout() self.vbox.addLayout(grid) - cprint = QPushButton(_("Generate encrypted seed PDF")) + cprint = QPushButton(_("Generate encrypted seed backup")) cprint.clicked.connect(partial(self.seed_img, True)) self.vbox.addWidget(cprint) self.vbox.addSpacing(14) - self.vbox.addWidget(WWLabel(_("and/or type any secret below:"))) + self.vbox.addWidget(WWLabel(_("OR type any secret below:"))) self.text = ScanQRTextEdit() self.text.setTabChangesFocus(True) self.text.setMaximumHeight(70) @@ -231,12 +235,19 @@ class Plugin(BasePlugin): self.vbox.addWidget(self.max_chars) self.max_chars.setVisible(False) - self.ctext = QPushButton(_("Generate custom secret encrypted PDF")) + self.ctext = QPushButton(_("Generate custom secret encrypted backup")) self.ctext.clicked.connect(self.t) self.vbox.addWidget(self.ctext) self.ctext.setEnabled(False) + self.vbox.addSpacing(11) + self.vbox.addWidget( + QLabel(''.join(["" + _("WARNING") + ": " + _("Revealer is a one-time-pad and should be used only once."), '
', + _("Multiple secrets encrypted for the same Revealer can be attacked."), '
', + ]))) + self.vbox.addSpacing(11) + self.vbox.addSpacing(21) self.vbox.addLayout(Buttons(CloseButton(d))) return bool(d.exec_()) @@ -305,21 +316,27 @@ class Plugin(BasePlugin): if(self.noise_seed == False): self.noise_seed = random.SystemRandom().getrandbits(128) - self.hex_noise = format(self.noise_seed, '02x') + self.hex_noise = format(self.noise_seed, '032x') self.hex_noise = self.version + str(self.hex_noise) if (self.user_input == True): self.noise_seed = int(self.noise_seed, 16) - self.hex_noise = self.version + str(format(self.noise_seed, '02x')) - + self.hex_noise = self.version + str(format(self.noise_seed, '032x')) self.code_id = self.code_hashid(self.hex_noise) self.hex_noise = ' '.join(self.hex_noise[i:i+4] for i in range(0,len(self.hex_noise),4)) - random.seed(self.noise_seed) + entropy = binascii.unhexlify(str(format(self.noise_seed, '032x'))) + code_id = binascii.unhexlify(self.version + self.code_id) + + drbg = DRBG(entropy + code_id) + noise_array=bin(int.from_bytes(drbg.generate(1929), 'big'))[2:] + + i=0 for x in range(w): for y in range(h): - rawnoise.setPixel(x,y,random.randint(0, 1)) + rawnoise.setPixel(x,y,int(noise_array[i])) + i+=1 self.rawnoise = rawnoise if create_revealer==True: From 91c369e39288328f24fedc70e36eda67f5ad6dd3 Mon Sep 17 00:00:00 2001 From: SomberNight Date: Thu, 23 Aug 2018 18:31:14 +0200 Subject: [PATCH 021/138] hw wallets: generalise 'minimum_library' for those that provide a version number --- electrum/base_wizard.py | 3 ++- electrum/plugin.py | 3 ++- electrum/plugins/coldcard/coldcard.py | 17 ++++++++++--- electrum/plugins/hw_wallet/plugin.py | 36 ++++++++++++++++++++++++++- electrum/plugins/hw_wallet/qt.py | 6 +---- electrum/plugins/safe_t/safe_t.py | 28 +++++++-------------- electrum/plugins/trezor/trezor.py | 28 +++++++-------------- 7 files changed, 71 insertions(+), 50 deletions(-) diff --git a/electrum/base_wizard.py b/electrum/base_wizard.py index fa8193fd..0e2d45c6 100644 --- a/electrum/base_wizard.py +++ b/electrum/base_wizard.py @@ -240,7 +240,8 @@ class BaseWizard(object): u = devmgr.unpaired_device_infos(None, plugin, devices=scanned_devices) except BaseException as e: devmgr.print_error('error getting device infos for {}: {}'.format(name, e)) - debug_msg += ' {}:\n {}\n'.format(plugin.name, e) + indented_error_msg = ' '.join([''] + str(e).splitlines(keepends=True)) + debug_msg += ' {}:\n{}\n'.format(plugin.name, indented_error_msg) continue devices += list(map(lambda x: (name, x), u)) if not debug_msg: diff --git a/electrum/plugin.py b/electrum/plugin.py index 4ea8e53d..f269fb89 100644 --- a/electrum/plugin.py +++ b/electrum/plugin.py @@ -457,7 +457,8 @@ class DeviceMgr(ThreadJob, PrintError): '''Returns a list of DeviceInfo objects: one for each connected, unpaired device accepted by the plugin.''' if not plugin.libraries_available: - raise Exception('Missing libraries for {}'.format(plugin.name)) + message = plugin.get_library_not_available_message() + raise Exception(message) if devices is None: devices = self.scan_devices() devices = [dev for dev in devices if not self.xpub_by_id(dev.id_)] diff --git a/electrum/plugins/coldcard/coldcard.py b/electrum/plugins/coldcard/coldcard.py index 5c99991d..5327aa5e 100644 --- a/electrum/plugins/coldcard/coldcard.py +++ b/electrum/plugins/coldcard/coldcard.py @@ -585,8 +585,8 @@ class Coldcard_KeyStore(Hardware_KeyStore): class ColdcardPlugin(HW_PluginBase): - libraries_available = requirements_ok keystore_class = Coldcard_KeyStore + minimum_library = (0, 7, 2) client = None DEVICE_IDS = [ @@ -600,10 +600,19 @@ class ColdcardPlugin(HW_PluginBase): def __init__(self, parent, config, name): HW_PluginBase.__init__(self, parent, config, name) - if self.libraries_available: - self.device_manager().register_devices(self.DEVICE_IDS) + self.libraries_available = self.check_libraries_available() and requirements_ok + if not self.libraries_available: + return - self.device_manager().register_enumerate_func(self.detect_simulator) + self.device_manager().register_devices(self.DEVICE_IDS) + self.device_manager().register_enumerate_func(self.detect_simulator) + + def get_library_version(self): + import ckcc + try: + return ckcc.__version__ + except AttributeError: + return 'unknown' def detect_simulator(self): # if there is a simulator running on this machine, diff --git a/electrum/plugins/hw_wallet/plugin.py b/electrum/plugins/hw_wallet/plugin.py index bde6928c..24861494 100644 --- a/electrum/plugins/hw_wallet/plugin.py +++ b/electrum/plugins/hw_wallet/plugin.py @@ -27,7 +27,7 @@ from electrum.plugin import BasePlugin, hook from electrum.i18n import _ from electrum.bitcoin import is_address, TYPE_SCRIPT -from electrum.util import bfh +from electrum.util import bfh, versiontuple from electrum.transaction import opcodes, TxOutput @@ -38,6 +38,8 @@ class HW_PluginBase(BasePlugin): # libraries_available, libraries_URL, minimum_firmware, # wallet_class, ckd_public, types, HidTransport + minimum_library = (0, ) + def __init__(self, parent, config, name): BasePlugin.__init__(self, parent, config, name) self.device = self.keystore_class.device @@ -78,6 +80,38 @@ class HW_PluginBase(BasePlugin): return False return True + def get_library_version(self) -> str: + """Returns the version of the 3rd party python library + for the hw wallet. For example '0.9.0' + + Returns 'unknown' if library is found but cannot determine version. + Raises 'ImportError' if library is not found. + """ + raise NotImplementedError() + + def check_libraries_available(self) -> bool: + try: + library_version = self.get_library_version() + except ImportError: + return False + if library_version == 'unknown' or \ + versiontuple(library_version) < self.minimum_library: + self.libraries_available_message = ( + _("Library version for '{}' is too old.").format(self.name) + + '\nInstalled: {}, Needed: {}' + .format(library_version, self.minimum_library)) + self.print_stderr(self.libraries_available_message) + return False + return True + + def get_library_not_available_message(self) -> str: + if hasattr(self, 'libraries_available_message'): + message = self.libraries_available_message + else: + message = _("Missing libraries for {}.").format(self.name) + message += '\n' + _("Make sure you install it with python3") + return message + def is_any_tx_output_on_change_branch(tx): if not hasattr(tx, 'output_info'): diff --git a/electrum/plugins/hw_wallet/qt.py b/electrum/plugins/hw_wallet/qt.py index 214ea2b5..2b5215eb 100644 --- a/electrum/plugins/hw_wallet/qt.py +++ b/electrum/plugins/hw_wallet/qt.py @@ -189,11 +189,7 @@ class QtPluginBase(object): if not isinstance(keystore, self.keystore_class): continue if not self.libraries_available: - if hasattr(self, 'libraries_available_message'): - message = self.libraries_available_message + '\n' - else: - message = _("Cannot find python library for") + " '%s'.\n" % self.name - message += _("Make sure you install it with python3") + message = keystore.plugin.get_library_not_available_message() window.show_error(message) return tooltip = self.device + '\n' + (keystore.label or 'unnamed') diff --git a/electrum/plugins/safe_t/safe_t.py b/electrum/plugins/safe_t/safe_t.py index 983ddf59..f6ef634c 100644 --- a/electrum/plugins/safe_t/safe_t.py +++ b/electrum/plugins/safe_t/safe_t.py @@ -82,25 +82,8 @@ class SafeTPlugin(HW_PluginBase): def __init__(self, parent, config, name): HW_PluginBase.__init__(self, parent, config, name) - try: - # Minimal test if python-safet is installed - import safetlib - try: - library_version = safetlib.__version__ - except AttributeError: - # python-safet only introduced __version__ in 0.1.0 - library_version = 'unknown' - if library_version == 'unknown' or \ - versiontuple(library_version) < self.minimum_library: - self.libraries_available_message = ( - _("Library version for '{}' is too old.").format(name) - + '\nInstalled: {}, Needed: {}' - .format(library_version, self.minimum_library)) - self.print_stderr(self.libraries_available_message) - raise ImportError() - self.libraries_available = True - except ImportError: - self.libraries_available = False + self.libraries_available = self.check_libraries_available() + if not self.libraries_available: return from . import client @@ -113,6 +96,13 @@ class SafeTPlugin(HW_PluginBase): self.transport_handler = transport.SafeTTransport() self.device_manager().register_enumerate_func(self.enumerate) + def get_library_version(self): + import safetlib + try: + return safetlib.__version__ + except AttributeError: + return 'unknown' + def enumerate(self): devices = self.transport_handler.enumerate_devices() return [Device(d.get_path(), -1, d.get_path(), 'Safe-T mini', 0) for d in devices] diff --git a/electrum/plugins/trezor/trezor.py b/electrum/plugins/trezor/trezor.py index be0090eb..0c479437 100644 --- a/electrum/plugins/trezor/trezor.py +++ b/electrum/plugins/trezor/trezor.py @@ -83,25 +83,8 @@ class TrezorPlugin(HW_PluginBase): def __init__(self, parent, config, name): HW_PluginBase.__init__(self, parent, config, name) - try: - # Minimal test if python-trezor is installed - import trezorlib - try: - library_version = trezorlib.__version__ - except AttributeError: - # python-trezor only introduced __version__ in 0.9.0 - library_version = 'unknown' - if library_version == 'unknown' or \ - versiontuple(library_version) < self.minimum_library: - self.libraries_available_message = ( - _("Library version for '{}' is too old.").format(name) - + '\nInstalled: {}, Needed: {}' - .format(library_version, self.minimum_library)) - self.print_stderr(self.libraries_available_message) - raise ImportError() - self.libraries_available = True - except ImportError: - self.libraries_available = False + self.libraries_available = self.check_libraries_available() + if not self.libraries_available: return from . import client @@ -114,6 +97,13 @@ class TrezorPlugin(HW_PluginBase): self.transport_handler = transport.TrezorTransport() self.device_manager().register_enumerate_func(self.enumerate) + def get_library_version(self): + import trezorlib + try: + return trezorlib.__version__ + except AttributeError: + return 'unknown' + def enumerate(self): devices = self.transport_handler.enumerate_devices() return [Device(d.get_path(), -1, d.get_path(), 'TREZOR', 0) for d in devices] From 262d431ff5507cc6a277fae32a2460d21745d64f Mon Sep 17 00:00:00 2001 From: Janus Date: Fri, 24 Aug 2018 14:56:58 +0200 Subject: [PATCH 022/138] x509: handle dates in the 22nd century --- electrum/tests/test_x509.py | 6 ++++++ electrum/x509.py | 29 ++++++++++++++--------------- 2 files changed, 20 insertions(+), 15 deletions(-) create mode 100644 electrum/tests/test_x509.py diff --git a/electrum/tests/test_x509.py b/electrum/tests/test_x509.py new file mode 100644 index 00000000..75d11a8c --- /dev/null +++ b/electrum/tests/test_x509.py @@ -0,0 +1,6 @@ +import unittest +from electrum.x509 import X509 +class TestX509(unittest.TestCase): + def test_generalizedtime(self): + full = X509(b'0\x82\x05F0\x82\x03.\x02\t\x00\xfeV\xd6\xb5?\xb1j\xe40\r\x06\t*\x86H\x86\xf7\r\x01\x01\x0b\x05\x000d1\x0b0\t\x06\x03U\x04\x06\x13\x02US1\x130\x11\x06\x03U\x04\x08\x0c\nCalifornia1!0\x1f\x06\x03U\x04\n\x0c\x18Internet Widgits Pty Ltd1\x1d0\x1b\x06\x03U\x04\x03\x0c\x14testnet.qtornado.com0 \x17\r180206010225Z\x18\x0f21180113010225Z0d1\x0b0\t\x06\x03U\x04\x06\x13\x02US1\x130\x11\x06\x03U\x04\x08\x0c\nCalifornia1!0\x1f\x06\x03U\x04\n\x0c\x18Internet Widgits Pty Ltd1\x1d0\x1b\x06\x03U\x04\x03\x0c\x14testnet.qtornado.com0\x82\x02"0\r\x06\t*\x86H\x86\xf7\r\x01\x01\x01\x05\x00\x03\x82\x02\x0f\x000\x82\x02\n\x02\x82\x02\x01\x00\xc2B\xe0\xa8\xd9$M\xbc)Wx\x0cv\x00\xc0\xfa2Ew:\xce\xa7\xcb\xc8\r?\xea\xc5R(\xc7\xc3Y\xe7zq=\xcd\x8d\xe3\x86\x9ecSI\xc7\x84\xf2~\x91\xd4\x19\xc2;\x97\xe81e\xf2\xeb\xf1\xadw\xa3p\x88A*-\r\xb6Yt\x98R\xe8\x8a\xf9\xb5>"F\xac\x19%\xc8~\x1d\xac\x93A\xffk\xce\xdb\xfc9\x05\xa0\xad\xf9V\x0f0\xa2b\xd0@\xe4\xf1\xb1\xe8\xb1\x10[&\xa1\xff\x13\xcfQ\xb7\x805\xef\xe7tL\xe5|\x08W\x8c\xd72\x9d\'\xeb\x92)3N\x01M\x06\xa9\xdc\xe4\'\x13\x90x\xd8\x830\x97\xa8\xcc2d \xfa\x91\x04\xd0\x1b\xe7\xaa t\x87\xba]\xb5w\x05(\xba\x07\xc2X$~?L\xc5\x03\xb2\xdeQ\xf3\xf3\xdab\xd9\x92\xd9\x86^:\x93\xc9\x86~\xd1\x94\xd4\x80\x9c\xff0\xc6m\xf4\xf0\xd6\x18\x96l\x1d\x0c\xe8\x15 \x8c\x89\xcb\xa4*\xd9\xefg\x844\x81\xb3\xce\xa1\x8a|\xf9h\xc3\xe1!\xfeZ`\xb71\x97Kj\x0b"\xd3\x98T\r\xd9\xbb\xc6\x0b\x81\x81k\x0e\xd01\x16\x91\xe4A\x8c\x1a\xe9W\xd4=<\xd4m_\xd4m\xa4H\x14\xc0\xae\x12\xab\x808\xf1\xf9_\xbb\xfb\xd0U\x0e\\\xd3.?\xa36\xe1hstU"\x17P\xcb>\x83\x9c\xaa\x9b\xb7\xe5\xb4\xb5W\xdc\xc1\xee\x91K\x12\xc2\xe1U\xaf\xf7I`\x83\x91\x0c\xc0\xcb\x15\x13!V\xa9\xc1\xca\x1b\x80\xff\xd8\x1f\xd8_+\x83\xcd\xcb%\xd6\xb7\xdc\x8a2\xa8Q\x1f\xbb.\xdf\x05\xb7hD\xab\xea\xe9\xfb.\xdd\x93\xd1\xf0\xb8r\xb9t.\xab\xf6]\xac\xc9U9\x87\x9e\xe36 \x87\xe7eo\x98\xac\xf4\x87\x8e\xf4\xa86\xd3\xcapy\xee\xa0]\xdbA\xb9\x00\xe9_R\xc8\xf7\xca\x13\xc6\xb1Z|c\xe8v\xa24\xac?k\xf1\xc4\x97\x18\x07\xbaU\xc9\xf5? \x95\x8f\x11\xa7\xc9\x8eY\x9c\xdfnx?\x88\xba\x90\xef\x94WU\xb5\xcf\x0b"\xe8\xfe\xa6.\x0cr-\xaf3\x8a\xe6v\xf9\xb91\x87\x91\xc6\xb1\xe9\xb9UP\xf5\x14\xb7\x99\x80\xc0\xc5}\x9a~\x7f\x06\x1e\xb8\x05\xd5\xa2LXO\\73i\x82\xcd\xc6#\xb7\xa4q\xd7\xd4y\xb1d\xaf\xa8\t\x9e1K\xd94\xaf7\x08\x8c);\xd2\xed\x91\xc6\xed\x83\x90\r\xef\x85\xf0\xfeJi\x02;\xf0\x0b\x03\xe7\xc1\x84\xd45\xaeP\xc2Lp\x1akb\xcaP\xe9\xfc\xc1\xc8VPQu\x85\x92l\x12\xb99{\x91\xd0\xa6d\n\xde\xf85\x93e\xfa\\\xf9cKx8\x84"s\xb8\xe52~\x97\x05\xc3\xf6\x1c\xca\x0b\xda\x8b\x90\xfeu5,\x94,\x99\xf9\x9a\xf3T\x8dAZ\xc7\xe9\x95-\x98\xf2\xbaL\x89\xc0?\xba1\xb5\\t|RY_\xc6\xabr\xe8') + full.check_date() diff --git a/electrum/x509.py b/electrum/x509.py index e4b94d40..f03d3051 100644 --- a/electrum/x509.py +++ b/electrum/x509.py @@ -26,6 +26,7 @@ from . import util from .util import profiler, bh2u import ecdsa import hashlib +import time # algo OIDs ALGO_RSA_SHA1 = '1.2.840.113549.1.1.5' @@ -178,6 +179,14 @@ class ASN1_Node(bytes): p[oid] = value return p + def decode_time(self, ii): + GENERALIZED_TIMESTAMP_FMT = '%Y%m%d%H%M%SZ' + UTCTIME_TIMESTAMP_FMT = '%y%m%d%H%M%SZ' + + try: + return time.strptime(self.get_value_of_type(ii, 'UTCTime').decode('ascii'), UTCTIME_TIMESTAMP_FMT) + except TypeError: + return time.strptime(self.get_value_of_type(ii, 'GeneralizedTime').decode('ascii'), GENERALIZED_TIMESTAMP_FMT) class X509(object): def __init__(self, b): @@ -210,15 +219,9 @@ class X509(object): # validity validity = der.next_node(issuer) ii = der.first_child(validity) - try: - self.notBefore = der.get_value_of_type(ii, 'UTCTime') - except TypeError: - self.notBefore = der.get_value_of_type(ii, 'GeneralizedTime')[2:] # strip year + self.notBefore = der.decode_time(ii) ii = der.next_node(ii) - try: - self.notAfter = der.get_value_of_type(ii, 'UTCTime') - except TypeError: - self.notAfter = der.get_value_of_type(ii, 'GeneralizedTime')[2:] # strip year + self.notAfter = der.decode_time(ii) # subject subject = der.next_node(validity) @@ -293,14 +296,10 @@ class X509(object): return self.CA def check_date(self): - import time - now = time.time() - TIMESTAMP_FMT = '%y%m%d%H%M%SZ' - not_before = time.mktime(time.strptime(self.notBefore.decode('ascii'), TIMESTAMP_FMT)) - not_after = time.mktime(time.strptime(self.notAfter.decode('ascii'), TIMESTAMP_FMT)) - if not_before > now: + now = time.gmtime() + if self.notBefore > now: raise CertificateError('Certificate has not entered its valid date range. (%s)' % self.get_common_name()) - if not_after <= now: + if self.notAfter <= now: raise CertificateError('Certificate has expired. (%s)' % self.get_common_name()) def getFingerprint(self): From 0137626a63d0da8fffb186d11dccd203c86243bb Mon Sep 17 00:00:00 2001 From: SomberNight Date: Tue, 28 Aug 2018 18:20:35 +0200 Subject: [PATCH 023/138] wallet restore: remove dead code. add log lines. --- electrum/gui/qt/installwizard.py | 22 ---------------------- electrum/wallet.py | 8 +++++--- 2 files changed, 5 insertions(+), 25 deletions(-) diff --git a/electrum/gui/qt/installwizard.py b/electrum/gui/qt/installwizard.py index cd45e6f3..8d201663 100644 --- a/electrum/gui/qt/installwizard.py +++ b/electrum/gui/qt/installwizard.py @@ -102,7 +102,6 @@ def wizard_dialog(func): class InstallWizard(QDialog, MessageBoxMixin, BaseWizard): accept_signal = pyqtSignal() - synchronized_signal = pyqtSignal(str) def __init__(self, config, app, plugins, storage): BaseWizard.__init__(self, config, plugins, storage) @@ -448,27 +447,6 @@ class InstallWizard(QDialog, MessageBoxMixin, BaseWizard): self.exec_layout(playout.layout()) return playout.encrypt_cb.isChecked() - def show_restore(self, wallet, network): - # FIXME: these messages are shown after the install wizard is - # finished and the window closed. On macOS they appear parented - # with a re-appeared ghost install wizard window... - if network: - def task(): - wallet.wait_until_synchronized() - if wallet.is_found(): - msg = _("Recovery successful") - else: - msg = _("No transactions found for this seed") - self.synchronized_signal.emit(msg) - self.synchronized_signal.connect(self.show_message) - t = threading.Thread(target = task) - t.daemon = True - t.start() - else: - msg = _("This wallet was restored offline. It may " - "contain more addresses than displayed.") - self.show_message(msg) - @wizard_dialog def confirm_dialog(self, title, message, run_next): self.confirm(message, title) diff --git a/electrum/wallet.py b/electrum/wallet.py index eeddc69f..d1e561da 100644 --- a/electrum/wallet.py +++ b/electrum/wallet.py @@ -643,22 +643,24 @@ class Abstract_Wallet(AddressSynchronizer): self.set_up_to_date(False) while not self.is_up_to_date(): if callback: - msg = "%s\n%s %d"%( + msg = "{}\n{} {}".format( _("Please wait..."), _("Addresses generated:"), - len(self.addresses(True))) + len(self.get_addresses())) callback(msg) time.sleep(0.1) def wait_for_network(): while not self.network.is_connected(): if callback: - msg = "%s \n" % (_("Connecting...")) + msg = "{} \n".format(_("Connecting...")) callback(msg) time.sleep(0.1) # wait until we are connected, because the user # might have selected another server if self.network: + self.print_error("waiting for network...") wait_for_network() + self.print_error("waiting while wallet is syncing...") wait_for_wallet() else: self.synchronize() From 1b19cdd0f44ed5b65b30631f21db769fe5aaeefb Mon Sep 17 00:00:00 2001 From: SomberNight Date: Tue, 28 Aug 2018 20:17:21 +0200 Subject: [PATCH 024/138] transaction.py: fix script_GetOp for malformed scripts related fyookball/electrum#829 --- electrum/tests/test_transaction.py | 6 +++++ electrum/transaction.py | 39 ++++++++++++++++-------------- 2 files changed, 27 insertions(+), 18 deletions(-) diff --git a/electrum/tests/test_transaction.py b/electrum/tests/test_transaction.py index 4e43c3aa..71a0406b 100644 --- a/electrum/tests/test_transaction.py +++ b/electrum/tests/test_transaction.py @@ -307,6 +307,12 @@ class TestTransaction(SequentialTestCase): txid = '9b9f39e314662a7433aadaa5c94a2f1e24c7e7bf55fc9e1f83abd72be933eb95' self._run_naive_tests_on_tx(raw_tx, txid) + # see https://bitcoin.stackexchange.com/questions/38006/txout-script-criteria-scriptpubkey-critieria + def test_txid_invalid_op_return(self): + raw_tx = '01000000019ac03d5ae6a875d970128ef9086cef276a1919684a6988023cc7254691d97e6d010000006b4830450221009d41dc793ba24e65f571473d40b299b6459087cea1509f0d381740b1ac863cb6022039c425906fcaf51b2b84d8092569fb3213de43abaff2180e2a799d4fcb4dd0aa012102d5ede09a8ae667d0f855ef90325e27f6ce35bbe60a1e6e87af7f5b3c652140fdffffffff080100000000000000010101000000000000000202010100000000000000014c0100000000000000034c02010100000000000000014d0100000000000000044dffff010100000000000000014e0100000000000000064effffffff0100000000' + txid = 'ebc9fa1196a59e192352d76c0f6e73167046b9d37b8302b6bb6968dfd279b767' + self._run_naive_tests_on_tx(raw_tx, txid) + # these transactions are from Bitcoin Core unit tests ---> # https://github.com/bitcoin/bitcoin/blob/11376b5583a283772c82f6d32d0007cdbf5b8ef0/src/test/data/tx_valid.json diff --git a/electrum/transaction.py b/electrum/transaction.py index fe056985..446a8b77 100644 --- a/electrum/transaction.py +++ b/electrum/transaction.py @@ -59,6 +59,10 @@ class NotRecognizedRedeemScript(Exception): pass +class MalformedBitcoinScript(Exception): + pass + + TxOutput = NamedTuple("TxOutput", [('type', int), ('address', str), ('value', Union[int, str])]) # ^ value is str when the output is set to max: '!' @@ -263,13 +267,16 @@ def script_GetOp(_bytes : bytes): if opcode <= opcodes.OP_PUSHDATA4: nSize = opcode if opcode == opcodes.OP_PUSHDATA1: - nSize = _bytes[i] + try: nSize = _bytes[i] + except IndexError: raise MalformedBitcoinScript() i += 1 elif opcode == opcodes.OP_PUSHDATA2: - (nSize,) = struct.unpack_from(' 0: result += " " - if opcode <= opcodes.OP_PUSHDATA4: - result += "%d:"%(opcode,) - result += short_hex(vch) - else: - result += script_GetOpName(opcode) - return result - - def match_decoded(decoded, to_match): + if decoded is None: + return False if len(decoded) != len(to_match): - return False; + return False for i in range(len(decoded)): if to_match[i] == opcodes.OP_PUSHDATA4 and decoded[i][0] <= opcodes.OP_PUSHDATA4 and decoded[i][0]>0: continue # Opcodes below OP_PUSHDATA4 all just push data onto stack, and are equivalent. @@ -413,7 +410,10 @@ def parse_scriptSig(d, _bytes): def parse_redeemScript_multisig(redeem_script: bytes): - dec2 = [ x for x in script_GetOp(redeem_script) ] + try: + dec2 = [ x for x in script_GetOp(redeem_script) ] + except MalformedBitcoinScript: + raise NotRecognizedRedeemScript() try: m = dec2[0][0] - opcodes.OP_1 + 1 n = dec2[-2][0] - opcodes.OP_1 + 1 @@ -434,7 +434,10 @@ def parse_redeemScript_multisig(redeem_script: bytes): def get_address_from_output_script(_bytes, *, net=None): - decoded = [x for x in script_GetOp(_bytes)] + try: + decoded = [x for x in script_GetOp(_bytes)] + except MalformedBitcoinScript: + decoded = None # The Genesis Block, self-payments, and pay-by-IP-address payments look like: # 65 BYTES:... CHECKSIG From c99007bda73cfe88f2a054f51df7cb607135c1c8 Mon Sep 17 00:00:00 2001 From: ghost43 Date: Thu, 30 Aug 2018 16:16:14 +0200 Subject: [PATCH 025/138] setup.py: add 'gui' extra. potentially build Qt icons files (#4647) --- setup.py | 30 +++++++++++++++++++++++++++--- 1 file changed, 27 insertions(+), 3 deletions(-) diff --git a/setup.py b/setup.py index 18c5cb88..fefd32c5 100755 --- a/setup.py +++ b/setup.py @@ -2,12 +2,15 @@ # python setup.py sdist --format=zip,gztar -from setuptools import setup, find_packages import os import sys import platform import imp import argparse +import subprocess + +from setuptools import setup, find_packages +from setuptools.command.install import install with open('contrib/requirements/requirements.txt') as f: requirements = f.read().splitlines() @@ -43,8 +46,26 @@ if platform.system() in ['Linux', 'FreeBSD', 'DragonFly']: extras_require = { 'hardware': requirements_hw, 'fast': ['pycryptodomex'], + 'gui': ['pyqt5'], } -extras_require['full'] = extras_require['hardware'] + extras_require['fast'] +extras_require['full'] = [pkg for sublist in list(extras_require.values()) for pkg in sublist] + + +class CustomInstallCommand(install): + def run(self): + install.run(self) + # potentially build Qt icons file + try: + import PyQt5 + except ImportError: + pass + else: + try: + path = os.path.join(self.install_lib, "electrum/gui/qt/icons_rc.py") + if not os.path.exists(path): + subprocess.call(["pyrcc5", "icons.qrc", "-o", path]) + except Exception as e: + print('Warning: building icons file failed with {}'.format(e)) setup( @@ -75,5 +96,8 @@ setup( author_email="thomasv@electrum.org", license="MIT Licence", url="https://electrum.org", - long_description="""Lightweight Bitcoin Wallet""" + long_description="""Lightweight Bitcoin Wallet""", + cmdclass={ + 'install': CustomInstallCommand, + }, ) From aac7a34405575a238964d6e429ebaf90ecd03fc6 Mon Sep 17 00:00:00 2001 From: RGauthamRam <30320759+RGauthamRam@users.noreply.github.com> Date: Thu, 30 Aug 2018 14:35:01 +0000 Subject: [PATCH 026/138] Update __init__.py (#4668) Resolving the issue #4363 --- electrum/gui/qt/__init__.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/electrum/gui/qt/__init__.py b/electrum/gui/qt/__init__.py index 7fa7f4e5..b49826c6 100644 --- a/electrum/gui/qt/__init__.py +++ b/electrum/gui/qt/__init__.py @@ -260,7 +260,8 @@ class ElectrumGui: return w def close_window(self, window): - self.windows.remove(window) + if window in self.windows: + self.windows.remove(window) self.build_tray_menu() # save wallet path of last open window if not self.windows: From 6ee689345fdba24fddf0a719e906fed406e0d448 Mon Sep 17 00:00:00 2001 From: SomberNight Date: Thu, 30 Aug 2018 18:34:04 +0200 Subject: [PATCH 027/138] fix -v syntax After the introduction of arguments for -v, it would sometimes incorrectly consume the CLI cmd as its argument. This change keeps the old "-v" syntax working, at the cost of having to provide the arguments without a whitespace directly after -v (and the args need to be single letters). --- electrum/commands.py | 2 +- run_electrum | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/electrum/commands.py b/electrum/commands.py index 7a9c0857..e2cf87a2 100644 --- a/electrum/commands.py +++ b/electrum/commands.py @@ -832,7 +832,7 @@ def add_global_options(parser): group = parser.add_argument_group('global options') # const is for when no argument is given to verbosity # default is for when the flag is missing - group.add_argument("-v", "--verbosity", dest="verbosity", help="Set verbosity filter", default='', const='*', nargs='?') + group.add_argument("-v", dest="verbosity", help="Set verbosity filter", default='', const='*', nargs='?') group.add_argument("-D", "--dir", dest="electrum_path", help="electrum directory") group.add_argument("-P", "--portable", action="store_true", dest="portable", default=False, help="Use local 'electrum_data' directory") group.add_argument("-w", "--wallet", dest="wallet_path", help="wallet path") diff --git a/run_electrum b/run_electrum index 46654ec1..dd35c351 100755 --- a/run_electrum +++ b/run_electrum @@ -335,6 +335,14 @@ if __name__ == '__main__': sys.argv.remove('help') sys.argv.append('-h') + # old '-v' syntax + try: + i = sys.argv.index('-v') + except ValueError: + pass + else: + sys.argv[i] = '-v*' + # read arguments from stdin pipe and prompt for i, arg in enumerate(sys.argv): if arg == '-': From c42f0dac53e7d1e27c443b20c51d5d68e8ff8acd Mon Sep 17 00:00:00 2001 From: Filip Gospodinov Date: Thu, 30 Aug 2018 18:53:14 +0200 Subject: [PATCH 028/138] test_bitcoin: fix decorators for running tests twice (#4669) This bug is triggered if ecc_fast._libsecp256k1 and/or crypto.AES are not present. Before, if the first test would have raised an exception it would have been implicitly caught by returning from the finally block and hence this effectively masks the test's outcome. Now, the exception is properly propagated causing the test to fail if an exception is raised. --- electrum/tests/test_bitcoin.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/electrum/tests/test_bitcoin.py b/electrum/tests/test_bitcoin.py index c63592d6..2575ec78 100644 --- a/electrum/tests/test_bitcoin.py +++ b/electrum/tests/test_bitcoin.py @@ -48,10 +48,10 @@ def needs_test_with_all_ecc_implementations(func): # first test without libsecp func(*args, **kwargs) finally: - # if libsecp is not available, we are done - if not ecc_fast._libsecp256k1: - return ecc_fast.do_monkey_patching_of_python_ecdsa_internals_with_libsecp256k1() + # if libsecp is not available, we are done + if not ecc_fast._libsecp256k1: + return # if libsecp is available, test again now func(*args, **kwargs) return run_test @@ -74,10 +74,10 @@ def needs_test_with_all_aes_implementations(func): # first test without pycryptodomex func(*args, **kwargs) finally: - # if pycryptodomex is not available, we are done - if not _aes: - return crypto.AES = _aes + # if pycryptodomex is not available, we are done + if not _aes: + return # if pycryptodomex is available, test again now func(*args, **kwargs) return run_test From 1bb1fc37f418a787e986e41b976a98e646d83e48 Mon Sep 17 00:00:00 2001 From: SomberNight Date: Thu, 30 Aug 2018 19:25:42 +0200 Subject: [PATCH 029/138] network: don't ask for block -1 if server is on wrong chain --- electrum/network.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/electrum/network.py b/electrum/network.py index 344d60f0..6eb1ae16 100644 --- a/electrum/network.py +++ b/electrum/network.py @@ -1020,11 +1020,14 @@ class Network(util.DaemonThread): raise Exception(interface.mode) # If not finished, get the next header if next_height is not None: - if interface.mode == 'catch_up' and interface.tip > next_height + 50: + if next_height < 0: + self.connection_down(interface.server) + next_height = None + elif interface.mode == 'catch_up' and interface.tip > next_height + 50: self.request_chunk(interface, next_height // 2016) else: self.request_header(interface, next_height) - else: + if next_height is None: interface.mode = 'default' interface.request = None self.notify('updated') From 56e7ba41c48f2a8017eafc539361da8954284ba2 Mon Sep 17 00:00:00 2001 From: ThomasV Date: Mon, 3 Sep 2018 14:57:29 +0200 Subject: [PATCH 030/138] prepare release 3.2.3 and release notes --- RELEASE-NOTES | 18 ++++++++++++++++++ electrum/version.py | 4 ++-- 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/RELEASE-NOTES b/RELEASE-NOTES index 2483455d..74b68774 100644 --- a/RELEASE-NOTES +++ b/RELEASE-NOTES @@ -1,3 +1,21 @@ +# Release 3.2.3 - (September 3, 2018) + + * hardware wallet: the Safe-T mini from Archos is now supported. + * hardware wallet: the Coldcard from Coinkite is now supported. + * BIP39 seeds: if a seed extension (aka passphrase) contained + multiple consecutive whitespaces or leading/trailing whitespaces + then the derived addresses were not following spec. This has been + fixed, and affected should move their coins. The wizard will show a + warning in this case. (#4566) + * Revealer: the PRNG used has been changed (#4649) + * fix Linux distributables: 'typing' was not bundled, needed for python 3.4 + * fix #4626: fix spending from segwit multisig wallets involving a Trezor + cosigner when using a custom derivation path + * fix #4491: on Android, if user had set "uBTC" as base unit, app crashed + * fix #4497: on Android, paying bip70 invoices from cold start did not work + * Several other minor bugfixes and usability improvements. + + # Release 3.2.2 - (July 2nd, 2018) * Fix DNS resolution on Windows diff --git a/electrum/version.py b/electrum/version.py index 4f3791cd..5030fa5f 100644 --- a/electrum/version.py +++ b/electrum/version.py @@ -1,5 +1,5 @@ -ELECTRUM_VERSION = '3.2.2' # version of the client package -APK_VERSION = '3.2.2.0' # read by buildozer.spec +ELECTRUM_VERSION = '3.2.3' # version of the client package +APK_VERSION = '3.2.3.0' # read by buildozer.spec PROTOCOL_VERSION = '1.2' # protocol version requested From 28c49d2c48e77ab8b82e7b9043a99d7c659abff9 Mon Sep 17 00:00:00 2001 From: ThomasV Date: Mon, 3 Sep 2018 15:39:45 +0200 Subject: [PATCH 031/138] update submodules --- contrib/deterministic-build/electrum-icons | 2 +- contrib/deterministic-build/electrum-locale | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/contrib/deterministic-build/electrum-icons b/contrib/deterministic-build/electrum-icons index 5af76dc1..0b8cbcca 160000 --- a/contrib/deterministic-build/electrum-icons +++ b/contrib/deterministic-build/electrum-icons @@ -1 +1 @@ -Subproject commit 5af76dc1b04c782e622ac409cd802c483c529c1f +Subproject commit 0b8cbcca428ceb791527bcbb2ef2b36b4ab29c73 diff --git a/contrib/deterministic-build/electrum-locale b/contrib/deterministic-build/electrum-locale index de999cef..25ea957b 160000 --- a/contrib/deterministic-build/electrum-locale +++ b/contrib/deterministic-build/electrum-locale @@ -1 +1 @@ -Subproject commit de999ceffd2a864df54451d23f290ef5f333e8ea +Subproject commit 25ea957b6071b3f251d5da20bd08e2f4a81ace86 From bc35c82619c86dcef8b8e74bb5118b4afae59324 Mon Sep 17 00:00:00 2001 From: SomberNight Date: Tue, 4 Sep 2018 13:38:49 +0200 Subject: [PATCH 032/138] update submodules --- contrib/deterministic-build/electrum-locale | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contrib/deterministic-build/electrum-locale b/contrib/deterministic-build/electrum-locale index 25ea957b..27e36687 160000 --- a/contrib/deterministic-build/electrum-locale +++ b/contrib/deterministic-build/electrum-locale @@ -1 +1 @@ -Subproject commit 25ea957b6071b3f251d5da20bd08e2f4a81ace86 +Subproject commit 27e36687f4b0fbd126628bdde80758b63ade7347 From 7d844096285e8ddb4a663d94b2e44665b0e7be7a Mon Sep 17 00:00:00 2001 From: SomberNight Date: Tue, 4 Sep 2018 16:31:35 +0200 Subject: [PATCH 033/138] fix #4078 --- electrum/qrscanner.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/electrum/qrscanner.py b/electrum/qrscanner.py index 56e0a18a..df5f92a1 100644 --- a/electrum/qrscanner.py +++ b/electrum/qrscanner.py @@ -75,7 +75,7 @@ def _find_system_cameras(): if os.path.exists(device_root): for device in os.listdir(device_root): try: - with open(os.path.join(device_root, device, 'name')) as f: + with open(os.path.join(device_root, device, 'name'), encoding='utf-8') as f: name = f.read() except IOError: continue From 1ec71cbacafe63a50cdbfadd3ba8c5f2cfc4786a Mon Sep 17 00:00:00 2001 From: SomberNight Date: Tue, 4 Sep 2018 16:42:08 +0200 Subject: [PATCH 034/138] follow-up prev fix #4078 --- electrum/qrscanner.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/electrum/qrscanner.py b/electrum/qrscanner.py index df5f92a1..463d5ec6 100644 --- a/electrum/qrscanner.py +++ b/electrum/qrscanner.py @@ -74,10 +74,11 @@ def _find_system_cameras(): devices = {} # Name -> device if os.path.exists(device_root): for device in os.listdir(device_root): + path = os.path.join(device_root, device, 'name') try: - with open(os.path.join(device_root, device, 'name'), encoding='utf-8') as f: + with open(path, encoding='utf-8') as f: name = f.read() - except IOError: + except Exception: continue name = name.strip('\n') devices[name] = os.path.join("/dev", device) From 9220545e604a00ae5254270a0a4421b70df3b010 Mon Sep 17 00:00:00 2001 From: Filip Gospodinov Date: Tue, 4 Sep 2018 16:53:53 +0200 Subject: [PATCH 035/138] build-wine: avoid untracked changes in submodule The locale output file can simply be output in the folder where it's actually needed. This also saves a recursive copy. This makes `.gitignore` in the electrum-locale submodule obsolete. --- contrib/build-wine/build-electrum-git.sh | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/contrib/build-wine/build-electrum-git.sh b/contrib/build-wine/build-electrum-git.sh index f98a77a1..752a0bc7 100755 --- a/contrib/build-wine/build-electrum-git.sh +++ b/contrib/build-wine/build-electrum-git.sh @@ -34,7 +34,7 @@ if ! which msgfmt > /dev/null 2>&1; then exit 1 fi for i in ./locale/*; do - dir=$i/LC_MESSAGES + dir=$WINEPREFIX/drive_c/electrum/electrum/locale/$i/LC_MESSAGES mkdir -p $dir msgfmt --output-file=$dir/electrum.mo $i/electrum.po || true done @@ -44,7 +44,6 @@ find -exec touch -d '2000-11-11T11:11:11+00:00' {} + popd cp $WINEPREFIX/drive_c/electrum/LICENCE . -cp -r $WINEPREFIX/drive_c/electrum/contrib/deterministic-build/electrum-locale/locale $WINEPREFIX/drive_c/electrum/electrum/ cp $WINEPREFIX/drive_c/electrum/contrib/deterministic-build/electrum-icons/icons_rc.py $WINEPREFIX/drive_c/electrum/electrum/gui/qt/ # Install frozen dependencies From e9f18883211cf823815580df9dfa8ac254ab43f7 Mon Sep 17 00:00:00 2001 From: SomberNight Date: Tue, 4 Sep 2018 17:06:42 +0200 Subject: [PATCH 036/138] include plugins in win/mac binaries --- contrib/build-osx/osx.spec | 7 ++++--- contrib/build-wine/deterministic.spec | 3 ++- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/contrib/build-osx/osx.spec b/contrib/build-osx/osx.spec index 2de6bfaf..501df88e 100644 --- a/contrib/build-osx/osx.spec +++ b/contrib/build-osx/osx.spec @@ -30,9 +30,10 @@ hiddenimports += collect_submodules('websocket') hiddenimports += collect_submodules('ckcc') datas = [ - (electrum+'electrum/*.json', PYPKG), - (electrum+'electrum/wordlist/english.txt', PYPKG + '/wordlist'), - (electrum+'electrum/locale', PYPKG + '/locale') + (electrum + PYPKG + '/*.json', PYPKG), + (electrum + PYPKG + '/wordlist/english.txt', PYPKG + '/wordlist'), + (electrum + PYPKG + '/locale', PYPKG + '/locale'), + (electrum + PYPKG + '/plugins', PYPKG + '/plugins'), ] datas += collect_data_files('trezorlib') datas += collect_data_files('safetlib') diff --git a/contrib/build-wine/deterministic.spec b/contrib/build-wine/deterministic.spec index 63d75c2c..875a091a 100644 --- a/contrib/build-wine/deterministic.spec +++ b/contrib/build-wine/deterministic.spec @@ -36,7 +36,8 @@ datas = [ (home+'electrum/*.json', 'electrum'), (home+'electrum/wordlist/english.txt', 'electrum/wordlist'), (home+'electrum/locale', 'electrum/locale'), - ('C:\\Program Files (x86)\\ZBar\\bin\\', '.') + (home+'electrum/plugins', 'electrum/plugins'), + ('C:\\Program Files (x86)\\ZBar\\bin\\', '.'), ] datas += collect_data_files('trezorlib') datas += collect_data_files('safetlib') From 6c7bfe613f429c3cbe9b7feb770cadd7d8dd090e Mon Sep 17 00:00:00 2001 From: Filip Gospodinov Date: Tue, 4 Sep 2018 22:32:46 +0200 Subject: [PATCH 037/138] contrib: remove git describe workaround (#4683) `git describe` fails if no tag can be found, leading to the whole build script to fail. This is not always desired. To prevent `git describe` from failing in this case the `--always` flag can be passed which causes a short commit hash to be output when a tag is not present. --- contrib/build-osx/make_osx | 2 +- contrib/build-wine/build-electrum-git.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/contrib/build-osx/make_osx b/contrib/build-osx/make_osx index 3c3a1bab..b6a4f5b3 100755 --- a/contrib/build-osx/make_osx +++ b/contrib/build-osx/make_osx @@ -13,7 +13,7 @@ src_dir=$(dirname "$0") cd $src_dir/../.. export PYTHONHASHSEED=22 -VERSION=`git describe --tags --dirty` +VERSION=`git describe --tags --dirty --always` which brew > /dev/null 2>&1 || fail "Please install brew from https://brew.sh/ to continue" diff --git a/contrib/build-wine/build-electrum-git.sh b/contrib/build-wine/build-electrum-git.sh index f98a77a1..752d5727 100755 --- a/contrib/build-wine/build-electrum-git.sh +++ b/contrib/build-wine/build-electrum-git.sh @@ -25,7 +25,7 @@ pushd $WINEPREFIX/drive_c/electrum git submodule init git submodule update -VERSION=`git describe --tags --dirty || printf 'custom'` +VERSION=`git describe --tags --dirty --always` echo "Last commit: $VERSION" pushd ./contrib/deterministic-build/electrum-locale From 0da1e904fecc983ecb38cf3f43ee5dc2c933c822 Mon Sep 17 00:00:00 2001 From: Calin Culianu Date: Tue, 4 Sep 2018 23:38:38 +0300 Subject: [PATCH 038/138] macOS: Add missing URI handler(#4557) Backport from Electron Cash -- fix missing bitcoin: URI types form macOS Info.plist --- contrib/build-osx/make_osx | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/contrib/build-osx/make_osx b/contrib/build-osx/make_osx index b6a4f5b3..f02f9f5d 100755 --- a/contrib/build-osx/make_osx +++ b/contrib/build-osx/make_osx @@ -90,5 +90,11 @@ done info "Building binary" pyinstaller --noconfirm --ascii --clean --name $VERSION contrib/build-osx/osx.spec || fail "Could not build binary" +info "Adding bitcoin URI types to Info.plist" +plutil -insert 'CFBundleURLTypes' \ + -xml ' CFBundleURLName bitcoin CFBundleURLSchemes bitcoin ' \ + -- dist/$PACKAGE.app/Contents/Info.plist \ + || fail "Could not add keys to Info.plist. Make sure the program 'plutil' exists and is installed." + info "Creating .DMG" hdiutil create -fs HFS+ -volname $PACKAGE -srcfolder dist/$PACKAGE.app dist/electrum-$VERSION.dmg || fail "Could not create .DMG" From 73e367dc3bbef3e9dcc6d1f524e109c0a30f6a1d Mon Sep 17 00:00:00 2001 From: Janus Date: Wed, 5 Sep 2018 14:38:43 +0200 Subject: [PATCH 039/138] wallet: don't cache NaN coin price if NaN coin price is cached, historial acquisition prices are not shown correctly since the historial prices are requested after the full history is initially shown. As such, "No data" will be shown, even though the user required using historical pricing. --- electrum/wallet.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/electrum/wallet.py b/electrum/wallet.py index d1e561da..84e9ea19 100644 --- a/electrum/wallet.py +++ b/electrum/wallet.py @@ -1129,7 +1129,8 @@ class Abstract_Wallet(AddressSynchronizer): return result if self.txi.get(txid, {}) != {}: result = self.average_price(txid, price_func, ccy) * txin_value/Decimal(COIN) - self.coin_price_cache[cache_key] = result + if not result.is_nan(): + self.coin_price_cache[cache_key] = result return result else: fiat_value = self.get_fiat_value(txid, ccy) From 1e3c3a528c8d3fe8008bc0c0e2845f1ce059119a Mon Sep 17 00:00:00 2001 From: SomberNight Date: Wed, 5 Sep 2018 15:22:57 +0200 Subject: [PATCH 040/138] attempt at fixing wallet syncing crash fix #3998 fix #4689 --- electrum/address_synchronizer.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/electrum/address_synchronizer.py b/electrum/address_synchronizer.py index 88ef82f2..56203d67 100644 --- a/electrum/address_synchronizer.py +++ b/electrum/address_synchronizer.py @@ -380,6 +380,8 @@ class AddressSynchronizer(PrintError): for prevout_hash, d in _spent_outpoints.items(): for prevout_n_str, spending_txid in d.items(): prevout_n = int(prevout_n_str) + if spending_txid not in self.transactions: + continue # only care about txns we have self.spent_outpoints[prevout_hash][prevout_n] = spending_txid @profiler From 951fd8a47f6d7d19c1766f127094c61c815cb9a1 Mon Sep 17 00:00:00 2001 From: ThomasV Date: Wed, 5 Sep 2018 15:33:31 +0200 Subject: [PATCH 041/138] bump apk version number --- electrum/version.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/electrum/version.py b/electrum/version.py index 5030fa5f..cf185907 100644 --- a/electrum/version.py +++ b/electrum/version.py @@ -1,5 +1,5 @@ ELECTRUM_VERSION = '3.2.3' # version of the client package -APK_VERSION = '3.2.3.0' # read by buildozer.spec +APK_VERSION = '3.2.3.1' # read by buildozer.spec PROTOCOL_VERSION = '1.2' # protocol version requested From ecbbfdd10c9fdfefabc94ccd871266a9117b34d5 Mon Sep 17 00:00:00 2001 From: SomberNight Date: Wed, 5 Sep 2018 15:58:39 +0200 Subject: [PATCH 042/138] rerun freeze packages --- .../requirements-binaries.txt | 72 ++++----- .../deterministic-build/requirements-hw.txt | 138 +++++++++--------- contrib/deterministic-build/requirements.txt | 58 ++++---- 3 files changed, 135 insertions(+), 133 deletions(-) diff --git a/contrib/deterministic-build/requirements-binaries.txt b/contrib/deterministic-build/requirements-binaries.txt index 02561924..1ae2b837 100644 --- a/contrib/deterministic-build/requirements-binaries.txt +++ b/contrib/deterministic-build/requirements-binaries.txt @@ -1,43 +1,45 @@ -pip==10.0.1 \ - --hash=sha256:717cdffb2833be8409433a93746744b59505f42146e8d37de6c62b430e25d6d7 \ - --hash=sha256:f2bd08e0cd1b06e10218feaf6fef299f473ba706582eb3bd9d52203fdbd7ee68 -pycryptodomex==3.6.4 \ - --hash=sha256:0461e88a7199f9e88f9f90c2c1e109e9e1f7bbb94dc6192e5df52829d31510c1 \ - --hash=sha256:08d0aba5a72e8af5da118ac4b6a5d75befceca7dd92a031b040ed5ff4417cec2 \ - --hash=sha256:0e22d47935d5fa95f556d5f5857576bc6750233964de06a840d58459010c3889 \ - --hash=sha256:10ef21d1728ec0b8afc4f8e1d8d9ea66f317154ea18731a4a05bd996cdc33fdf \ - --hash=sha256:1962b81eef81bf5c42d625816904a22a0bd23d15ca5d49891a54e3c0d0189d84 \ - --hash=sha256:24aae88efe3cbcb4a9cf840b2c352e7de1d6c2c5b3df37ff99b5c7e271e8f3a8 \ - --hash=sha256:43ad6d1d7ca545d53360bf412ee70fcb9ede876b4376fc6db06fc7328f70588c \ - --hash=sha256:4daabe7c0404e673b9029aa43761c779b9b4df2cbe11ccd94daded6a0acd8808 \ - --hash=sha256:4e15af025e02b04b0d0728e8248e4384d3dc7a3a89a020f5bd4d04ef2c5d9d4c \ - --hash=sha256:5b4d3c4a069a05972e0ed7111071bbcb4727ac652b5d7e8f786e8ea2fe63306b \ - --hash=sha256:67ad8b2ad15a99ae70e287454a112f67d2abaf160ee9c97f9daebf2296066447 \ - --hash=sha256:6d7e6fb69d9fd2c57e177f8a9cdf6489a725da77568e3d0a226c7dd18504396a \ - --hash=sha256:7907d7a5adde7cd07d19f129a4afa892b68b0b52a07eaf989e48e2677040b4bf \ - --hash=sha256:88210edafd564c8ff4a68716aaf0627e3bc43e9c192a33d6f5616743f72c2d9b \ - --hash=sha256:8a6b14a90bdcbcdc268acae87126c33bf4250d3842803a93a548d7c10135893a \ - --hash=sha256:94a10446ad61965516aecd610a2dd28d79ab1dfd8723903e1bd19ffa985c208e \ - --hash=sha256:99bda900a0bf6f9e6c69bdeb6114f7f6730b9d36a47bc1fe144263ce85bfc403 \ - --hash=sha256:9dae2e738622bd35ba82fe0b06f773be137a14e6b28defb2e36efc2d809cd28a \ - --hash=sha256:a04cd6021ff2756c38135a95f81b980485507bccbff4d2b8f62e537552270471 \ - --hash=sha256:a3b61625b60dd5e72556520a77464e2ac568c20b8ad12ea1f4443bf5051dc624 \ - --hash=sha256:a9a91fd9e7967a5bad88d542c9fce09323e15d16cb6fa9b8978390e46e68cbdf \ - --hash=sha256:afc44f1b595bd736ec3762dd9a2d0ef276a6ac560c85f643acfc4c0bf0c73384 \ - --hash=sha256:b5f3c8912b36e6abb843a51eecb414a1161f80c0ca0b65066c23aa449b5f98db \ - --hash=sha256:cc07c8b7686dd7093f33067a02b92f4fed860d75ad2bcc4e60624f70fdb94576 \ - --hash=sha256:da646eddbe026306fd1cb2c392a9aee4ebea13f2a9add9af303bb3151786a5d8 \ - --hash=sha256:df93eaccd5c09e6380fab8f15c06a89944415e4bb9af64a94f467ce4c782ff8e \ - --hash=sha256:e667303019770834354c75022ab0324d5ae5bf7cd7015939678033a58f87ee70 \ - --hash=sha256:f921219040ce994c9118b7218b7f7b4e9394e507c97cfc869ce5358437fc26cd +pip==18.0 \ + --hash=sha256:070e4bf493c7c2c9f6a08dd797dd3c066d64074c38e9e8a0fb4e6541f266d96c \ + --hash=sha256:a0e11645ee37c90b40c46d607070c4fd583e2cd46231b1c06e389c5e814eed76 +pycryptodomex==3.6.6 \ + --hash=sha256:0cf562fc5e5ddbe935bb6162d84a7e46e19edba8ac6609587ab9e78dc7c527d4 \ + --hash=sha256:13b77b7a177a2fd0beb42db84b21d7d4ab646dfd223989a3b5fa6a6901075ae8 \ + --hash=sha256:1baf0d485853cfa8f87c969148dc040ae81a8de3dcaaeb07b3f40a90ab2ac637 \ + --hash=sha256:1dac67655206c92eabf827cc3c9f9efd35d699057f12185f01245b22e02db5f8 \ + --hash=sha256:1dc3abcb853e8b2188d0c8d624dbdc575a1f23ae82feb9a99e4a69b7064df81a \ + --hash=sha256:24bf22fffba3a7c1132a039d95256ca9e5016798111c7bf7d0091bfddb0e0245 \ + --hash=sha256:26fde532deaed9781643be654b25fc899b97866b68e50bc015aadd442387c42b \ + --hash=sha256:2958eceb671795ec4e5f2164e4ec5ddc1788fdf4f72b18390f548de5e11c9dcc \ + --hash=sha256:34b3218fcdcd59c26de75c4ff8a15e6472e7b88f9e5b3b193cb1c001e7a0e815 \ + --hash=sha256:3f4d96cfa963960d190d3d6ef5e8f7c2c14815ff816999dff5efaa6bf7cd1134 \ + --hash=sha256:40063250911af6ec5b3ccc80108e7a3be9d1695dd3d17104a1930861cbdb78b7 \ + --hash=sha256:4b8669f4b3fa386696b9b0366e69898dd626b119eaead50ee3b2c59c56222272 \ + --hash=sha256:5144ad0df1009cce6d03b71c2e5843ed96be91ab746e58e8e64ef9bca5209bfe \ + --hash=sha256:549d0a0884e60d876b975e18e791cf2aece077cb174f0d7d042982b5d36a6279 \ + --hash=sha256:5b365bc3da05fbc15acd6600d41f84fe8ed903400566bc0d1a0fadc862b41c8e \ + --hash=sha256:6ab64112924be1905a22656166ec0eeeba275fb15c15adba6470bd030362e160 \ + --hash=sha256:a06e0e0965145cc0d625e1a031b49705aa2c6b4e16aa0044d4719fb1d639977f \ + --hash=sha256:a472d2271cfb37940ad80c4698affeaf39552e4c19ceeac4d5290fe71519e3f4 \ + --hash=sha256:bfc315eef8cdae280e404df64cf71f8673abcc81e646699b15722f41b82a4ed7 \ + --hash=sha256:c1d4ea2382c1726ff65548f41dc79bd9d0345f3a47ba128768242eea470c6515 \ + --hash=sha256:c54d3d2e3b099dae61124d7476311ab594df7eeec305f612a5eb79226cf36b53 \ + --hash=sha256:d0d448484e161786922b41e112b5d7cf76ef5f0c725ea5107ef866bb14a38b12 \ + --hash=sha256:ddf10a2a071ae749158d8fdad0cbc78f6197219721afa91e0752dd999fddf422 \ + --hash=sha256:e0cc6ec20e6dfce1a6715ce60d71df3e9491461d525980821f71223026950b0e \ + --hash=sha256:e5fcb23f936912b6cfb475c7b115aa2e31b7fed409bc947c6190503d9f7d0338 \ + --hash=sha256:e76d0148ffa5b86f1bcb111bd3950bc61fd50bed8b6b1cf9f5e56784378b55b6 \ + --hash=sha256:ea09a059e4cf3d99a446f0a80ac9be54802542226cdbf8ffeea79a6ddc77f310 \ + --hash=sha256:f5844faf085ad3d92fb94d07347c69f193c0bd1f32843329c2a422addeb042c9 \ + --hash=sha256:f8478a443bb747c2ef1d508a09eeb57ff8c2ebbd8ea0e6e2351d483c23e725b3 \ + --hash=sha256:ff31cb6cd69c6683bd44e99bc4f36cb74a338cee58a3a9c5c19a8ee4bdd2f3b2 PyQt5==5.10.1 \ --hash=sha256:1e652910bd1ffd23a3a48c510ecad23a57a853ed26b782cd54b16658e6f271ac \ --hash=sha256:4db7113f464c733a99fcb66c4c093a47cf7204ad3f8b3bda502efcc0839ac14b \ --hash=sha256:9c17ab3974c1fc7bbb04cc1c9dae780522c0ebc158613f3025fccae82227b5f7 \ --hash=sha256:f6035baa009acf45e5f460cf88f73580ad5dc0e72330029acd99e477f20a5d61 -setuptools==40.0.0 \ - --hash=sha256:012adb8e25fbfd64c652e99e7bab58799a3aaf05d39ab38561f69190a909015f \ - --hash=sha256:d68abee4eed409fbe8c302ac4d8429a1ffef912cd047a903b5701c024048dd49 +setuptools==40.2.0 \ + --hash=sha256:47881d54ede4da9c15273bac65f9340f8929d4f0213193fa7894be384f2dcfa6 \ + --hash=sha256:ea3796a48a207b46ea36a9d26de4d0cc87c953a683a7b314ea65d666930ea8e6 SIP==4.19.8 \ --hash=sha256:09f9a4e6c28afd0bafedb26ffba43375b97fe7207bd1a0d3513f79b7d168b331 \ --hash=sha256:105edaaa1c8aa486662226360bd3999b4b89dd56de3e314d82b83ed0587d8783 \ diff --git a/contrib/deterministic-build/requirements-hw.txt b/contrib/deterministic-build/requirements-hw.txt index ea2d9119..361258e4 100644 --- a/contrib/deterministic-build/requirements-hw.txt +++ b/contrib/deterministic-build/requirements-hw.txt @@ -1,43 +1,46 @@ -btchip-python==0.1.27 \ - --hash=sha256:e58a941abbb2d8901bf4858baa18012537c60812c7f895f9a039113ecce3032b -certifi==2018.4.16 \ - --hash=sha256:13e698f54293db9f89122b0581843a782ad0934a4fe0172d2a980ba77fc61bb7 \ - --hash=sha256:9fa520c1bacfb634fa7af20a76bcbd3d5fb390481724c597da32c719a7dca4b0 +btchip-python==0.1.28 \ + --hash=sha256:da09d0d7a6180d428833795ea9a233c3b317ddfcccea8cc6f0eba59435e5dd83 +certifi==2018.8.24 \ + --hash=sha256:376690d6f16d32f9d1fe8932551d80b23e9d393a8578c5633a2ed39a64861638 \ + --hash=sha256:456048c7e371c089d0a77a5212fb37a2c2dce1e24146e3b7e0261736aaeaa22a chardet==3.0.4 \ --hash=sha256:84ab92ed1c4d4f16916e05906b6b75a6c0fb5db821cc65e70cbd64a3e2a5eaae \ --hash=sha256:fc323ffcaeaed0e0a02bf4d117757b98aed530d9ed4531e3e15460124c106691 +ckcc-protocol==0.7.2 \ + --hash=sha256:31ee5178cfba8895eb2a6b8d06dc7830b51461a0ff767a670a64707c63e6b264 \ + --hash=sha256:498db4ccdda018cd9f40210f5bd02ddcc98e7df583170b2eab4035c86c3cc03b click==6.7 \ --hash=sha256:29f99fc6125fbc931b758dc053b3114e55c77a6e4c6c3a2674a2dc986016381d \ --hash=sha256:f15516df478d5a56180fbf80e68f206010e6d160fc39fa508b65e035fd75130b -Cython==0.28.4 \ - --hash=sha256:01487236575df8f17b46982071438dce4f7eaf8acc8fb99fca3510d343cd7a28 \ - --hash=sha256:0671d17c7a27634d6819246e535241b951141ed0e3f6f2a6d618fd32344dae3e \ - --hash=sha256:0e6190d6971c46729f712dd7307a9c0a8c027bfa5b4d8f2edef106b01759926c \ - --hash=sha256:202587c754901d0678bd6ff89c707f099987928239049a528470c06c6c922cf8 \ - --hash=sha256:345197ba9278cf6a914cb7421dc665a0531a219b0072abf6b0cebfdf68e75725 \ - --hash=sha256:3a296b8d6b02f0e01ab04bedea658f43eef5ad2f8e586a820226ead1a677d9b1 \ - --hash=sha256:484572a2b22823a967be106137a93f7d634db116b3f7accb37dbd760eda2fa9f \ - --hash=sha256:4c67c9c803e50ceff32cc5e4769c50fc8ae8df9c4e5cc592ce8310b5a1076d23 \ - --hash=sha256:539038087c321911745fc2e77049209b1231300d481cb4d682b2f95c724814b3 \ - --hash=sha256:58113e0683c3688594c112103d7e9f2d0092fd2d8297a220240bea22e184dfdd \ - --hash=sha256:65cb25ca4284804293a2404d1be3b5a98818be21a72791649bacbcfa4e431d41 \ - --hash=sha256:699e765da2580e34b08473fc0acef3a2d7bcb7f13eb29401cd25236bcf000080 \ - --hash=sha256:6b54c3470810cea49a8be90814d05c5325ceb9c5bf429fd86c36fc1b32dfc157 \ - --hash=sha256:71ac1629e4eae2ed329be8caf45efea10bfe1af3d8767e12e64b83e4ea5a3250 \ - --hash=sha256:722c179d3df8677f3daf45b1a2764678ed4f0aaddbaa7211a8a08ebfd907c0db \ - --hash=sha256:76ac2b08d3d956d77b574bb43cbf1d37bd58b9d50c04ba281303e695854ebc46 \ - --hash=sha256:7eff1157be9e26bf7494288c89979ca69d593a009e2c7420a739e2cf1e0635f5 \ - --hash=sha256:99546c8696d27d0efa639c77b2f8af6e61dc3a5073caae4f27ffd991ca926f42 \ - --hash=sha256:a0c263b31d335f29c11f4a9e98fbcd908d0731d4ea99bfd27c1c47caaeb4ca2e \ - --hash=sha256:a29c66292605bff962adc26530c030607aa699206b12dfb84f131b0454e15df4 \ - --hash=sha256:a4d3724c5a1ddd86d7d830d8e02c40151839b833791dd4b6fe9e144380fa7d37 \ - --hash=sha256:aed9f33b19d542eea56c38ef3862ca56147f7903648156cd57eabb0fe47c35d6 \ - --hash=sha256:b57e733dd8871d2cc7358c2e0fe33027453afffbcd0ea6a537f54877cad5131c \ - --hash=sha256:d5bf4db62236e82955c40bafbaa18d54b20b5ceefa06fb57c7facc443929f4bd \ - --hash=sha256:d9272dd71ab78e87fa34a0a59bbd6acc9a9c0005c834a6fc8457ff9619dc6795 \ - --hash=sha256:e9d5671bcbb90a41b0832fcb3872fcbaca3d68ff11ea09724dd6cbdf31d947fb \ - --hash=sha256:ee54646afb2b73b293c94cf079682d18d404ebd6c01122dc3980f111aec2d8ae \ - --hash=sha256:f16a87197939977824609005b73f9ebb291b9653a14e5f27afc1c5d6f981ba39 +Cython==0.28.5 \ + --hash=sha256:022592d419fc754509d0e0461eb2958dbaa45fb60d51c8a61778c58994edbe36 \ + --hash=sha256:07659f4c57582104d9486c071de512fbd7e087a3a630535298442cc0e20a3f5a \ + --hash=sha256:13c73e2ffa93a615851e03fad97591954d143b5b62361b9adef81f46a31cd8ef \ + --hash=sha256:13eab5a2835a84ff62db343035603044c908d2b3b6eec09d67fdf9970acf7ac9 \ + --hash=sha256:183b35a48f58862c4ec1e821f07bb7b1156c8c8559c85c32ae086f28947474eb \ + --hash=sha256:2f526b0887128bf20ab2acc905a975f62b5a04ab2f63ecbe5a30fc28285d0e0c \ + --hash=sha256:32de8637f5e6c5a76667bc7c8fc644bd9314dc19af36db8ce30a0b92ada0f642 \ + --hash=sha256:4172c183ef4fb2ace6a29cdf7fc9200c5a471a7f775ff691975b774bd9ed3ad2 \ + --hash=sha256:553956ec06ecbd731ef0c538eb28a5b46bedea7ab89b18237ff28b4b99d65eee \ + --hash=sha256:660eeb6870687fd3eda91e00ba4e72220545c254c8c4d967fd0c910f4fbb8cbc \ + --hash=sha256:693a8619ef066ece055ed065a15cf440f9d3ebd1bca60e87ea19144833756433 \ + --hash=sha256:759c799e9ef418f163b5412e295e14c0a48fe3b4dcba9ab8aab69e9f511cfefd \ + --hash=sha256:827d3a91b7a7c31ce69e5974496fd9a8ba28eb498b988affb66d0d30de11d934 \ + --hash=sha256:87e57b5d730cfab225d95e7b23abbc0c6f77598bd66639e93c73ce8afbae6f38 \ + --hash=sha256:9400e5db8383346b0694a3e794d8bded18a27b21123516dcdf4b79d7ec28e98b \ + --hash=sha256:9ec27681c5b1b457aacb1cbda5db04aa28b76da2af6e1e1fd15f233eafe6a0b0 \ + --hash=sha256:ae4784f040a3313c8bd00c8d04934b7ade63dc59692d8f00a5235be8ed72a445 \ + --hash=sha256:b2ba8310ebd3c0e0b884d5e95bbd99d467d6af922acd1e44fe4b819839b2150e \ + --hash=sha256:b64575241f64f6ec005a4d4137339fb0ba5e156e826db2fdb5f458060d9979e0 \ + --hash=sha256:c78ad0df75a9fc03ab28ca1b950c893a208c451a18f76796c3e25817d6994001 \ + --hash=sha256:cdbb917e41220bd3812234dbe59d15391adbc2c5d91ae11a5273aab9e32ba7ec \ + --hash=sha256:d2223a80c623e2a8e97953ab945dfaa9385750a494438dcb55562eb1ddd9565a \ + --hash=sha256:e22f21cf92a9f8f007a280e3b3462c886d9068132a6c698dec10ad6125e3ca1e \ + --hash=sha256:ea5c16c48e561f4a6f6b8c24807494b77a79e156b8133521c400f22ca712101b \ + --hash=sha256:ee7a9614d51fe16e32ca5befe72e0808baff481791728449d0b17c8b0fe29eb9 \ + --hash=sha256:ef86de9299e4ab2ebb129fb84b886bf40b9aced9807c6d6d5f28b46fb905f82c \ + --hash=sha256:f3e4860f5458a9875caa3de65e255720c0ed2ce71f0bcdab02497b32104f9db8 \ + --hash=sha256:fc6c20a8ac22202a779ad4c59756647be0826993d2151a03c015e76d2368ae5f ecdsa==0.13 \ --hash=sha256:40d002cf360d0e035cf2cb985e1308d41aaa087cbfc135b2dc2d844296ea546c \ --hash=sha256:64cf1ee26d1cde3c73c6d7d107f835fed7c6a2904aef9eac223d57ad800c43fa @@ -56,31 +59,33 @@ idna==2.7 \ --hash=sha256:684a38a6f903c1d71d6d5fac066b58d7768af4de2b832e426ec79c30daa94a16 keepkey==4.0.2 \ --hash=sha256:cddee60ae405841cdff789cbc54168ceaeb2282633420f2be155554c25c69138 -libusb1==1.6.4 \ - --hash=sha256:8c930d9c1d037d9c83924c82608aa6a1adcaa01ca0e4a23ee0e8e18d7eee670d +libusb1==1.6.6 \ + --hash=sha256:a49917a2262cf7134396f6720c8be011f14aabfc5cdc53f880cc672c0f39d271 mnemonic==0.18 \ --hash=sha256:02a7306a792370f4a0c106c2cf1ce5a0c84b9dbd7e71c6792fdb9ad88a727f1d pbkdf2==1.3 \ --hash=sha256:ac6397369f128212c43064a2b4878038dab78dab41875364554aaf2a684e6979 -pip==10.0.1 \ - --hash=sha256:717cdffb2833be8409433a93746744b59505f42146e8d37de6c62b430e25d6d7 \ - --hash=sha256:f2bd08e0cd1b06e10218feaf6fef299f473ba706582eb3bd9d52203fdbd7ee68 -protobuf==3.6.0 \ - --hash=sha256:12985d9f40c104da2f44ec089449214876809b40fdc5d9e43b93b512b9e74056 \ - --hash=sha256:12c97fe27af12fc5d66b23f905ab09dd4fb0c68d5a74a419d914580e6d2e71e3 \ - --hash=sha256:327fb9d8a8247bc780b9ea7ed03c0643bc0d22c139b761c9ec1efc7cc3f0923e \ - --hash=sha256:3895319db04c0b3baed74fb66be7ba9f4cd8e88a432b8e71032cdf08b2dfee23 \ - --hash=sha256:695072063e256d32335d48b9484451f7c7948edc3dbd419469d6a778602682fc \ - --hash=sha256:7d786f3ef5b33a04e6538089674f244a3b0f588155016559d950989010af97d0 \ - --hash=sha256:8bf82bb7a466a54be7272dcb492f71d55a2453a58d862fb74c3f2083f2768543 \ - --hash=sha256:9bbc1ae1c33c1bd3a2fc05a3aec328544d2b039ff0ce6f000063628a32fad777 \ - --hash=sha256:9e992c68103ab5635728d29fcf132c669cb4e2db24d012685210276185009d17 \ - --hash=sha256:9f1087abb67b34e55108bc610936b34363a7aac692023bcbb17e065c253a1f80 \ - --hash=sha256:9fefcb92a3784b446abf3641d9a14dad815bee88e0edd10b9a9e0e144d01a991 \ - --hash=sha256:a37836aa47d1b81c2db1a6b7a5e79926062b5d76bd962115a0e615551be2b48d \ - --hash=sha256:cca22955443c55cf86f963a4ad7057bca95e4dcde84d6a493066d380cfab3bb0 \ - --hash=sha256:d7ac50bc06d31deb07ace6de85556c1d7330e5c0958f3b2af85037d6d1182abf \ - --hash=sha256:dfe6899304b898538f4dc94fa0b281b56b70e40f58afa4c6f807805261cbe2e8 +pip==18.0 \ + --hash=sha256:070e4bf493c7c2c9f6a08dd797dd3c066d64074c38e9e8a0fb4e6541f266d96c \ + --hash=sha256:a0e11645ee37c90b40c46d607070c4fd583e2cd46231b1c06e389c5e814eed76 +protobuf==3.6.1 \ + --hash=sha256:10394a4d03af7060fa8a6e1cbf38cea44be1467053b0aea5bbfcb4b13c4b88c4 \ + --hash=sha256:1489b376b0f364bcc6f89519718c057eb191d7ad6f1b395ffd93d1aa45587811 \ + --hash=sha256:1931d8efce896981fe410c802fd66df14f9f429c32a72dd9cfeeac9815ec6444 \ + --hash=sha256:196d3a80f93c537f27d2a19a4fafb826fb4c331b0b99110f985119391d170f96 \ + --hash=sha256:46e34fdcc2b1f2620172d3a4885128705a4e658b9b62355ae5e98f9ea19f42c2 \ + --hash=sha256:59cd75ded98094d3cf2d79e84cdb38a46e33e7441b2826f3838dcc7c07f82995 \ + --hash=sha256:5ee0522eed6680bb5bac5b6d738f7b0923b3cafce8c4b1a039a6107f0841d7ed \ + --hash=sha256:65917cfd5da9dfc993d5684643063318a2e875f798047911a9dd71ca066641c9 \ + --hash=sha256:685bc4ec61a50f7360c9fd18e277b65db90105adbf9c79938bd315435e526b90 \ + --hash=sha256:92e8418976e52201364a3174e40dc31f5fd8c147186d72380cbda54e0464ee19 \ + --hash=sha256:9335f79d1940dfb9bcaf8ec881fb8ab47d7a2c721fb8b02949aab8bbf8b68625 \ + --hash=sha256:a7ee3bb6de78185e5411487bef8bc1c59ebd97e47713cba3c460ef44e99b3db9 \ + --hash=sha256:ceec283da2323e2431c49de58f80e1718986b79be59c266bb0509cbf90ca5b9e \ + --hash=sha256:e7a5ccf56444211d79e3204b05087c1460c212a2c7d62f948b996660d0165d68 \ + --hash=sha256:fcfc907746ec22716f05ea96b7f41597dfe1a1c088f861efb8a0d4f4196a6f10 +pyaes==1.6.1 \ + --hash=sha256:02c1b1405c38d3c370b085fb952dd8bea3fadcee6411ad99f312cc129c536d8f pyblake2==1.1.2 \ --hash=sha256:3757f7ad709b0e1b2a6b3919fa79fe3261f166fc375cd521f2be480f8319dde9 \ --hash=sha256:407e02c7f8f36fcec1b7aa114ddca0c1060c598142ea6f6759d03710b946a7e3 \ @@ -94,12 +99,12 @@ pyblake2==1.1.2 \ requests==2.19.1 \ --hash=sha256:63b52e3c866428a224f97cab011de738c36aec0185aa91cfacd418b5d58911d1 \ --hash=sha256:ec22d826a36ed72a7358ff3fe56cbd4ba69dd7a6718ffd450ff0e9df7a47ce6a -safet==0.1.3 \ - --hash=sha256:ba80fe9f6ba317ab9514a8726cd3792e68eb46dd419f380d48ae4a0ccae646dc \ - --hash=sha256:e5d8e6a87c8bdf1cefd07004181b93fd7631557fdab09d143ba8d1b29291d6dc -setuptools==40.0.0 \ - --hash=sha256:012adb8e25fbfd64c652e99e7bab58799a3aaf05d39ab38561f69190a909015f \ - --hash=sha256:d68abee4eed409fbe8c302ac4d8429a1ffef912cd047a903b5701c024048dd49 +safet==0.1.4 \ + --hash=sha256:522c257910f9472e9c77c487425ed286f6721c314653e232bc41c6cedece1bb1 \ + --hash=sha256:b152874acdc89ff0c8b2d680bfbf020b3e53527c2ad3404489dd61a548aa56a1 +setuptools==40.2.0 \ + --hash=sha256:47881d54ede4da9c15273bac65f9340f8929d4f0213193fa7894be384f2dcfa6 \ + --hash=sha256:ea3796a48a207b46ea36a9d26de4d0cc87c953a683a7b314ea65d666930ea8e6 six==1.11.0 \ --hash=sha256:70e8a77beed4562e7f14fe23a786b54f6296e34344c23bc42f07b15018ff98e9 \ --hash=sha256:832dc0e10feb1aa2c68dcc57dbb658f1c7e65b9b61af69048abc87a2db00a0eb @@ -109,14 +114,9 @@ trezor==0.10.2 \ urllib3==1.23 \ --hash=sha256:a68ac5e15e76e7e5dd2b8f94007233e01effe3e50e8daddf69acfd81cb686baf \ --hash=sha256:b5725a0bd4ba422ab0e66e89e030c806576753ea3ee08554382c14e685d117b5 -websocket-client==0.48.0 \ - --hash=sha256:18f1170e6a1b5463986739d9fd45c4308b0d025c1b2f9b88788d8f69e8a5eb4a \ - --hash=sha256:db70953ae4a064698b27ae56dcad84d0ee68b7b43cb40940f537738f38f510c1 +websocket-client==0.52.0 \ + --hash=sha256:03763384c530b331ec3822d0b52ffdc28c3aeb8a900ac8c98b2ceea3128a7b4e \ + --hash=sha256:3c9924675eaf0b27ae22feeeab4741bb4149b94820bd3a143eeaf8b62f64d821 wheel==0.31.1 \ --hash=sha256:0a2e54558a0628f2145d2fc822137e322412115173e8a2ddbe1c9024338ae83c \ --hash=sha256:80044e51ec5bbf6c894ba0bc48d26a8c20a9ba629f4ca19ea26ecfcf87685f5f -pyaes==1.6.1 \ - --hash=sha256:02c1b1405c38d3c370b085fb952dd8bea3fadcee6411ad99f312cc129c536d8f -ckcc-protocol==0.7.2 \ - --hash=sha256:498db4ccdda018cd9f40210f5bd02ddcc98e7df583170b2eab4035c86c3cc03b \ - --hash=sha256:31ee5178cfba8895eb2a6b8d06dc7830b51461a0ff767a670a64707c63e6b264 diff --git a/contrib/deterministic-build/requirements.txt b/contrib/deterministic-build/requirements.txt index 1b226f9d..c75d9fc4 100644 --- a/contrib/deterministic-build/requirements.txt +++ b/contrib/deterministic-build/requirements.txt @@ -1,6 +1,6 @@ -certifi==2018.4.16 \ - --hash=sha256:13e698f54293db9f89122b0581843a782ad0934a4fe0172d2a980ba77fc61bb7 \ - --hash=sha256:9fa520c1bacfb634fa7af20a76bcbd3d5fb390481724c597da32c719a7dca4b0 +certifi==2018.8.24 \ + --hash=sha256:376690d6f16d32f9d1fe8932551d80b23e9d393a8578c5633a2ed39a64861638 \ + --hash=sha256:456048c7e371c089d0a77a5212fb37a2c2dce1e24146e3b7e0261736aaeaa22a chardet==3.0.4 \ --hash=sha256:84ab92ed1c4d4f16916e05906b6b75a6c0fb5db821cc65e70cbd64a3e2a5eaae \ --hash=sha256:fc323ffcaeaed0e0a02bf4d117757b98aed530d9ed4531e3e15460124c106691 @@ -16,25 +16,25 @@ idna==2.7 \ jsonrpclib-pelix==0.3.1 \ --hash=sha256:5417b1508d5a50ec64f6e5b88907f111155d52607b218ff3ba9a777afb2e49e3 \ --hash=sha256:bd89a6093bc4d47dc8a096197aacb827359944a4533be5193f3845f57b9f91b4 -pip==10.0.1 \ - --hash=sha256:717cdffb2833be8409433a93746744b59505f42146e8d37de6c62b430e25d6d7 \ - --hash=sha256:f2bd08e0cd1b06e10218feaf6fef299f473ba706582eb3bd9d52203fdbd7ee68 -protobuf==3.6.0 \ - --hash=sha256:12985d9f40c104da2f44ec089449214876809b40fdc5d9e43b93b512b9e74056 \ - --hash=sha256:12c97fe27af12fc5d66b23f905ab09dd4fb0c68d5a74a419d914580e6d2e71e3 \ - --hash=sha256:327fb9d8a8247bc780b9ea7ed03c0643bc0d22c139b761c9ec1efc7cc3f0923e \ - --hash=sha256:3895319db04c0b3baed74fb66be7ba9f4cd8e88a432b8e71032cdf08b2dfee23 \ - --hash=sha256:695072063e256d32335d48b9484451f7c7948edc3dbd419469d6a778602682fc \ - --hash=sha256:7d786f3ef5b33a04e6538089674f244a3b0f588155016559d950989010af97d0 \ - --hash=sha256:8bf82bb7a466a54be7272dcb492f71d55a2453a58d862fb74c3f2083f2768543 \ - --hash=sha256:9bbc1ae1c33c1bd3a2fc05a3aec328544d2b039ff0ce6f000063628a32fad777 \ - --hash=sha256:9e992c68103ab5635728d29fcf132c669cb4e2db24d012685210276185009d17 \ - --hash=sha256:9f1087abb67b34e55108bc610936b34363a7aac692023bcbb17e065c253a1f80 \ - --hash=sha256:9fefcb92a3784b446abf3641d9a14dad815bee88e0edd10b9a9e0e144d01a991 \ - --hash=sha256:a37836aa47d1b81c2db1a6b7a5e79926062b5d76bd962115a0e615551be2b48d \ - --hash=sha256:cca22955443c55cf86f963a4ad7057bca95e4dcde84d6a493066d380cfab3bb0 \ - --hash=sha256:d7ac50bc06d31deb07ace6de85556c1d7330e5c0958f3b2af85037d6d1182abf \ - --hash=sha256:dfe6899304b898538f4dc94fa0b281b56b70e40f58afa4c6f807805261cbe2e8 +pip==18.0 \ + --hash=sha256:070e4bf493c7c2c9f6a08dd797dd3c066d64074c38e9e8a0fb4e6541f266d96c \ + --hash=sha256:a0e11645ee37c90b40c46d607070c4fd583e2cd46231b1c06e389c5e814eed76 +protobuf==3.6.1 \ + --hash=sha256:10394a4d03af7060fa8a6e1cbf38cea44be1467053b0aea5bbfcb4b13c4b88c4 \ + --hash=sha256:1489b376b0f364bcc6f89519718c057eb191d7ad6f1b395ffd93d1aa45587811 \ + --hash=sha256:1931d8efce896981fe410c802fd66df14f9f429c32a72dd9cfeeac9815ec6444 \ + --hash=sha256:196d3a80f93c537f27d2a19a4fafb826fb4c331b0b99110f985119391d170f96 \ + --hash=sha256:46e34fdcc2b1f2620172d3a4885128705a4e658b9b62355ae5e98f9ea19f42c2 \ + --hash=sha256:59cd75ded98094d3cf2d79e84cdb38a46e33e7441b2826f3838dcc7c07f82995 \ + --hash=sha256:5ee0522eed6680bb5bac5b6d738f7b0923b3cafce8c4b1a039a6107f0841d7ed \ + --hash=sha256:65917cfd5da9dfc993d5684643063318a2e875f798047911a9dd71ca066641c9 \ + --hash=sha256:685bc4ec61a50f7360c9fd18e277b65db90105adbf9c79938bd315435e526b90 \ + --hash=sha256:92e8418976e52201364a3174e40dc31f5fd8c147186d72380cbda54e0464ee19 \ + --hash=sha256:9335f79d1940dfb9bcaf8ec881fb8ab47d7a2c721fb8b02949aab8bbf8b68625 \ + --hash=sha256:a7ee3bb6de78185e5411487bef8bc1c59ebd97e47713cba3c460ef44e99b3db9 \ + --hash=sha256:ceec283da2323e2431c49de58f80e1718986b79be59c266bb0509cbf90ca5b9e \ + --hash=sha256:e7a5ccf56444211d79e3204b05087c1460c212a2c7d62f948b996660d0165d68 \ + --hash=sha256:fcfc907746ec22716f05ea96b7f41597dfe1a1c088f861efb8a0d4f4196a6f10 pyaes==1.6.1 \ --hash=sha256:02c1b1405c38d3c370b085fb952dd8bea3fadcee6411ad99f312cc129c536d8f PySocks==1.6.8 \ @@ -48,16 +48,16 @@ qrcode==6.0 \ requests==2.19.1 \ --hash=sha256:63b52e3c866428a224f97cab011de738c36aec0185aa91cfacd418b5d58911d1 \ --hash=sha256:ec22d826a36ed72a7358ff3fe56cbd4ba69dd7a6718ffd450ff0e9df7a47ce6a -setuptools==40.0.0 \ - --hash=sha256:012adb8e25fbfd64c652e99e7bab58799a3aaf05d39ab38561f69190a909015f \ - --hash=sha256:d68abee4eed409fbe8c302ac4d8429a1ffef912cd047a903b5701c024048dd49 +setuptools==40.2.0 \ + --hash=sha256:47881d54ede4da9c15273bac65f9340f8929d4f0213193fa7894be384f2dcfa6 \ + --hash=sha256:ea3796a48a207b46ea36a9d26de4d0cc87c953a683a7b314ea65d666930ea8e6 six==1.11.0 \ --hash=sha256:70e8a77beed4562e7f14fe23a786b54f6296e34344c23bc42f07b15018ff98e9 \ --hash=sha256:832dc0e10feb1aa2c68dcc57dbb658f1c7e65b9b61af69048abc87a2db00a0eb -typing==3.6.4 \ - --hash=sha256:3a887b021a77b292e151afb75323dea88a7bc1b3dfa92176cff8e44c8b68bddf \ - --hash=sha256:b2c689d54e1144bbcfd191b0832980a21c2dbcf7b5ff7a66248a60c90e951eb8 \ - --hash=sha256:d400a9344254803a2368533e4533a4200d21eb7b6b729c173bc38201a74db3f2 +typing==3.6.6 \ + --hash=sha256:4027c5f6127a6267a435201981ba156de91ad0d1d98e9ddc2aa173453453492d \ + --hash=sha256:57dcf675a99b74d64dacf6fba08fb17cf7e3d5fdff53d4a30ea2a5e7e52543d4 \ + --hash=sha256:a4c8473ce11a65999c8f59cb093e70686b6c84c98df58c1dae9b3b196089858a urllib3==1.23 \ --hash=sha256:a68ac5e15e76e7e5dd2b8f94007233e01effe3e50e8daddf69acfd81cb686baf \ --hash=sha256:b5725a0bd4ba422ab0e66e89e030c806576753ea3ee08554382c14e685d117b5 From 44fbd8330bed41fd243b0881aad44e41d3706e66 Mon Sep 17 00:00:00 2001 From: SomberNight Date: Wed, 5 Sep 2018 18:07:24 +0200 Subject: [PATCH 043/138] update gitignore --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index 484619da..3b34d757 100644 --- a/.gitignore +++ b/.gitignore @@ -20,3 +20,5 @@ bin/ # tox files .cache/ .coverage +.pytest_cache +.idea From 69a204d72600d7a2a58917cb4fe705ab438d4437 Mon Sep 17 00:00:00 2001 From: SomberNight Date: Wed, 5 Sep 2018 18:30:53 +0200 Subject: [PATCH 044/138] fix #4657 --- electrum/gui/kivy/main_window.py | 10 +++++++--- electrum/gui/qt/main_window.py | 11 ++++++++--- electrum/util.py | 9 +++++++-- 3 files changed, 22 insertions(+), 8 deletions(-) diff --git a/electrum/gui/kivy/main_window.py b/electrum/gui/kivy/main_window.py index ba8e7da2..b5468bb7 100644 --- a/electrum/gui/kivy/main_window.py +++ b/electrum/gui/kivy/main_window.py @@ -69,7 +69,8 @@ Label.register('Roboto', from electrum.util import (base_units, NoDynamicFeeEstimates, decimal_point_to_base_unit_name, - base_unit_name_to_decimal_point, NotEnoughFunds) + base_unit_name_to_decimal_point, NotEnoughFunds, UnknownBaseUnit, + DECIMAL_POINT_DEFAULT) class ElectrumWindow(App): @@ -163,8 +164,11 @@ class ElectrumWindow(App): self._trigger_update_history() def _get_bu(self): - decimal_point = self.electrum_config.get('decimal_point', 5) - return decimal_point_to_base_unit_name(decimal_point) + decimal_point = self.electrum_config.get('decimal_point', DECIMAL_POINT_DEFAULT) + try: + return decimal_point_to_base_unit_name(decimal_point) + except UnknownBaseUnit: + return decimal_point_to_base_unit_name(DECIMAL_POINT_DEFAULT) def _set_bu(self, value): assert value in base_units.keys() diff --git a/electrum/gui/qt/main_window.py b/electrum/gui/qt/main_window.py index 75667603..4d2eb241 100644 --- a/electrum/gui/qt/main_window.py +++ b/electrum/gui/qt/main_window.py @@ -49,7 +49,8 @@ from electrum.util import (format_time, format_satoshis, format_fee_satoshis, UserCancelled, NoDynamicFeeEstimates, profiler, export_meta, import_meta, bh2u, bfh, InvalidPassword, base_units, base_units_list, base_unit_name_to_decimal_point, - decimal_point_to_base_unit_name, quantize_feerate) + decimal_point_to_base_unit_name, quantize_feerate, + UnknownBaseUnit, DECIMAL_POINT_DEFAULT) from electrum.transaction import Transaction, TxOutput from electrum.address_synchronizer import AddTransactionException from electrum.wallet import Multisig_Wallet, CannotBumpFee @@ -126,8 +127,12 @@ class ElectrumWindow(QMainWindow, MessageBoxMixin, PrintError): self.create_status_bar() self.need_update = threading.Event() - self.decimal_point = config.get('decimal_point', 5) - self.num_zeros = int(config.get('num_zeros',0)) + self.decimal_point = config.get('decimal_point', DECIMAL_POINT_DEFAULT) + try: + decimal_point_to_base_unit_name(self.decimal_point) + except UnknownBaseUnit: + self.decimal_point = DECIMAL_POINT_DEFAULT + self.num_zeros = int(config.get('num_zeros', 0)) self.completions = QStringListModel() diff --git a/electrum/util.py b/electrum/util.py index 123dc212..de72cc80 100644 --- a/electrum/util.py +++ b/electrum/util.py @@ -49,13 +49,18 @@ base_units = {'BTC':8, 'mBTC':5, 'bits':2, 'sat':0} base_units_inverse = inv_dict(base_units) base_units_list = ['BTC', 'mBTC', 'bits', 'sat'] # list(dict) does not guarantee order +DECIMAL_POINT_DEFAULT = 5 # mBTC + + +class UnknownBaseUnit(Exception): pass + def decimal_point_to_base_unit_name(dp: int) -> str: # e.g. 8 -> "BTC" try: return base_units_inverse[dp] except KeyError: - raise Exception('Unknown base unit') + raise UnknownBaseUnit(dp) from None def base_unit_name_to_decimal_point(unit_name: str) -> int: @@ -63,7 +68,7 @@ def base_unit_name_to_decimal_point(unit_name: str) -> int: try: return base_units[unit_name] except KeyError: - raise Exception('Unknown base unit') + raise UnknownBaseUnit(unit_name) from None def normalize_version(v): From 40ceabff799c98dc7dd7f260d667550b4622ca9a Mon Sep 17 00:00:00 2001 From: SomberNight Date: Wed, 5 Sep 2018 18:36:13 +0200 Subject: [PATCH 045/138] rm redundant function from util --- electrum/network.py | 2 +- electrum/util.py | 3 --- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/electrum/network.py b/electrum/network.py index 6eb1ae16..5793ad62 100644 --- a/electrum/network.py +++ b/electrum/network.py @@ -83,7 +83,7 @@ def parse_servers(result): def filter_version(servers): def is_recent(version): try: - return util.normalize_version(version) >= util.normalize_version(PROTOCOL_VERSION) + return util.versiontuple(version) >= util.versiontuple(PROTOCOL_VERSION) except Exception as e: return False return {k: v for k, v in servers.items() if is_recent(v.get('version'))} diff --git a/electrum/util.py b/electrum/util.py index de72cc80..7963c1a2 100644 --- a/electrum/util.py +++ b/electrum/util.py @@ -71,9 +71,6 @@ def base_unit_name_to_decimal_point(unit_name: str) -> int: raise UnknownBaseUnit(unit_name) from None -def normalize_version(v): - return [int(x) for x in re.sub(r'(\.0+)*$','', v).split(".")] - class NotEnoughFunds(Exception): pass From 97ea0fc43983d93052cd25f94c015f648bf33b96 Mon Sep 17 00:00:00 2001 From: Janus Date: Wed, 15 Aug 2018 19:01:28 +0200 Subject: [PATCH 046/138] aiorpcx: replace network loop with asyncio and try to maintain ten sessions --- electrum/address_synchronizer.py | 4 +- electrum/daemon.py | 4 +- electrum/gui/qt/main_window.py | 2 +- electrum/network.py | 85 +++++++++++++++++++++++++------- electrum/util.py | 13 +++++ 5 files changed, 85 insertions(+), 23 deletions(-) diff --git a/electrum/address_synchronizer.py b/electrum/address_synchronizer.py index 56203d67..d0e8dff1 100644 --- a/electrum/address_synchronizer.py +++ b/electrum/address_synchronizer.py @@ -139,14 +139,14 @@ class AddressSynchronizer(PrintError): if self.network is not None: self.verifier = SPV(self.network, self) self.synchronizer = Synchronizer(self, network) - network.add_jobs([self.verifier, self.synchronizer]) + #network.add_jobs([self.verifier, self.synchronizer]) else: self.verifier = None self.synchronizer = None def stop_threads(self): if self.network: - self.network.remove_jobs([self.synchronizer, self.verifier]) + #self.network.remove_jobs([self.synchronizer, self.verifier]) self.synchronizer.release() self.synchronizer = None self.verifier = None diff --git a/electrum/daemon.py b/electrum/daemon.py index ccdce4a0..72d6ece8 100644 --- a/electrum/daemon.py +++ b/electrum/daemon.py @@ -128,8 +128,8 @@ class Daemon(DaemonThread): self.network = Network(config) self.network.start() self.fx = FxThread(config, self.network) - if self.network: - self.network.add_jobs([self.fx]) + #if self.network: + # self.network.add_jobs([self.fx]) self.gui = None self.wallets = {} # Setup JSONRPC server diff --git a/electrum/gui/qt/main_window.py b/electrum/gui/qt/main_window.py index 4d2eb241..b62dd3e9 100644 --- a/electrum/gui/qt/main_window.py +++ b/electrum/gui/qt/main_window.py @@ -712,7 +712,7 @@ class ElectrumWindow(QMainWindow, MessageBoxMixin, PrintError): if not self.wallet: return - if self.network is None or not self.network.is_running(): + if self.network is None: text = _("Offline") icon = QIcon(":icons/status_disconnected.png") diff --git a/electrum/network.py b/electrum/network.py index 5793ad62..4a7215ce 100644 --- a/electrum/network.py +++ b/electrum/network.py @@ -39,20 +39,42 @@ import dns.resolver import socks from . import util -from .util import print_error +from .util import print_error, PrintError from . import bitcoin from .bitcoin import COIN from . import constants -from .interface import Connection, Interface from . import blockchain from .version import ELECTRUM_VERSION, PROTOCOL_VERSION from .i18n import _ from .blockchain import InvalidHeader +import aiorpcx, asyncio, ssl +import concurrent.futures NODES_RETRY_INTERVAL = 60 SERVER_RETRY_INTERVAL = 10 +class Interface(PrintError): + @util.aiosafe + async def run(self): + self.host, self.port, self.protocol = self.server.split(':') + async with aiorpcx.ClientSession(self.host, self.port) as session: + ver = await session.send_request('server.version', [ELECTRUM_VERSION, PROTOCOL_VERSION]) + print(ver) + + def __init__(self, server): + self.exception = None + self.server = server + self.fut = asyncio.get_event_loop().create_task(self.run()) + + def has_timed_out(self): + return self.fut.done() + + def queue_request(self, method, params, msg_id): + pass + + def close(self): + self.fut.cancel() def parse_servers(result): """ parse servers list into dict format""" @@ -162,7 +184,7 @@ def serialize_server(host, port, protocol): return str(':'.join([host, port, protocol])) -class Network(util.DaemonThread): +class Network(PrintError): """The Network class manages a set of connections to remote electrum servers, each connected socket is handled by an Interface() object. Connections are initiated by a Connection() thread which stops once @@ -179,7 +201,6 @@ class Network(util.DaemonThread): def __init__(self, config=None): if config is None: config = {} # Do not use mutables as default values! - util.DaemonThread.__init__(self) self.config = SimpleConfig(config) if isinstance(config, dict) else config self.num_server = 10 if not self.config.get('oneserver') else 0 self.blockchains = blockchain.read_blockchains(self.config) # note: needs self.blockchains_lock @@ -244,6 +265,7 @@ class Network(util.DaemonThread): self.socket_queue = queue.Queue() self.start_network(deserialize_server(self.default_server)[2], deserialize_proxy(self.config.get('proxy'))) + self.asyncio_loop = asyncio.get_event_loop() def with_interface_lock(func): def func_wrapper(self, *args, **kwargs): @@ -424,7 +446,7 @@ class Network(util.DaemonThread): self.print_error("connecting to %s as new interface" % server) self.set_status('connecting') self.connecting.add(server) - Connection(server, self.socket_queue, self.config.path) + self.socket_queue.put(server) def start_random_interface(self): with self.interface_lock: @@ -781,10 +803,10 @@ class Network(util.DaemonThread): if b.catch_up == server: b.catch_up = None - def new_interface(self, server, socket): + def new_interface(self, server): # todo: get tip first, then decide which checkpoint to use. self.add_recent_server(server) - interface = Interface(server, socket) + interface = Interface(server) interface.blockchain = None interface.tip_header = None interface.tip = 0 @@ -804,12 +826,12 @@ class Network(util.DaemonThread): '''Socket maintenance.''' # Responses to connection attempts? while not self.socket_queue.empty(): - server, socket = self.socket_queue.get() + server = self.socket_queue.get() if server in self.connecting: self.connecting.remove(server) if socket: - self.new_interface(server, socket) + self.new_interface(server) else: self.connection_down(server) @@ -1078,16 +1100,15 @@ class Network(util.DaemonThread): with b.lock: b.update_size() - def run(self): + def _run(self): self.init_headers_file() - while self.is_running(): - self.maintain_sockets() - self.wait_on_sockets() - self.maintain_requests() - self.run_jobs() # Synchronizer and Verifier - self.process_pending_sends() - self.stop_network() - self.on_stop() + these = [self.maintain_sessions()] + these = [self.asyncio_loop.create_task(x) for x in these] + self.gat = asyncio.gather(*these) + try: + self.asyncio_loop.run_until_complete(self.gat) + except concurrent.futures.CancelledError: + pass def on_notify_header(self, interface, header_dict): try: @@ -1321,3 +1342,31 @@ class Network(util.DaemonThread): @classmethod def max_checkpoint(cls): return max(0, len(constants.net.CHECKPOINTS) * 2016 - 1) + + def start(self): + self.fut = threading.Thread(target=self._run) + self.fut.start() + + def stop(self): + async def stop(): + self.gat.cancel() + asyncio.run_coroutine_threadsafe(stop(), self.asyncio_loop) + + def join(self): + return self.fut.join(1) + + async def maintain_sessions(self): + while True: + while self.socket_queue.qsize() > 0: + server = self.socket_queue.get() + self.new_interface(server) + remove = [] + for k, i in self.interfaces.items(): + if i.has_timed_out(): + remove.append(k) + for k in remove: + self.connection_down(k) + for i in range(self.num_server - len(self.interfaces)): + self.start_random_interface() + self.notify('updated') + await asyncio.sleep(1) diff --git a/electrum/util.py b/electrum/util.py index 7963c1a2..4a3629cd 100644 --- a/electrum/util.py +++ b/electrum/util.py @@ -925,6 +925,19 @@ def make_dir(path, allow_symlink=True): os.mkdir(path) os.chmod(path, stat.S_IRUSR | stat.S_IWUSR | stat.S_IXUSR) +def aiosafe(f): + # save exception in object. + # f must be a method of a PrintError instance. + # aiosafe calls should not be nested + async def f2(*args, **kwargs): + self = args[0] + try: + return await f(*args, **kwargs) + except BaseException as e: + self.print_error("Exception in", f.__name__, ":", e.__class__.__name__, str(e)) + traceback.print_exc(file=sys.stderr) + self.exception = e + return f2 TxMinedStatus = NamedTuple("TxMinedStatus", [("height", int), ("conf", int), From 8080a713b2fa8e56cc5d9d8bf977c2cdf55c1f47 Mon Sep 17 00:00:00 2001 From: Janus Date: Thu, 16 Aug 2018 12:09:41 +0200 Subject: [PATCH 047/138] aiorpcx: pass ssl context, sleep after connecting --- electrum/network.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/electrum/network.py b/electrum/network.py index 4a7215ce..01febd14 100644 --- a/electrum/network.py +++ b/electrum/network.py @@ -58,9 +58,13 @@ class Interface(PrintError): @util.aiosafe async def run(self): self.host, self.port, self.protocol = self.server.split(':') - async with aiorpcx.ClientSession(self.host, self.port) as session: + sslc = ssl.SSLContext(ssl.PROTOCOL_TLS) if self.protocol == 's' else None + async with aiorpcx.ClientSession(self.host, self.port, ssl=sslc) as session: ver = await session.send_request('server.version', [ELECTRUM_VERSION, PROTOCOL_VERSION]) print(ver) + while True: + print("sleeping") + await asyncio.sleep(1) def __init__(self, server): self.exception = None From 89a01a64636f9f061a7c9cf2eb842feff12cb92f Mon Sep 17 00:00:00 2001 From: Janus Date: Thu, 16 Aug 2018 18:16:25 +0200 Subject: [PATCH 048/138] aiorpcx: pin certificates --- electrum/__init__.py | 2 +- electrum/interface.py | 412 ++++++++++-------------------------------- electrum/network.py | 37 +--- 3 files changed, 109 insertions(+), 342 deletions(-) diff --git a/electrum/__init__.py b/electrum/__init__.py index 48a60c15..556fc329 100644 --- a/electrum/__init__.py +++ b/electrum/__init__.py @@ -4,7 +4,7 @@ from .wallet import Wallet from .storage import WalletStorage from .coinchooser import COIN_CHOOSERS from .network import Network, pick_random_server -from .interface import Connection, Interface +from .interface import Interface from .simple_config import SimpleConfig, get_config, set_config from . import bitcoin from . import transaction diff --git a/electrum/interface.py b/electrum/interface.py index 357d913a..678c726a 100644 --- a/electrum/interface.py +++ b/electrum/interface.py @@ -28,343 +28,131 @@ import socket import ssl import sys import threading -import time import traceback +import aiorpcx +import asyncio import requests -from .util import print_error +from .util import PrintError ca_path = requests.certs.where() from . import util from . import x509 from . import pem +from .version import ELECTRUM_VERSION, PROTOCOL_VERSION +class Interface(PrintError): -def Connection(server, queue, config_path): - """Makes asynchronous connections to a remote Electrum server. - Returns the running thread that is making the connection. - - Once the thread has connected, it finishes, placing a tuple on the - queue of the form (server, socket), where socket is None if - connection failed. - """ - host, port, protocol = server.rsplit(':', 2) - if not protocol in 'st': - raise Exception('Unknown protocol: %s' % protocol) - c = TcpConnection(server, queue, config_path) - c.start() - return c - - -class TcpConnection(threading.Thread, util.PrintError): - verbosity_filter = 'i' - - def __init__(self, server, queue, config_path): - threading.Thread.__init__(self) + def __init__(self, server, config_path, connecting): + self.connecting = connecting + self.server = server + self.host, self.port, self.protocol = self.server.split(':') self.config_path = config_path - self.queue = queue - self.server = server - self.host, self.port, self.protocol = self.server.rsplit(':', 2) - self.host = str(self.host) - self.port = int(self.port) - self.use_ssl = (self.protocol == 's') - self.daemon = True + self.cert_path = os.path.join(self.config_path, 'certs', self.host) + self.fut = asyncio.get_event_loop().create_task(self.run()) def diagnostic_name(self): return self.host - def check_host_name(self, peercert, name): - """Simple certificate/host name checker. Returns True if the - certificate matches, False otherwise. Does not support - wildcards.""" - # Check that the peer has supplied a certificate. - # None/{} is not acceptable. - if not peercert: - return False - if 'subjectAltName' in peercert: - for typ, val in peercert["subjectAltName"]: - if typ == "DNS" and val == name: - return True - else: - # Only check the subject DN if there is no subject alternative - # name. - cn = None - for attr, val in peercert["subject"]: - # Use most-specific (last) commonName attribute. - if attr == "commonName": - cn = val - if cn is not None: - return cn == name - return False - - def get_simple_socket(self): + async def is_server_ca_signed(self, sslc): try: - l = socket.getaddrinfo(self.host, self.port, socket.AF_UNSPEC, socket.SOCK_STREAM) - except socket.gaierror: - self.print_error("cannot resolve hostname") - return - e = None - for res in l: - try: - s = socket.socket(res[0], socket.SOCK_STREAM) - s.settimeout(10) - s.connect(res[4]) - s.settimeout(2) - s.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1) - return s - except BaseException as _e: - e = _e - continue - else: - self.print_error("failed to connect", str(e)) - - @staticmethod - def get_ssl_context(cert_reqs, ca_certs): - context = ssl.create_default_context(purpose=ssl.Purpose.SERVER_AUTH, cafile=ca_certs) - context.check_hostname = False - context.verify_mode = cert_reqs - - context.options |= ssl.OP_NO_SSLv2 - context.options |= ssl.OP_NO_SSLv3 - context.options |= ssl.OP_NO_TLSv1 - - return context - - def get_socket(self): - if self.use_ssl: - cert_path = os.path.join(self.config_path, 'certs', self.host) - if not os.path.exists(cert_path): - is_new = True - s = self.get_simple_socket() - if s is None: - return - # try with CA first - try: - context = self.get_ssl_context(cert_reqs=ssl.CERT_REQUIRED, ca_certs=ca_path) - s = context.wrap_socket(s, do_handshake_on_connect=True) - except ssl.SSLError as e: - self.print_error(e) - except: - return - else: - try: - peer_cert = s.getpeercert() - except OSError: - return - if self.check_host_name(peer_cert, self.host): - self.print_error("SSL certificate signed by CA") - return s - # get server certificate. - # Do not use ssl.get_server_certificate because it does not work with proxy - s = self.get_simple_socket() - if s is None: - return - try: - context = self.get_ssl_context(cert_reqs=ssl.CERT_NONE, ca_certs=None) - s = context.wrap_socket(s) - except ssl.SSLError as e: - self.print_error("SSL error retrieving SSL certificate:", e) - return - except: - return - - try: - dercert = s.getpeercert(True) - except OSError: - return - s.close() - cert = ssl.DER_cert_to_PEM_cert(dercert) - # workaround android bug - cert = re.sub("([^\n])-----END CERTIFICATE-----","\\1\n-----END CERTIFICATE-----",cert) - temporary_path = cert_path + '.temp' - util.assert_datadir_available(self.config_path) - with open(temporary_path, "w", encoding='utf-8') as f: - f.write(cert) - f.flush() - os.fsync(f.fileno()) - else: - is_new = False - - s = self.get_simple_socket() - if s is None: - return - - if self.use_ssl: - try: - context = self.get_ssl_context(cert_reqs=ssl.CERT_REQUIRED, - ca_certs=(temporary_path if is_new else cert_path)) - s = context.wrap_socket(s, do_handshake_on_connect=True) - except socket.timeout: - self.print_error('timeout') - return - except ssl.SSLError as e: - self.print_error("SSL error:", e) - if e.errno != 1: - return - if is_new: - rej = cert_path + '.rej' - if os.path.exists(rej): - os.unlink(rej) - os.rename(temporary_path, rej) - else: - util.assert_datadir_available(self.config_path) - with open(cert_path, encoding='utf-8') as f: - cert = f.read() - try: - b = pem.dePem(cert, 'CERTIFICATE') - x = x509.X509(b) - except: - traceback.print_exc(file=sys.stderr) - self.print_error("wrong certificate") - return - try: - x.check_date() - except: - self.print_error("certificate has expired:", cert_path) - os.unlink(cert_path) - return - self.print_error("wrong certificate") - if e.errno == 104: - return - return - except BaseException as e: - self.print_error(e) - traceback.print_exc(file=sys.stderr) - return - - if is_new: - self.print_error("saving certificate") - os.rename(temporary_path, cert_path) - - return s - - def run(self): - socket = self.get_socket() - if socket: - self.print_error("connected") - self.queue.put((self.server, socket)) - - -class Interface(util.PrintError): - """The Interface class handles a socket connected to a single remote - Electrum server. Its exposed API is: - - - Member functions close(), fileno(), get_responses(), has_timed_out(), - ping_required(), queue_request(), send_requests() - - Member variable server. - """ - - def __init__(self, server, socket): - self.server = server - self.host, _, _ = server.rsplit(':', 2) - self.socket = socket - - self.pipe = util.SocketPipe(socket) - self.pipe.set_timeout(0.0) # Don't wait for data - # Dump network messages. Set at runtime from the console. - self.debug = False - self.unsent_requests = [] - self.unanswered_requests = {} - self.last_send = time.time() - self.closed_remotely = False - - def diagnostic_name(self): - return self.host - - def fileno(self): - # Needed for select - return self.socket.fileno() - - def close(self): - if not self.closed_remotely: - try: - self.socket.shutdown(socket.SHUT_RDWR) - except socket.error: - pass - self.socket.close() - - def queue_request(self, *args): # method, params, _id - '''Queue a request, later to be send with send_requests when the - socket is available for writing. - ''' - self.request_time = time.time() - self.unsent_requests.append(args) - - def num_requests(self): - '''Keep unanswered requests below 100''' - n = 100 - len(self.unanswered_requests) - return min(n, len(self.unsent_requests)) - - def send_requests(self): - '''Sends queued requests. Returns False on failure.''' - self.last_send = time.time() - make_dict = lambda m, p, i: {'method': m, 'params': p, 'id': i} - n = self.num_requests() - wire_requests = self.unsent_requests[0:n] - try: - self.pipe.send_all([make_dict(*r) for r in wire_requests]) - except BaseException as e: - self.print_error("pipe send error:", e) + await self.open_session(sslc, do_sleep=False) + except ssl.SSLError as e: + assert e.reason == 'CERTIFICATE_VERIFY_FAILED' return False - self.unsent_requests = self.unsent_requests[n:] - for request in wire_requests: - if self.debug: - self.print_error("-->", request) - self.unanswered_requests[request[2]] = request return True - def ping_required(self): - '''Returns True if a ping should be sent.''' - return time.time() - self.last_send > 300 + @util.aiosafe + async def run(self): + if self.protocol != 's': + await self.open_session(None, execute_after_connect=lambda: self.connecting.remove(self.server)) + return + + ca_sslc = ssl.create_default_context(ssl.Purpose.SERVER_AUTH) + exists = os.path.exists(self.cert_path) + if exists: + with open(self.cert_path, 'r') as f: + contents = f.read() + if contents != '': # if not CA signed + try: + b = pem.dePem(contents, 'CERTIFICATE') + except SyntaxError: + exists = False + else: + x = x509.X509(b) + try: + x.check_date() + except x509.CertificateError: + self.print_error("certificate has expired:", self.cert_path) + os.unlink(self.cert_path) + exists = False + if not exists: + ca_signed = await self.is_server_ca_signed(ca_sslc) + if ca_signed: + with open(self.cert_path, 'w') as f: + # empty file means this is CA signed, not self-signed + f.write('') + else: + await self.save_certificate() + siz = os.stat(self.cert_path).st_size + if siz == 0: # if CA signed + sslc = ca_sslc + else: + sslc = ssl.create_default_context(ssl.Purpose.SERVER_AUTH, cafile=self.cert_path) + sslc.check_hostname = 0 + await self.open_session(sslc, execute_after_connect=lambda: self.connecting.remove(self.server)) + + async def save_certificate(self): + if not os.path.exists(self.cert_path): + # we may need to retry this a few times, in case the handshake hasn't completed + for _ in range(10): + dercert = await self.get_certificate() + if dercert: + self.print_error("succeeded in getting cert") + with open(self.cert_path, 'w') as f: + cert = ssl.DER_cert_to_PEM_cert(dercert) + # workaround android bug + cert = re.sub("([^\n])-----END CERTIFICATE-----","\\1\n-----END CERTIFICATE-----",cert) + f.write(cert) + # even though close flushes we can't fsync when closed. + # and we must flush before fsyncing, cause flush flushes to OS buffer + # fsync writes to OS buffer to disk + f.flush() + os.fsync(f.fileno()) + break + await asyncio.sleep(1) + assert False, "could not get certificate" + + async def get_certificate(self): + sslc = ssl.SSLContext() + try: + async with aiorpcx.ClientSession(self.host, self.port, ssl=sslc) as session: + return session.transport._ssl_protocol._sslpipe._sslobj.getpeercert(True) + except ValueError: + return None + + async def open_session(self, sslc, do_sleep=True, execute_after_connect=lambda: None): + async with aiorpcx.ClientSession(self.host, self.port, ssl=sslc) as session: + ver = await session.send_request('server.version', [ELECTRUM_VERSION, PROTOCOL_VERSION]) + print(ver) + connect_hook_executed = False + while do_sleep: + if not connect_hook_executed: + connect_hook_executed = True + execute_after_connect() + await asyncio.wait_for(session.send_request('server.ping'), 5) + await asyncio.sleep(300) def has_timed_out(self): - '''Returns True if the interface has timed out.''' - if (self.unanswered_requests and time.time() - self.request_time > 10 - and self.pipe.idle_time() > 10): - self.print_error("timeout", len(self.unanswered_requests)) - return True + return self.fut.done() - return False - - def get_responses(self): - '''Call if there is data available on the socket. Returns a list of - (request, response) pairs. Notifications are singleton - unsolicited responses presumably as a result of prior - subscriptions, so request is None and there is no 'id' member. - Otherwise it is a response, which has an 'id' member and a - corresponding request. If the connection was closed remotely - or the remote server is misbehaving, a (None, None) will appear. - ''' - responses = [] - while True: - try: - response = self.pipe.get() - except util.timeout: - break - if not type(response) is dict: - responses.append((None, None)) - if response is None: - self.closed_remotely = True - self.print_error("connection closed remotely") - break - if self.debug: - self.print_error("<--", response) - wire_id = response.get('id', None) - if wire_id is None: # Notification - responses.append((None, response)) - else: - request = self.unanswered_requests.pop(wire_id, None) - if request: - responses.append((request, response)) - else: - self.print_error("unknown wire ID", wire_id) - responses.append((None, None)) # Signal - break - - return responses + def queue_request(self, method, params, msg_id): + pass + def close(self): + self.fut.cancel() def check_cert(host, cert): try: diff --git a/electrum/network.py b/electrum/network.py index 01febd14..9e5b33d8 100644 --- a/electrum/network.py +++ b/electrum/network.py @@ -47,38 +47,14 @@ from . import blockchain from .version import ELECTRUM_VERSION, PROTOCOL_VERSION from .i18n import _ from .blockchain import InvalidHeader +from .interface import Interface -import aiorpcx, asyncio, ssl +import asyncio import concurrent.futures NODES_RETRY_INTERVAL = 60 SERVER_RETRY_INTERVAL = 10 -class Interface(PrintError): - @util.aiosafe - async def run(self): - self.host, self.port, self.protocol = self.server.split(':') - sslc = ssl.SSLContext(ssl.PROTOCOL_TLS) if self.protocol == 's' else None - async with aiorpcx.ClientSession(self.host, self.port, ssl=sslc) as session: - ver = await session.send_request('server.version', [ELECTRUM_VERSION, PROTOCOL_VERSION]) - print(ver) - while True: - print("sleeping") - await asyncio.sleep(1) - - def __init__(self, server): - self.exception = None - self.server = server - self.fut = asyncio.get_event_loop().create_task(self.run()) - - def has_timed_out(self): - return self.fut.done() - - def queue_request(self, method, params, msg_id): - pass - - def close(self): - self.fut.cancel() def parse_servers(result): """ parse servers list into dict format""" @@ -539,7 +515,7 @@ class Network(PrintError): self.close_interface(self.interface) assert self.interface is None assert not self.interfaces - self.connecting = set() + self.connecting.clear() # Get a new queue - no old pending connections thanks! self.socket_queue = queue.Queue() @@ -810,7 +786,7 @@ class Network(PrintError): def new_interface(self, server): # todo: get tip first, then decide which checkpoint to use. self.add_recent_server(server) - interface = Interface(server) + interface = Interface(server, self.config.path, self.connecting) interface.blockchain = None interface.tip_header = None interface.tip = 0 @@ -1368,9 +1344,12 @@ class Network(PrintError): for k, i in self.interfaces.items(): if i.has_timed_out(): remove.append(k) + changed = False for k in remove: self.connection_down(k) + changed = True for i in range(self.num_server - len(self.interfaces)): self.start_random_interface() - self.notify('updated') + changed = True + if changed: self.notify('updated') await asyncio.sleep(1) From c53caecd1e130d889f952e5b7e6d1d4c0b206b85 Mon Sep 17 00:00:00 2001 From: ThomasV Date: Fri, 17 Aug 2018 14:51:02 +0200 Subject: [PATCH 049/138] fix else statement --- electrum/interface.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/electrum/interface.py b/electrum/interface.py index 678c726a..563a43e5 100644 --- a/electrum/interface.py +++ b/electrum/interface.py @@ -123,7 +123,8 @@ class Interface(PrintError): os.fsync(f.fileno()) break await asyncio.sleep(1) - assert False, "could not get certificate" + else: + assert False, "could not get certificate" async def get_certificate(self): sslc = ssl.SSLContext() From f733cb89475872d5d59188ed8fccfbaa3f35b0ec Mon Sep 17 00:00:00 2001 From: Janus Date: Mon, 27 Aug 2018 20:39:36 +0200 Subject: [PATCH 050/138] aiorpcx: socks support --- electrum/gui/kivy/uix/ui_screens/proxy.kv | 2 +- electrum/gui/qt/network_dialog.py | 2 +- electrum/interface.py | 47 +++++++++++++++++------ electrum/network.py | 39 +++++++++---------- electrum/util.py | 22 +++++++++++ 5 files changed, 77 insertions(+), 35 deletions(-) diff --git a/electrum/gui/kivy/uix/ui_screens/proxy.kv b/electrum/gui/kivy/uix/ui_screens/proxy.kv index 738a8ffd..b7231855 100644 --- a/electrum/gui/kivy/uix/ui_screens/proxy.kv +++ b/electrum/gui/kivy/uix/ui_screens/proxy.kv @@ -14,7 +14,7 @@ Popup: height: '48dp' size_hint_y: None text: app.proxy_config.get('mode', 'none') - values: ['none', 'socks4', 'socks5', 'http'] + values: ['none', 'socks4', 'socks5'] Label: text: _('Host') TextInput: diff --git a/electrum/gui/qt/network_dialog.py b/electrum/gui/qt/network_dialog.py index ecc7695b..0acdbcd2 100644 --- a/electrum/gui/qt/network_dialog.py +++ b/electrum/gui/qt/network_dialog.py @@ -239,7 +239,7 @@ class NetworkChoiceLayout(object): self.proxy_cb.clicked.connect(self.set_proxy) self.proxy_mode = QComboBox() - self.proxy_mode.addItems(['SOCKS4', 'SOCKS5', 'HTTP']) + self.proxy_mode.addItems(['SOCKS4', 'SOCKS5']) self.proxy_host = QLineEdit() self.proxy_host.setFixedWidth(200) self.proxy_port = QLineEdit() diff --git a/electrum/interface.py b/electrum/interface.py index 563a43e5..5dd9c60e 100644 --- a/electrum/interface.py +++ b/electrum/interface.py @@ -34,7 +34,7 @@ import asyncio import requests -from .util import PrintError +from .util import PrintError, aiosafe, bfh ca_path = requests.certs.where() @@ -42,16 +42,38 @@ from . import util from . import x509 from . import pem from .version import ELECTRUM_VERSION, PROTOCOL_VERSION +from .util import NotificationSession class Interface(PrintError): - def __init__(self, server, config_path, connecting): + def __init__(self, server, config_path, connecting, proxy): + self.exception = None self.connecting = connecting self.server = server self.host, self.port, self.protocol = self.server.split(':') + self.port = int(self.port) self.config_path = config_path self.cert_path = os.path.join(self.config_path, 'certs', self.host) self.fut = asyncio.get_event_loop().create_task(self.run()) + if proxy: + proxy['user'] = proxy.get('user', '') + if proxy['user'] == '': + proxy['user'] = 'sampleuser' # aiorpcx doesn't allow empty user + proxy['password'] = proxy.get('password', '') + if proxy['password'] == '': + proxy['password'] = 'samplepassword' + try: + auth = aiorpcx.socks.SOCKSUserAuth(proxy['user'], proxy['password']) + except KeyError: + auth = None + if proxy['mode'] == "socks4": + self.proxy = aiorpcx.socks.SOCKSProxy((proxy['host'], int(proxy['port'])), aiorpcx.socks.SOCKS4a, auth) + elif proxy['mode'] == "socks5": + self.proxy = aiorpcx.socks.SOCKSProxy((proxy['host'], int(proxy['port'])), aiorpcx.socks.SOCKS5, auth) + else: + raise NotImplementedError + else: + self.proxy = None def diagnostic_name(self): return self.host @@ -67,8 +89,8 @@ class Interface(PrintError): @util.aiosafe async def run(self): if self.protocol != 's': - await self.open_session(None, execute_after_connect=lambda: self.connecting.remove(self.server)) - return + await self.open_session(None, execute_after_connect=self.mark_ready) + assert False ca_sslc = ssl.create_default_context(ssl.Purpose.SERVER_AUTH) exists = os.path.exists(self.cert_path) @@ -84,8 +106,8 @@ class Interface(PrintError): x = x509.X509(b) try: x.check_date() - except x509.CertificateError: - self.print_error("certificate has expired:", self.cert_path) + except x509.CertificateError as e: + self.print_error("certificate problem", e) os.unlink(self.cert_path) exists = False if not exists: @@ -102,7 +124,11 @@ class Interface(PrintError): else: sslc = ssl.create_default_context(ssl.Purpose.SERVER_AUTH, cafile=self.cert_path) sslc.check_hostname = 0 - await self.open_session(sslc, execute_after_connect=lambda: self.connecting.remove(self.server)) + await self.open_session(sslc, execute_after_connect=self.mark_ready) + assert False + + def mark_ready(self): + self.connecting.remove(self.server) async def save_certificate(self): if not os.path.exists(self.cert_path): @@ -129,13 +155,13 @@ class Interface(PrintError): async def get_certificate(self): sslc = ssl.SSLContext() try: - async with aiorpcx.ClientSession(self.host, self.port, ssl=sslc) as session: + async with aiorpcx.ClientSession(self.host, self.port, ssl=sslc, proxy=self.proxy) as session: return session.transport._ssl_protocol._sslpipe._sslobj.getpeercert(True) except ValueError: return None async def open_session(self, sslc, do_sleep=True, execute_after_connect=lambda: None): - async with aiorpcx.ClientSession(self.host, self.port, ssl=sslc) as session: + async with NotificationSession(None, None, self.host, self.port, ssl=sslc, proxy=self.proxy) as session: ver = await session.send_request('server.version', [ELECTRUM_VERSION, PROTOCOL_VERSION]) print(ver) connect_hook_executed = False @@ -146,9 +172,6 @@ class Interface(PrintError): await asyncio.wait_for(session.send_request('server.ping'), 5) await asyncio.sleep(300) - def has_timed_out(self): - return self.fut.done() - def queue_request(self, method, params, msg_id): pass diff --git a/electrum/network.py b/electrum/network.py index 9e5b33d8..de1b7b8c 100644 --- a/electrum/network.py +++ b/electrum/network.py @@ -36,7 +36,6 @@ import ipaddress import dns import dns.resolver -import socks from . import util from .util import print_error, PrintError @@ -434,6 +433,7 @@ class Network(PrintError): server = pick_random_server(self.get_servers(), self.protocol, exclude_set) if server: self.start_interface(server) + return server def start_interfaces(self): self.start_interface(self.default_server) @@ -444,22 +444,13 @@ class Network(PrintError): self.proxy = proxy # Store these somewhere so we can un-monkey-patch if not hasattr(socket, "_socketobject"): - socket._socketobject = socket.socket socket._getaddrinfo = socket.getaddrinfo if proxy: self.print_error('setting proxy', proxy) proxy_mode = proxy_modes.index(proxy["mode"]) + 1 - socks.setdefaultproxy(proxy_mode, - proxy["host"], - int(proxy["port"]), - # socks.py seems to want either None or a non-empty string - username=(proxy.get("user", "") or None), - password=(proxy.get("password", "") or None)) - socket.socket = socks.socksocket # prevent dns leaks, see http://stackoverflow.com/questions/13184205/dns-over-proxy socket.getaddrinfo = lambda *args: [(socket.AF_INET, socket.SOCK_STREAM, 6, '', (args[0], args[1]))] else: - socket.socket = socket._socketobject if sys.platform == 'win32': # On Windows, socket.getaddrinfo takes a mutex, and might hold it for up to 10 seconds # when dns-resolving. To speed it up drastically, we resolve dns ourselves, outside that lock. @@ -783,10 +774,10 @@ class Network(PrintError): if b.catch_up == server: b.catch_up = None - def new_interface(self, server): + async def new_interface(self, server): # todo: get tip first, then decide which checkpoint to use. self.add_recent_server(server) - interface = Interface(server, self.config.path, self.connecting) + interface = Interface(server, self.config.path, self.connecting, self.proxy) interface.blockchain = None interface.tip_header = None interface.tip = 0 @@ -1082,9 +1073,7 @@ class Network(PrintError): def _run(self): self.init_headers_file() - these = [self.maintain_sessions()] - these = [self.asyncio_loop.create_task(x) for x in these] - self.gat = asyncio.gather(*these) + self.gat = self.asyncio_loop.create_task(self.maintain_sessions()) try: self.asyncio_loop.run_until_complete(self.gat) except concurrent.futures.CancelledError: @@ -1339,17 +1328,25 @@ class Network(PrintError): while True: while self.socket_queue.qsize() > 0: server = self.socket_queue.get() - self.new_interface(server) + asyncio.get_event_loop().create_task(self.new_interface(server)) remove = [] for k, i in self.interfaces.items(): - if i.has_timed_out(): + if i.fut.done(): + if i.exception: + try: + raise i.exception + except BaseException as e: + self.print_error(i.server, "errored because", str(e), str(type(e))) + else: + assert False, "interface future should not finish without exception" remove.append(k) changed = False for k in remove: self.connection_down(k) changed = True - for i in range(self.num_server - len(self.interfaces)): - self.start_random_interface() - changed = True - if changed: self.notify('updated') + for i in range(self.num_server - len(self.interfaces) - len(self.connecting)): + if self.start_random_interface(): + changed = True + if changed: + self.notify('updated') await asyncio.sleep(1) diff --git a/electrum/util.py b/electrum/util.py index 4a3629cd..ec4d4434 100644 --- a/electrum/util.py +++ b/electrum/util.py @@ -38,6 +38,7 @@ from locale import localeconv from .i18n import _ +from aiorpcx import ClientSession, Notification import urllib.request, urllib.parse, urllib.error import queue @@ -947,3 +948,24 @@ VerifiedTxInfo = NamedTuple("VerifiedTxInfo", [("height", int), ("timestamp", int), ("txpos", int), ("header_hash", str)]) + +from .blockchain import deserialize_header + +class NotificationSession(ClientSession): + + def __init__(self, scripthash, header, *args, **kwargs): + super(NotificationSession, self).__init__(*args, **kwargs) + self.scripthash = scripthash + self.header = header + + @aiosafe + async def handle_request(self, request): + if isinstance(request, Notification): + if request.method == 'blockchain.scripthash.subscribe' and self.scripthash is not None: + args = request.args + await self.scripthash.put((args[0], args[1])) + elif request.method == 'blockchain.headers.subscribe' and self.header is not None: + deser = deserialize_header(bfh(request.args[0]['hex']), request.args[0]['height']) + await self.header.put(deser) + else: + assert False, request.method From b120584f97c757deeb8e23e70631829ddb8fadfb Mon Sep 17 00:00:00 2001 From: Janus Date: Fri, 27 Jul 2018 12:29:04 +0200 Subject: [PATCH 051/138] aiorpcx address synchronizer --- contrib/requirements/requirements.txt | 1 + electrum/address_synchronizer.py | 11 +- electrum/network.py | 46 +---- electrum/synchronizer.py | 247 +++++++++++++------------- run_electrum | 1 + 5 files changed, 133 insertions(+), 173 deletions(-) diff --git a/contrib/requirements/requirements.txt b/contrib/requirements/requirements.txt index 99b859c3..3860c9cd 100644 --- a/contrib/requirements/requirements.txt +++ b/contrib/requirements/requirements.txt @@ -8,3 +8,4 @@ jsonrpclib-pelix PySocks>=1.6.6 qdarkstyle<3.0 typing>=3.0.0 +aiorpcx>=0.7.1 diff --git a/electrum/address_synchronizer.py b/electrum/address_synchronizer.py index d0e8dff1..ed9f190e 100644 --- a/electrum/address_synchronizer.py +++ b/electrum/address_synchronizer.py @@ -22,6 +22,7 @@ # SOFTWARE. import threading +import asyncio import itertools from collections import defaultdict @@ -138,16 +139,18 @@ class AddressSynchronizer(PrintError): self.network = network if self.network is not None: self.verifier = SPV(self.network, self) - self.synchronizer = Synchronizer(self, network) - #network.add_jobs([self.verifier, self.synchronizer]) + self.synchronizer = Synchronizer(self) + #network.add_jobs([self.verifier]) + self.network.futures.append(asyncio.run_coroutine_threadsafe(self.synchronizer.send_subscriptions(), self.network.asyncio_loop)) + self.network.futures.append(asyncio.run_coroutine_threadsafe(self.synchronizer.handle_status(), self.network.asyncio_loop)) + self.network.futures.append(asyncio.run_coroutine_threadsafe(self.synchronizer.main(), self.network.asyncio_loop)) else: self.verifier = None self.synchronizer = None def stop_threads(self): if self.network: - #self.network.remove_jobs([self.synchronizer, self.verifier]) - self.synchronizer.release() + #self.network.remove_jobs([self.verifier]) self.synchronizer = None self.verifier = None # Now no references to the synchronizer or verifier diff --git a/electrum/network.py b/electrum/network.py index de1b7b8c..e00a9c05 100644 --- a/electrum/network.py +++ b/electrum/network.py @@ -20,6 +20,7 @@ # ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN # CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. +import asyncio import time import queue import os @@ -204,7 +205,6 @@ class Network(PrintError): self.callback_lock = threading.Lock() self.pending_sends_lock = threading.Lock() self.recent_servers_lock = threading.RLock() # <- re-entrant - self.subscribed_addresses_lock = threading.Lock() self.blockchains_lock = threading.Lock() self.pending_sends = [] @@ -226,7 +226,6 @@ class Network(PrintError): util.make_dir(dir_path) # subscriptions and requests - self.subscribed_addresses = set() # note: needs self.subscribed_addresses_lock self.h2addr = {} # Requests from client we've not seen a response to self.unanswered_requests = {} @@ -245,6 +244,7 @@ class Network(PrintError): self.start_network(deserialize_server(self.default_server)[2], deserialize_proxy(self.config.get('proxy'))) self.asyncio_loop = asyncio.get_event_loop() + self.futures = [] def with_interface_lock(func): def func_wrapper(self, *args, **kwargs): @@ -338,26 +338,6 @@ class Network(PrintError): interface.queue_request(method, params, message_id) return message_id - @with_interface_lock - def send_subscriptions(self): - assert self.interface - self.print_error('sending subscriptions to', self.interface.server, len(self.unanswered_requests), len(self.subscribed_addresses)) - self.sub_cache.clear() - # Resend unanswered requests - requests = self.unanswered_requests.values() - self.unanswered_requests = {} - for request in requests: - message_id = self.queue_request(request[0], request[1]) - self.unanswered_requests[message_id] = request - self.queue_request('server.banner', []) - self.queue_request('server.donation_address', []) - self.queue_request('server.peers.subscribe', []) - self.request_fee_estimates() - self.queue_request('blockchain.relayfee', []) - with self.subscribed_addresses_lock: - for h in self.subscribed_addresses: - self.queue_request('blockchain.scripthash.subscribe', [h]) - def request_fee_estimates(self): from .simple_config import FEE_ETA_TARGETS self.config.requested_fee_estimates() @@ -578,7 +558,6 @@ class Network(PrintError): # fixme: we don't want to close headers sub #self.close_interface(self.interface) self.interface = i - self.send_subscriptions() self.set_status('connected') self.notify('updated') self.notify('interfaces') @@ -683,11 +662,6 @@ class Network(PrintError): # Copy the request method and params to the response response['method'] = method response['params'] = params - # Only once we've received a response to an addr subscription - # add it to the list; avoids double-sends on reconnection - if method == 'blockchain.scripthash.subscribe': - with self.subscribed_addresses_lock: - self.subscribed_addresses.add(params[0]) else: if not response: # Closed remotely / misbehaving self.connection_down(interface.server) @@ -1078,6 +1052,7 @@ class Network(PrintError): self.asyncio_loop.run_until_complete(self.gat) except concurrent.futures.CancelledError: pass + [f.cancel() for f in self.futures] def on_notify_header(self, interface, header_dict): try: @@ -1212,21 +1187,6 @@ class Network(PrintError): callback(x2) return cb2 - def subscribe_to_addresses(self, addresses, callback): - hash2address = { - bitcoin.address_to_scripthash(address): address - for address in addresses} - self.h2addr.update(hash2address) - msgs = [ - ('blockchain.scripthash.subscribe', [x]) - for x in hash2address.keys()] - self.send(msgs, self.map_scripthash_to_address(callback)) - - def request_address_history(self, address, callback): - h = bitcoin.address_to_scripthash(address) - self.h2addr.update({h: address}) - self.send([('blockchain.scripthash.get_history', [h])], self.map_scripthash_to_address(callback)) - # NOTE this method handles exceptions and a special edge case, counter to # what the other ElectrumX methods do. This is unexpected. def broadcast_transaction(self, transaction, callback=None): diff --git a/electrum/synchronizer.py b/electrum/synchronizer.py index 48635df8..6cc3b7bd 100644 --- a/electrum/synchronizer.py +++ b/electrum/synchronizer.py @@ -22,102 +22,86 @@ # ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN # CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. +import traceback +import ssl +import asyncio +from aiorpcx import ClientSession, Request, Notification, TaskGroup from threading import Lock import hashlib +import concurrent.futures # from .bitcoin import Hash, hash_encode from .transaction import Transaction -from .util import ThreadJob, bh2u +from .util import ThreadJob, bh2u, PrintError, aiosafe +from .bitcoin import address_to_scripthash +from .version import ELECTRUM_VERSION, PROTOCOL_VERSION -class Synchronizer(ThreadJob): +def history_status(h): + if not h: + return None + status = '' + for tx_hash, height in h: + status += tx_hash + ':%d:' % height + return bh2u(hashlib.sha256(status.encode('ascii')).digest()) + + + +class NotificationSession(ClientSession): + + def __init__(self, queue, *args, **kwargs): + super(NotificationSession, self).__init__(*args, **kwargs) + self.queue = queue + + @aiosafe + async def handle_request(self, request): + if isinstance(request, Notification): + if request.method == 'blockchain.scripthash.subscribe': + args = request.args + await self.queue.put((args[0], args[1])) + + +class Synchronizer(PrintError): '''The synchronizer keeps the wallet up-to-date with its set of addresses and their transactions. It subscribes over the network to wallet addresses, gets the wallet to generate new addresses when necessary, requests the transaction history of any addresses we don't have the full history of, and requests binary transaction data of any transactions the wallet doesn't have. - - External interface: __init__() and add() member functions. ''' - - def __init__(self, wallet, network): + def __init__(self, wallet): self.wallet = wallet - self.network = network - self.new_addresses = set() - # Entries are (tx_hash, tx_height) tuples self.requested_tx = {} self.requested_histories = {} self.requested_addrs = set() - self.lock = Lock() + self.scripthash_to_address = {} + # Queues + self.add_queue = asyncio.Queue() + self.status_queue = asyncio.Queue() - self.initialized = False - self.initialize() - - def parse_response(self, response): - if response.get('error'): - self.print_error("response error:", response) - return None, None - return response['params'], response['result'] + async def send_version(self): + r = await self.session.send_request('server.version', [ELECTRUM_VERSION, PROTOCOL_VERSION]) def is_up_to_date(self): - return (not self.requested_tx and not self.requested_histories - and not self.requested_addrs) + return (not self.requested_addrs and not self.requested_histories) - def release(self): - self.network.unsubscribe(self.on_address_status) + def add(self, addr): + self.requested_addrs.add(addr) + self.add_queue.put_nowait(addr) - def add(self, address): - '''This can be called from the proxy or GUI threads.''' - with self.lock: - self.new_addresses.add(address) - - def subscribe_to_addresses(self, addresses): - if addresses: - self.requested_addrs |= addresses - self.network.subscribe_to_addresses(addresses, self.on_address_status) - - def get_status(self, h): - if not h: - return None - status = '' - for tx_hash, height in h: - status += tx_hash + ':%d:' % height - return bh2u(hashlib.sha256(status.encode('ascii')).digest()) - - def on_address_status(self, response): - if self.wallet.synchronizer is None and self.initialized: - return # we have been killed, this was just an orphan callback - params, result = self.parse_response(response) - if not params: - return - addr = params[0] + async def on_address_status(self, addr, status): history = self.wallet.history.get(addr, []) - if self.get_status(history) != result: - # note that at this point 'result' can be None; - # if we had a history for addr but now the server is telling us - # there is no history - if addr not in self.requested_histories: - self.requested_histories[addr] = result - self.network.request_address_history(addr, self.on_address_history) - # remove addr from list only after it is added to requested_histories - if addr in self.requested_addrs: # Notifications won't be in - self.requested_addrs.remove(addr) - - def on_address_history(self, response): - if self.wallet.synchronizer is None and self.initialized: - return # we have been killed, this was just an orphan callback - params, result = self.parse_response(response) - if not params: + if history_status(history) == status: return - addr = params[0] - try: - server_status = self.requested_histories[addr] - except KeyError: - # note: server_status can be None even if we asked for the history, - # so it is not sufficient to test that - self.print_error("receiving history (unsolicited)", addr, len(result)) + # note that at this point 'result' can be None; + # if we had a history for addr but now the server is telling us + # there is no history + if addr in self.requested_histories: return + # request address history + self.requested_histories[addr] = status + h = address_to_scripthash(addr) + result = await self.session.send_request("blockchain.scripthash.get_history", [h]) self.print_error("receiving history", addr, len(result)) hashes = set(map(lambda item: item['tx_hash'], result)) hist = list(map(lambda item: (item['tx_hash'], item['height']), result)) @@ -128,23 +112,44 @@ class Synchronizer(ThreadJob): if len(hashes) != len(result): self.print_error("error: server history has non-unique txids: %s"% addr) # Check that the status corresponds to what was announced - elif self.get_status(hist) != server_status: + elif history_status(hist) != status: self.print_error("error: status mismatch: %s" % addr) else: # Store received history self.wallet.receive_history_callback(addr, hist, tx_fees) # Request transactions we don't have - self.request_missing_txs(hist) + # "hist" is a list of [tx_hash, tx_height] lists + transaction_hashes = [] + for tx_hash, tx_height in hist: + if tx_hash in self.requested_tx: + continue + if tx_hash in self.wallet.transactions: + continue + transaction_hashes.append(tx_hash) + self.requested_tx[tx_hash] = tx_height + + for tx_hash in transaction_hashes: + await self.get_transaction(tx_hash) + # Remove request; this allows up_to_date to be True self.requested_histories.pop(addr) - def on_tx_response(self, response): - if self.wallet.synchronizer is None and self.initialized: - return # we have been killed, this was just an orphan callback - params, result = self.parse_response(response) - if not params: - return - tx_hash = params[0] + async def request_missing_txs(self, hist): + # "hist" is a list of [tx_hash, tx_height] lists + transaction_hashes = [] + for tx_hash, tx_height in hist: + if tx_hash in self.requested_tx: + continue + if tx_hash in self.wallet.transactions: + continue + transaction_hashes.append(tx_hash) + self.requested_tx[tx_hash] = tx_height + + for tx_hash in transaction_hashes: + await self.get_transaction(tx_hash) + + async def get_transaction(self, tx_hash): + result = await self.session.send_request('blockchain.transaction.get', [tx_hash]) tx = Transaction(result) try: tx.deserialize() @@ -160,54 +165,44 @@ class Synchronizer(ThreadJob): self.print_error("received tx %s height: %d bytes: %d" % (tx_hash, tx_height, len(tx.raw))) # callbacks - self.network.trigger_callback('new_transaction', tx) - if not self.requested_tx: - self.network.trigger_callback('updated') + self.wallet.network.trigger_callback('new_transaction', tx) - def request_missing_txs(self, hist): - # "hist" is a list of [tx_hash, tx_height] lists - transaction_hashes = [] - for tx_hash, tx_height in hist: - if tx_hash in self.requested_tx: - continue - if tx_hash in self.wallet.transactions: - continue - transaction_hashes.append(tx_hash) - self.requested_tx[tx_hash] = tx_height + async def subscribe_to_address(self, addr): + h = address_to_scripthash(addr) + self.scripthash_to_address[h] = addr + status = await self.session.send_request('blockchain.scripthash.subscribe', [h]) + await self.status_queue.put((h, status)) + self.requested_addrs.remove(addr) - self.network.get_transactions(transaction_hashes, self.on_tx_response) + @aiosafe + async def send_subscriptions(self): + async with TaskGroup() as group: + while True: + addr = await self.add_queue.get() + await group.spawn(self.subscribe_to_address(addr)) - def initialize(self): - '''Check the initial state of the wallet. Subscribe to all its - addresses, and request any transactions in its address history - we don't have. - ''' - for history in self.wallet.history.values(): - # Old electrum servers returned ['*'] when all history for - # the address was pruned. This no longer happens but may - # remain in old wallets. - if history == ['*']: - continue - self.request_missing_txs(history) + @aiosafe + async def handle_status(self): + async with TaskGroup() as group: + while True: + h, status = await self.status_queue.get() + addr = self.scripthash_to_address[h] + await group.spawn(self.on_address_status(addr, status)) - if self.requested_tx: - self.print_error("missing tx", self.requested_tx) - self.subscribe_to_addresses(set(self.wallet.get_addresses())) - self.initialized = True - - def run(self): - '''Called from the network proxy thread main loop.''' - # 1. Create new addresses - self.wallet.synchronize() - - # 2. Subscribe to new addresses - with self.lock: - addresses = self.new_addresses - self.new_addresses = set() - self.subscribe_to_addresses(addresses) - - # 3. Detect if situation has changed - up_to_date = self.is_up_to_date() - if up_to_date != self.wallet.is_up_to_date(): - self.wallet.set_up_to_date(up_to_date) - self.network.trigger_callback('updated') + @aiosafe + async def main(self): + conn = self.wallet.network.default_server + host, port, protocol = conn.split(':') + sslc = ssl.SSLContext(ssl.PROTOCOL_TLS) if protocol == 's' else None + async with NotificationSession(self.status_queue, host, int(port), ssl=sslc) as session: + self.session = session + await self.send_version() + self.wallet.synchronizer = self + for addr in self.wallet.get_addresses(): self.add(addr) + while True: + await asyncio.sleep(1) + self.wallet.synchronize() + up_to_date = self.is_up_to_date() + if up_to_date != self.wallet.is_up_to_date(): + self.wallet.set_up_to_date(up_to_date) + self.wallet.network.trigger_callback('updated') diff --git a/run_electrum b/run_electrum index dd35c351..3db004e2 100755 --- a/run_electrum +++ b/run_electrum @@ -48,6 +48,7 @@ def check_imports(): import qrcode import google.protobuf import jsonrpclib + import aiorpcx except ImportError as e: sys.exit("Error: %s. Try 'sudo pip install '"%str(e)) # the following imports are for pyinstaller From 8f36c9167de1bfd2505ef5516cd43661962b9c27 Mon Sep 17 00:00:00 2001 From: Janus Date: Wed, 29 Aug 2018 18:41:51 +0200 Subject: [PATCH 052/138] aiorpcx: remove callback based code, add session to Interface --- electrum/address_synchronizer.py | 18 +- electrum/gui/kivy/main_window.py | 5 +- electrum/gui/qt/network_dialog.py | 4 +- electrum/interface.py | 41 +- electrum/network.py | 609 ++---------------------------- electrum/verifier.py | 36 +- electrum/version.py | 2 +- 7 files changed, 103 insertions(+), 612 deletions(-) diff --git a/electrum/address_synchronizer.py b/electrum/address_synchronizer.py index ed9f190e..07b0f958 100644 --- a/electrum/address_synchronizer.py +++ b/electrum/address_synchronizer.py @@ -135,15 +135,25 @@ class AddressSynchronizer(PrintError): # add it in case it was previously unconfirmed self.add_unverified_tx(tx_hash, tx_height) + def on_default_server_changed(self, evt): + for i in self.network.futures: + if i.done() and i.exception(): + raise i.exception() + if not i.done(): + i.cancel() + self.network.futures.clear() + self.network.futures.append(asyncio.get_event_loop().create_task(self.verifier.main())) + self.network.futures.append(asyncio.get_event_loop().create_task(self.synchronizer.send_subscriptions())) + self.network.futures.append(asyncio.get_event_loop().create_task(self.synchronizer.handle_status())) + assert self.network.interface.session is not None + self.network.futures.append(asyncio.get_event_loop().create_task(self.synchronizer.main())) + def start_threads(self, network): self.network = network if self.network is not None: self.verifier = SPV(self.network, self) self.synchronizer = Synchronizer(self) - #network.add_jobs([self.verifier]) - self.network.futures.append(asyncio.run_coroutine_threadsafe(self.synchronizer.send_subscriptions(), self.network.asyncio_loop)) - self.network.futures.append(asyncio.run_coroutine_threadsafe(self.synchronizer.handle_status(), self.network.asyncio_loop)) - self.network.futures.append(asyncio.run_coroutine_threadsafe(self.synchronizer.main(), self.network.asyncio_loop)) + self.network.register_callback(self.on_default_server_changed, ['default_server_changed']) else: self.verifier = None self.synchronizer = None diff --git a/electrum/gui/kivy/main_window.py b/electrum/gui/kivy/main_window.py index b5468bb7..2ea871e2 100644 --- a/electrum/gui/kivy/main_window.py +++ b/electrum/gui/kivy/main_window.py @@ -15,6 +15,7 @@ from electrum.util import profiler, InvalidPassword from electrum.plugin import run_hook from electrum.util import format_satoshis, format_satoshis_plain from electrum.paymentrequest import PR_UNPAID, PR_PAID, PR_UNKNOWN, PR_EXPIRED +from electrum import blockchain from .i18n import _ from kivy.app import App @@ -114,10 +115,10 @@ class ElectrumWindow(App): from .uix.dialogs.choice_dialog import ChoiceDialog chains = self.network.get_blockchains() def cb(name): - for index, b in self.network.blockchains.items(): + for index, b in blockchain.blockchains.items(): if name == b.get_name(): self.network.follow_chain(index) - names = [self.network.blockchains[b].get_name() for b in chains] + names = [blockchain.blockchains[b].get_name() for b in chains] if len(names) > 1: cur_chain = self.network.blockchain().get_name() ChoiceDialog(_('Choose your chain'), names, cur_chain, cb).open() diff --git a/electrum/gui/qt/network_dialog.py b/electrum/gui/qt/network_dialog.py index 0acdbcd2..268e01b7 100644 --- a/electrum/gui/qt/network_dialog.py +++ b/electrum/gui/qt/network_dialog.py @@ -31,7 +31,7 @@ from PyQt5.QtWidgets import * import PyQt5.QtCore as QtCore from electrum.i18n import _ -from electrum import constants +from electrum import constants, blockchain from electrum.util import print_error from electrum.network import serialize_server, deserialize_server @@ -103,7 +103,7 @@ class NodesListWidget(QTreeWidget): chains = network.get_blockchains() n_chains = len(chains) for k, items in chains.items(): - b = network.blockchains[k] + b = blockchain.blockchains[k] name = b.get_name() if n_chains >1: x = QTreeWidgetItem([name + '@%d'%b.get_forkpoint(), '%d'%b.height()]) diff --git a/electrum/interface.py b/electrum/interface.py index 5dd9c60e..5ed8aa71 100644 --- a/electrum/interface.py +++ b/electrum/interface.py @@ -31,6 +31,7 @@ import threading import traceback import aiorpcx import asyncio +import concurrent.futures import requests @@ -43,18 +44,23 @@ from . import x509 from . import pem from .version import ELECTRUM_VERSION, PROTOCOL_VERSION from .util import NotificationSession +from . import blockchain class Interface(PrintError): - def __init__(self, server, config_path, connecting, proxy): + def __init__(self, network, server, config_path, proxy): self.exception = None - self.connecting = connecting + self.ready = asyncio.Future() self.server = server self.host, self.port, self.protocol = self.server.split(':') self.port = int(self.port) self.config_path = config_path self.cert_path = os.path.join(self.config_path, 'certs', self.host) self.fut = asyncio.get_event_loop().create_task(self.run()) + self.tip_header = None + self.tip = 0 + self.blockchain = None + self.network = network if proxy: proxy['user'] = proxy.get('user', '') if proxy['user'] == '': @@ -71,7 +77,7 @@ class Interface(PrintError): elif proxy['mode'] == "socks5": self.proxy = aiorpcx.socks.SOCKSProxy((proxy['host'], int(proxy['port'])), aiorpcx.socks.SOCKS5, auth) else: - raise NotImplementedError + raise NotImplementedError # http proxy not available with aiorpcx else: self.proxy = None @@ -128,7 +134,17 @@ class Interface(PrintError): assert False def mark_ready(self): - self.connecting.remove(self.server) + assert self.tip_header + chain = blockchain.check_header(self.tip_header) + if not chain: + self.blockchain = blockchain.blockchains[0] + else: + self.blockchain = chain + + self.print_error("set blockchain with height", self.blockchain.height()) + + if not self.ready.done(): + self.ready.set_result(1) async def save_certificate(self): if not os.path.exists(self.cert_path): @@ -161,16 +177,25 @@ class Interface(PrintError): return None async def open_session(self, sslc, do_sleep=True, execute_after_connect=lambda: None): - async with NotificationSession(None, None, self.host, self.port, ssl=sslc, proxy=self.proxy) as session: + q = asyncio.Queue() + async with NotificationSession(None, q, self.host, self.port, ssl=sslc, proxy=self.proxy) as session: ver = await session.send_request('server.version', [ELECTRUM_VERSION, PROTOCOL_VERSION]) - print(ver) + self.print_error(ver, do_sleep, self.host) connect_hook_executed = False while do_sleep: if not connect_hook_executed: connect_hook_executed = True + res = await session.send_request('blockchain.headers.subscribe') + self.tip_header = blockchain.deserialize_header(bfh(res['hex']), res['height']) + self.tip = res['height'] execute_after_connect() - await asyncio.wait_for(session.send_request('server.ping'), 5) - await asyncio.sleep(300) + self.session = session + try: + new_header = await asyncio.wait_for(q.get(), 300) + self.tip_header = new_header + self.tip = new_header['block_height'] + except concurrent.futures.TimeoutError: + await asyncio.wait_for(session.send_request('server.ping'), 5) def queue_request(self, method, params, msg_id): pass diff --git a/electrum/network.py b/electrum/network.py index e00a9c05..4509b638 100644 --- a/electrum/network.py +++ b/electrum/network.py @@ -20,14 +20,12 @@ # ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN # CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. -import asyncio +import concurrent.futures import time import queue import os -import errno import random import re -import select from collections import defaultdict import threading import socket @@ -39,18 +37,15 @@ import dns import dns.resolver from . import util -from .util import print_error, PrintError -from . import bitcoin +from .util import PrintError, print_error, bfh from .bitcoin import COIN from . import constants from . import blockchain -from .version import ELECTRUM_VERSION, PROTOCOL_VERSION -from .i18n import _ -from .blockchain import InvalidHeader from .interface import Interface import asyncio import concurrent.futures +from .version import PROTOCOL_VERSION NODES_RETRY_INTERVAL = 60 SERVER_RETRY_INTERVAL = 10 @@ -163,7 +158,6 @@ def deserialize_server(server_str): def serialize_server(host, port, protocol): return str(':'.join([host, port, protocol])) - class Network(PrintError): """The Network class manages a set of connections to remote electrum servers, each connected socket is handled by an Interface() object. @@ -183,10 +177,10 @@ class Network(PrintError): config = {} # Do not use mutables as default values! self.config = SimpleConfig(config) if isinstance(config, dict) else config self.num_server = 10 if not self.config.get('oneserver') else 0 - self.blockchains = blockchain.read_blockchains(self.config) # note: needs self.blockchains_lock - self.print_error("blockchains", self.blockchains.keys()) + blockchain.blockchains = blockchain.read_blockchains(self.config) # note: needs self.blockchains_lock + self.print_error("blockchains", list(blockchain.blockchains.keys())) self.blockchain_index = config.get('blockchain_index', 0) - if self.blockchain_index not in self.blockchains.keys(): + if self.blockchain_index not in blockchain.blockchains.keys(): self.blockchain_index = 0 # Server for addresses and transactions self.default_server = self.config.get('server', None) @@ -201,6 +195,7 @@ class Network(PrintError): self.default_server = pick_random_server() # locks: if you need to take multiple ones, acquire them in the order they are defined here! + self.bhi_lock = asyncio.Lock() self.interface_lock = threading.RLock() # <- re-entrant self.callback_lock = threading.Lock() self.pending_sends_lock = threading.Lock() @@ -322,29 +317,6 @@ class Network(PrintError): def is_connecting(self): return self.connection_status == 'connecting' - @with_interface_lock - def queue_request(self, method, params, interface=None): - # If you want to queue a request on any interface it must go - # through this function so message ids are properly tracked - if interface is None: - interface = self.interface - if interface is None: - self.print_error('warning: dropping request', method, params) - return - message_id = self.message_id - self.message_id += 1 - if self.debug: - self.print_error(interface.host, "-->", method, params, message_id) - interface.queue_request(method, params, message_id) - return message_id - - def request_fee_estimates(self): - from .simple_config import FEE_ETA_TARGETS - self.config.requested_fee_estimates() - self.queue_request('mempool.get_fee_histogram', []) - for i in FEE_ETA_TARGETS: - self.queue_request('blockchain.estimatefee', [i]) - def get_status_value(self, key): if key == 'status': value = self.connection_status @@ -415,11 +387,6 @@ class Network(PrintError): self.start_interface(server) return server - def start_interfaces(self): - self.start_interface(self.default_server) - for i in range(self.num_server - 1): - self.start_random_interface() - def set_proxy(self, proxy): self.proxy = proxy # Store these somewhere so we can un-monkey-patch @@ -475,7 +442,6 @@ class Network(PrintError): self.disconnected_servers = set([]) # note: needs self.interface_lock self.protocol = protocol self.set_proxy(proxy) - self.start_interfaces() @with_interface_lock def stop_network(self): @@ -558,6 +524,7 @@ class Network(PrintError): # fixme: we don't want to close headers sub #self.close_interface(self.interface) self.interface = i + self.trigger_callback('default_server_changed') self.set_status('connected') self.notify('updated') self.notify('interfaces') @@ -638,91 +605,6 @@ class Network(PrintError): """ hashable index for subscriptions and cache""" return str(method) + (':' + str(params[0]) if params else '') - def process_responses(self, interface): - responses = interface.get_responses() - for request, response in responses: - if request: - method, params, message_id = request - k = self.get_index(method, params) - # client requests go through self.send() with a - # callback, are only sent to the current interface, - # and are placed in the unanswered_requests dictionary - client_req = self.unanswered_requests.pop(message_id, None) - if client_req: - if interface != self.interface: - # we probably changed the current interface - # in the meantime; drop this. - return - callbacks = [client_req[2]] - else: - # fixme: will only work for subscriptions - k = self.get_index(method, params) - callbacks = list(self.subscriptions.get(k, [])) - - # Copy the request method and params to the response - response['method'] = method - response['params'] = params - else: - if not response: # Closed remotely / misbehaving - self.connection_down(interface.server) - break - # Rewrite response shape to match subscription request response - method = response.get('method') - params = response.get('params') - k = self.get_index(method, params) - if method == 'blockchain.headers.subscribe': - response['result'] = params[0] - response['params'] = [] - elif method == 'blockchain.scripthash.subscribe': - response['params'] = [params[0]] # addr - response['result'] = params[1] - callbacks = list(self.subscriptions.get(k, [])) - - # update cache if it's a subscription - if method.endswith('.subscribe'): - with self.interface_lock: - self.sub_cache[k] = response - # Response is now in canonical form - self.process_response(interface, response, callbacks) - - def send(self, messages, callback): - '''Messages is a list of (method, params) tuples''' - messages = list(messages) - with self.pending_sends_lock: - self.pending_sends.append((messages, callback)) - - @with_interface_lock - def process_pending_sends(self): - # Requests needs connectivity. If we don't have an interface, - # we cannot process them. - if not self.interface: - return - - with self.pending_sends_lock: - sends = self.pending_sends - self.pending_sends = [] - - for messages, callback in sends: - for method, params in messages: - r = None - if method.endswith('.subscribe'): - k = self.get_index(method, params) - # add callback to list - l = list(self.subscriptions.get(k, [])) - if callback not in l: - l.append(callback) - with self.callback_lock: - self.subscriptions[k] = l - # check cached response for subscriptions - r = self.sub_cache.get(k) - - if r is not None: - self.print_error("cache hit", k) - callback(r) - else: - message_id = self.queue_request(method, params) - self.unanswered_requests[message_id] = method, params, callback - def unsubscribe(self, callback): '''Unsubscribe a callback to free object references to enable GC.''' # Note: we can't unsubscribe from the server, so if we receive @@ -744,297 +626,37 @@ class Network(PrintError): self.close_interface(self.interfaces[server]) self.notify('interfaces') with self.blockchains_lock: - for b in self.blockchains.values(): + for b in blockchain.blockchains.values(): if b.catch_up == server: b.catch_up = None + @util.aiosafe async def new_interface(self, server): # todo: get tip first, then decide which checkpoint to use. self.add_recent_server(server) - interface = Interface(server, self.config.path, self.connecting, self.proxy) - interface.blockchain = None - interface.tip_header = None - interface.tip = 0 - interface.mode = 'default' - interface.request = None + + interface = Interface(self, server, self.config.path, self.proxy) + try: + await asyncio.wait_for(interface.ready, 5) + except BaseException as e: + import traceback + traceback.print_exc() + self.print_error(interface.server, "couldn't launch because", str(e), str(type(e))) + self.connection_down(interface.server) + return + finally: + self.connecting.remove(server) + with self.interface_lock: self.interfaces[server] = interface - # server.version should be the first message - params = [ELECTRUM_VERSION, PROTOCOL_VERSION] - self.queue_request('server.version', params, interface) - self.queue_request('blockchain.headers.subscribe', [True], interface) + if server == self.default_server: self.switch_to_interface(server) + #self.notify('interfaces') - def maintain_sockets(self): - '''Socket maintenance.''' - # Responses to connection attempts? - while not self.socket_queue.empty(): - server = self.socket_queue.get() - if server in self.connecting: - self.connecting.remove(server) - - if socket: - self.new_interface(server) - else: - self.connection_down(server) - - # Send pings and shut down stale interfaces - # must use copy of values - with self.interface_lock: - interfaces = list(self.interfaces.values()) - for interface in interfaces: - if interface.has_timed_out(): - self.connection_down(interface.server) - elif interface.ping_required(): - self.queue_request('server.ping', [], interface) - - now = time.time() - # nodes - with self.interface_lock: - if len(self.interfaces) + len(self.connecting) < self.num_server: - self.start_random_interface() - if now - self.nodes_retry_time > NODES_RETRY_INTERVAL: - self.print_error('network: retrying connections') - self.disconnected_servers = set([]) - self.nodes_retry_time = now - - # main interface - with self.interface_lock: - if not self.is_connected(): - if self.auto_connect: - if not self.is_connecting(): - self.switch_to_random_interface() - else: - if self.default_server in self.disconnected_servers: - if now - self.server_retry_time > SERVER_RETRY_INTERVAL: - self.disconnected_servers.remove(self.default_server) - self.server_retry_time = now - else: - self.switch_to_interface(self.default_server) - else: - if self.config.is_fee_estimates_update_required(): - self.request_fee_estimates() - - def request_chunk(self, interface, index): - if index in self.requested_chunks: - return - interface.print_error("requesting chunk %d" % index) - self.requested_chunks.add(index) - height = index * 2016 - self.queue_request('blockchain.block.headers', [height, 2016], - interface) - - def on_block_headers(self, interface, response): - '''Handle receiving a chunk of block headers''' - error = response.get('error') - result = response.get('result') - params = response.get('params') - blockchain = interface.blockchain - if result is None or params is None or error is not None: - interface.print_error(error or 'bad response') - return - # Ignore unsolicited chunks - height = params[0] - index = height // 2016 - if index * 2016 != height or index not in self.requested_chunks: - interface.print_error("received chunk %d (unsolicited)" % index) - return - else: - interface.print_error("received chunk %d" % index) - self.requested_chunks.remove(index) - hexdata = result['hex'] - connect = blockchain.connect_chunk(index, hexdata) - if not connect: - self.connection_down(interface.server) - return - if index >= len(blockchain.checkpoints): - # If not finished, get the next chunk - if blockchain.height() < interface.tip: - self.request_chunk(interface, index+1) - else: - interface.mode = 'default' - interface.print_error('catch up done', blockchain.height()) - blockchain.catch_up = None - else: - # the verifier must have asked for this chunk - pass - self.notify('updated') - - def on_get_header(self, interface, response): - '''Handle receiving a single block header''' - header = response.get('result') - if not header: - interface.print_error(response) - self.connection_down(interface.server) - return - height = header.get('block_height') - #interface.print_error('got header', height, blockchain.hash_header(header)) - if interface.request != height: - interface.print_error("unsolicited header",interface.request, height) - self.connection_down(interface.server) - return - chain = blockchain.check_header(header) - if interface.mode == 'backward': - can_connect = blockchain.can_connect(header) - if can_connect and can_connect.catch_up is None: - interface.mode = 'catch_up' - interface.blockchain = can_connect - interface.blockchain.save_header(header) - next_height = height + 1 - interface.blockchain.catch_up = interface.server - elif chain: - # FIXME should await "initial chunk download". - # binary search will NOT do the correct thing if we don't yet - # have all headers up to the fork height - interface.print_error("binary search") - interface.mode = 'binary' - interface.blockchain = chain - interface.good = height - next_height = (interface.bad + interface.good) // 2 - assert next_height >= self.max_checkpoint(), (interface.bad, interface.good) - else: - if height == 0: - self.connection_down(interface.server) - next_height = None - else: - interface.bad = height - interface.bad_header = header - delta = interface.tip - height - next_height = max(self.max_checkpoint(), interface.tip - 2 * delta) - if height == next_height: - self.connection_down(interface.server) - next_height = None - - elif interface.mode == 'binary': - if chain: - interface.good = height - interface.blockchain = chain - else: - interface.bad = height - interface.bad_header = header - if interface.bad != interface.good + 1: - next_height = (interface.bad + interface.good) // 2 - assert next_height >= self.max_checkpoint() - elif not interface.blockchain.can_connect(interface.bad_header, check_height=False): - self.connection_down(interface.server) - next_height = None - else: - branch = self.blockchains.get(interface.bad) - if branch is not None: - if branch.check_header(interface.bad_header): - interface.print_error('joining chain', interface.bad) - next_height = None - elif branch.parent().check_header(header): - interface.print_error('reorg', interface.bad, interface.tip) - interface.blockchain = branch.parent() - next_height = interface.bad - else: - interface.print_error('forkpoint conflicts with existing fork', branch.path()) - branch.write(b'', 0) - branch.save_header(interface.bad_header) - interface.mode = 'catch_up' - interface.blockchain = branch - next_height = interface.bad + 1 - interface.blockchain.catch_up = interface.server - else: - bh = interface.blockchain.height() - next_height = None - if bh > interface.good: - if not interface.blockchain.check_header(interface.bad_header): - b = interface.blockchain.fork(interface.bad_header) - with self.blockchains_lock: - self.blockchains[interface.bad] = b - interface.blockchain = b - interface.print_error("new chain", b.forkpoint) - interface.mode = 'catch_up' - maybe_next_height = interface.bad + 1 - if maybe_next_height <= interface.tip: - next_height = maybe_next_height - interface.blockchain.catch_up = interface.server - else: - assert bh == interface.good - if interface.blockchain.catch_up is None and bh < interface.tip: - interface.print_error("catching up from %d"% (bh + 1)) - interface.mode = 'catch_up' - next_height = bh + 1 - interface.blockchain.catch_up = interface.server - - self.notify('updated') - - elif interface.mode == 'catch_up': - can_connect = interface.blockchain.can_connect(header) - if can_connect: - interface.blockchain.save_header(header) - next_height = height + 1 if height < interface.tip else None - else: - # go back - interface.print_error("cannot connect", height) - interface.mode = 'backward' - interface.bad = height - interface.bad_header = header - next_height = height - 1 - - if next_height is None: - # exit catch_up state - interface.print_error('catch up done', interface.blockchain.height()) - interface.blockchain.catch_up = None - self.switch_lagging_interface() - self.notify('updated') - - else: - raise Exception(interface.mode) - # If not finished, get the next header - if next_height is not None: - if next_height < 0: - self.connection_down(interface.server) - next_height = None - elif interface.mode == 'catch_up' and interface.tip > next_height + 50: - self.request_chunk(interface, next_height // 2016) - else: - self.request_header(interface, next_height) - if next_height is None: - interface.mode = 'default' - interface.request = None - self.notify('updated') - - # refresh network dialog - self.notify('interfaces') - - def maintain_requests(self): - with self.interface_lock: - interfaces = list(self.interfaces.values()) - for interface in interfaces: - if interface.request and time.time() - interface.request_time > 20: - interface.print_error("blockchain request timed out") - self.connection_down(interface.server) - continue - - def wait_on_sockets(self): - # Python docs say Windows doesn't like empty selects. - # Sleep to prevent busy looping - if not self.interfaces: - time.sleep(0.1) - return - with self.interface_lock: - interfaces = list(self.interfaces.values()) - rin = [i for i in interfaces] - win = [i for i in interfaces if i.num_requests()] - try: - rout, wout, xout = select.select(rin, win, [], 0.1) - except socket.error as e: - if e.errno == errno.EINTR: - return - raise - assert not xout - for interface in wout: - interface.send_requests() - for interface in rout: - self.process_responses(interface) - def init_headers_file(self): - b = self.blockchains[0] + b = blockchain.blockchains[0] filename = b.path() length = 80 * len(constants.net.CHECKPOINTS) * 2016 if not os.path.exists(filename) or os.path.getsize(filename) < length: @@ -1052,73 +674,18 @@ class Network(PrintError): self.asyncio_loop.run_until_complete(self.gat) except concurrent.futures.CancelledError: pass - [f.cancel() for f in self.futures] - - def on_notify_header(self, interface, header_dict): - try: - header_hex, height = header_dict['hex'], header_dict['height'] - except KeyError: - # no point in keeping this connection without headers sub - self.connection_down(interface.server) - return - try: - header = blockchain.deserialize_header(util.bfh(header_hex), height) - except InvalidHeader: - self.connection_down(interface.server) - return - #interface.print_error('notified of header', height, blockchain.hash_header(header)) - if height < self.max_checkpoint(): - self.connection_down(interface.server) - return - interface.tip_header = header - interface.tip = height - if interface.mode != 'default': - return - b = blockchain.check_header(header) - if b: - interface.blockchain = b - self.switch_lagging_interface() - self.notify('updated') - self.notify('interfaces') - return - b = blockchain.can_connect(header) - if b: - interface.blockchain = b - b.save_header(header) - self.switch_lagging_interface() - self.notify('updated') - self.notify('interfaces') - return - with self.blockchains_lock: - tip = max([x.height() for x in self.blockchains.values()]) - if tip >=0: - interface.mode = 'backward' - interface.bad = height - interface.bad_header = header - self.request_header(interface, min(tip +1, height - 1)) - else: - chain = self.blockchains[0] - if chain.catch_up is None: - chain.catch_up = interface - interface.mode = 'catch_up' - interface.blockchain = chain - with self.blockchains_lock: - self.print_error("switching to catchup mode", tip, self.blockchains) - self.request_header(interface, 0) - else: - self.print_error("chain already catching up with", chain.catch_up.server) @with_interface_lock def blockchain(self): if self.interface and self.interface.blockchain is not None: self.blockchain_index = self.interface.blockchain.forkpoint - return self.blockchains[self.blockchain_index] + return blockchain.blockchains[self.blockchain_index] @with_interface_lock def get_blockchains(self): out = {} with self.blockchains_lock: - blockchain_items = list(self.blockchains.items()) + blockchain_items = list(blockchain.blockchains.items()) for k, b in blockchain_items: r = list(filter(lambda i: i.blockchain==b, list(self.interfaces.values()))) if r: @@ -1126,14 +693,14 @@ class Network(PrintError): return out def follow_chain(self, index): - blockchain = self.blockchains.get(index) - if blockchain: + bc = blockchain.blockchains.get(index) + if bc: self.blockchain_index = index self.config.set_key('blockchain_index', index) with self.interface_lock: interfaces = list(self.interfaces.values()) for i in interfaces: - if i.blockchain == blockchain: + if i.blockchain == bc: self.switch_to_interface(i.server) break else: @@ -1149,119 +716,6 @@ class Network(PrintError): def get_local_height(self): return self.blockchain().height() - @staticmethod - def __wait_for(it): - """Wait for the result of calling lambda `it`.""" - q = queue.Queue() - it(q.put) - try: - result = q.get(block=True, timeout=30) - except queue.Empty: - raise util.TimeoutException(_('Server did not answer')) - - if result.get('error'): - raise Exception(result.get('error')) - - return result.get('result') - - @staticmethod - def __with_default_synchronous_callback(invocation, callback): - """ Use this method if you want to make the network request - synchronous. """ - if not callback: - return Network.__wait_for(invocation) - - invocation(callback) - - def request_header(self, interface, height): - self.queue_request('blockchain.block.get_header', [height], interface) - interface.request = height - interface.req_time = time.time() - - def map_scripthash_to_address(self, callback): - def cb2(x): - x2 = x.copy() - p = x2.pop('params') - addr = self.h2addr[p[0]] - x2['params'] = [addr] - callback(x2) - return cb2 - - # NOTE this method handles exceptions and a special edge case, counter to - # what the other ElectrumX methods do. This is unexpected. - def broadcast_transaction(self, transaction, callback=None): - command = 'blockchain.transaction.broadcast' - invocation = lambda c: self.send([(command, [str(transaction)])], c) - - if callback: - invocation(callback) - return - - try: - out = Network.__wait_for(invocation) - except BaseException as e: - return False, "error: " + str(e) - - if out != transaction.txid(): - return False, "error: " + out - - return True, out - - def get_history_for_scripthash(self, hash, callback=None): - command = 'blockchain.scripthash.get_history' - invocation = lambda c: self.send([(command, [hash])], c) - - return Network.__with_default_synchronous_callback(invocation, callback) - - def subscribe_to_headers(self, callback=None): - command = 'blockchain.headers.subscribe' - invocation = lambda c: self.send([(command, [True])], c) - - return Network.__with_default_synchronous_callback(invocation, callback) - - def subscribe_to_address(self, address, callback=None): - command = 'blockchain.address.subscribe' - invocation = lambda c: self.send([(command, [address])], c) - - return Network.__with_default_synchronous_callback(invocation, callback) - - def get_merkle_for_transaction(self, tx_hash, tx_height, callback=None): - command = 'blockchain.transaction.get_merkle' - invocation = lambda c: self.send([(command, [tx_hash, tx_height])], c) - - return Network.__with_default_synchronous_callback(invocation, callback) - - def subscribe_to_scripthash(self, scripthash, callback=None): - command = 'blockchain.scripthash.subscribe' - invocation = lambda c: self.send([(command, [scripthash])], c) - - return Network.__with_default_synchronous_callback(invocation, callback) - - def get_transaction(self, transaction_hash, callback=None): - command = 'blockchain.transaction.get' - invocation = lambda c: self.send([(command, [transaction_hash])], c) - - return Network.__with_default_synchronous_callback(invocation, callback) - - def get_transactions(self, transaction_hashes, callback=None): - command = 'blockchain.transaction.get' - messages = [(command, [tx_hash]) for tx_hash in transaction_hashes] - invocation = lambda c: self.send(messages, c) - - return Network.__with_default_synchronous_callback(invocation, callback) - - def listunspent_for_scripthash(self, scripthash, callback=None): - command = 'blockchain.scripthash.listunspent' - invocation = lambda c: self.send([(command, [scripthash])], c) - - return Network.__with_default_synchronous_callback(invocation, callback) - - def get_balance_for_scripthash(self, scripthash, callback=None): - command = 'blockchain.scripthash.get_balance' - invocation = lambda c: self.send([(command, [scripthash])], c) - - return Network.__with_default_synchronous_callback(invocation, callback) - def export_checkpoints(self, path): # run manually from the console to generate checkpoints cp = self.blockchain().get_checkpoints() @@ -1310,3 +764,4 @@ class Network(PrintError): if changed: self.notify('updated') await asyncio.sleep(1) + diff --git a/electrum/verifier.py b/electrum/verifier.py index 4a0d82ec..f64e7fa4 100644 --- a/electrum/verifier.py +++ b/electrum/verifier.py @@ -21,9 +21,10 @@ # CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. +import asyncio from typing import Sequence, Optional -from .util import ThreadJob, bh2u, VerifiedTxInfo +from .util import ThreadJob, bh2u, VerifiedTxInfo, aiosafe from .bitcoin import Hash, hash_decode, hash_encode from .transaction import Transaction from .blockchain import hash_header @@ -45,17 +46,21 @@ class SPV(ThreadJob): self.merkle_roots = {} # txid -> merkle root (once it has been verified) self.requested_merkle = set() # txid set of pending requests - def run(self): - interface = self.network.interface - if not interface: - return + @aiosafe + async def main(self): + while True: + await self.run() + await asyncio.sleep(1) - blockchain = interface.blockchain + async def run(self): + blockchain = self.network.blockchain() if not blockchain: + self.print_error("no blockchain") return local_height = self.network.get_local_height() unverified = self.wallet.get_unverified_txs() + #print("verifier run", len(unverified)) for tx_hash, tx_height in unverified.items(): # do not request merkle branch before headers are available if tx_height <= 0 or tx_height > local_height: @@ -65,31 +70,26 @@ class SPV(ThreadJob): if header is None: index = tx_height // 2016 if index < len(blockchain.checkpoints): - self.network.request_chunk(interface, index) + # FIXME disabled until async block header download has been merged + pass #await self.network.request_chunk(tx_height, None) elif (tx_hash not in self.requested_merkle and tx_hash not in self.merkle_roots): - self.network.get_merkle_for_transaction( - tx_hash, - tx_height, - self.verify_merkle) self.print_error('requested merkle', tx_hash) self.requested_merkle.add(tx_hash) + self.verify_merkle(tx_hash, await self.network.get_merkle_for_transaction( + tx_hash, + tx_height + )) if self.network.blockchain() != self.blockchain: self.blockchain = self.network.blockchain() self.undo_verifications() - def verify_merkle(self, response): + def verify_merkle(self, tx_hash, merkle): if self.wallet.verifier is None: return # we have been killed, this was just an orphan callback - if response.get('error'): - self.print_error('received an error:', response) - return - params = response['params'] - merkle = response['result'] # Verify the hash of the server-provided merkle branch to a # transaction matches the merkle root of its block - tx_hash = params[0] tx_height = merkle.get('block_height') pos = merkle.get('pos') merkle_branch = merkle.get('merkle') diff --git a/electrum/version.py b/electrum/version.py index cf185907..53387af3 100644 --- a/electrum/version.py +++ b/electrum/version.py @@ -1,7 +1,7 @@ ELECTRUM_VERSION = '3.2.3' # version of the client package APK_VERSION = '3.2.3.1' # read by buildozer.spec -PROTOCOL_VERSION = '1.2' # protocol version requested +PROTOCOL_VERSION = '1.4' # protocol version requested # The hash of the mnemonic seed must begin with this SEED_PREFIX = '01' # Standard wallet From 9bfb5fe71f7027fc904f4dee9afcd9856deee4c4 Mon Sep 17 00:00:00 2001 From: Janus Date: Wed, 29 Aug 2018 15:15:15 +0200 Subject: [PATCH 053/138] address synchronizer: use aiorpcx session object in network's interface, request, fees --- electrum/synchronizer.py | 78 ++++++++++++++++++++++------------------ 1 file changed, 44 insertions(+), 34 deletions(-) diff --git a/electrum/synchronizer.py b/electrum/synchronizer.py index 6cc3b7bd..f6579313 100644 --- a/electrum/synchronizer.py +++ b/electrum/synchronizer.py @@ -32,10 +32,11 @@ import concurrent.futures # from .bitcoin import Hash, hash_encode from .transaction import Transaction -from .util import ThreadJob, bh2u, PrintError, aiosafe +from .util import ThreadJob, bh2u, PrintError, aiosafe, bfh, NotificationSession from .bitcoin import address_to_scripthash from .version import ELECTRUM_VERSION, PROTOCOL_VERSION - +from .network import parse_servers +from .bitcoin import COIN def history_status(h): if not h: @@ -47,20 +48,6 @@ def history_status(h): -class NotificationSession(ClientSession): - - def __init__(self, queue, *args, **kwargs): - super(NotificationSession, self).__init__(*args, **kwargs) - self.queue = queue - - @aiosafe - async def handle_request(self, request): - if isinstance(request, Notification): - if request.method == 'blockchain.scripthash.subscribe': - args = request.args - await self.queue.put((args[0], args[1])) - - class Synchronizer(PrintError): '''The synchronizer keeps the wallet up-to-date with its set of addresses and their transactions. It subscribes over the network @@ -79,9 +66,6 @@ class Synchronizer(PrintError): self.add_queue = asyncio.Queue() self.status_queue = asyncio.Queue() - async def send_version(self): - r = await self.session.send_request('server.version', [ELECTRUM_VERSION, PROTOCOL_VERSION]) - def is_up_to_date(self): return (not self.requested_addrs and not self.requested_histories) @@ -134,6 +118,8 @@ class Synchronizer(PrintError): # Remove request; this allows up_to_date to be True self.requested_histories.pop(addr) + if self.wallet.network: self.wallet.network.notify('updated') + async def request_missing_txs(self, hist): # "hist" is a list of [tx_hash, tx_height] lists transaction_hashes = [] @@ -170,12 +156,37 @@ class Synchronizer(PrintError): async def subscribe_to_address(self, addr): h = address_to_scripthash(addr) self.scripthash_to_address[h] = addr + self.session.scripthash = self.status_queue status = await self.session.send_request('blockchain.scripthash.subscribe', [h]) await self.status_queue.put((h, status)) self.requested_addrs.remove(addr) + async def request_fee_estimates(self): + from .simple_config import FEE_ETA_TARGETS + self.wallet.network.config.requested_fee_estimates() + histogram = await self.session.send_request('mempool.get_fee_histogram') + fees = [] + for i in FEE_ETA_TARGETS: + fees.append((i, await self.session.send_request('blockchain.estimatefee', [i]))) + return histogram, fees + @aiosafe async def send_subscriptions(self): + self.wallet.network.banner = await self.session.send_request('server.banner') + self.wallet.network.notify('banner') + self.wallet.network.donation_address = await self.session.send_request('server.donation_address') + self.wallet.network.irc_servers = parse_servers(await self.session.send_request('server.peers.subscribe')) + self.wallet.network.notify('servers') + histogram, fees = await self.request_fee_estimates() + self.wallet.network.config.mempool_fees = histogram + self.wallet.network.notify('fee_histogram') + for i, result in fees: + fee = int(result * COIN) + self.wallet.network.config.update_fee_estimates(i, fee) + self.print_error("fee_estimates[%d]" % i, fee) + self.wallet.network.notify('fee') + relayfee = await self.session.send_request('blockchain.relayfee') + self.wallet.network.relay_fee = int(relayfee * COIN) if relayfee is not None else None async with TaskGroup() as group: while True: addr = await self.add_queue.get() @@ -189,20 +200,19 @@ class Synchronizer(PrintError): addr = self.scripthash_to_address[h] await group.spawn(self.on_address_status(addr, status)) + @property + def session(self): + s = self.wallet.network.interface.session + assert s is not None + return s + @aiosafe async def main(self): - conn = self.wallet.network.default_server - host, port, protocol = conn.split(':') - sslc = ssl.SSLContext(ssl.PROTOCOL_TLS) if protocol == 's' else None - async with NotificationSession(self.status_queue, host, int(port), ssl=sslc) as session: - self.session = session - await self.send_version() - self.wallet.synchronizer = self - for addr in self.wallet.get_addresses(): self.add(addr) - while True: - await asyncio.sleep(1) - self.wallet.synchronize() - up_to_date = self.is_up_to_date() - if up_to_date != self.wallet.is_up_to_date(): - self.wallet.set_up_to_date(up_to_date) - self.wallet.network.trigger_callback('updated') + for addr in self.wallet.get_addresses(): self.add(addr) + while True: + await asyncio.sleep(1) + self.wallet.synchronize() + up_to_date = self.is_up_to_date() + if up_to_date != self.wallet.is_up_to_date(): + self.wallet.set_up_to_date(up_to_date) + self.wallet.network.trigger_callback('updated') From 5117a520aeb91875ab6b0a0192490f3cc15ec3d0 Mon Sep 17 00:00:00 2001 From: ThomasV Date: Fri, 31 Aug 2018 14:43:02 +0200 Subject: [PATCH 054/138] fix start_network --- electrum/network.py | 1 + 1 file changed, 1 insertion(+) diff --git a/electrum/network.py b/electrum/network.py index 4509b638..3df3f51d 100644 --- a/electrum/network.py +++ b/electrum/network.py @@ -442,6 +442,7 @@ class Network(PrintError): self.disconnected_servers = set([]) # note: needs self.interface_lock self.protocol = protocol self.set_proxy(proxy) + self.start_interface(self.default_server) @with_interface_lock def stop_network(self): From 9543a108be4feaba269f638ffc082db5429a7244 Mon Sep 17 00:00:00 2001 From: Janus Date: Fri, 31 Aug 2018 15:25:09 +0200 Subject: [PATCH 055/138] aiorpcx: revive some maintain_sockets code, reintroduce NODES_RETRY_INTERVAL and SERVER_RETRY_INTERVAL usage, and fix --oneserver --- electrum/network.py | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/electrum/network.py b/electrum/network.py index 3df3f51d..e0c8f398 100644 --- a/electrum/network.py +++ b/electrum/network.py @@ -759,9 +759,35 @@ class Network(PrintError): for k in remove: self.connection_down(k) changed = True + + # nodes + now = time.time() for i in range(self.num_server - len(self.interfaces) - len(self.connecting)): if self.start_random_interface(): changed = True + if now - self.nodes_retry_time > NODES_RETRY_INTERVAL: + self.print_error('network: retrying connections') + self.disconnected_servers = set([]) + self.nodes_retry_time = now + + # main interface + if not self.is_connected(): + if self.auto_connect: + if not self.is_connecting(): + self.switch_to_random_interface() + changed = True + else: + if self.default_server in self.disconnected_servers: + if now - self.server_retry_time > SERVER_RETRY_INTERVAL: + self.disconnected_servers.remove(self.default_server) + self.server_retry_time = now + changed = True + else: + self.switch_to_interface(self.default_server) + changed = True + + # TODO: request fee_estimates if needed (now in synchronizer) + if changed: self.notify('updated') await asyncio.sleep(1) From 6700364ac854275c7ecfcd3d0eaaa7c23111aacd Mon Sep 17 00:00:00 2001 From: SomberNight Date: Wed, 29 Aug 2018 18:57:10 +0200 Subject: [PATCH 056/138] interface: fix cert handling notably os.unlink cannot be inside the "with open" --- electrum/interface.py | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/electrum/interface.py b/electrum/interface.py index 5ed8aa71..b386f0f7 100644 --- a/electrum/interface.py +++ b/electrum/interface.py @@ -103,19 +103,19 @@ class Interface(PrintError): if exists: with open(self.cert_path, 'r') as f: contents = f.read() - if contents != '': # if not CA signed + if contents != '': # if not CA signed + try: + b = pem.dePem(contents, 'CERTIFICATE') + except SyntaxError: + exists = False + else: + x = x509.X509(b) try: - b = pem.dePem(contents, 'CERTIFICATE') - except SyntaxError: + x.check_date() + except x509.CertificateError as e: + self.print_error("certificate problem", e) + os.unlink(self.cert_path) exists = False - else: - x = x509.X509(b) - try: - x.check_date() - except x509.CertificateError as e: - self.print_error("certificate problem", e) - os.unlink(self.cert_path) - exists = False if not exists: ca_signed = await self.is_server_ca_signed(ca_sslc) if ca_signed: From a4ffa0b22a9577f2aaa8bb731af4671ad3dc6a3d Mon Sep 17 00:00:00 2001 From: SomberNight Date: Wed, 29 Aug 2018 18:59:47 +0200 Subject: [PATCH 057/138] interface: clean-up proxy username/pw handling --- electrum/interface.py | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/electrum/interface.py b/electrum/interface.py index b386f0f7..ad6ea7c1 100644 --- a/electrum/interface.py +++ b/electrum/interface.py @@ -62,16 +62,11 @@ class Interface(PrintError): self.blockchain = None self.network = network if proxy: - proxy['user'] = proxy.get('user', '') - if proxy['user'] == '': - proxy['user'] = 'sampleuser' # aiorpcx doesn't allow empty user - proxy['password'] = proxy.get('password', '') - if proxy['password'] == '': - proxy['password'] = 'samplepassword' - try: - auth = aiorpcx.socks.SOCKSUserAuth(proxy['user'], proxy['password']) - except KeyError: + username, pw = proxy.get('user'), proxy.get('password') + if not username or not pw: auth = None + else: + auth = aiorpcx.socks.SOCKSUserAuth(username, pw) if proxy['mode'] == "socks4": self.proxy = aiorpcx.socks.SOCKSProxy((proxy['host'], int(proxy['port'])), aiorpcx.socks.SOCKS4a, auth) elif proxy['mode'] == "socks5": From f12074397fd2855db6a2584010a203cc2eeda9c8 Mon Sep 17 00:00:00 2001 From: Janus Date: Fri, 31 Aug 2018 16:46:49 +0200 Subject: [PATCH 058/138] aiorpcx: reintroduce periodic fee updates --- electrum/network.py | 47 +++++++++++++++++++++++++++++++++++++--- electrum/synchronizer.py | 26 ---------------------- 2 files changed, 44 insertions(+), 29 deletions(-) diff --git a/electrum/network.py b/electrum/network.py index e0c8f398..1d5055f6 100644 --- a/electrum/network.py +++ b/electrum/network.py @@ -240,6 +240,9 @@ class Network(PrintError): deserialize_proxy(self.config.get('proxy'))) self.asyncio_loop = asyncio.get_event_loop() self.futures = [] + self.server_info_job = asyncio.Future() + # just to not trigger a warning from switch_to_interface the first time we change default_server + self.server_info_job.set_result(1) def with_interface_lock(func): def func_wrapper(self, *args, **kwargs): @@ -312,11 +315,40 @@ class Network(PrintError): self.notify('status') def is_connected(self): - return self.interface is not None + return self.interface is not None and self.interface.ready.done() def is_connecting(self): return self.connection_status == 'connecting' + @util.aiosafe + async def request_server_info(self, interface): + await interface.ready + session = interface.session + self.banner = await session.send_request('server.banner') + self.notify('banner') + self.donation_address = await session.send_request('server.donation_address') + self.irc_servers = parse_servers(await session.send_request('server.peers.subscribe')) + self.notify('servers') + await self.request_fee_estimates(interface) + relayfee = await session.send_request('blockchain.relayfee') + self.relay_fee = int(relayfee * COIN) if relayfee is not None else None + + async def request_fee_estimates(self, interface): + session = interface.session + from .simple_config import FEE_ETA_TARGETS + self.config.requested_fee_estimates() + histogram = await session.send_request('mempool.get_fee_histogram') + fees = [] + for i in FEE_ETA_TARGETS: + fees.append((i, await session.send_request('blockchain.estimatefee', [i]))) + self.config.mempool_fees = histogram + self.notify('fee_histogram') + for i, result in fees: + fee = int(result * COIN) + self.config.update_fee_estimates(i, fee) + self.print_error("fee_estimates[%d]" % i, fee) + self.notify('fee') + def get_status_value(self, key): if key == 'status': value = self.connection_status @@ -512,6 +544,7 @@ class Network(PrintError): being opened, start a thread to connect. The actual switch will happen on receipt of the connection notification. Do nothing if server already is our interface.''' + old_default_server = self.default_server self.default_server = server if server not in self.interfaces: self.interface = None @@ -525,6 +558,10 @@ class Network(PrintError): # fixme: we don't want to close headers sub #self.close_interface(self.interface) self.interface = i + if not self.server_info_job.done(): + self.print_error('cancelled previous request_server_info job, was it too slow? server was:', old_default_server) + self.server_info_job.cancel() + self.server_info_job = asyncio.get_event_loop().create_task(self.request_server_info(i)) self.trigger_callback('default_server_changed') self.set_status('connected') self.notify('updated') @@ -785,10 +822,14 @@ class Network(PrintError): else: self.switch_to_interface(self.default_server) changed = True - - # TODO: request fee_estimates if needed (now in synchronizer) + else: + if self.config.is_fee_estimates_update_required(): + asyncio.get_event_loop().create_task(self.attempt_fee_estimate_update()) if changed: self.notify('updated') await asyncio.sleep(1) + @util.aiosafe + async def attempt_fee_estimate_update(self): + await asyncio.wait_for(self.request_fee_estimates(self.interface), 5) diff --git a/electrum/synchronizer.py b/electrum/synchronizer.py index f6579313..eba1ec7f 100644 --- a/electrum/synchronizer.py +++ b/electrum/synchronizer.py @@ -35,8 +35,6 @@ from .transaction import Transaction from .util import ThreadJob, bh2u, PrintError, aiosafe, bfh, NotificationSession from .bitcoin import address_to_scripthash from .version import ELECTRUM_VERSION, PROTOCOL_VERSION -from .network import parse_servers -from .bitcoin import COIN def history_status(h): if not h: @@ -161,32 +159,8 @@ class Synchronizer(PrintError): await self.status_queue.put((h, status)) self.requested_addrs.remove(addr) - async def request_fee_estimates(self): - from .simple_config import FEE_ETA_TARGETS - self.wallet.network.config.requested_fee_estimates() - histogram = await self.session.send_request('mempool.get_fee_histogram') - fees = [] - for i in FEE_ETA_TARGETS: - fees.append((i, await self.session.send_request('blockchain.estimatefee', [i]))) - return histogram, fees - @aiosafe async def send_subscriptions(self): - self.wallet.network.banner = await self.session.send_request('server.banner') - self.wallet.network.notify('banner') - self.wallet.network.donation_address = await self.session.send_request('server.donation_address') - self.wallet.network.irc_servers = parse_servers(await self.session.send_request('server.peers.subscribe')) - self.wallet.network.notify('servers') - histogram, fees = await self.request_fee_estimates() - self.wallet.network.config.mempool_fees = histogram - self.wallet.network.notify('fee_histogram') - for i, result in fees: - fee = int(result * COIN) - self.wallet.network.config.update_fee_estimates(i, fee) - self.print_error("fee_estimates[%d]" % i, fee) - self.wallet.network.notify('fee') - relayfee = await self.session.send_request('blockchain.relayfee') - self.wallet.network.relay_fee = int(relayfee * COIN) if relayfee is not None else None async with TaskGroup() as group: while True: addr = await self.add_queue.get() From 19387ff91133174ada0cf0a59e8e62bc6b3cd7e4 Mon Sep 17 00:00:00 2001 From: Janus Date: Fri, 31 Aug 2018 18:06:11 +0200 Subject: [PATCH 059/138] aiorpcx: simplify open_session --- electrum/interface.py | 33 ++++++++++++++++----------------- 1 file changed, 16 insertions(+), 17 deletions(-) diff --git a/electrum/interface.py b/electrum/interface.py index ad6ea7c1..1db430fe 100644 --- a/electrum/interface.py +++ b/electrum/interface.py @@ -81,7 +81,7 @@ class Interface(PrintError): async def is_server_ca_signed(self, sslc): try: - await self.open_session(sslc, do_sleep=False) + await self.open_session(sslc, exit_early=True) except ssl.SSLError as e: assert e.reason == 'CERTIFICATE_VERIFY_FAILED' return False @@ -90,7 +90,7 @@ class Interface(PrintError): @util.aiosafe async def run(self): if self.protocol != 's': - await self.open_session(None, execute_after_connect=self.mark_ready) + await self.open_session(None, exit_early=False) assert False ca_sslc = ssl.create_default_context(ssl.Purpose.SERVER_AUTH) @@ -125,7 +125,7 @@ class Interface(PrintError): else: sslc = ssl.create_default_context(ssl.Purpose.SERVER_AUTH, cafile=self.cert_path) sslc.check_hostname = 0 - await self.open_session(sslc, execute_after_connect=self.mark_ready) + await self.open_session(sslc, exit_early=False) assert False def mark_ready(self): @@ -171,22 +171,21 @@ class Interface(PrintError): except ValueError: return None - async def open_session(self, sslc, do_sleep=True, execute_after_connect=lambda: None): - q = asyncio.Queue() - async with NotificationSession(None, q, self.host, self.port, ssl=sslc, proxy=self.proxy) as session: + async def open_session(self, sslc, exit_early): + header_queue = asyncio.Queue() + async with NotificationSession(None, header_queue, self.host, self.port, ssl=sslc, proxy=self.proxy) as session: ver = await session.send_request('server.version', [ELECTRUM_VERSION, PROTOCOL_VERSION]) - self.print_error(ver, do_sleep, self.host) - connect_hook_executed = False - while do_sleep: - if not connect_hook_executed: - connect_hook_executed = True - res = await session.send_request('blockchain.headers.subscribe') - self.tip_header = blockchain.deserialize_header(bfh(res['hex']), res['height']) - self.tip = res['height'] - execute_after_connect() - self.session = session + if exit_early: + return + self.print_error(ver, self.host) + subscription_res = await session.send_request('blockchain.headers.subscribe') + self.tip_header = blockchain.deserialize_header(bfh(subscription_res['hex']), subscription_res['height']) + self.tip = subscription_res['height'] + self.mark_ready() + self.session = session + while True: try: - new_header = await asyncio.wait_for(q.get(), 300) + new_header = await asyncio.wait_for(header_queue.get(), 300) self.tip_header = new_header self.tip = new_header['block_height'] except concurrent.futures.TimeoutError: From e9ceeb85af014a0a54835ab9bf0dbb554db456f1 Mon Sep 17 00:00:00 2001 From: Janus Date: Tue, 14 Aug 2018 17:50:20 +0200 Subject: [PATCH 060/138] async block headers --- electrum/blockchain.py | 2 +- electrum/interface.py | 212 ++++++++++++++++++++++++++++++- electrum/network.py | 38 +++++- electrum/tests/test_interface.py | 28 ---- electrum/tests/test_network.py | 118 +++++++++++++++++ electrum/verifier.py | 3 +- 6 files changed, 364 insertions(+), 37 deletions(-) delete mode 100644 electrum/tests/test_interface.py create mode 100644 electrum/tests/test_network.py diff --git a/electrum/blockchain.py b/electrum/blockchain.py index c4c55782..e0ab5d16 100644 --- a/electrum/blockchain.py +++ b/electrum/blockchain.py @@ -308,7 +308,7 @@ class Blockchain(util.PrintError): elif height == 0: return constants.net.GENESIS elif height < len(self.checkpoints) * 2016: - assert (height+1) % 2016 == 0, height + assert (height+1) % 2016 == 0, (height, len(self.checkpoints), (height+1) % 2016) index = height // 2016 h, t = self.checkpoints[index] return h diff --git a/electrum/interface.py b/electrum/interface.py index 1db430fe..23119333 100644 --- a/electrum/interface.py +++ b/electrum/interface.py @@ -87,7 +87,7 @@ class Interface(PrintError): return False return True - @util.aiosafe + @aiosafe async def run(self): if self.protocol != 's': await self.open_session(None, exit_early=False) @@ -183,11 +183,15 @@ class Interface(PrintError): self.tip = subscription_res['height'] self.mark_ready() self.session = session + copy_header_queue = asyncio.Queue() + conniface = Conn(self.server, session, lambda idx, tip: self.network.request_chunk(idx, tip, session)) + block_retriever = asyncio.get_event_loop().create_task(self.run_fetch_blocks(subscription_res, copy_header_queue, conniface)) while True: try: new_header = await asyncio.wait_for(header_queue.get(), 300) self.tip_header = new_header self.tip = new_header['block_height'] + await copy_header_queue.put(new_header) except concurrent.futures.TimeoutError: await asyncio.wait_for(session.send_request('server.ping'), 5) @@ -197,6 +201,212 @@ class Interface(PrintError): def close(self): self.fut.cancel() + @aiosafe + async def run_fetch_blocks(self, sub_reply, replies, conniface): + async with self.network.bhi_lock: + bhi = BlockHeaderInterface(conniface, sub_reply['height'], self.blockchain.height()+1, self) + await replies.put(blockchain.deserialize_header(bfh(sub_reply['hex']), sub_reply['height'])) + self.print_error("checking if catched up {}-1 > {}, tip {}".format(sub_reply['height'], self.blockchain.height(), bhi.tip)) + if sub_reply['height']-1 > self.blockchain.height(): + last_status = await bhi.sync_until() + assert last_status == 'catchup', last_status + assert self.blockchain.height()+1 == bhi.height, (self.blockchain.height(), bhi.height) + + while True: + self.network.notify('updated') + item = await replies.get() + async with self.network.bhi_lock: + if self.blockchain.height() >= bhi.height and self.blockchain.check_header(item): + # another interface amended the blockchain + self.print_error("SKIPPING HEADER", bhi.height) + continue + if bhi.tip < bhi.height: + bhi.height = bhi.tip + await bhi.step(item) + bhi.tip = max(bhi.height, bhi.tip) + +class BlockHeaderInterface(PrintError): + def __init__(self, conn, tip, height, iface): + self.tip = tip + self.height = height + self.conn = conn + self.iface = iface + + def diagnostic_name(self): + return self.conn.server + + async def sync_until(self, next_height=None): + if next_height is None: + next_height = self.tip + last = None + while last is None or self.height < next_height: + if next_height > self.height + 10: + could_connect, num_headers = await self.conn.request_chunk(self.height, next_height) + self.tip = max(self.height + num_headers, self.tip) + if not could_connect: + last = await self.step() + self.tip = max(self.height, self.tip) + continue + self.height = (self.height // 2016 * 2016) + num_headers + if self.height > next_height: + assert False, (self.height, self.tip) + last = 'catchup' + else: + last = await self.step() + self.tip = max(self.height, self.tip) + return last + + async def step(self, header=None): + assert self.height != 0 + if header is None: + header = await self.conn.get_block_header(self.height, 'catchup') + can_connect = blockchain.can_connect(header) if 'mock' not in header else header['mock']['connect'](self) + + bad_header = None + if not can_connect: + self.print_error("can't connect", self.height) + #backward + bad = self.height + bad_header = header + self.height -= 1 + checkp = False + if self.height <= self.iface.network.max_checkpoint(): + self.height = self.iface.network.max_checkpoint() + 1 + checkp = True + + header = await self.conn.get_block_header(self.height, 'backward') + chain = blockchain.check_header(header) if 'mock' not in header else header['mock']['check'](header) + can_connect = blockchain.can_connect(header) if 'mock' not in header else header['mock']['connect'](self) + if checkp: + assert can_connect or chain, (can_connect, chain) + while not chain and not can_connect: + bad = self.height + bad_header = header + delta = self.tip - self.height + next_height = self.tip - 2 * delta + checkp = False + if next_height <= self.iface.network.max_checkpoint(): + next_height = self.iface.network.max_checkpoint() + 1 + checkp = True + self.height = next_height + + header = await self.conn.get_block_header(self.height, 'backward') + chain = blockchain.check_header(header) if 'mock' not in header else header['mock']['check'](header) + can_connect = blockchain.can_connect(header) if 'mock' not in header else header['mock']['connect'](self) + if checkp: + assert can_connect or chain, (can_connect, chain) + self.print_error("exiting backward mode at", self.height) + if can_connect: + self.print_error("could connect", self.height) + chain = blockchain.check_header(header) if 'mock' not in header else header['mock']['check'](header) + + if type(can_connect) is bool: + # mock + self.height += 1 + if self.height > self.tip: + assert False + return 'catchup' + self.iface.blockchain = can_connect + self.height += 1 + self.iface.blockchain.save_header(header) + return 'catchup' + + if not chain: + raise Exception("not chain") # line 931 in 8e69174374aee87d73cd2f8005fbbe87c93eee9c's network.py + + # binary + if type(chain) in [int, bool]: + pass # mock + else: + self.iface.blockchain = chain + good = self.height + self.height = (bad + good) // 2 + header = await self.conn.get_block_header(self.height, 'binary') + while True: + self.print_error("binary step") + chain = blockchain.check_header(header) if 'mock' not in header else header['mock']['check'](header) + if chain: + assert bad != self.height, (bad, self.height) + good = self.height + self.iface.blockchain = self.iface.blockchain if type(chain) in [bool, int] else chain + else: + bad = self.height + assert good != self.height + bad_header = header + if bad != good + 1: + self.height = (bad + good) // 2 + header = await self.conn.get_block_header(self.height, 'binary') + continue + mock = bad_header and 'mock' in bad_header and bad_header['mock']['connect'](self) + real = not mock and self.iface.blockchain.can_connect(bad_header, check_height=False) + if not real and not mock: + raise Exception('unexpected bad header during binary' + str(bad_header)) # line 948 in 8e69174374aee87d73cd2f8005fbbe87c93eee9c's network.py + branch = blockchain.blockchains.get(bad) + if branch is not None: + ismocking = False + if type(branch) is dict: + ismocking = True + # FIXME: it does not seem sufficient to check that the branch + # contains the bad_header. what if self.blockchain doesn't? + # the chains shouldn't be joined then. observe the incorrect + # joining on regtest with a server that has a fork of height + # one. the problem is observed only if forking is not during + # electrum runtime + if ismocking and branch['check'](bad_header) or not ismocking and branch.check_header(bad_header): + self.print_error('joining chain', bad) + self.height += 1 + return 'join' + else: + if ismocking and branch['parent']['check'](header) or not ismocking and branch.parent().check_header(header): + self.print_error('reorg', bad, self.tip) + self.iface.blockchain = branch.parent() if not ismocking else branch['parent'] + self.height = bad + header = await self.conn.get_block_header(self.height, 'binary') + else: + if ismocking: + self.height = bad + 1 + self.print_error("TODO replace blockchain") + return 'conflict' + self.print_error('forkpoint conflicts with existing fork', branch.path()) + branch.write(b'', 0) + branch.save_header(bad_header) + self.iface.blockchain = branch + self.height = bad + 1 + return 'conflict' + else: + bh = self.iface.blockchain.height() + if bh > good: + forkfun = self.iface.blockchain.fork + if 'mock' in bad_header: + chain = bad_header['mock']['check'](bad_header) + forkfun = bad_header['mock']['fork'] if 'fork' in bad_header['mock'] else forkfun + else: + chain = self.iface.blockchain.check_header(bad_header) + if not chain: + b = forkfun(bad_header) + assert bad not in blockchain.blockchains, (bad, list(blockchain.blockchains.keys())) + blockchain.blockchains[bad] = b + self.iface.blockchain = b + self.height = b.forkpoint + 1 + assert b.forkpoint == bad + return 'fork' + else: + assert bh == good + if bh < self.tip: + self.print_error("catching up from %d"% (bh + 1)) + self.height = bh + 1 + return 'no_fork' + +class Conn: + def __init__(self, server, session, get_chunk): + self.server = server + self.session = session # type: aiorpcx.ClientSession + self.request_chunk = get_chunk + async def get_block_header(self, height, assert_mode): + res = await asyncio.wait_for(self.session.send_request('blockchain.block.header', [height]), 1) + return blockchain.deserialize_header(bytes.fromhex(res), height) + + def check_cert(host, cert): try: b = pem.dePem(cert, 'CERTIFICATE') diff --git a/electrum/network.py b/electrum/network.py index 1d5055f6..92378d9f 100644 --- a/electrum/network.py +++ b/electrum/network.py @@ -37,7 +37,7 @@ import dns import dns.resolver from . import util -from .util import PrintError, print_error, bfh +from .util import PrintError, print_error, aiosafe, bfh from .bitcoin import COIN from . import constants from . import blockchain @@ -533,7 +533,12 @@ class Network(PrintError): if self.server_is_lagging() and self.auto_connect: # switch to one that has the correct header (not height) header = self.blockchain().read_header(self.get_local_height()) - filtered = list(map(lambda x: x[0], filter(lambda x: x[1].tip_header == header, self.interfaces.items()))) + def filt(x): + a = x[1].tip_header + b = header + assert type(a) is type(b) + return a == b + filtered = list(map(lambda x: x[0], filter(filt, self.interfaces.items()))) if filtered: choice = random.choice(filtered) self.switch_to_interface(choice) @@ -668,7 +673,7 @@ class Network(PrintError): if b.catch_up == server: b.catch_up = None - @util.aiosafe + @aiosafe async def new_interface(self, server): # todo: get tip first, then decide which checkpoint to use. self.add_recent_server(server) @@ -677,8 +682,8 @@ class Network(PrintError): try: await asyncio.wait_for(interface.ready, 5) except BaseException as e: - import traceback - traceback.print_exc() + #import traceback + #traceback.print_exc() self.print_error(interface.server, "couldn't launch because", str(e), str(type(e))) self.connection_down(interface.server) return @@ -713,6 +718,29 @@ class Network(PrintError): except concurrent.futures.CancelledError: pass + async def get_merkle_for_transaction(self, tx_hash, tx_height): + print("getting merkle for transaction", tx_hash, tx_height) + return await self.interface.session.send_request('blockchain.transaction.get_merkle', [tx_hash, tx_height]) + + def broadcast_transaction(self, tx): + fut = asyncio.run_coroutine_threadsafe(self.interface.session.send_request('blockchain.transaction.broadcast', [str(tx)]), self.asyncio_loop) + return True, fut.result(1) + + async def request_chunk(self, height, tip, session=None): + if session is None: session = self.interface.session + index = height // 2016 + size = 2016 + if tip is not None and height + 2016 >= tip: + size = tip - height + #if index * 2016 < height: + # size = height - index * 2016 + res = await session.send_request('blockchain.block.headers', [index * 2016, size]) + conn = self.blockchain().connect_chunk(index, res['hex']) + if not conn: + return conn, 0 + self.blockchain().save_chunk(index, bfh(res['hex'])) + return conn, res['count'] + @with_interface_lock def blockchain(self): if self.interface and self.interface.blockchain is not None: diff --git a/electrum/tests/test_interface.py b/electrum/tests/test_interface.py deleted file mode 100644 index 402588ca..00000000 --- a/electrum/tests/test_interface.py +++ /dev/null @@ -1,28 +0,0 @@ -import unittest - -from electrum import interface - -from . import SequentialTestCase - - -class TestInterface(SequentialTestCase): - - def test_match_host_name(self): - self.assertTrue(interface._match_hostname('asd.fgh.com', 'asd.fgh.com')) - self.assertFalse(interface._match_hostname('asd.fgh.com', 'asd.zxc.com')) - self.assertTrue(interface._match_hostname('asd.fgh.com', '*.fgh.com')) - self.assertFalse(interface._match_hostname('asd.fgh.com', '*fgh.com')) - self.assertFalse(interface._match_hostname('asd.fgh.com', '*.zxc.com')) - - def test_check_host_name(self): - i = interface.TcpConnection(server=':1:', queue=None, config_path=None) - - self.assertFalse(i.check_host_name(None, None)) - self.assertFalse(i.check_host_name( - peercert={'subjectAltName': []}, name='')) - self.assertTrue(i.check_host_name( - peercert={'subjectAltName': [('DNS', 'foo.bar.com')]}, - name='foo.bar.com')) - self.assertTrue(i.check_host_name( - peercert={'subject': [('commonName', 'foo.bar.com')]}, - name='foo.bar.com')) diff --git a/electrum/tests/test_network.py b/electrum/tests/test_network.py new file mode 100644 index 00000000..8181951d --- /dev/null +++ b/electrum/tests/test_network.py @@ -0,0 +1,118 @@ +import asyncio +import tempfile +import unittest + +from electrum.constants import set_regtest +from electrum.simple_config import SimpleConfig +from electrum import blockchain +from electrum.interface import BlockHeaderInterface + +class MockConnection: + def __init__(self): + self.q = asyncio.Queue() + self.server = 'mock-server' + async def get_block_header(self, height, assert_mode): + assert self.q.qsize() > 0, (height, assert_mode) + item = await self.q.get() + print("step with height", height, item) + assert item['block_height'] == height, (item['block_height'], height) + assert assert_mode in item['mock'], (assert_mode, item) + return item + +class TestNetwork(unittest.TestCase): + def setUp(self): + self.config = SimpleConfig({'electrum_path': tempfile.mkdtemp(prefix="test_network")}) + + def blockchain_iface_pair(self, forkpoint=2002): + b = blockchain.Blockchain(self.config, forkpoint, None) + class FakeNetwork: + max_checkpoint = lambda: 0 + class FakeIface: + blockchain = b + network = FakeNetwork + return FakeIface + + def test_new_fork(self): + blockchain.blockchains = {} + conn = MockConnection() + conn.q.put_nowait({'block_height': 8, 'mock': {'catchup':1, 'check': lambda x: False, 'connect': lambda x: False}}) + def mock_connect(block_header_iface): + return block_header_iface.height == 6 + conn.q.put_nowait({'block_height': 7, 'mock': {'backward':1,'check': lambda x: False, 'connect': mock_connect, 'fork': self.mock_fork}}) + conn.q.put_nowait({'block_height': 2, 'mock': {'backward':1,'check':lambda x: True, 'connect': lambda x: False}}) + conn.q.put_nowait({'block_height': 4, 'mock': {'binary':1,'check':lambda x: True, 'connect': lambda x: True}}) + conn.q.put_nowait({'block_height': 5, 'mock': {'binary':1,'check':lambda x: True, 'connect': lambda x: True}}) + conn.q.put_nowait({'block_height': 6, 'mock': {'binary':1,'check':lambda x: True, 'connect': lambda x: True}}) + ifa = BlockHeaderInterface(conn, 12, 8, self.blockchain_iface_pair()) + self.assertEqual('fork', asyncio.get_event_loop().run_until_complete(ifa.sync_until(next_height=8))) + self.assertEqual(conn.q.qsize(), 0) + + def test_new_can_connect_during_backward(self): + blockchain.blockchains = {} + conn = MockConnection() + conn.q.put_nowait({'block_height': 8, 'mock': {'catchup':1, 'check': lambda x: False, 'connect': lambda x: False}}) + def mock_connect(block_header_iface): + return block_header_iface.height == 2 + conn.q.put_nowait({'block_height': 7, 'mock': {'backward':1, 'check': lambda x: False, 'connect': mock_connect, 'fork': self.mock_fork}}) + conn.q.put_nowait({'block_height': 2, 'mock': {'backward':1, 'check': lambda x: False, 'connect': mock_connect, 'fork': self.mock_fork}}) + conn.q.put_nowait({'block_height': 3, 'mock': {'catchup':1, 'check': lambda x: False, 'connect': lambda x: True}}) + conn.q.put_nowait({'block_height': 4, 'mock': {'catchup':1, 'check': lambda x: False, 'connect': lambda x: True}}) + ifa = BlockHeaderInterface(conn, 12, 8, self.blockchain_iface_pair()) + self.assertEqual('catchup', asyncio.get_event_loop().run_until_complete(ifa.sync_until(next_height=5))) + self.assertEqual(conn.q.qsize(), 0) + + def mock_fork(self, bad_header): + return blockchain.Blockchain(self.config, bad_header['block_height'], None) + + def test_new_chain_false_during_binary(self): + blockchain.blockchains = {} + conn = MockConnection() + conn.q.put_nowait({'block_height': 8, 'mock': {'catchup':1, 'check': lambda x: False, 'connect': lambda x: False}}) + mock_connect = lambda bhi: bhi.height == 3 + conn.q.put_nowait({'block_height': 7, 'mock': {'backward':1, 'check': lambda x: False, 'connect': mock_connect}}) + conn.q.put_nowait({'block_height': 2, 'mock': {'backward':1, 'check': lambda x: True, 'connect': mock_connect}}) + conn.q.put_nowait({'block_height': 4, 'mock': {'binary':1, 'check': lambda x: False, 'fork': self.mock_fork, 'connect': mock_connect}}) + conn.q.put_nowait({'block_height': 3, 'mock': {'binary':1, 'check': lambda x: True, 'connect': lambda x: True}}) + conn.q.put_nowait({'block_height': 5, 'mock': {'catchup':1, 'check': lambda x: True, 'connect': lambda x: True}}) + conn.q.put_nowait({'block_height': 6, 'mock': {'catchup':1, 'check': lambda x: True, 'connect': lambda x: True}}) + ifa = BlockHeaderInterface(conn, 12, 8, self.blockchain_iface_pair(1000)) + self.assertEqual('catchup', asyncio.get_event_loop().run_until_complete(ifa.sync_until(next_height=7))) + self.assertEqual(conn.q.qsize(), 0) + + def test_new_join(self): + blockchain.blockchains = {7: {'check': lambda bad_header: True}} + conn = MockConnection() + conn.q.put_nowait({'block_height': 8, 'mock': {'catchup':1, 'check': lambda x: False, 'connect': lambda x: False}}) + conn.q.put_nowait({'block_height': 7, 'mock': {'backward':1, 'check': lambda x: False, 'connect': lambda x: x.height == 6}}) + conn.q.put_nowait({'block_height': 2, 'mock': {'backward':1, 'check': lambda x: True, 'connect': lambda x: False}}) + conn.q.put_nowait({'block_height': 4, 'mock': {'binary':1, 'check': lambda x: True, 'connect': lambda x: False}}) + conn.q.put_nowait({'block_height': 5, 'mock': {'binary':1, 'check': lambda x: True, 'connect': lambda x: False}}) + conn.q.put_nowait({'block_height': 6, 'mock': {'binary':1, 'check': lambda x: True, 'connect': lambda x: True}}) + ifa = BlockHeaderInterface(conn, 12, 8, self.blockchain_iface_pair()) + self.assertEqual('join', asyncio.get_event_loop().run_until_complete(ifa.sync_until(next_height=7))) + self.assertEqual(conn.q.qsize(), 0) + + def test_new_reorg(self): + times = 0 + def check(header): + nonlocal times + self.assertEqual(header['block_height'], 7) + times += 1 + return times != 1 + blockchain.blockchains = {7: {'check': check, 'parent': {'check': lambda x: True}}} + conn = MockConnection() + conn.q.put_nowait({'block_height': 8, 'mock': {'catchup':1, 'check': lambda x: False, 'connect': lambda x: False}}) + conn.q.put_nowait({'block_height': 7, 'mock': {'backward':1, 'check': lambda x: False, 'connect': lambda x: x.height == 6}}) + conn.q.put_nowait({'block_height': 2, 'mock': {'backward':1, 'check': lambda x: 1, 'connect': lambda x: False}}) + conn.q.put_nowait({'block_height': 4, 'mock': {'binary':1, 'check': lambda x: 1, 'connect': lambda x: False}}) + conn.q.put_nowait({'block_height': 5, 'mock': {'binary':1, 'check': lambda x: 1, 'connect': lambda x: False}}) + conn.q.put_nowait({'block_height': 6, 'mock': {'binary':1, 'check': lambda x: 1, 'connect': lambda x: True}}) + conn.q.put_nowait({'block_height': 7, 'mock': {'binary':1, 'check': lambda x: False, 'connect': lambda x: True}}) + ifa = BlockHeaderInterface(conn, 12, 8, self.blockchain_iface_pair()) + self.assertEqual('join', asyncio.get_event_loop().run_until_complete(ifa.sync_until(next_height=8))) + self.assertEqual(conn.q.qsize(), 0) + self.assertEqual(times, 2) + +if __name__=="__main__": + set_regtest() + unittest.main() diff --git a/electrum/verifier.py b/electrum/verifier.py index f64e7fa4..61642364 100644 --- a/electrum/verifier.py +++ b/electrum/verifier.py @@ -70,8 +70,7 @@ class SPV(ThreadJob): if header is None: index = tx_height // 2016 if index < len(blockchain.checkpoints): - # FIXME disabled until async block header download has been merged - pass #await self.network.request_chunk(tx_height, None) + await self.network.request_chunk(tx_height, None) elif (tx_hash not in self.requested_merkle and tx_hash not in self.merkle_roots): self.print_error('requested merkle', tx_hash) From 2157eae4990ed5d80a78880409e0ebcf20ab27f5 Mon Sep 17 00:00:00 2001 From: SomberNight Date: Wed, 29 Aug 2018 18:54:25 +0200 Subject: [PATCH 061/138] fix request_chunk --- electrum/network.py | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/electrum/network.py b/electrum/network.py index 92378d9f..0436359c 100644 --- a/electrum/network.py +++ b/electrum/network.py @@ -730,15 +730,13 @@ class Network(PrintError): if session is None: session = self.interface.session index = height // 2016 size = 2016 - if tip is not None and height + 2016 >= tip: - size = tip - height - #if index * 2016 < height: - # size = height - index * 2016 + if tip is not None: + size = min(size, tip - index * 2016) + size = max(size, 0) res = await session.send_request('blockchain.block.headers', [index * 2016, size]) conn = self.blockchain().connect_chunk(index, res['hex']) if not conn: return conn, 0 - self.blockchain().save_chunk(index, bfh(res['hex'])) return conn, res['count'] @with_interface_lock From 3f0d79f07d8353639e03f7d56c8a46fa59df17a1 Mon Sep 17 00:00:00 2001 From: SomberNight Date: Fri, 31 Aug 2018 16:32:45 +0200 Subject: [PATCH 062/138] blockchain.py: better handling of missing headers. more restrictive verify_chunk. --- electrum/blockchain.py | 32 +++++++++++++++++++++++++------- 1 file changed, 25 insertions(+), 7 deletions(-) diff --git a/electrum/blockchain.py b/electrum/blockchain.py index e0ab5d16..a7befad2 100644 --- a/electrum/blockchain.py +++ b/electrum/blockchain.py @@ -146,7 +146,10 @@ class Blockchain(util.PrintError): def check_header(self, header): header_hash = hash_header(header) height = header.get('block_height') - return header_hash == self.get_hash(height) + try: + return header_hash == self.get_hash(height) + except MissingHeader: + return False def fork(parent, header): forkpoint = header.get('block_height') @@ -166,8 +169,10 @@ class Blockchain(util.PrintError): p = self.path() self._size = os.path.getsize(p)//80 if os.path.exists(p) else 0 - def verify_header(self, header, prev_hash, target): + def verify_header(self, header, prev_hash, target, expected_header_hash=None): _hash = hash_header(header) + if expected_header_hash and expected_header_hash != _hash: + raise Exception("hash mismatches with expected: {} vs {}".format(expected_header_hash, _hash)) if prev_hash != header.get('prev_block_hash'): raise Exception("prev hash mismatch: %s vs %s" % (prev_hash, header.get('prev_block_hash'))) if constants.net.TESTNET: @@ -180,12 +185,18 @@ class Blockchain(util.PrintError): def verify_chunk(self, index, data): num = len(data) // 80 - prev_hash = self.get_hash(index * 2016 - 1) + start_height = index * 2016 + prev_hash = self.get_hash(start_height - 1) target = self.get_target(index-1) for i in range(num): + height = start_height + i + try: + expected_header_hash = self.get_hash(height) + except MissingHeader: + expected_header_hash = None raw_header = data[i*80:(i+1) * 80] header = deserialize_header(raw_header, index*2016 + i) - self.verify_header(header, prev_hash, target) + self.verify_header(header, prev_hash, target, expected_header_hash) prev_hash = hash_header(header) def path(self): @@ -303,17 +314,24 @@ class Blockchain(util.PrintError): return deserialize_header(h, height) def get_hash(self, height): + def is_height_checkpoint(): + within_cp_range = height < len(self.checkpoints) * 2016 + at_chunk_boundary = (height+1) % 2016 == 0 + return within_cp_range and at_chunk_boundary + if height == -1: return '0000000000000000000000000000000000000000000000000000000000000000' elif height == 0: return constants.net.GENESIS - elif height < len(self.checkpoints) * 2016: - assert (height+1) % 2016 == 0, (height, len(self.checkpoints), (height+1) % 2016) + elif is_height_checkpoint(): index = height // 2016 h, t = self.checkpoints[index] return h else: - return hash_header(self.read_header(height)) + header = self.read_header(height) + if header is None: + raise MissingHeader(height) + return hash_header(header) def get_target(self, index): # compute target from chunk x, used in chunk x+1 From 14a032a0b16c498602ff63cd5482af123891f0c1 Mon Sep 17 00:00:00 2001 From: SomberNight Date: Fri, 31 Aug 2018 16:46:03 +0200 Subject: [PATCH 063/138] disconnect from servers on exception --- electrum/interface.py | 2 ++ electrum/network.py | 18 ++++++++++-------- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/electrum/interface.py b/electrum/interface.py index 23119333..7631e65f 100644 --- a/electrum/interface.py +++ b/electrum/interface.py @@ -244,6 +244,8 @@ class BlockHeaderInterface(PrintError): could_connect, num_headers = await self.conn.request_chunk(self.height, next_height) self.tip = max(self.height + num_headers, self.tip) if not could_connect: + if self.height <= self.iface.network.max_checkpoint(): + raise Exception('server chain conflicts with checkpoints or genesis') last = await self.step() self.tip = max(self.height, self.tip) continue diff --git a/electrum/network.py b/electrum/network.py index 0436359c..58ad6069 100644 --- a/electrum/network.py +++ b/electrum/network.py @@ -809,14 +809,16 @@ class Network(PrintError): asyncio.get_event_loop().create_task(self.new_interface(server)) remove = [] for k, i in self.interfaces.items(): - if i.fut.done(): - if i.exception: - try: - raise i.exception - except BaseException as e: - self.print_error(i.server, "errored because", str(e), str(type(e))) - else: - assert False, "interface future should not finish without exception" + if i.fut.done() and not i.exception: + assert False, "interface future should not finish without exception" + if i.exception: + if not i.fut.done(): + try: i.fut.cancel() + except Exception as e: self.print_error('exception while cancelling fut', e) + try: + raise i.exception + except BaseException as e: + self.print_error(i.server, "errored because", str(e), str(type(e))) remove.append(k) changed = False for k in remove: From c89020725b34a416c19cb45d580c958a3e2a3805 Mon Sep 17 00:00:00 2001 From: Janus Date: Fri, 31 Aug 2018 18:38:08 +0200 Subject: [PATCH 064/138] address synchronizer: fetch initial addresses from wallet --- electrum/address_synchronizer.py | 1 + 1 file changed, 1 insertion(+) diff --git a/electrum/address_synchronizer.py b/electrum/address_synchronizer.py index 07b0f958..ab19dab2 100644 --- a/electrum/address_synchronizer.py +++ b/electrum/address_synchronizer.py @@ -154,6 +154,7 @@ class AddressSynchronizer(PrintError): self.verifier = SPV(self.network, self) self.synchronizer = Synchronizer(self) self.network.register_callback(self.on_default_server_changed, ['default_server_changed']) + self.network.trigger_callback('default_server_changed') else: self.verifier = None self.synchronizer = None From 2187615c08e5209a5eb649c367406b6eacfe0c13 Mon Sep 17 00:00:00 2001 From: SomberNight Date: Fri, 31 Aug 2018 19:51:32 +0200 Subject: [PATCH 065/138] verifier: request proofs in batches --- electrum/network.py | 1 - electrum/verifier.py | 49 ++++++++++++++++++++++---------------------- 2 files changed, 24 insertions(+), 26 deletions(-) diff --git a/electrum/network.py b/electrum/network.py index 58ad6069..f0aa4a61 100644 --- a/electrum/network.py +++ b/electrum/network.py @@ -719,7 +719,6 @@ class Network(PrintError): pass async def get_merkle_for_transaction(self, tx_hash, tx_height): - print("getting merkle for transaction", tx_hash, tx_height) return await self.interface.session.send_request('blockchain.transaction.get_merkle', [tx_hash, tx_height]) def broadcast_transaction(self, tx): diff --git a/electrum/verifier.py b/electrum/verifier.py index 61642364..39ecf82a 100644 --- a/electrum/verifier.py +++ b/electrum/verifier.py @@ -24,6 +24,8 @@ import asyncio from typing import Sequence, Optional +from aiorpcx import TaskGroup + from .util import ThreadJob, bh2u, VerifiedTxInfo, aiosafe from .bitcoin import Hash, hash_decode, hash_encode from .transaction import Transaction @@ -49,10 +51,10 @@ class SPV(ThreadJob): @aiosafe async def main(self): while True: - await self.run() + await self._request_proofs() await asyncio.sleep(1) - async def run(self): + async def _request_proofs(self): blockchain = self.network.blockchain() if not blockchain: self.print_error("no blockchain") @@ -60,33 +62,30 @@ class SPV(ThreadJob): local_height = self.network.get_local_height() unverified = self.wallet.get_unverified_txs() - #print("verifier run", len(unverified)) - for tx_hash, tx_height in unverified.items(): - # do not request merkle branch before headers are available - if tx_height <= 0 or tx_height > local_height: - continue - header = blockchain.read_header(tx_height) - if header is None: - index = tx_height // 2016 - if index < len(blockchain.checkpoints): - await self.network.request_chunk(tx_height, None) - elif (tx_hash not in self.requested_merkle - and tx_hash not in self.merkle_roots): - self.print_error('requested merkle', tx_hash) - self.requested_merkle.add(tx_hash) - self.verify_merkle(tx_hash, await self.network.get_merkle_for_transaction( - tx_hash, - tx_height - )) + async with TaskGroup() as group: + for tx_hash, tx_height in unverified.items(): + # do not request merkle branch before headers are available + if tx_height <= 0 or tx_height > local_height: + continue + + header = blockchain.read_header(tx_height) + if header is None: + index = tx_height // 2016 + if index < len(blockchain.checkpoints): + await group.spawn(self.network.request_chunk, tx_height, None) + elif (tx_hash not in self.requested_merkle + and tx_hash not in self.merkle_roots): + self.print_error('requested merkle', tx_hash) + self.requested_merkle.add(tx_hash) + await group.spawn(self._request_and_verify_single_proof, tx_hash, tx_height) if self.network.blockchain() != self.blockchain: self.blockchain = self.network.blockchain() - self.undo_verifications() + self._undo_verifications() - def verify_merkle(self, tx_hash, merkle): - if self.wallet.verifier is None: - return # we have been killed, this was just an orphan callback + async def _request_and_verify_single_proof(self, tx_hash, tx_height): + merkle = await self.network.get_merkle_for_transaction(tx_hash, tx_height) # Verify the hash of the server-provided merkle branch to a # transaction matches the merkle root of its block tx_height = merkle.get('block_height') @@ -143,7 +142,7 @@ class SPV(ThreadJob): else: raise InnerNodeOfSpvProofIsValidTx() - def undo_verifications(self): + def _undo_verifications(self): height = self.blockchain.get_forkpoint() tx_hashes = self.wallet.undo_verifications(self.blockchain, height) for tx_hash in tx_hashes: From 4d95452ae706e0c29a6abd6a64547c8e7cae9567 Mon Sep 17 00:00:00 2001 From: SomberNight Date: Fri, 31 Aug 2018 20:56:58 +0200 Subject: [PATCH 066/138] wallet: partial fix for race in on_default_server_changed --- electrum/address_synchronizer.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/electrum/address_synchronizer.py b/electrum/address_synchronizer.py index ab19dab2..65a75402 100644 --- a/electrum/address_synchronizer.py +++ b/electrum/address_synchronizer.py @@ -142,10 +142,12 @@ class AddressSynchronizer(PrintError): if not i.done(): i.cancel() self.network.futures.clear() + if self.network.interface is None: + return + # FIXME there are races here.. network.interface can become None self.network.futures.append(asyncio.get_event_loop().create_task(self.verifier.main())) self.network.futures.append(asyncio.get_event_loop().create_task(self.synchronizer.send_subscriptions())) self.network.futures.append(asyncio.get_event_loop().create_task(self.synchronizer.handle_status())) - assert self.network.interface.session is not None self.network.futures.append(asyncio.get_event_loop().create_task(self.synchronizer.main())) def start_threads(self, network): From 9c363db440936b51c567e5f7a1827e9a644dc79f Mon Sep 17 00:00:00 2001 From: Janus Date: Tue, 4 Sep 2018 12:36:47 +0200 Subject: [PATCH 067/138] async block headers: avoid duplicate tip fields, handle electrumx server skipping blocks --- electrum/interface.py | 40 ++++++++++++++++------------------ electrum/tests/test_network.py | 15 +++++++------ 2 files changed, 27 insertions(+), 28 deletions(-) diff --git a/electrum/interface.py b/electrum/interface.py index 7631e65f..59a87b57 100644 --- a/electrum/interface.py +++ b/electrum/interface.py @@ -204,30 +204,26 @@ class Interface(PrintError): @aiosafe async def run_fetch_blocks(self, sub_reply, replies, conniface): async with self.network.bhi_lock: - bhi = BlockHeaderInterface(conniface, sub_reply['height'], self.blockchain.height()+1, self) + bhi = BlockHeaderInterface(conniface, self.blockchain.height()+1, self) await replies.put(blockchain.deserialize_header(bfh(sub_reply['hex']), sub_reply['height'])) - self.print_error("checking if catched up {}-1 > {}, tip {}".format(sub_reply['height'], self.blockchain.height(), bhi.tip)) - if sub_reply['height']-1 > self.blockchain.height(): - last_status = await bhi.sync_until() - assert last_status == 'catchup', last_status - assert self.blockchain.height()+1 == bhi.height, (self.blockchain.height(), bhi.height) while True: self.network.notify('updated') item = await replies.get() async with self.network.bhi_lock: + if self.blockchain.height()-1 < item['block_height']: + await bhi.sync_until() if self.blockchain.height() >= bhi.height and self.blockchain.check_header(item): # another interface amended the blockchain self.print_error("SKIPPING HEADER", bhi.height) continue - if bhi.tip < bhi.height: - bhi.height = bhi.tip + if self.tip < bhi.height: + bhi.height = self.tip await bhi.step(item) - bhi.tip = max(bhi.height, bhi.tip) + self.tip = max(bhi.height, self.tip) class BlockHeaderInterface(PrintError): - def __init__(self, conn, tip, height, iface): - self.tip = tip + def __init__(self, conn, height, iface): self.height = height self.conn = conn self.iface = iface @@ -237,31 +233,33 @@ class BlockHeaderInterface(PrintError): async def sync_until(self, next_height=None): if next_height is None: - next_height = self.tip + next_height = self.iface.tip last = None while last is None or self.height < next_height: if next_height > self.height + 10: could_connect, num_headers = await self.conn.request_chunk(self.height, next_height) - self.tip = max(self.height + num_headers, self.tip) + self.iface.tip = max(self.height + num_headers, self.iface.tip) if not could_connect: if self.height <= self.iface.network.max_checkpoint(): raise Exception('server chain conflicts with checkpoints or genesis') last = await self.step() - self.tip = max(self.height, self.tip) + self.iface.tip = max(self.height, self.iface.tip) continue self.height = (self.height // 2016 * 2016) + num_headers if self.height > next_height: - assert False, (self.height, self.tip) + assert False, (self.height, self.iface.tip) last = 'catchup' else: last = await self.step() - self.tip = max(self.height, self.tip) + self.iface.tip = max(self.height, self.iface.tip) return last async def step(self, header=None): assert self.height != 0 if header is None: header = await self.conn.get_block_header(self.height, 'catchup') + chain = self.iface.blockchain.check_header(header) if 'mock' not in header else header['mock']['check'](header) + if chain: return 'catchup' can_connect = blockchain.can_connect(header) if 'mock' not in header else header['mock']['connect'](self) bad_header = None @@ -284,8 +282,8 @@ class BlockHeaderInterface(PrintError): while not chain and not can_connect: bad = self.height bad_header = header - delta = self.tip - self.height - next_height = self.tip - 2 * delta + delta = self.iface.tip - self.height + next_height = self.iface.tip - 2 * delta checkp = False if next_height <= self.iface.network.max_checkpoint(): next_height = self.iface.network.max_checkpoint() + 1 @@ -305,7 +303,7 @@ class BlockHeaderInterface(PrintError): if type(can_connect) is bool: # mock self.height += 1 - if self.height > self.tip: + if self.height > self.iface.tip: assert False return 'catchup' self.iface.blockchain = can_connect @@ -360,7 +358,7 @@ class BlockHeaderInterface(PrintError): return 'join' else: if ismocking and branch['parent']['check'](header) or not ismocking and branch.parent().check_header(header): - self.print_error('reorg', bad, self.tip) + self.print_error('reorg', bad, self.iface.tip) self.iface.blockchain = branch.parent() if not ismocking else branch['parent'] self.height = bad header = await self.conn.get_block_header(self.height, 'binary') @@ -394,7 +392,7 @@ class BlockHeaderInterface(PrintError): return 'fork' else: assert bh == good - if bh < self.tip: + if bh < self.iface.tip: self.print_error("catching up from %d"% (bh + 1)) self.height = bh + 1 return 'no_fork' diff --git a/electrum/tests/test_network.py b/electrum/tests/test_network.py index 8181951d..39781e64 100644 --- a/electrum/tests/test_network.py +++ b/electrum/tests/test_network.py @@ -30,6 +30,7 @@ class TestNetwork(unittest.TestCase): class FakeIface: blockchain = b network = FakeNetwork + tip = 12 return FakeIface def test_new_fork(self): @@ -43,7 +44,7 @@ class TestNetwork(unittest.TestCase): conn.q.put_nowait({'block_height': 4, 'mock': {'binary':1,'check':lambda x: True, 'connect': lambda x: True}}) conn.q.put_nowait({'block_height': 5, 'mock': {'binary':1,'check':lambda x: True, 'connect': lambda x: True}}) conn.q.put_nowait({'block_height': 6, 'mock': {'binary':1,'check':lambda x: True, 'connect': lambda x: True}}) - ifa = BlockHeaderInterface(conn, 12, 8, self.blockchain_iface_pair()) + ifa = BlockHeaderInterface(conn, 8, self.blockchain_iface_pair()) self.assertEqual('fork', asyncio.get_event_loop().run_until_complete(ifa.sync_until(next_height=8))) self.assertEqual(conn.q.qsize(), 0) @@ -57,7 +58,7 @@ class TestNetwork(unittest.TestCase): conn.q.put_nowait({'block_height': 2, 'mock': {'backward':1, 'check': lambda x: False, 'connect': mock_connect, 'fork': self.mock_fork}}) conn.q.put_nowait({'block_height': 3, 'mock': {'catchup':1, 'check': lambda x: False, 'connect': lambda x: True}}) conn.q.put_nowait({'block_height': 4, 'mock': {'catchup':1, 'check': lambda x: False, 'connect': lambda x: True}}) - ifa = BlockHeaderInterface(conn, 12, 8, self.blockchain_iface_pair()) + ifa = BlockHeaderInterface(conn, 8, self.blockchain_iface_pair()) self.assertEqual('catchup', asyncio.get_event_loop().run_until_complete(ifa.sync_until(next_height=5))) self.assertEqual(conn.q.qsize(), 0) @@ -73,9 +74,9 @@ class TestNetwork(unittest.TestCase): conn.q.put_nowait({'block_height': 2, 'mock': {'backward':1, 'check': lambda x: True, 'connect': mock_connect}}) conn.q.put_nowait({'block_height': 4, 'mock': {'binary':1, 'check': lambda x: False, 'fork': self.mock_fork, 'connect': mock_connect}}) conn.q.put_nowait({'block_height': 3, 'mock': {'binary':1, 'check': lambda x: True, 'connect': lambda x: True}}) - conn.q.put_nowait({'block_height': 5, 'mock': {'catchup':1, 'check': lambda x: True, 'connect': lambda x: True}}) - conn.q.put_nowait({'block_height': 6, 'mock': {'catchup':1, 'check': lambda x: True, 'connect': lambda x: True}}) - ifa = BlockHeaderInterface(conn, 12, 8, self.blockchain_iface_pair(1000)) + conn.q.put_nowait({'block_height': 5, 'mock': {'catchup':1, 'check': lambda x: False, 'connect': lambda x: True}}) + conn.q.put_nowait({'block_height': 6, 'mock': {'catchup':1, 'check': lambda x: False, 'connect': lambda x: True}}) + ifa = BlockHeaderInterface(conn, 8, self.blockchain_iface_pair(1000)) self.assertEqual('catchup', asyncio.get_event_loop().run_until_complete(ifa.sync_until(next_height=7))) self.assertEqual(conn.q.qsize(), 0) @@ -88,7 +89,7 @@ class TestNetwork(unittest.TestCase): conn.q.put_nowait({'block_height': 4, 'mock': {'binary':1, 'check': lambda x: True, 'connect': lambda x: False}}) conn.q.put_nowait({'block_height': 5, 'mock': {'binary':1, 'check': lambda x: True, 'connect': lambda x: False}}) conn.q.put_nowait({'block_height': 6, 'mock': {'binary':1, 'check': lambda x: True, 'connect': lambda x: True}}) - ifa = BlockHeaderInterface(conn, 12, 8, self.blockchain_iface_pair()) + ifa = BlockHeaderInterface(conn, 8, self.blockchain_iface_pair()) self.assertEqual('join', asyncio.get_event_loop().run_until_complete(ifa.sync_until(next_height=7))) self.assertEqual(conn.q.qsize(), 0) @@ -108,7 +109,7 @@ class TestNetwork(unittest.TestCase): conn.q.put_nowait({'block_height': 5, 'mock': {'binary':1, 'check': lambda x: 1, 'connect': lambda x: False}}) conn.q.put_nowait({'block_height': 6, 'mock': {'binary':1, 'check': lambda x: 1, 'connect': lambda x: True}}) conn.q.put_nowait({'block_height': 7, 'mock': {'binary':1, 'check': lambda x: False, 'connect': lambda x: True}}) - ifa = BlockHeaderInterface(conn, 12, 8, self.blockchain_iface_pair()) + ifa = BlockHeaderInterface(conn, 8, self.blockchain_iface_pair()) self.assertEqual('join', asyncio.get_event_loop().run_until_complete(ifa.sync_until(next_height=8))) self.assertEqual(conn.q.qsize(), 0) self.assertEqual(times, 2) From d367199553545d5e93052a8704f39d3054331bbb Mon Sep 17 00:00:00 2001 From: Janus Date: Tue, 4 Sep 2018 16:57:07 +0200 Subject: [PATCH 068/138] async block headers: remove BlockHeaderInterface and Conn classes, make self.height a local --- electrum/interface.py | 208 +++++++++++++++------------------ electrum/tests/test_network.py | 132 ++++++++++----------- 2 files changed, 158 insertions(+), 182 deletions(-) diff --git a/electrum/interface.py b/electrum/interface.py index 59a87b57..763bc07d 100644 --- a/electrum/interface.py +++ b/electrum/interface.py @@ -171,6 +171,13 @@ class Interface(PrintError): except ValueError: return None + async def get_block_header(self, height, assert_mode): + res = await asyncio.wait_for(self.session.send_request('blockchain.block.header', [height]), 1) + return blockchain.deserialize_header(bytes.fromhex(res), height) + + async def request_chunk(self, idx, tip): + return await self.network.request_chunk(idx, tip, self.session) + async def open_session(self, sslc, exit_early): header_queue = asyncio.Queue() async with NotificationSession(None, header_queue, self.host, self.port, ssl=sslc, proxy=self.proxy) as session: @@ -184,8 +191,7 @@ class Interface(PrintError): self.mark_ready() self.session = session copy_header_queue = asyncio.Queue() - conniface = Conn(self.server, session, lambda idx, tip: self.network.request_chunk(idx, tip, session)) - block_retriever = asyncio.get_event_loop().create_task(self.run_fetch_blocks(subscription_res, copy_header_queue, conniface)) + block_retriever = asyncio.get_event_loop().create_task(self.run_fetch_blocks(subscription_res, copy_header_queue)) while True: try: new_header = await asyncio.wait_for(header_queue.get(), 300) @@ -195,121 +201,109 @@ class Interface(PrintError): except concurrent.futures.TimeoutError: await asyncio.wait_for(session.send_request('server.ping'), 5) - def queue_request(self, method, params, msg_id): - pass - def close(self): self.fut.cancel() @aiosafe - async def run_fetch_blocks(self, sub_reply, replies, conniface): + async def run_fetch_blocks(self, sub_reply, replies): async with self.network.bhi_lock: - bhi = BlockHeaderInterface(conniface, self.blockchain.height()+1, self) + height = self.blockchain.height()+1 await replies.put(blockchain.deserialize_header(bfh(sub_reply['hex']), sub_reply['height'])) while True: self.network.notify('updated') item = await replies.get() async with self.network.bhi_lock: - if self.blockchain.height()-1 < item['block_height']: - await bhi.sync_until() - if self.blockchain.height() >= bhi.height and self.blockchain.check_header(item): + if self.blockchain.height() < item['block_height']-1: + _, height = await self.sync_until(height, None) + if self.blockchain.height() >= height and self.blockchain.check_header(item): # another interface amended the blockchain - self.print_error("SKIPPING HEADER", bhi.height) + self.print_error("SKIPPING HEADER", height) continue - if self.tip < bhi.height: - bhi.height = self.tip - await bhi.step(item) - self.tip = max(bhi.height, self.tip) + if self.tip < height: + height = self.tip + _, height = await self.step(height, item) + self.tip = max(height, self.tip) -class BlockHeaderInterface(PrintError): - def __init__(self, conn, height, iface): - self.height = height - self.conn = conn - self.iface = iface - - def diagnostic_name(self): - return self.conn.server - - async def sync_until(self, next_height=None): + async def sync_until(self, height, next_height=None): if next_height is None: - next_height = self.iface.tip + next_height = self.tip last = None - while last is None or self.height < next_height: - if next_height > self.height + 10: - could_connect, num_headers = await self.conn.request_chunk(self.height, next_height) - self.iface.tip = max(self.height + num_headers, self.iface.tip) + while last is None or height < next_height: + if next_height > height + 10: + could_connect, num_headers = await self.request_chunk(height, next_height) + self.tip = max(height + num_headers, self.tip) if not could_connect: - if self.height <= self.iface.network.max_checkpoint(): + if height <= self.network.max_checkpoint(): raise Exception('server chain conflicts with checkpoints or genesis') - last = await self.step() - self.iface.tip = max(self.height, self.iface.tip) + last, height = await self.step(height) + self.tip = max(height, self.tip) continue - self.height = (self.height // 2016 * 2016) + num_headers - if self.height > next_height: - assert False, (self.height, self.iface.tip) + height = (height // 2016 * 2016) + num_headers + if height > next_height: + assert False, (height, self.tip) last = 'catchup' else: - last = await self.step() - self.iface.tip = max(self.height, self.iface.tip) - return last + last, height = await self.step(height) + self.tip = max(height, self.tip) + return last, height - async def step(self, header=None): - assert self.height != 0 + async def step(self, height, header=None): + assert height != 0 if header is None: - header = await self.conn.get_block_header(self.height, 'catchup') - chain = self.iface.blockchain.check_header(header) if 'mock' not in header else header['mock']['check'](header) - if chain: return 'catchup' - can_connect = blockchain.can_connect(header) if 'mock' not in header else header['mock']['connect'](self) + header = await self.get_block_header(height, 'catchup') + chain = self.blockchain.check_header(header) if 'mock' not in header else header['mock']['check'](header) + if chain: return 'catchup', height + can_connect = blockchain.can_connect(header) if 'mock' not in header else header['mock']['connect'](height) bad_header = None if not can_connect: - self.print_error("can't connect", self.height) + self.print_error("can't connect", height) #backward - bad = self.height + bad = height bad_header = header - self.height -= 1 + height -= 1 checkp = False - if self.height <= self.iface.network.max_checkpoint(): - self.height = self.iface.network.max_checkpoint() + 1 + if height <= self.network.max_checkpoint(): + height = self.network.max_checkpoint() + 1 checkp = True - header = await self.conn.get_block_header(self.height, 'backward') + header = await self.get_block_header(height, 'backward') chain = blockchain.check_header(header) if 'mock' not in header else header['mock']['check'](header) - can_connect = blockchain.can_connect(header) if 'mock' not in header else header['mock']['connect'](self) + can_connect = blockchain.can_connect(header) if 'mock' not in header else header['mock']['connect'](height) if checkp: assert can_connect or chain, (can_connect, chain) while not chain and not can_connect: - bad = self.height + bad = height bad_header = header - delta = self.iface.tip - self.height - next_height = self.iface.tip - 2 * delta + delta = self.tip - height + next_height = self.tip - 2 * delta checkp = False - if next_height <= self.iface.network.max_checkpoint(): - next_height = self.iface.network.max_checkpoint() + 1 + if next_height <= self.network.max_checkpoint(): + next_height = self.network.max_checkpoint() + 1 checkp = True - self.height = next_height + height = next_height - header = await self.conn.get_block_header(self.height, 'backward') + header = await self.get_block_header(height, 'backward') chain = blockchain.check_header(header) if 'mock' not in header else header['mock']['check'](header) - can_connect = blockchain.can_connect(header) if 'mock' not in header else header['mock']['connect'](self) + can_connect = blockchain.can_connect(header) if 'mock' not in header else header['mock']['connect'](height) if checkp: assert can_connect or chain, (can_connect, chain) - self.print_error("exiting backward mode at", self.height) + self.print_error("exiting backward mode at", height) if can_connect: - self.print_error("could connect", self.height) + self.print_error("could connect", height) chain = blockchain.check_header(header) if 'mock' not in header else header['mock']['check'](header) if type(can_connect) is bool: # mock - self.height += 1 - if self.height > self.iface.tip: + height += 1 + if height > self.tip: assert False - return 'catchup' - self.iface.blockchain = can_connect - self.height += 1 - self.iface.blockchain.save_header(header) - return 'catchup' + return 'catchup', height + self.blockchain = can_connect + height += 1 + self.blockchain.save_header(header) + return 'catchup', height if not chain: raise Exception("not chain") # line 931 in 8e69174374aee87d73cd2f8005fbbe87c93eee9c's network.py @@ -318,27 +312,27 @@ class BlockHeaderInterface(PrintError): if type(chain) in [int, bool]: pass # mock else: - self.iface.blockchain = chain - good = self.height - self.height = (bad + good) // 2 - header = await self.conn.get_block_header(self.height, 'binary') + self.blockchain = chain + good = height + height = (bad + good) // 2 + header = await self.get_block_header(height, 'binary') while True: self.print_error("binary step") chain = blockchain.check_header(header) if 'mock' not in header else header['mock']['check'](header) if chain: - assert bad != self.height, (bad, self.height) - good = self.height - self.iface.blockchain = self.iface.blockchain if type(chain) in [bool, int] else chain + assert bad != height, (bad, height) + good = height + self.blockchain = self.blockchain if type(chain) in [bool, int] else chain else: - bad = self.height - assert good != self.height + bad = height + assert good != height bad_header = header if bad != good + 1: - self.height = (bad + good) // 2 - header = await self.conn.get_block_header(self.height, 'binary') + height = (bad + good) // 2 + header = await self.get_block_header(height, 'binary') continue - mock = bad_header and 'mock' in bad_header and bad_header['mock']['connect'](self) - real = not mock and self.iface.blockchain.can_connect(bad_header, check_height=False) + mock = bad_header and 'mock' in bad_header and bad_header['mock']['connect'](height) + real = not mock and self.blockchain.can_connect(bad_header, check_height=False) if not real and not mock: raise Exception('unexpected bad header during binary' + str(bad_header)) # line 948 in 8e69174374aee87d73cd2f8005fbbe87c93eee9c's network.py branch = blockchain.blockchains.get(bad) @@ -354,58 +348,48 @@ class BlockHeaderInterface(PrintError): # electrum runtime if ismocking and branch['check'](bad_header) or not ismocking and branch.check_header(bad_header): self.print_error('joining chain', bad) - self.height += 1 - return 'join' + height += 1 + return 'join', height else: if ismocking and branch['parent']['check'](header) or not ismocking and branch.parent().check_header(header): - self.print_error('reorg', bad, self.iface.tip) - self.iface.blockchain = branch.parent() if not ismocking else branch['parent'] - self.height = bad - header = await self.conn.get_block_header(self.height, 'binary') + self.print_error('reorg', bad, self.tip) + self.blockchain = branch.parent() if not ismocking else branch['parent'] + height = bad + header = await self.get_block_header(height, 'binary') else: if ismocking: - self.height = bad + 1 + height = bad + 1 self.print_error("TODO replace blockchain") - return 'conflict' + return 'conflict', height self.print_error('forkpoint conflicts with existing fork', branch.path()) branch.write(b'', 0) branch.save_header(bad_header) - self.iface.blockchain = branch - self.height = bad + 1 - return 'conflict' + self.blockchain = branch + height = bad + 1 + return 'conflict', height else: - bh = self.iface.blockchain.height() + bh = self.blockchain.height() if bh > good: - forkfun = self.iface.blockchain.fork + forkfun = self.blockchain.fork if 'mock' in bad_header: chain = bad_header['mock']['check'](bad_header) forkfun = bad_header['mock']['fork'] if 'fork' in bad_header['mock'] else forkfun else: - chain = self.iface.blockchain.check_header(bad_header) + chain = self.blockchain.check_header(bad_header) if not chain: b = forkfun(bad_header) assert bad not in blockchain.blockchains, (bad, list(blockchain.blockchains.keys())) blockchain.blockchains[bad] = b - self.iface.blockchain = b - self.height = b.forkpoint + 1 + self.blockchain = b + height = b.forkpoint + 1 assert b.forkpoint == bad - return 'fork' + return 'fork', height else: assert bh == good - if bh < self.iface.tip: + if bh < self.tip: self.print_error("catching up from %d"% (bh + 1)) - self.height = bh + 1 - return 'no_fork' - -class Conn: - def __init__(self, server, session, get_chunk): - self.server = server - self.session = session # type: aiorpcx.ClientSession - self.request_chunk = get_chunk - async def get_block_header(self, height, assert_mode): - res = await asyncio.wait_for(self.session.send_request('blockchain.block.header', [height]), 1) - return blockchain.deserialize_header(bytes.fromhex(res), height) - + height = bh + 1 + return 'no_fork', height def check_cert(host, cert): try: diff --git a/electrum/tests/test_network.py b/electrum/tests/test_network.py index 39781e64..07b5996c 100644 --- a/electrum/tests/test_network.py +++ b/electrum/tests/test_network.py @@ -5,12 +5,18 @@ import unittest from electrum.constants import set_regtest from electrum.simple_config import SimpleConfig from electrum import blockchain -from electrum.interface import BlockHeaderInterface +from electrum.interface import Interface -class MockConnection: - def __init__(self): +class MockInterface(Interface): + def __init__(self, config): + self.config = config + super().__init__(None, 'mock-server:50000:t', self.config.electrum_path(), None) + class FakeNetwork: + max_checkpoint = lambda: 0 + self.network = FakeNetwork self.q = asyncio.Queue() - self.server = 'mock-server' + self.blockchain = blockchain.Blockchain(self.config, 2002, None) + self.tip = 12 async def get_block_header(self, height, assert_mode): assert self.q.qsize() > 0, (height, assert_mode) item = await self.q.get() @@ -22,76 +28,63 @@ class MockConnection: class TestNetwork(unittest.TestCase): def setUp(self): self.config = SimpleConfig({'electrum_path': tempfile.mkdtemp(prefix="test_network")}) - - def blockchain_iface_pair(self, forkpoint=2002): - b = blockchain.Blockchain(self.config, forkpoint, None) - class FakeNetwork: - max_checkpoint = lambda: 0 - class FakeIface: - blockchain = b - network = FakeNetwork - tip = 12 - return FakeIface + self.interface = MockInterface(self.config) def test_new_fork(self): blockchain.blockchains = {} - conn = MockConnection() - conn.q.put_nowait({'block_height': 8, 'mock': {'catchup':1, 'check': lambda x: False, 'connect': lambda x: False}}) - def mock_connect(block_header_iface): - return block_header_iface.height == 6 - conn.q.put_nowait({'block_height': 7, 'mock': {'backward':1,'check': lambda x: False, 'connect': mock_connect, 'fork': self.mock_fork}}) - conn.q.put_nowait({'block_height': 2, 'mock': {'backward':1,'check':lambda x: True, 'connect': lambda x: False}}) - conn.q.put_nowait({'block_height': 4, 'mock': {'binary':1,'check':lambda x: True, 'connect': lambda x: True}}) - conn.q.put_nowait({'block_height': 5, 'mock': {'binary':1,'check':lambda x: True, 'connect': lambda x: True}}) - conn.q.put_nowait({'block_height': 6, 'mock': {'binary':1,'check':lambda x: True, 'connect': lambda x: True}}) - ifa = BlockHeaderInterface(conn, 8, self.blockchain_iface_pair()) - self.assertEqual('fork', asyncio.get_event_loop().run_until_complete(ifa.sync_until(next_height=8))) - self.assertEqual(conn.q.qsize(), 0) + self.interface.q.put_nowait({'block_height': 8, 'mock': {'catchup':1, 'check': lambda x: False, 'connect': lambda x: False}}) + def mock_connect(height): + return height == 6 + self.interface.q.put_nowait({'block_height': 7, 'mock': {'backward':1,'check': lambda x: False, 'connect': mock_connect, 'fork': self.mock_fork}}) + self.interface.q.put_nowait({'block_height': 2, 'mock': {'backward':1,'check':lambda x: True, 'connect': lambda x: False}}) + self.interface.q.put_nowait({'block_height': 4, 'mock': {'binary':1,'check':lambda x: True, 'connect': lambda x: True}}) + self.interface.q.put_nowait({'block_height': 5, 'mock': {'binary':1,'check':lambda x: True, 'connect': lambda x: True}}) + self.interface.q.put_nowait({'block_height': 6, 'mock': {'binary':1,'check':lambda x: True, 'connect': lambda x: True}}) + ifa = self.interface + self.assertEqual(('fork', 8), asyncio.get_event_loop().run_until_complete(ifa.sync_until(8, next_height=8))) + self.assertEqual(self.interface.q.qsize(), 0) def test_new_can_connect_during_backward(self): blockchain.blockchains = {} - conn = MockConnection() - conn.q.put_nowait({'block_height': 8, 'mock': {'catchup':1, 'check': lambda x: False, 'connect': lambda x: False}}) - def mock_connect(block_header_iface): - return block_header_iface.height == 2 - conn.q.put_nowait({'block_height': 7, 'mock': {'backward':1, 'check': lambda x: False, 'connect': mock_connect, 'fork': self.mock_fork}}) - conn.q.put_nowait({'block_height': 2, 'mock': {'backward':1, 'check': lambda x: False, 'connect': mock_connect, 'fork': self.mock_fork}}) - conn.q.put_nowait({'block_height': 3, 'mock': {'catchup':1, 'check': lambda x: False, 'connect': lambda x: True}}) - conn.q.put_nowait({'block_height': 4, 'mock': {'catchup':1, 'check': lambda x: False, 'connect': lambda x: True}}) - ifa = BlockHeaderInterface(conn, 8, self.blockchain_iface_pair()) - self.assertEqual('catchup', asyncio.get_event_loop().run_until_complete(ifa.sync_until(next_height=5))) - self.assertEqual(conn.q.qsize(), 0) + self.interface.q.put_nowait({'block_height': 8, 'mock': {'catchup':1, 'check': lambda x: False, 'connect': lambda x: False}}) + def mock_connect(height): + return height == 2 + self.interface.q.put_nowait({'block_height': 7, 'mock': {'backward':1, 'check': lambda x: False, 'connect': mock_connect, 'fork': self.mock_fork}}) + self.interface.q.put_nowait({'block_height': 2, 'mock': {'backward':1, 'check': lambda x: False, 'connect': mock_connect, 'fork': self.mock_fork}}) + self.interface.q.put_nowait({'block_height': 3, 'mock': {'catchup':1, 'check': lambda x: False, 'connect': lambda x: True}}) + self.interface.q.put_nowait({'block_height': 4, 'mock': {'catchup':1, 'check': lambda x: False, 'connect': lambda x: True}}) + ifa = self.interface + self.assertEqual(('catchup', 5), asyncio.get_event_loop().run_until_complete(ifa.sync_until(8, next_height=5))) + self.assertEqual(self.interface.q.qsize(), 0) def mock_fork(self, bad_header): return blockchain.Blockchain(self.config, bad_header['block_height'], None) def test_new_chain_false_during_binary(self): blockchain.blockchains = {} - conn = MockConnection() - conn.q.put_nowait({'block_height': 8, 'mock': {'catchup':1, 'check': lambda x: False, 'connect': lambda x: False}}) - mock_connect = lambda bhi: bhi.height == 3 - conn.q.put_nowait({'block_height': 7, 'mock': {'backward':1, 'check': lambda x: False, 'connect': mock_connect}}) - conn.q.put_nowait({'block_height': 2, 'mock': {'backward':1, 'check': lambda x: True, 'connect': mock_connect}}) - conn.q.put_nowait({'block_height': 4, 'mock': {'binary':1, 'check': lambda x: False, 'fork': self.mock_fork, 'connect': mock_connect}}) - conn.q.put_nowait({'block_height': 3, 'mock': {'binary':1, 'check': lambda x: True, 'connect': lambda x: True}}) - conn.q.put_nowait({'block_height': 5, 'mock': {'catchup':1, 'check': lambda x: False, 'connect': lambda x: True}}) - conn.q.put_nowait({'block_height': 6, 'mock': {'catchup':1, 'check': lambda x: False, 'connect': lambda x: True}}) - ifa = BlockHeaderInterface(conn, 8, self.blockchain_iface_pair(1000)) - self.assertEqual('catchup', asyncio.get_event_loop().run_until_complete(ifa.sync_until(next_height=7))) - self.assertEqual(conn.q.qsize(), 0) + self.interface.q.put_nowait({'block_height': 8, 'mock': {'catchup':1, 'check': lambda x: False, 'connect': lambda x: False}}) + mock_connect = lambda height: height == 3 + self.interface.q.put_nowait({'block_height': 7, 'mock': {'backward':1, 'check': lambda x: False, 'connect': mock_connect}}) + self.interface.q.put_nowait({'block_height': 2, 'mock': {'backward':1, 'check': lambda x: True, 'connect': mock_connect}}) + self.interface.q.put_nowait({'block_height': 4, 'mock': {'binary':1, 'check': lambda x: False, 'fork': self.mock_fork, 'connect': mock_connect}}) + self.interface.q.put_nowait({'block_height': 3, 'mock': {'binary':1, 'check': lambda x: True, 'connect': lambda x: True}}) + self.interface.q.put_nowait({'block_height': 5, 'mock': {'catchup':1, 'check': lambda x: False, 'connect': lambda x: True}}) + self.interface.q.put_nowait({'block_height': 6, 'mock': {'catchup':1, 'check': lambda x: False, 'connect': lambda x: True}}) + ifa = self.interface + self.assertEqual(('catchup', 7), asyncio.get_event_loop().run_until_complete(ifa.sync_until(8, next_height=7))) + self.assertEqual(self.interface.q.qsize(), 0) def test_new_join(self): blockchain.blockchains = {7: {'check': lambda bad_header: True}} - conn = MockConnection() - conn.q.put_nowait({'block_height': 8, 'mock': {'catchup':1, 'check': lambda x: False, 'connect': lambda x: False}}) - conn.q.put_nowait({'block_height': 7, 'mock': {'backward':1, 'check': lambda x: False, 'connect': lambda x: x.height == 6}}) - conn.q.put_nowait({'block_height': 2, 'mock': {'backward':1, 'check': lambda x: True, 'connect': lambda x: False}}) - conn.q.put_nowait({'block_height': 4, 'mock': {'binary':1, 'check': lambda x: True, 'connect': lambda x: False}}) - conn.q.put_nowait({'block_height': 5, 'mock': {'binary':1, 'check': lambda x: True, 'connect': lambda x: False}}) - conn.q.put_nowait({'block_height': 6, 'mock': {'binary':1, 'check': lambda x: True, 'connect': lambda x: True}}) - ifa = BlockHeaderInterface(conn, 8, self.blockchain_iface_pair()) - self.assertEqual('join', asyncio.get_event_loop().run_until_complete(ifa.sync_until(next_height=7))) - self.assertEqual(conn.q.qsize(), 0) + self.interface.q.put_nowait({'block_height': 8, 'mock': {'catchup':1, 'check': lambda x: False, 'connect': lambda x: False}}) + self.interface.q.put_nowait({'block_height': 7, 'mock': {'backward':1, 'check': lambda x: False, 'connect': lambda height: height == 6}}) + self.interface.q.put_nowait({'block_height': 2, 'mock': {'backward':1, 'check': lambda x: True, 'connect': lambda x: False}}) + self.interface.q.put_nowait({'block_height': 4, 'mock': {'binary':1, 'check': lambda x: True, 'connect': lambda x: False}}) + self.interface.q.put_nowait({'block_height': 5, 'mock': {'binary':1, 'check': lambda x: True, 'connect': lambda x: False}}) + self.interface.q.put_nowait({'block_height': 6, 'mock': {'binary':1, 'check': lambda x: True, 'connect': lambda x: True}}) + ifa = self.interface + self.assertEqual(('join', 7), asyncio.get_event_loop().run_until_complete(ifa.sync_until(8, next_height=7))) + self.assertEqual(self.interface.q.qsize(), 0) def test_new_reorg(self): times = 0 @@ -101,17 +94,16 @@ class TestNetwork(unittest.TestCase): times += 1 return times != 1 blockchain.blockchains = {7: {'check': check, 'parent': {'check': lambda x: True}}} - conn = MockConnection() - conn.q.put_nowait({'block_height': 8, 'mock': {'catchup':1, 'check': lambda x: False, 'connect': lambda x: False}}) - conn.q.put_nowait({'block_height': 7, 'mock': {'backward':1, 'check': lambda x: False, 'connect': lambda x: x.height == 6}}) - conn.q.put_nowait({'block_height': 2, 'mock': {'backward':1, 'check': lambda x: 1, 'connect': lambda x: False}}) - conn.q.put_nowait({'block_height': 4, 'mock': {'binary':1, 'check': lambda x: 1, 'connect': lambda x: False}}) - conn.q.put_nowait({'block_height': 5, 'mock': {'binary':1, 'check': lambda x: 1, 'connect': lambda x: False}}) - conn.q.put_nowait({'block_height': 6, 'mock': {'binary':1, 'check': lambda x: 1, 'connect': lambda x: True}}) - conn.q.put_nowait({'block_height': 7, 'mock': {'binary':1, 'check': lambda x: False, 'connect': lambda x: True}}) - ifa = BlockHeaderInterface(conn, 8, self.blockchain_iface_pair()) - self.assertEqual('join', asyncio.get_event_loop().run_until_complete(ifa.sync_until(next_height=8))) - self.assertEqual(conn.q.qsize(), 0) + self.interface.q.put_nowait({'block_height': 8, 'mock': {'catchup':1, 'check': lambda x: False, 'connect': lambda x: False}}) + self.interface.q.put_nowait({'block_height': 7, 'mock': {'backward':1, 'check': lambda x: False, 'connect': lambda height: height == 6}}) + self.interface.q.put_nowait({'block_height': 2, 'mock': {'backward':1, 'check': lambda x: 1, 'connect': lambda x: False}}) + self.interface.q.put_nowait({'block_height': 4, 'mock': {'binary':1, 'check': lambda x: 1, 'connect': lambda x: False}}) + self.interface.q.put_nowait({'block_height': 5, 'mock': {'binary':1, 'check': lambda x: 1, 'connect': lambda x: False}}) + self.interface.q.put_nowait({'block_height': 6, 'mock': {'binary':1, 'check': lambda x: 1, 'connect': lambda x: True}}) + self.interface.q.put_nowait({'block_height': 7, 'mock': {'binary':1, 'check': lambda x: False, 'connect': lambda x: True}}) + ifa = self.interface + self.assertEqual(('join', 8), asyncio.get_event_loop().run_until_complete(ifa.sync_until(8, next_height=8))) + self.assertEqual(self.interface.q.qsize(), 0) self.assertEqual(times, 2) if __name__=="__main__": From 0142e0fa223bb2c56dd684e7a0867787fe0e9e2b Mon Sep 17 00:00:00 2001 From: SomberNight Date: Thu, 6 Sep 2018 15:14:35 +0200 Subject: [PATCH 069/138] fix 'daemon load_wallet' over RPC for python > 3.5.3 related: #3764 --- electrum/simple_config.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/electrum/simple_config.py b/electrum/simple_config.py index 25efbb8d..4bfd56f5 100644 --- a/electrum/simple_config.py +++ b/electrum/simple_config.py @@ -241,7 +241,7 @@ class SimpleConfig(PrintError): # command line -w option if self.get('wallet_path'): - return os.path.join(self.get('cwd'), self.get('wallet_path')) + return os.path.join(self.get('cwd', ''), self.get('wallet_path')) # path in config file path = self.get('default_wallet_path') From 234273809aca6f47b5350c8eb3818f09483f113c Mon Sep 17 00:00:00 2001 From: ThomasV Date: Thu, 6 Sep 2018 15:44:11 +0200 Subject: [PATCH 070/138] set interface.session before marking as ready --- electrum/interface.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/electrum/interface.py b/electrum/interface.py index 763bc07d..45a05576 100644 --- a/electrum/interface.py +++ b/electrum/interface.py @@ -180,7 +180,8 @@ class Interface(PrintError): async def open_session(self, sslc, exit_early): header_queue = asyncio.Queue() - async with NotificationSession(None, header_queue, self.host, self.port, ssl=sslc, proxy=self.proxy) as session: + self.session = NotificationSession(None, header_queue, self.host, self.port, ssl=sslc, proxy=self.proxy) + async with self.session as session: ver = await session.send_request('server.version', [ELECTRUM_VERSION, PROTOCOL_VERSION]) if exit_early: return @@ -189,7 +190,6 @@ class Interface(PrintError): self.tip_header = blockchain.deserialize_header(bfh(subscription_res['hex']), subscription_res['height']) self.tip = subscription_res['height'] self.mark_ready() - self.session = session copy_header_queue = asyncio.Queue() block_retriever = asyncio.get_event_loop().create_task(self.run_fetch_blocks(subscription_res, copy_header_queue)) while True: From 5ef04a039b7686ebc6f8c9328fb7cd7c102863ef Mon Sep 17 00:00:00 2001 From: ThomasV Date: Thu, 6 Sep 2018 15:53:41 +0200 Subject: [PATCH 071/138] move NotificationSession --- electrum/interface.py | 24 +++++++++++++++++++++++- electrum/synchronizer.py | 2 +- electrum/util.py | 22 ---------------------- 3 files changed, 24 insertions(+), 24 deletions(-) diff --git a/electrum/interface.py b/electrum/interface.py index 45a05576..19581bf9 100644 --- a/electrum/interface.py +++ b/electrum/interface.py @@ -32,6 +32,7 @@ import traceback import aiorpcx import asyncio import concurrent.futures +from aiorpcx import ClientSession, Notification import requests @@ -43,8 +44,29 @@ from . import util from . import x509 from . import pem from .version import ELECTRUM_VERSION, PROTOCOL_VERSION -from .util import NotificationSession from . import blockchain +from .blockchain import deserialize_header + + +class NotificationSession(ClientSession): + + def __init__(self, scripthash, header, *args, **kwargs): + super(NotificationSession, self).__init__(*args, **kwargs) + self.scripthash = scripthash + self.header = header + + @aiosafe + async def handle_request(self, request): + if isinstance(request, Notification): + if request.method == 'blockchain.scripthash.subscribe' and self.scripthash is not None: + args = request.args + await self.scripthash.put((args[0], args[1])) + elif request.method == 'blockchain.headers.subscribe' and self.header is not None: + deser = deserialize_header(bfh(request.args[0]['hex']), request.args[0]['height']) + await self.header.put(deser) + else: + assert False, request.method + class Interface(PrintError): diff --git a/electrum/synchronizer.py b/electrum/synchronizer.py index eba1ec7f..3fe16a25 100644 --- a/electrum/synchronizer.py +++ b/electrum/synchronizer.py @@ -32,7 +32,7 @@ import concurrent.futures # from .bitcoin import Hash, hash_encode from .transaction import Transaction -from .util import ThreadJob, bh2u, PrintError, aiosafe, bfh, NotificationSession +from .util import ThreadJob, bh2u, PrintError, aiosafe, bfh from .bitcoin import address_to_scripthash from .version import ELECTRUM_VERSION, PROTOCOL_VERSION diff --git a/electrum/util.py b/electrum/util.py index ec4d4434..4a3629cd 100644 --- a/electrum/util.py +++ b/electrum/util.py @@ -38,7 +38,6 @@ from locale import localeconv from .i18n import _ -from aiorpcx import ClientSession, Notification import urllib.request, urllib.parse, urllib.error import queue @@ -948,24 +947,3 @@ VerifiedTxInfo = NamedTuple("VerifiedTxInfo", [("height", int), ("timestamp", int), ("txpos", int), ("header_hash", str)]) - -from .blockchain import deserialize_header - -class NotificationSession(ClientSession): - - def __init__(self, scripthash, header, *args, **kwargs): - super(NotificationSession, self).__init__(*args, **kwargs) - self.scripthash = scripthash - self.header = header - - @aiosafe - async def handle_request(self, request): - if isinstance(request, Notification): - if request.method == 'blockchain.scripthash.subscribe' and self.scripthash is not None: - args = request.args - await self.scripthash.put((args[0], args[1])) - elif request.method == 'blockchain.headers.subscribe' and self.header is not None: - deser = deserialize_header(bfh(request.args[0]['hex']), request.args[0]['height']) - await self.header.put(deser) - else: - assert False, request.method From 6e80ba7b4fd8a3b6e6b2124c5d8ef64e89a62f5c Mon Sep 17 00:00:00 2001 From: Janus Date: Thu, 6 Sep 2018 16:18:45 +0200 Subject: [PATCH 072/138] asyncio: labels, crash_reporter, fx: migrate requests use to aiohttp --- contrib/requirements/requirements.txt | 2 + electrum/base_crash_reporter.py | 18 +- electrum/daemon.py | 6 +- electrum/exchange_rate.py | 218 ++++++++++-------- .../gui/kivy/uix/dialogs/crash_reporter.py | 12 +- electrum/gui/qt/exception_window.py | 11 +- electrum/network.py | 15 +- electrum/plugins/labels/labels.py | 80 ++++--- electrum/plugins/labels/qt.py | 4 +- electrum/util.py | 16 ++ 10 files changed, 224 insertions(+), 158 deletions(-) diff --git a/contrib/requirements/requirements.txt b/contrib/requirements/requirements.txt index 3860c9cd..3536b894 100644 --- a/contrib/requirements/requirements.txt +++ b/contrib/requirements/requirements.txt @@ -9,3 +9,5 @@ PySocks>=1.6.6 qdarkstyle<3.0 typing>=3.0.0 aiorpcx>=0.7.1 +aiohttp +aiohttp_socks diff --git a/electrum/base_crash_reporter.py b/electrum/base_crash_reporter.py index a5702e2e..6cd94a49 100644 --- a/electrum/base_crash_reporter.py +++ b/electrum/base_crash_reporter.py @@ -19,6 +19,7 @@ # ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN # CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. +import asyncio import json import locale import traceback @@ -26,14 +27,13 @@ import subprocess import sys import os -import requests - from .version import ELECTRUM_VERSION from .import constants from .i18n import _ +from .util import make_aiohttp_session -class BaseCrashReporter(object): +class BaseCrashReporter: report_server = "https://crashhub.electrum.org" config_key = "show_crash_reporter" issue_template = """

Traceback

@@ -60,16 +60,22 @@ class BaseCrashReporter(object): def __init__(self, exctype, value, tb): self.exc_args = (exctype, value, tb) - def send_report(self, endpoint="/crash"): + def send_report(self, asyncio_loop, proxy, endpoint="/crash"): if constants.net.GENESIS[-4:] not in ["4943", "e26f"] and ".electrum.org" in BaseCrashReporter.report_server: # Gah! Some kind of altcoin wants to send us crash reports. raise Exception(_("Missing report URL.")) report = self.get_traceback_info() report.update(self.get_additional_info()) report = json.dumps(report) - response = requests.post(BaseCrashReporter.report_server + endpoint, data=report) + coro = self.do_post(proxy, BaseCrashReporter.report_server + endpoint, data=report) + response = asyncio.run_coroutine_threadsafe(coro, asyncio_loop).result(1) return response + async def do_post(self, proxy, url, data): + async with make_aiohttp_session(proxy) as session: + async with session.post(url, data=data) as resp: + return await resp.text() + def get_traceback_info(self): exc_string = str(self.exc_args[1]) stack = traceback.extract_tb(self.exc_args[2]) @@ -125,4 +131,4 @@ class BaseCrashReporter(object): raise NotImplementedError def get_os_version(self): - raise NotImplementedError + raise NotImplementedError diff --git a/electrum/daemon.py b/electrum/daemon.py index 72d6ece8..f2a9316e 100644 --- a/electrum/daemon.py +++ b/electrum/daemon.py @@ -22,6 +22,7 @@ # ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN # CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. +import asyncio import ast import os import time @@ -126,10 +127,9 @@ class Daemon(DaemonThread): self.network = None else: self.network = Network(config) - self.network.start() self.fx = FxThread(config, self.network) - #if self.network: - # self.network.add_jobs([self.fx]) + if self.network: + self.network.start(self.fx.run()) self.gui = None self.wallets = {} # Setup JSONRPC server diff --git a/electrum/exchange_rate.py b/electrum/exchange_rate.py index 1d543a95..e94c0468 100644 --- a/electrum/exchange_rate.py +++ b/electrum/exchange_rate.py @@ -1,18 +1,21 @@ +import asyncio +import aiohttp +from aiohttp_socks import SocksConnector, SocksVer from datetime import datetime import inspect -import requests import sys import os import json -from threading import Thread import time import csv import decimal from decimal import Decimal +import concurrent.futures from .bitcoin import COIN from .i18n import _ -from .util import PrintError, ThreadJob, make_dir +from .util import PrintError, ThreadJob, make_dir, aiosafe +from .util import make_aiohttp_session # See https://en.wikipedia.org/wiki/ISO_4217 @@ -23,6 +26,7 @@ CCY_PRECISIONS = {'BHD': 3, 'BIF': 0, 'BYR': 0, 'CLF': 4, 'CLP': 0, 'RWF': 0, 'TND': 3, 'UGX': 0, 'UYI': 0, 'VND': 0, 'VUV': 0, 'XAF': 0, 'XAU': 4, 'XOF': 0, 'XPF': 0} +PROXY = None class ExchangeBase(PrintError): @@ -32,34 +36,41 @@ class ExchangeBase(PrintError): self.on_quotes = on_quotes self.on_history = on_history - def get_json(self, site, get_string): + async def get_raw(self, site, get_string): # APIs must have https url = ''.join(['https://', site, get_string]) - response = requests.request('GET', url, headers={'User-Agent' : 'Electrum'}, timeout=10) - return response.json() + async with make_aiohttp_session(PROXY) as session: + async with session.get(url) as response: + return await response.text() - def get_csv(self, site, get_string): + async def get_json(self, site, get_string): + # APIs must have https url = ''.join(['https://', site, get_string]) - response = requests.request('GET', url, headers={'User-Agent' : 'Electrum'}) - reader = csv.DictReader(response.content.decode().split('\n')) + async with make_aiohttp_session(PROXY) as session: + async with session.get(url) as response: + return await response.json() + + async def get_csv(self, site, get_string): + raw = await self.get_raw(site, get_string) + reader = csv.DictReader(raw.split('\n')) return list(reader) def name(self): return self.__class__.__name__ - def update_safe(self, ccy): + @aiosafe + async def update_safe(self, ccy): try: self.print_error("getting fx quotes for", ccy) - self.quotes = self.get_rates(ccy) + self.quotes = await self.get_rates(ccy) self.print_error("received fx quotes") except BaseException as e: self.print_error("failed fx quotes:", e) + self.quotes = {} self.on_quotes() def update(self, ccy): - t = Thread(target=self.update_safe, args=(ccy,)) - t.setDaemon(True) - t.start() + asyncio.get_event_loop().create_task(self.update_safe(ccy)) def read_historical_rates(self, ccy, cache_dir): filename = os.path.join(cache_dir, self.name() + '_'+ ccy) @@ -78,13 +89,16 @@ class ExchangeBase(PrintError): self.on_history() return h - def get_historical_rates_safe(self, ccy, cache_dir): + @aiosafe + async def get_historical_rates_safe(self, ccy, cache_dir): try: self.print_error("requesting fx history for", ccy) - h = self.request_history(ccy) + h = await self.request_history(ccy) self.print_error("received fx history for", ccy) except BaseException as e: self.print_error("failed fx history:", e) + import traceback + traceback.print_exc() return filename = os.path.join(cache_dir, self.name() + '_' + ccy) with open(filename, 'w', encoding='utf-8') as f: @@ -100,9 +114,7 @@ class ExchangeBase(PrintError): if h is None: h = self.read_historical_rates(ccy, cache_dir) if h is None or h['timestamp'] < time.time() - 24*3600: - t = Thread(target=self.get_historical_rates_safe, args=(ccy, cache_dir)) - t.setDaemon(True) - t.start() + asyncio.get_event_loop().create_task(self.get_historical_rates_safe(ccy, cache_dir)) def history_ccys(self): return [] @@ -116,8 +128,8 @@ class ExchangeBase(PrintError): class BitcoinAverage(ExchangeBase): - def get_rates(self, ccy): - json = self.get_json('apiv2.bitcoinaverage.com', '/indices/global/ticker/short') + async def get_rates(self, ccy): + json = await self.get_json('apiv2.bitcoinaverage.com', '/indices/global/ticker/short') return dict([(r.replace("BTC", ""), Decimal(json[r]['last'])) for r in json if r != 'timestamp']) @@ -126,8 +138,8 @@ class BitcoinAverage(ExchangeBase): 'MXN', 'NOK', 'NZD', 'PLN', 'RON', 'RUB', 'SEK', 'SGD', 'USD', 'ZAR'] - def request_history(self, ccy): - history = self.get_csv('apiv2.bitcoinaverage.com', + async def request_history(self, ccy): + history = await self.get_csv('apiv2.bitcoinaverage.com', "/indices/global/history/BTC%s?period=alltime&format=csv" % ccy) return dict([(h['DateTime'][:10], h['Average']) for h in history]) @@ -135,8 +147,8 @@ class BitcoinAverage(ExchangeBase): class Bitcointoyou(ExchangeBase): - def get_rates(self, ccy): - json = self.get_json('bitcointoyou.com', "/API/ticker.aspx") + async def get_rates(self, ccy): + json = await self.get_json('bitcointoyou.com', "/API/ticker.aspx") return {'BRL': Decimal(json['ticker']['last'])} def history_ccys(self): @@ -145,8 +157,8 @@ class Bitcointoyou(ExchangeBase): class BitcoinVenezuela(ExchangeBase): - def get_rates(self, ccy): - json = self.get_json('api.bitcoinvenezuela.com', '/') + async def get_rates(self, ccy): + json = await self.get_json('api.bitcoinvenezuela.com', '/') rates = [(r, json['BTC'][r]) for r in json['BTC'] if json['BTC'][r] is not None] # Giving NULL for LTC return dict(rates) @@ -154,85 +166,86 @@ class BitcoinVenezuela(ExchangeBase): def history_ccys(self): return ['ARS', 'EUR', 'USD', 'VEF'] - def request_history(self, ccy): - return self.get_json('api.bitcoinvenezuela.com', - "/historical/index.php?coin=BTC")[ccy +'_BTC'] + async def request_history(self, ccy): + json = await self.get_json('api.bitcoinvenezuela.com', + "/historical/index.php?coin=BTC") + return json[ccy +'_BTC'] class Bitbank(ExchangeBase): - def get_rates(self, ccy): - json = self.get_json('public.bitbank.cc', '/btc_jpy/ticker') + async def get_rates(self, ccy): + json = await self.get_json('public.bitbank.cc', '/btc_jpy/ticker') return {'JPY': Decimal(json['data']['last'])} class BitFlyer(ExchangeBase): - def get_rates(self, ccy): - json = self.get_json('bitflyer.jp', '/api/echo/price') + async def get_rates(self, ccy): + json = await self.get_json('bitflyer.jp', '/api/echo/price') return {'JPY': Decimal(json['mid'])} class Bitmarket(ExchangeBase): - def get_rates(self, ccy): - json = self.get_json('www.bitmarket.pl', '/json/BTCPLN/ticker.json') + async def get_rates(self, ccy): + json = await self.get_json('www.bitmarket.pl', '/json/BTCPLN/ticker.json') return {'PLN': Decimal(json['last'])} class BitPay(ExchangeBase): - def get_rates(self, ccy): - json = self.get_json('bitpay.com', '/api/rates') + async def get_rates(self, ccy): + json = await self.get_json('bitpay.com', '/api/rates') return dict([(r['code'], Decimal(r['rate'])) for r in json]) class Bitso(ExchangeBase): - def get_rates(self, ccy): - json = self.get_json('api.bitso.com', '/v2/ticker') + async def get_rates(self, ccy): + json = await self.get_json('api.bitso.com', '/v2/ticker') return {'MXN': Decimal(json['last'])} class BitStamp(ExchangeBase): - def get_rates(self, ccy): - json = self.get_json('www.bitstamp.net', '/api/ticker/') + async def get_rates(self, ccy): + json = await self.get_json('www.bitstamp.net', '/api/ticker/') return {'USD': Decimal(json['last'])} class Bitvalor(ExchangeBase): - def get_rates(self,ccy): - json = self.get_json('api.bitvalor.com', '/v1/ticker.json') + async def get_rates(self,ccy): + json = await self.get_json('api.bitvalor.com', '/v1/ticker.json') return {'BRL': Decimal(json['ticker_1h']['total']['last'])} class BlockchainInfo(ExchangeBase): - def get_rates(self, ccy): - json = self.get_json('blockchain.info', '/ticker') + async def get_rates(self, ccy): + json = await self.get_json('blockchain.info', '/ticker') return dict([(r, Decimal(json[r]['15m'])) for r in json]) class BTCChina(ExchangeBase): - def get_rates(self, ccy): - json = self.get_json('data.btcchina.com', '/data/ticker') + async def get_rates(self, ccy): + json = await self.get_json('data.btcchina.com', '/data/ticker') return {'CNY': Decimal(json['ticker']['last'])} class BTCParalelo(ExchangeBase): - def get_rates(self, ccy): - json = self.get_json('btcparalelo.com', '/api/price') + async def get_rates(self, ccy): + json = await self.get_json('btcparalelo.com', '/api/price') return {'VEF': Decimal(json['price'])} class Coinbase(ExchangeBase): - def get_rates(self, ccy): - json = self.get_json('coinbase.com', + async def get_rates(self, ccy): + json = await self.get_json('coinbase.com', '/api/v1/currencies/exchange_rates') return dict([(r[7:].upper(), Decimal(json[r])) for r in json if r.startswith('btc_to_')]) @@ -240,13 +253,13 @@ class Coinbase(ExchangeBase): class CoinDesk(ExchangeBase): - def get_currencies(self): - dicts = self.get_json('api.coindesk.com', + async def get_currencies(self): + dicts = await self.get_json('api.coindesk.com', '/v1/bpi/supported-currencies.json') return [d['currency'] for d in dicts] - def get_rates(self, ccy): - json = self.get_json('api.coindesk.com', + async def get_rates(self, ccy): + json = await self.get_json('api.coindesk.com', '/v1/bpi/currentprice/%s.json' % ccy) result = {ccy: Decimal(json['bpi'][ccy]['rate_float'])} return result @@ -257,35 +270,35 @@ class CoinDesk(ExchangeBase): def history_ccys(self): return self.history_starts().keys() - def request_history(self, ccy): + async def request_history(self, ccy): start = self.history_starts()[ccy] end = datetime.today().strftime('%Y-%m-%d') # Note ?currency and ?index don't work as documented. Sigh. query = ('/v1/bpi/historical/close.json?start=%s&end=%s' % (start, end)) - json = self.get_json('api.coindesk.com', query) + json = await self.get_json('api.coindesk.com', query) return json['bpi'] class Coinsecure(ExchangeBase): - def get_rates(self, ccy): - json = self.get_json('api.coinsecure.in', '/v0/noauth/newticker') + async def get_rates(self, ccy): + json = await self.get_json('api.coinsecure.in', '/v0/noauth/newticker') return {'INR': Decimal(json['lastprice'] / 100.0 )} class Foxbit(ExchangeBase): - def get_rates(self,ccy): - json = self.get_json('api.bitvalor.com', '/v1/ticker.json') + async def get_rates(self,ccy): + json = await self.get_json('api.bitvalor.com', '/v1/ticker.json') return {'BRL': Decimal(json['ticker_1h']['exchanges']['FOX']['last'])} class itBit(ExchangeBase): - def get_rates(self, ccy): + async def get_rates(self, ccy): ccys = ['USD', 'EUR', 'SGD'] - json = self.get_json('api.itbit.com', '/v1/markets/XBT%s/ticker' % ccy) + json = await self.get_json('api.itbit.com', '/v1/markets/XBT%s/ticker' % ccy) result = dict.fromkeys(ccys) if ccy in ccys: result[ccy] = Decimal(json['lastPrice']) @@ -294,10 +307,10 @@ class itBit(ExchangeBase): class Kraken(ExchangeBase): - def get_rates(self, ccy): + async def get_rates(self, ccy): ccys = ['EUR', 'USD', 'CAD', 'GBP', 'JPY'] pairs = ['XBT%s' % c for c in ccys] - json = self.get_json('api.kraken.com', + json = await self.get_json('api.kraken.com', '/0/public/Ticker?pair=%s' % ','.join(pairs)) return dict((k[-3:], Decimal(float(v['c'][0]))) for k, v in json['result'].items()) @@ -305,45 +318,45 @@ class Kraken(ExchangeBase): class LocalBitcoins(ExchangeBase): - def get_rates(self, ccy): - json = self.get_json('localbitcoins.com', + async def get_rates(self, ccy): + json = await self.get_json('localbitcoins.com', '/bitcoinaverage/ticker-all-currencies/') return dict([(r, Decimal(json[r]['rates']['last'])) for r in json]) class MercadoBitcoin(ExchangeBase): - def get_rates(self, ccy): - json = self.get_json('api.bitvalor.com', '/v1/ticker.json') + async def get_rates(self, ccy): + json = await self.get_json('api.bitvalor.com', '/v1/ticker.json') return {'BRL': Decimal(json['ticker_1h']['exchanges']['MBT']['last'])} class NegocieCoins(ExchangeBase): - def get_rates(self,ccy): - json = self.get_json('api.bitvalor.com', '/v1/ticker.json') + async def get_rates(self,ccy): + json = await self.get_json('api.bitvalor.com', '/v1/ticker.json') return {'BRL': Decimal(json['ticker_1h']['exchanges']['NEG']['last'])} class TheRockTrading(ExchangeBase): - def get_rates(self, ccy): - json = self.get_json('api.therocktrading.com', + async def get_rates(self, ccy): + json = await self.get_json('api.therocktrading.com', '/v1/funds/BTCEUR/ticker') return {'EUR': Decimal(json['last'])} class Unocoin(ExchangeBase): - def get_rates(self, ccy): - json = self.get_json('www.unocoin.com', 'trade?buy') + async def get_rates(self, ccy): + json = await self.get_json('www.unocoin.com', 'trade?buy') return {'INR': Decimal(json)} class WEX(ExchangeBase): - def get_rates(self, ccy): - json_eur = self.get_json('wex.nz', '/api/3/ticker/btc_eur') - json_rub = self.get_json('wex.nz', '/api/3/ticker/btc_rur') - json_usd = self.get_json('wex.nz', '/api/3/ticker/btc_usd') + async def get_rates(self, ccy): + json_eur = await self.get_json('wex.nz', '/api/3/ticker/btc_eur') + json_rub = await self.get_json('wex.nz', '/api/3/ticker/btc_rur') + json_usd = await self.get_json('wex.nz', '/api/3/ticker/btc_usd') return {'EUR': Decimal(json_eur['btc_eur']['last']), 'RUB': Decimal(json_rub['btc_rur']['last']), 'USD': Decimal(json_usd['btc_usd']['last'])} @@ -351,15 +364,15 @@ class WEX(ExchangeBase): class Winkdex(ExchangeBase): - def get_rates(self, ccy): - json = self.get_json('winkdex.com', '/api/v0/price') + async def get_rates(self, ccy): + json = await self.get_json('winkdex.com', '/api/v0/price') return {'USD': Decimal(json['price'] / 100.0)} def history_ccys(self): return ['USD'] - def request_history(self, ccy): - json = self.get_json('winkdex.com', + async def request_history(self, ccy): + json = await self.get_json('winkdex.com', "/api/v0/series?start_time=1342915200") history = json['series'][0]['results'] return dict([(h['timestamp'][:10], h['price'] / 100.0) @@ -367,8 +380,8 @@ class Winkdex(ExchangeBase): class Zaif(ExchangeBase): - def get_rates(self, ccy): - json = self.get_json('api.zaif.jp', '/api/1/last_price/btc_jpy') + async def get_rates(self, ccy): + json = await self.get_json('api.zaif.jp', '/api/1/last_price/btc_jpy') return {'JPY': Decimal(json['last_price'])} @@ -381,7 +394,6 @@ def dictinvert(d): return inv def get_exchanges_and_currencies(): - import os, json path = os.path.join(os.path.dirname(__file__), 'currencies.json') try: with open(path, 'r', encoding='utf-8') as f: @@ -426,13 +438,22 @@ class FxThread(ThreadJob): def __init__(self, config, network): self.config = config self.network = network + self.network.register_callback(self.set_proxy, ['proxy_set']) self.ccy = self.get_currency() self.history_used_spot = False self.ccy_combo = None self.hist_checkbox = None self.cache_dir = os.path.join(config.path, 'cache') + self.trigger = asyncio.Event() + self.trigger.set() self.set_exchange(self.config_exchange()) make_dir(self.cache_dir) + self.set_proxy('bogus', self.network.proxy) + + def set_proxy(self, trigger_name, *args): + global PROXY + PROXY = args[0] + self.trigger.set() def get_currencies(self, h): d = get_exchanges_by_ccy(h) @@ -451,13 +472,18 @@ class FxThread(ThreadJob): rounded_amount = amount return fmt_str.format(rounded_amount) - def run(self): - # This runs from the plugins thread which catches exceptions - if self.is_enabled(): - if self.timeout ==0 and self.show_history(): - self.exchange.get_historical_rates(self.ccy, self.cache_dir) - if self.timeout <= time.time(): - self.timeout = time.time() + 150 + async def run(self): + while True: + try: + await asyncio.wait_for(self.trigger.wait(), 150) + except concurrent.futures.TimeoutError: + pass + else: + self.trigger.clear() + if self.is_enabled(): + if self.show_history(): + self.exchange.get_historical_rates(self.ccy, self.cache_dir) + if self.is_enabled(): self.exchange.update(self.ccy) def is_enabled(self): @@ -497,7 +523,7 @@ class FxThread(ThreadJob): def set_currency(self, ccy): self.ccy = ccy self.config.set_key('currency', ccy, True) - self.timeout = 0 # Because self.ccy changes + self.trigger.set() # Because self.ccy changes self.on_quotes() def set_exchange(self, name): @@ -508,7 +534,7 @@ class FxThread(ThreadJob): self.exchange = class_(self.on_quotes, self.on_history) # A new exchange means new fx quotes, initially empty. Force # a quote refresh - self.timeout = 0 + self.trigger.set() self.exchange.read_historical_rates(self.ccy, self.cache_dir) def on_quotes(self): diff --git a/electrum/gui/kivy/uix/dialogs/crash_reporter.py b/electrum/gui/kivy/uix/dialogs/crash_reporter.py index 04582b95..00e96f2f 100644 --- a/electrum/gui/kivy/uix/dialogs/crash_reporter.py +++ b/electrum/gui/kivy/uix/dialogs/crash_reporter.py @@ -1,6 +1,7 @@ import sys +import json -import requests +from aiohttp.client_exceptions import ClientError from kivy import base, utils from kivy.clock import Clock from kivy.core.window import Window @@ -102,6 +103,11 @@ class CrashReporter(BaseCrashReporter, Factory.Popup): self.ids.crash_message.text = BaseCrashReporter.CRASH_MESSAGE self.ids.request_help_message.text = BaseCrashReporter.REQUEST_HELP_MESSAGE self.ids.describe_error_message.text = BaseCrashReporter.DESCRIBE_ERROR_MESSAGE + self.proxy = self.main_window.network.proxy + self.main_window.network.register_callback(self.set_proxy, ['proxy_set']) + + def set_proxy(self, evt, proxy): + self.proxy = proxy def show_contents(self): details = CrashReportDetails(self.get_report_string()) @@ -115,8 +121,8 @@ class CrashReporter(BaseCrashReporter, Factory.Popup): def send_report(self): try: - response = BaseCrashReporter.send_report(self, "/crash.json").json() - except requests.exceptions.RequestException: + response = json.loads(BaseCrashReporter.send_report(self, self.main_window.network.asyncio_loop, self.proxy, "/crash.json")) + except (ValueError, ClientError): self.show_popup(_('Unable to send report'), _("Please check your network connection.")) else: self.show_popup(_('Report sent'), response["text"]) diff --git a/electrum/gui/qt/exception_window.py b/electrum/gui/qt/exception_window.py index 1774a043..c4e337f1 100644 --- a/electrum/gui/qt/exception_window.py +++ b/electrum/gui/qt/exception_window.py @@ -41,6 +41,10 @@ class Exception_Window(BaseCrashReporter, QWidget, MessageBoxMixin): def __init__(self, main_window, exctype, value, tb): BaseCrashReporter.__init__(self, exctype, value, tb) self.main_window = main_window + + self.proxy = self.main_window.network.proxy + self.main_window.network.register_callback(self.set_proxy, ['proxy_set']) + QWidget.__init__(self) self.setWindowTitle('Electrum - ' + _('An Error Occurred')) self.setMinimumSize(600, 300) @@ -88,16 +92,19 @@ class Exception_Window(BaseCrashReporter, QWidget, MessageBoxMixin): self.setLayout(main_box) self.show() + def set_proxy(self, evt, proxy): + self.proxy = proxy + def send_report(self): try: - response = BaseCrashReporter.send_report(self) + response = BaseCrashReporter.send_report(self, self.main_window.network.asyncio_loop, self.proxy) except BaseException as e: traceback.print_exc(file=sys.stderr) self.main_window.show_critical(_('There was a problem with the automatic reporting:') + '\n' + str(e) + '\n' + _("Please report this issue manually.")) return - QMessageBox.about(self, _("Crash report"), response.text) + QMessageBox.about(self, _("Crash report"), response) self.close() def on_close(self): diff --git a/electrum/network.py b/electrum/network.py index f0aa4a61..7d6e4950 100644 --- a/electrum/network.py +++ b/electrum/network.py @@ -110,7 +110,7 @@ def pick_random_server(hostmap = None, protocol = 's', exclude_set = set()): from .simple_config import SimpleConfig -proxy_modes = ['socks4', 'socks5', 'http'] +proxy_modes = ['socks4', 'socks5'] def serialize_proxy(p): @@ -437,6 +437,7 @@ class Network(PrintError): socket.getaddrinfo = self._fast_getaddrinfo else: socket.getaddrinfo = socket._getaddrinfo + self.trigger_callback('proxy_set', self.proxy) @staticmethod def _fast_getaddrinfo(host, *args, **kwargs): @@ -710,9 +711,13 @@ class Network(PrintError): with b.lock: b.update_size() - def _run(self): + def _run(self, fx): self.init_headers_file() - self.gat = self.asyncio_loop.create_task(self.maintain_sessions()) + jobs = [self.maintain_sessions()] + if fx: + jobs.append(fx) + jobs = [self.asyncio_loop.create_task(x) for x in jobs] + self.gat = asyncio.gather(*jobs) try: self.asyncio_loop.run_until_complete(self.gat) except concurrent.futures.CancelledError: @@ -789,8 +794,8 @@ class Network(PrintError): def max_checkpoint(cls): return max(0, len(constants.net.CHECKPOINTS) * 2016 - 1) - def start(self): - self.fut = threading.Thread(target=self._run) + def start(self, fx=None): + self.fut = threading.Thread(target=self._run, args=(fx,)) self.fut.start() def stop(self): diff --git a/electrum/plugins/labels/labels.py b/electrum/plugins/labels/labels.py index d5fa50b2..cf0833c5 100644 --- a/electrum/plugins/labels/labels.py +++ b/electrum/plugins/labels/labels.py @@ -1,6 +1,6 @@ +import asyncio import hashlib import requests -import threading import json import sys import traceback @@ -10,7 +10,7 @@ import base64 from electrum.plugin import BasePlugin, hook from electrum.crypto import aes_encrypt_with_iv, aes_decrypt_with_iv from electrum.i18n import _ - +from electrum.util import aiosafe, make_aiohttp_session class LabelsPlugin(BasePlugin): @@ -18,11 +18,11 @@ class LabelsPlugin(BasePlugin): BasePlugin.__init__(self, parent, config, name) self.target_host = 'labels.electrum.org' self.wallets = {} + self.proxy = None def encode(self, wallet, msg): password, iv, wallet_id = self.wallets[wallet] - encrypted = aes_encrypt_with_iv(password, iv, - msg.encode('utf8')) + encrypted = aes_encrypt_with_iv(password, iv, msg.encode('utf8')) return base64.b64encode(encrypted).decode() def decode(self, wallet, message): @@ -55,37 +55,27 @@ class LabelsPlugin(BasePlugin): "walletNonce": nonce, "externalId": self.encode(wallet, item), "encryptedLabel": self.encode(wallet, label)} - t = threading.Thread(target=self.do_request_safe, - args=["POST", "/label", False, bundle]) - t.setDaemon(True) - t.start() + asyncio.get_event_loop().create_task(self.do_post_safe("/label", False, bundle)) # Caller will write the wallet self.set_nonce(wallet, nonce + 1) - def do_request(self, method, url = "/labels", is_batch=False, data=None): + @aiosafe + async def do_post_safe(self, *args): + await self.do_post(*args) + + async def do_get(self, url = "/labels"): url = 'https://' + self.target_host + url - kwargs = {'headers': {}} - if method == 'GET' and data: - kwargs['params'] = data - elif method == 'POST' and data: - kwargs['data'] = json.dumps(data) - kwargs['headers']['Content-Type'] = 'application/json' - response = requests.request(method, url, **kwargs) - if response.status_code != 200: - raise Exception(response.status_code, response.text) - response = response.json() - if "error" in response: - raise Exception(response["error"]) - return response + async with make_aiohttp_session(self.proxy) as session: + async with session.get(url) as result: + return await result.json() - def do_request_safe(self, *args, **kwargs): - try: - self.do_request(*args, **kwargs) - except BaseException as e: - #traceback.print_exc(file=sys.stderr) - self.print_error('error doing request') + async def do_post(self, url = "/labels", data=None): + url = 'https://' + self.target_host + url + async with make_aiohttp_session(self.proxy) as session: + async with session.post(url, data=data) as result: + return await result.json() - def push_thread(self, wallet): + async def push_thread(self, wallet): wallet_data = self.wallets.get(wallet, None) if not wallet_data: raise Exception('Wallet {} not loaded'.format(wallet)) @@ -102,16 +92,16 @@ class LabelsPlugin(BasePlugin): continue bundle["labels"].append({'encryptedLabel': encoded_value, 'externalId': encoded_key}) - self.do_request("POST", "/labels", True, bundle) + await self.do_post("/labels", bundle) - def pull_thread(self, wallet, force): + async def pull_thread(self, wallet, force): wallet_data = self.wallets.get(wallet, None) if not wallet_data: raise Exception('Wallet {} not loaded'.format(wallet)) wallet_id = wallet_data[2] nonce = 1 if force else self.get_nonce(wallet) - 1 self.print_error("asking for labels since nonce", nonce) - response = self.do_request("GET", ("/labels/since/%d/for/%s" % (nonce, wallet_id) )) + response = await self.do_get("/labels/since/%d/for/%s" % (nonce, wallet_id)) if response["labels"] is None: self.print_error('no new labels') return @@ -140,12 +130,15 @@ class LabelsPlugin(BasePlugin): self.set_nonce(wallet, response["nonce"] + 1) self.on_pulled(wallet) - def pull_thread_safe(self, wallet, force): - try: - self.pull_thread(wallet, force) - except BaseException as e: - # traceback.print_exc(file=sys.stderr) - self.print_error('could not retrieve labels') + @aiosafe + async def pull_safe_thread(self, wallet, force): + await self.pull_thread(wallet, force) + + def pull(self, wallet, force): + return asyncio.run_coroutine_threadsafe(self.pull_thread(wallet, force), wallet.network.asyncio_loop).result() + + def push(self, wallet): + return asyncio.run_coroutine_threadsafe(self.push_thread(wallet), wallet.network.asyncio_loop).result() def start_wallet(self, wallet): nonce = self.get_nonce(wallet) @@ -159,9 +152,14 @@ class LabelsPlugin(BasePlugin): wallet_id = hashlib.sha256(mpk).hexdigest() self.wallets[wallet] = (password, iv, wallet_id) # If there is an auth token we can try to actually start syncing - t = threading.Thread(target=self.pull_thread_safe, args=(wallet, False)) - t.setDaemon(True) - t.start() + asyncio.get_event_loop().create_task(self.pull_safe_thread(wallet, False)) + self.proxy = wallet.network.proxy + wallet.network.register_callback(self.set_proxy, ['proxy_set']) def stop_wallet(self, wallet): + wallet.network.unregister_callback('proxy_set') self.wallets.pop(wallet, None) + + def set_proxy(self, evt_name, new_proxy): + self.proxy = new_proxy + self.print_error("proxy set") diff --git a/electrum/plugins/labels/qt.py b/electrum/plugins/labels/qt.py index df4ae55c..2a66d98e 100644 --- a/electrum/plugins/labels/qt.py +++ b/electrum/plugins/labels/qt.py @@ -38,11 +38,11 @@ class Plugin(LabelsPlugin): hbox = QHBoxLayout() hbox.addWidget(QLabel("Label sync options:")) upload = ThreadedButton("Force upload", - partial(self.push_thread, wallet), + partial(self.push, wallet), partial(self.done_processing_success, d), partial(self.done_processing_error, d)) download = ThreadedButton("Force download", - partial(self.pull_thread, wallet, True), + partial(self.pull, wallet, True), partial(self.done_processing_success, d), partial(self.done_processing_error, d)) vbox = QVBoxLayout() diff --git a/electrum/util.py b/electrum/util.py index 4a3629cd..61f0b9f5 100644 --- a/electrum/util.py +++ b/electrum/util.py @@ -37,6 +37,8 @@ from locale import localeconv from .i18n import _ +import aiohttp +from aiohttp_socks import SocksConnector, SocksVer import urllib.request, urllib.parse, urllib.error import queue @@ -947,3 +949,17 @@ VerifiedTxInfo = NamedTuple("VerifiedTxInfo", [("height", int), ("timestamp", int), ("txpos", int), ("header_hash", str)]) + +def make_aiohttp_session(proxy): + if proxy: + connector = SocksConnector( + socks_ver=SocksVer.SOCKS5 if proxy['mode'] == 'socks5' else SocksVer.SOCKS4, + host=proxy['host'], + port=int(proxy['port']), + username=proxy.get('user', None), + password=proxy.get('password', None), + rdns=True + ) + return aiohttp.ClientSession(headers={'User-Agent' : 'Electrum'}, timeout=aiohttp.ClientTimeout(total=10), connector=connector) + else: + return aiohttp.ClientSession(headers={'User-Agent' : 'Electrum'}, timeout=aiohttp.ClientTimeout(total=10)) From 0ad504bdf0afe24167f27e0922f5e53b77d205fd Mon Sep 17 00:00:00 2001 From: SomberNight Date: Thu, 6 Sep 2018 16:45:43 +0200 Subject: [PATCH 073/138] interface: catch many common exceptions explicitly --- electrum/interface.py | 29 +++++++++++++++++++++++++---- electrum/network.py | 2 +- electrum/util.py | 9 +++++++++ 3 files changed, 35 insertions(+), 5 deletions(-) diff --git a/electrum/interface.py b/electrum/interface.py index 19581bf9..d0e63f2f 100644 --- a/electrum/interface.py +++ b/electrum/interface.py @@ -36,7 +36,7 @@ from aiorpcx import ClientSession, Notification import requests -from .util import PrintError, aiosafe, bfh +from .util import PrintError, aiosafe, bfh, AIOSafeSilentException ca_path = requests.certs.where() @@ -68,6 +68,10 @@ class NotificationSession(ClientSession): assert False, request.method + +class GracefulDisconnect(AIOSafeSilentException): pass + + class Interface(PrintError): def __init__(self, network, server, config_path, proxy): @@ -134,7 +138,12 @@ class Interface(PrintError): os.unlink(self.cert_path) exists = False if not exists: - ca_signed = await self.is_server_ca_signed(ca_sslc) + try: + ca_signed = await self.is_server_ca_signed(ca_sslc) + except (ConnectionRefusedError, socket.gaierror) as e: + self.print_error('disconnecting due to: {}'.format(e)) + self.exception = e + return if ca_signed: with open(self.cert_path, 'w') as f: # empty file means this is CA signed, not self-signed @@ -147,7 +156,13 @@ class Interface(PrintError): else: sslc = ssl.create_default_context(ssl.Purpose.SERVER_AUTH, cafile=self.cert_path) sslc.check_hostname = 0 - await self.open_session(sslc, exit_early=False) + try: + await self.open_session(sslc, exit_early=False) + except (asyncio.CancelledError, ConnectionRefusedError, socket.gaierror, ssl.SSLError, TimeoutError) as e: + self.print_error('disconnecting due to: {}'.format(e)) + self.exception = e + return + # should never get here (can only exit via exception) assert False def mark_ready(self): @@ -204,7 +219,10 @@ class Interface(PrintError): header_queue = asyncio.Queue() self.session = NotificationSession(None, header_queue, self.host, self.port, ssl=sslc, proxy=self.proxy) async with self.session as session: - ver = await session.send_request('server.version', [ELECTRUM_VERSION, PROTOCOL_VERSION]) + try: + ver = await session.send_request('server.version', [ELECTRUM_VERSION, PROTOCOL_VERSION]) + except aiorpcx.jsonrpc.RPCError as e: + raise GracefulDisconnect(e) # probably 'unsupported protocol version' if exit_early: return self.print_error(ver, self.host) @@ -228,6 +246,9 @@ class Interface(PrintError): @aiosafe async def run_fetch_blocks(self, sub_reply, replies): + if self.tip < self.network.max_checkpoint(): + raise GracefulDisconnect('server tip below max checkpoint') + async with self.network.bhi_lock: height = self.blockchain.height()+1 await replies.put(blockchain.deserialize_header(bfh(sub_reply['hex']), sub_reply['height'])) diff --git a/electrum/network.py b/electrum/network.py index f0aa4a61..631178ae 100644 --- a/electrum/network.py +++ b/electrum/network.py @@ -817,7 +817,7 @@ class Network(PrintError): try: raise i.exception except BaseException as e: - self.print_error(i.server, "errored because", str(e), str(type(e))) + self.print_error(i.server, "errored because:", str(e), str(type(e))) remove.append(k) changed = False for k in remove: diff --git a/electrum/util.py b/electrum/util.py index 4a3629cd..571c57f6 100644 --- a/electrum/util.py +++ b/electrum/util.py @@ -34,6 +34,7 @@ import hmac import stat import inspect from locale import localeconv +import asyncio from .i18n import _ @@ -925,6 +926,10 @@ def make_dir(path, allow_symlink=True): os.mkdir(path) os.chmod(path, stat.S_IRUSR | stat.S_IWUSR | stat.S_IXUSR) + +class AIOSafeSilentException(Exception): pass + + def aiosafe(f): # save exception in object. # f must be a method of a PrintError instance. @@ -933,6 +938,10 @@ def aiosafe(f): self = args[0] try: return await f(*args, **kwargs) + except AIOSafeSilentException as e: + self.exception = e + except asyncio.CancelledError as e: + self.exception = e except BaseException as e: self.print_error("Exception in", f.__name__, ":", e.__class__.__name__, str(e)) traceback.print_exc(file=sys.stderr) From be50394f1163c248ac7fe84e14d4cb7c2f42ac5c Mon Sep 17 00:00:00 2001 From: Janus Date: Thu, 6 Sep 2018 17:18:26 +0200 Subject: [PATCH 074/138] aiorpcx: increase crash reporter timeout, avoid is_running in kivy --- electrum/base_crash_reporter.py | 2 +- electrum/gui/kivy/main_window.py | 2 +- electrum/gui/kivy/theming/light-0.png | Bin 0 -> 480803 bytes electrum/gui/kivy/theming/light.atlas | 1 + 4 files changed, 3 insertions(+), 2 deletions(-) create mode 100644 electrum/gui/kivy/theming/light-0.png create mode 100644 electrum/gui/kivy/theming/light.atlas diff --git a/electrum/base_crash_reporter.py b/electrum/base_crash_reporter.py index 6cd94a49..cc63159c 100644 --- a/electrum/base_crash_reporter.py +++ b/electrum/base_crash_reporter.py @@ -68,7 +68,7 @@ class BaseCrashReporter: report.update(self.get_additional_info()) report = json.dumps(report) coro = self.do_post(proxy, BaseCrashReporter.report_server + endpoint, data=report) - response = asyncio.run_coroutine_threadsafe(coro, asyncio_loop).result(1) + response = asyncio.run_coroutine_threadsafe(coro, asyncio_loop).result(5) return response async def do_post(self, proxy, url, data): diff --git a/electrum/gui/kivy/main_window.py b/electrum/gui/kivy/main_window.py index 2ea871e2..0fd45be8 100644 --- a/electrum/gui/kivy/main_window.py +++ b/electrum/gui/kivy/main_window.py @@ -697,7 +697,7 @@ class ElectrumWindow(App): if not self.wallet: self.status = _("No Wallet") return - if self.network is None or not self.network.is_running(): + if self.network is None or not self.network.is_connected(): status = _("Offline") elif self.network.is_connected(): server_height = self.network.get_server_height() diff --git a/electrum/gui/kivy/theming/light-0.png b/electrum/gui/kivy/theming/light-0.png new file mode 100644 index 0000000000000000000000000000000000000000..c418938ae505e7c0c6c035f71940164eee06e176 GIT binary patch literal 480803 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 TCiaS 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

y%14;_zXL>Z4!xqZi&u1z?@ z<3ObzHa!p%#?xo%%0zWq;fr{>5riDD>UbKf3S;Ps0&kwKYJ!hJL+`h##BfJyGIufs zNBJju{uHWg2jV=yRJ66tVp9IwE}bFXsFLV9pj9rQyN+iE#IzccS3g5*S@q*n)l� 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�=me7jtm(-e7EQN^op7Sq-4NwtfIdH7LGDYt+SW+ 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

6VNh69Pu4fZ`DU~%(H-jdw)*PcwQ6mfD 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%0AW7%v6h?eUo&YK(~{0K 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 DeC`tS7V&~ zAJ5-I_L6U6X1F{tv23!^w_Bmf7P8%)O$;9GzS5`JeBBkEvbnU2_PefN)N7ptPT4$7 zD=Lx&sr?=TS{@M(-b6fO$0p^$xZdN>@e^$jG&cfaGr5aT`DGsBmP`KTLtH!4VWz1VRT<@cLtKF> zutf#f!e@j}TL}RCy-wABor3#Q_=hnApfgGnL0Q0hgxswxWvi}CI3w4W{hS!ybi%!d zUS)Ix=we`;YRl0I$-8MHjdg7Y+=8cg*DIj2%#)iD}Txz)?A2RN}BE&F4mah)Pp_RhzfHH}Wm7$Oy`Sjx}zw)-fyH zzm_x-b%n5-B)l4%(3lWRNCs}x%guALxc1b@+R5m(TO&99fn5`$X*@9N4XSIX?!-&C`}opHe{7-BO@$mAJWoqCj2kUC-Sqcm9Nld>!w}du zYS`KIJhyX~*uD>D&QmOA9eS3_%xdOjEkfuhjS{0yCWkV5bYrQDzh;iCcrfS^N!|8_ zPDX|hQY43I7Kd-Z%~cxSbV6VDbA`h~=DISrX=DwJ>uA@t$MfG7wy=dQY~lZI?Em(o z=g^tI6nk*sb^U+5zpwwszl1mbCC&1Ccx$`c$T|hQ=btIxe-)!~+P^6QTY%Ra;@e)$ z4i7=oTcoMN(|-Ho!)#n-9J-z)4&P1#Uo5JJ*-=8B0--&jQ4IHL>@dMN9|!kNVR z3#0Ztrs2YGseSU_8jk#Y%{#7u^B%LRC%mA`Lz&(AmEX7IIz*z>BK>`@tEckVEg1r^D~ zqcVzujv=c}7VJhzXI~SfAYukZ**J4G4gxsQ_>U|-q&@^O>5cbUqrahGv&U&hgREUC3t#0*ZZ znqj#r_T{kWOi}C>%d?{LLLM{Q3*Y^0TOhH*w?l-+17?Z~VfQiaOh$MaX^~xPgs$ zR`(0O`Kj=Szex6pYq+RW@SHKBQ5pKCS8{SDCyZr|DcRltPkRjAFM2FR8~E?^Hjh&e zoT3nzw%DI4{BJhopK@K`&XcXs>#6fRb>1nfUc`%Er zfyqZ^wuk$3%DQ>n=9(sM%xjwr$YY$M78R!$n(s}y@nI*qG#8=M5Qh;~W-|um&~vvQ z5%qCvZb8iS>`+S02vkASv|-eu6pXVvT{Z5+CU1qgDM>hqU_n$iC4*697(`zyX!j*#Yb@^soz3 zxg3#WGUQz8yF5(?YqQr!O(yHH+F&w5TK_Q{*H|@jL!!&q;09C$7=n*SaolDG>0;~) z#yq=}_(5TVc;*WHH#F5-99OR*5K&z!R;8K~gSdRfD7@%JmHvv2s($Qwnf82D=I)nw z{Isu;LJ{a>a+p-!B1U@{Q(go^7DQHq6^OaXI#6_ykl#oQgU~24OWF1T*c|6VPD-Pk zxHBEeD$7~ovDsGB2vt^hgl9^Kwp@xkkDEJ=Fery!na!kF(*fs!5I58echU0SU*pJA zZ@C*2wIu82c7HBtwg<|ssw)rrQm-rZ3rw*=zOzIFURjC$3FOc_Lxf8$odw#^0;Wt2 zh9H@wIkRtvc%6pFkLbe?yLljHqKT1Ul#h^B9OEF(dCh&;t3Lk6UW~Kn!DTlCFZ%Q^ zu!SvbVGI9xvH#m|*+X~lPowZ1jEzCv4m{`$gZ&SB{cmynqd#-tZI536JXiB`ia&e< z=p35$f8;O5)c@WL`mH}={f=dtNwoT@^;4ihL;QoEWm~n%B%0DB`_L(Ctv7g#n}Yyu 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

y%14;_zXL>Z4!xqZi&u1z?@ z<3ObzHa!p%#?xo%%0zWq;fr{>5riDD>UbKf3S;Ps0&kwKYJ!hJL+`h##BfJyGIufs zNBJju{uHWg2jV=yRJ66tVp9IwE}bFXsFLV9pj9rQyN+iE#IzccS3g5*S@q*n)l� zNC~8_2XihzxPaW3L4vYe9=hLz2Fh(Uuebe7_(O3)j%0M*gm|s7fu7i1GQq~x5ah0z zoLR7{gbo-vsB6K-%aIcXXu3GpNQw4Ymaf)Pfpsf1T$q&P2e-tEti|`WfA`qLf9pXs z=Dhwc`XYs<`km83^c!+A>h_2$9mg=Hel^V;<~Y;)H(g$wE^$+S2L?tBQU1qr z8r_8J*EDQi$?6ldr=KK_{M>nt?&=cuY_au~DE2!`j10sUx|mY^d-&^{xHlDAY>N~P zE+`HQoNS*m`(=rQUrxtfb*km75K4BveJ~IBa9i80UWvFcgN-~%G9s-ii*HLSzlawd zW((nEhTiPYyvMm%takLVZhC-`8;-M4NBHC^Xkg>4etFnVOFw)I%8RD;E33bGen6<{ zj7xbMS+eqhP!wVY?U47DPw2hw6)m;zR&ogzt`CMoW1$J|llYS1FbNC<89KC>MBi@m+y zX7|gt#)^TEut(#bHG6*Locc>qx5*4MnBKidq_f4en`!$6uub4jjF$4?**XHOgd(Je zY-$I*&LYD2B`WwqJ=fh~(=tYh==Sw#XELwFZ+SV>#+e{lIXH?03ox35L-Cs7F=#(F zEjQ|&niBW@A&JDVl}bn_X)>#PvDZy{K{IAZcoJ@SR`CfH6YU^Jh&`J_S#e^CVUXG( zK5a*~`F!`lKzv@)02bL47oI0h&j*-qw_Rwn1F@%&OAGgfRo%r zo-_N9m0gQvhw{G!IsTVjBQV{cIR1H`D8ykF2h~xQR=LP9dSNc)aQnp<+VQKe{pt*3 z!m(b;Yr&N4ZF1%T#+~3S-bk(2EyHQ2`-aCP=qTH>Xy4=h#yXXhm>ASr_AnmRtf*!2 zj!mo(ubf9sVmebre@bRsGs6cCcN!9`j&ACcJI*Q7++a$7pIF1Ge<)3R;!R}V$W&4C z4(+DQ3-C_98#mG&C-6B?$Yuxd@~*Vh=W2=&ZRTPdN{L9$dcg+odX`H)C;es?%55*w z>GAXt-y0mR0>UAV`Ub~X@=iuPFub}pkMr?o8~Jvf zpPj<(QtySQl1csQ?awyR+G!{__B3*cd@t#+)CS%nn*d25gh&k;#3Tfb%5(rtO zkm(E1;4{Si`u!mW7~(>JOE&)pvjoAT25%*4$YN8`Ynznqq8{6yMILH_$k9dRrPBUI z8Vi%3Nj3Jk899V{J!s!Rrnlh~}^19ipyS$|X!Vj@A$lNewgX%T(8Mhjd zqX$N!wOZ@QPcOZ?_w>@6-Tk2rjl7^N0ag9>AGPGQs1&no^&iPjsbig*&_XxX1)KPM zXgfxkGlI`IU6zJ1>`>cDIv+lpciZ4;amW^Yq|MvzP`3-Bz*_(L@pgRBr((*>(Mk94 zV=zY+WB%P@)n_iDiem`7LsYBTm94nLA2!=(0VTA#2LYYilLUf*HMC{-oss7G*qmZW zYS}d^MI4WrEA{ScB7g zcCwKOhnn`8?6%_uEIYyx!eoxaPDn;?mT=yoczJVV9o2wR8Q;_dpbaV0F zJR=QhIsVyS_Rn-Exq&;<2|@Z0>-+EN*y+`J#w8VE#hdQ?GW;?*a)*#jx3iUll$PtG zg5WHo`BPtge@SiSGuQKu=v?-X$C}G6I|a}Tv*(>UK>l2Nz^4w^xZrZ|n{;~;0sv7A zPDLyZ_@PSB^m$mF1@2=$fb}_^?}v%Q;dsx1L;3Sse=w$s(K`gF#3qMXaK5xQ%!OU* z4?x~nN}R3HEOxezYcQAMq!j&}Ij36%oqMisZ5tOKA1FhM^{1q^e_)Y4zrILD*gX2~ zZ*2MBUk|o#x|+yfuOMWbGITN5uPmY!LY4Mz;@rsPkg_;uZA;L_%#Bz&I@)^O@ zH*Q~J^2artI!Tv!wYWDk<21^eo_AXUKd5kB{O$^V{Tjj3<~mC7O~@UGqm_ZA#$Mdv zcvg^KJ!Izhj9TQ5b5R}Hp8J2_z^e6IoS(n5w{pL5))Y@YP`ar$^zZt9eVqz#yBIqR zH4R@biAe`|ulVjJeW#@Q?AU%a^U{0Kv9Z9zANKnFC(h2zMA0#C>d$d8BrKdhv#l#o zh8e+muSLg!%)i?;s6|%l5=xZ_huZ7@PKi6~S>*7w2b}`f+f{mVmRLQQ=DScgvO$!I zDcQ}cv2Jo9mGt&Q797dJFocaYE-q{lV1Gqvsmg2*8xlF(WK@2LDV^cy0=sHoD_U2T zwP;G!zk6r6^_x0Zg^7!m&GV_%CeB2UI)F5hPOg38AgW%m2Nrm6)~H5Tu`=6H7{okl zwCL48kxctAEq*X8R{6nfHYeo3f7$4p#F#A4Y0Nl$osZA?>ifcZbMidX-l!6>{h|($ zE6Y*s30VlY8C1Xnzf6!|3O0SH{o?{nn(6}ip39Oyk-d!$^9zC|X<%wcxv@!!s*wks zQBQo9Vu5U~gz%}M9j-Ui_K&Xn2JZjy2#t7>N6=m zB|NAPc|{4maO~hEdY+XCUXeQCJVnj|^=$4pE`iicx(5clgdhParsQS;u6d0ZIv{bR zg0J-%S-2aevqYxv-AFL%;&U&F`pBx(dY(VLxwK^KA&=E~)yQ)cV)zc&sPBLXLiReZ zed#V@Rwppn1gDS7>Q2I(dDld>z8r8O8opHhExGz9r#~~%rGV8mGB{YKkWY+8FKqCu zOmF@pqboC?V*idtm5w#p(}nn4;&sWQpkR`ORC={if3gp(Q-cgm3MAKO53j3HyIr1g zU^(BRLR2;d44{53{{AobDNgm#PWa7`_SE=-#K6^b1)~XpH4h*vB|PaPT$uum-Uea1 zDyCE3gkC&#SS7R1BWXXENXoNC zBo?7Y{hbo84B1jTtIA$T=vr&WM`mcax2&jstlQTrt~uP5X0c( zC5>+KlF#x~4u9$SeH6QhTXzFU4GY$rq;}fqKX`mPv+j*+Q22dw*3U0_lyqwL7E@}Z z&G&+GK~z+oG2U35_s35S0bsDgRjMLg;3euxw?GPVU0KZj!27f_m$T(#zuh--&}+SHmWgf3>ui^fXLtH)D-+H(oy6IY)fp9%XuH($ zDc|sAEW+QX#6dNG>;1|VZl{Z1di-$O0e0t-KU&P~Y`o8;W&xPBJdIi$_H5HF7y=TT z;GS@Cn{#W&HGleOoG;?~jvQ_5dtx{N+u@!1O{X1GjmrNzkbK{hYiLcNyMTM!AQyHSvk?q*5p?hfhhl12oU z?hfhh?yhA4>0G|`_w8T6IUEkp^S(24@7%fLpNWR|;Z6GF=}v!?>)pD0Q$WX2LDWg+ z&bK0!u7mze*l17`b7T0EaHHr=hQUPDWULl1B-^`P7m)c=vRyo1Q17ffLf2_+S6W*2 zt$se4?O-i^7xYE_bBnd54gd&zYB;`$<#nm{zG3wkg|^xjsG)&7u%M52qpb(hz{5f0 z$zFdUZy=xfbB}g@d``JR$xCfS4^ikUe5?hDH(a-)RF2BIa|!bMOiysf4SSou}TT=|ug1FCA-w(Gp#Shjv{^kR*T|5s#PfU~*$=Gtr( z(-o+r2yCUwx9GEPbm%w^e%L2Q%x0o%trQ zXOtum#{cD5M=$Gd(HPq3+@oM8G#HN&cxpB0_lS1?syash1zqq*mp3!JO+1&q8o2Sh zGT!djTl#r{^=vtV1m1kK=L>mle%Z!{zEcw+cU%YeE+d7uy~rm((O)h9`D9+J-iNIa z10oVcMC2yaG3nSt;opBOl8RgT;`iJkijrMMsPJ{|yV|PiC^TYWMRQ>%EFTbk^MiZh zX!r_FyU{8`<0V>p{uZ1M$3uYB;im7>F$5WI$&BQhCy+r?s>vsWOlu5aC+37t%b&~& zm79id$WFR|&fS;PZq`a~(U!VBo2?*BNPT;mXH7gFVtwSXps(*e6}}0x%FK-d#)?-o zSsx`wk7Vr0y)RQIK-{urhxzZRXlEcrgP&1Y(Zz<=TDBFh)qGY0&nS=17NFUit+RIPuoQvVUcvmmm`=+aHD*B; zgL3UUzc=Njz}bW02>P6(ET<7hLE^!dFNRVOOSX?RPF;t5U0_AF-r+;%-kzw3`W`r8 z+!Xy$eLaM%+L{}COju|ULG7@4LJ{+9b_|}YG1?zxia9)@? zeTn4uB&mQP@Dl9rX`8Px4+? z#CXlP5v8R?$otnj(iLsoQmvP}|HL=jouS~jV^qN@+oa;<=(ZZ;T~0A{tE1@c_P!@1ft81cr?M4R zZTk70)(kdcsc#}DMg8$PQO(V?QTNXSJ$-h~6QRa7$r)`q3-Ny#1!_<^_Tju($j|d# zGLl^c_k`z^`q*sK)jC`v=`5-mQm6amKx2(+otf`{pMFeTcE$e$2zQwNb#=3xf3|oa zcXW#-{_a`x9ft5b(XF|S7-JH?f7Rr;n^ZPmbJZd?OdmdeErFL zq3A;;J^B=%Yj;W(uiZ_bdpx}C-|R`i#qKUr$L}BD04FT+@fJ;T57JVDml!Yt;?+r$ z=yy#GsLNGd`>zlc(^qwUI`vIjy_q60H&sD9Ce&~{D15*1 zZEuK>*!A>3Fx*r>oA>xjN=jx*Uv$>ra6;U-c(OxBD7SLt?C#>~C$6dbQ>hI9M)_N} znN)dMD=xyS9YtPFqeFM&_TE3_0KNqE9qs2zveim^&+pV##Z~0K*VFp$Fe{d-KzDem zA0rz#qyz4xg$|wI)_z!dW4@3eMY+6@27%)>8iQUP*zW2+`M&kvzvMnf|5VrM56zr_ z`ElL><01}^qcFM{&5c@G3|g69>yB`>Iga69jQm$ulC@kiPT!~U-{4aLP_g7%14cue zb?xEyre4Pyy>TlZ%rEzbna}<1+ORS?%tj6`AD%@9(h~w;i*Vo#ViGDNy)2Cay!)@( zA!KA^?v{3T8$75%qeRR)*G({Zb7BgRSyHhAo3slm5f(=91R{;IR#yEQvV(BjCs5mGZ}1M$6n)<%(CNyyo#+ zwh)PU^qlW%@v4eo?vu)-*m!Tz#|=PU;ckqqRJ|NDIg(3y$Fm?pgMFElZSCVQ7jFy{ z-r-g%R&adHb2DZIEL2|TOAKn!(L|eS5$382ov{cBLQ+=hr$Zm1kHf`(jr_Sulodzo zL@l|2apvuq$$WH0?1^rDxVyY~@uPpsorY)4>YF@X^LXWXA0zpuYB1E*h+ZP2x+9+c#WUi(I9u)eyaQVpq?s_D0&8vuHYoD|#8;vGI>%(`Qqxxl>dbu>$~X zzJ9%ngyoOuIG&itO?6ceOox8-1nEH58BGM8^^(}{*)TZmAK5zKY$++@=-R&kd zrj80dmRD>KRz@=vZ2O0%74`#^?Dci5aTw{=?Z%nz(+P!DEFALN^hjSPD*qn_KTG8c6J%xYlDCykmXo z=<@o@xr;3c$X0195MaW8M?(xw(~QlizM4TOCL1KyRopu1!1&gYG9lbo7;}GftPFk} zpfQP;{(0}MJy5gZt;(r5^T4~+X?HE8_Eq%yuWeSU^6IDBg)SL~3HY~SS=U4|R+<2~ zPwA6T2o$5!Rb)Nwvy`eudP`n<8G4(R~$lAUZRqu7Yu-rKF+ zk|@@=?IR#s7PCV;RuJdg1Yt2Z6t_XX00g^=MYG60Z6&}+iOAbOdi6e7h@)r{j=s5K zKIC}88veUU;7j&o#_~5)iIX#j%&Lbd85g+;2{rE|f*v?4ikXS!?V|1i?`OS}FOm9^{~uenBk=gebl>l#^XcrVD)AhMb^7(@ zsxW+rFQiI$-Vw&xKM}xMkOm?q1JUvekLsiU5E6Pw4`t{1D_|)tC)HoAp*MUj548Ai zjc_(X$hr4aRd&eyeT*+18)GU$+2mj&!!=Ji{z zTRgUhSqrO8pBYmFXb0_^cxlYg7CAm1cU$5fY6383>TR}@;t*z%?-){|UXBOi<7JS< zWsO6qSdQHQ*q>Vk(%`C{wr7E4y!-m*A)V0U5H!GhS%mj4rO6$bg0E#=&jIek+w{?n z3{{{it0lw|75MTGh9YcsgB($6B-=rTa8dMdX0Gpus5=$4^`kxUy6&CHJ4iNpc6i$H z#_YnEkxg|Cg_z_~jqpv2@TOS|`H!qid?`+y??bw_)9v7u;{o80vG<4{x>+AQc2rpq zlP?%6(Ryy6>mpG=4UPZe{lLJi+ivoF_j$l(Lk=6PM^Jd%?dbL;YnWlx(Dc(cS{ivk ziQ79D6IZ$(utjw|wMWFfyXdMLI9mR}h`|GvRC9iESQzr%4-rLla;3r%W-hC(e% zo>KoV><-iCenRkhecA*HSud17=9a=qNM!klblttaY`!uR;KT^~$`-*n6Oyulf&l2l zG#)V%nxB3viv^epI`{Cc#KC$eqp2do3emh8DIDRrw%!IEC~d)`St&xF4?p5Hiq^kW zV|gm*+$-{Yjl(Sc>!Uz;v?vj*s6jMW-d}kWUrE?9<16d>PG=_}QP8?Ig&n_dmzA5h zW!^Zz>p(eA1az5eiJ11W=`l6ew%BtFZ*uOvU$wPB^J(Ilyd2#2*-3& z2=QUkAl z%AaD5e1t9S#Z_X_Ld-?>LH~$QZa>_CtE6M4-O+P77sG@1%*nxl93&m!Pvh0G&j;H| zH*yDKs*=p+UvaJdKhX%5SQ$%4CIe_C_M}6aY@2ptiJ-7)VgHLsf2i}5Sa}MS1*}n$ z{gcytB6XjdPwK~(njzQCk7-wGCv$NY_dnZVRGnF$pNrNXWm})e?T1l(a-{+yZZ5U< z=R(SsqRxjRlDa^zq~)D&7#1U&4B0ooKJ0iQpO-Tp9@~n~6i2_le>A(;P?G2?O6yMj ziH=MY$Rscg7C0tllntOLKBETg!uB_m5sM$;XWMwQ;D$=X>17ofTEVn0bvx<-i9iT$ zjR>P4q)S-qng=rj*>E;*L+CWcEAyuSl9ewQ#fws5ZG|9UqCu90sQwo&l44|;a>^0G zLRH?-t@o+t7(2ila(jED&?Rr=*T@d^ggIb7;caI=7QJ3Gx~FKj)XUwC&@kg)w8vgjdDR+q(Mrw5h-y^|VV{gB~x>;sj(KoVMqORo04lgu2MAd!~-NCN+`!qT% z0gOs4!K+UVN_j9bK#J^Wa@)wK7jsz4_9cQE4+^^)4xVTjULq1s5JhIgyD$ENwW*;# zj?h+m4qTjHf9dGBUA0g1ygJ~1<7*G*^uDz@Y+SV?Tc4Y8axsKdl;qISn3Q-L#$Erl zju~R!H~uRdM&)<^^G#r;FWCObI%gZ9duQXaq?VTs+IaD^cGw=L`9fvcar@^p+I|#x zjKRnA63J^F+x6pag^YgJwkg(GzKN>GCm=mCQ_h0LwE?(Y@nxO?0%_~wlSa-{f>+7JJ%4YyxxqtvfI$WMtyJtZG|fo>h?n?7Bnb)+!TE6VfOJ`8Np7W&KO zigak5o%u;r24^xJxbM(#HlI^Q>L5Gtz%+AqJqz7n(@LGpS~a%0_Pmc6xEL;>m1 zFyYE5+CQwgOy1m|@bf+v#hSH+r^AC{2h7UcS>t?@5tJoeTt0asb~_?kdn2F7`hW_> zf^KF^h`=s7woucyCer-MrrShtrL8lbzV}NieJq?<3IEBv(=boanI=U85F%8HI2LtQ zwlEf#9+(rBom~cCaI0v^%l90M$S*dn*Z45}^FBBD3}AfA>c+Ckz9|IVx1_qv^7 zbLFG@Fi@t0%jT6?of%MiWdv0-TZ;`!s^hA-_~XbBso2Z#=iJTW3xg2@tp_UC=lt8u zw^K;#43yvSQaK{Am9z@EN)j>PTjA*#kYEbF3<1%t&F*K-lwyuQ|6NYkSUP(l7mNle z_St-O$=7-&yzs*zQ8rhEARD64UXC|dFZx-*)=fV@h+_%6fc4$i8w%Rm+W7DT;mu(o zi;VNToQa9auH6n_v5s||@_fzpn?ck75Hd|I@%*S17xy|BjBexZtttDXad=!N+sS&) z;_8I8%@f`67fQXA5t259)xYac?<=qQMx6>w`+b_uXNhSOt`WG{8-coR%;$LN>9rW| z%4)(uaxy8;_QrO>EWV3VW5yeMTtvC!t)UgOkINF6^7z%Oq8wn*X@r|^IA3PsMoa*Z zs?Zm98oQ0c5`y1-+P7K+!&YhG7fav7+Nc!!mmc&ymtOu|Icm1~c3(CpGcPyI6bP!- z5K@JILp#sg=EUM_pG>L=9U(trmnuoFK%L?yz`7RtloAP_K7g}pphmV9Go)OS7d-u1 zXvTpX1_*y0<&G90yYKlaJKEZ>RXVn&M)ltH_h8{7+e{gaVLzX2by4832yA=L1A4x; z4_jyfYN6z3ocyJE=NC1R6_p|+v++!}An~RK7tjnbgS9N&r{Ect(Po1GCl?OnFxdIe zp%}EkLZ8f2eO^B`+}3sTsr-SXjRrL`oJO4RE|%+iBRlBAiizy2gK=+627sU1rWiG> zQoNOnA>EG{DmgefxN{?l8jKj?B15Dt#oHGB`dK2Ufo4;y&g+JDkkZ>`(ZSBLc|Ohc zxHfmlTXwX0qDN{mfxCF*Rq5agR$-J~v82Vlws!KHQXr+%pB04hYcm5?mx{3H4$2&M z_O7n~em>V7aMu?rZU0s(rV;^p#C=fH=ZMG7UC0BCV z^(tqsu+$A+eJw}pewgYq@Vjnrf_QYVq~4Xm+9dNX4Y~93;^*4(<){D)Un>xsZDy^P z;Hbf5*hs)F;k!kKWP0(akL908TPck6vPV*-{K*iChIJMm(J}Hnbo2E|ntCp|*dEpQ zW95z}hlYlTO;2HNAvLG4#PSN0qATiJvr3vu<<-RU2Eb*a(XQndI!MBn+tv-Fdm|)t z{Zm&=!uGOPnvJF+iCwG_>MmixUbbw)j(;K@8(1@Q0!GltVIwMti~rDMNgL$l;W<-f zO4}?0g%!3E(0D@ncd)2w0zs7oCTD#svh;Qh^Uo%6LbcC-#azphwM`WpJ)yR(D5M{*OkiWtdEnw`+_(KvgYcE{%hxK8ASM zvT$;G{>OY(w0zJP*jByXv&TUZW+qKQSZGiWmfiXO=?qoc+_RuOU z)cGpH-mJR7lS4$9kjbP0n(BpYp)`+-gs{Jpu*PWIRHa?<7Q{ z5GJ9esi8GysIK>0mL+<>PY)s1d`h3r>qeBzy*Sev>3sGI?aJ8C1kFw$|4e!PMpGh%4wn<8 z@moXGMgFITudwr>#(J9E(!cj`iR+)#=--4;PS@RrH_(*)ki{CJiOmln{>-}S@O2fn zHJ=731+N-V_(F|}3Xg%9bBKhlUwP>Bh`sBCF_i|sBw3!9Vsy~i&iuHy< z?<1!U_V~@guhWaXJ2RX-imick-B+3hp8JP^6sU`phexkhRtZyYp+K5T)k3R_El1}S#wB)#13a8U-u7b>=4x-dG z7eHN6$5rr=O=4FL)m^AUVf{FF1>AI`WL~9G2K)PK9wMHj1?#W9brX$NVDdiCX5$-N zBnCI;wo0SE;HzGXA(=n#k;RgQMfhK0{3k41Z5FuctkHPa$}Ouvia*(f5g)bq;}c+? znqfTciB(uW*a^ep+Y0DH`FsKGUQtANija0@rG#VuLc#kYL5m4m2-TGfGkW|u;q43j zT_yGhREeFSi(ulH>YkMr=kfZ~=HmQ-B&_zr71|qvi2c4pyg5vpP zpNcN*%^{#2YDU!;cLeNhvp0uwB8rDL9>>w+Sv1w89!N(30~8(9{Yhw~hFKnk)^Ct( z5Vh9slix!S2Fuc($RNz#?px7Jz_m53?MjTDQ13+)5Gm@^uP$&?R3PR&iyDa8o*E$- z;1P+e+{aPs+8g_eMC$o6(c0hFEO3BL%dp%cd=+$pAiWmowR!lhKjULI3-vK%5j6JL z@y651mJ~yWdl$RS1N{43=Owjp02wHV6#;>$tq+2B94TbHiY7)>;z)IKt~q8cLN5cc zT!5%f19Q)=!4$9F$;B-?C^Qx%zq^}c7U*WHB5^YrmK@X7B~Y0eVaCYgBPQBg*lsQ_NS z|LoSEi!09iJ4_Fvu*|A{Qt8SreZ#~PwcthnYlg`cK$Eb|lR`hD=1<#I??6u=ZuRN9 z_>qtmt;xUDn{yho3yJTZVaN44R%1PeLEJ~pxyvd`faxyj8&sNss?l?4Mkv(#dj+~r zmqX(2p1n+i)-=I;SvVRhMk7reaR7uLDFprDazJbVO>k+zbABBu)_Q}zGcL~ z8`7`=iyfKm2M3Vo1}UC&GPO}pxswm{+E zrq)~TmmdK8PNh~qJ03q)BypAE+72q>qS#ACO9xWIRL2yIv*)?67^jA+0;==O3DZ}q(>J}7$@R2RpnWd zan0?E#%HpPwck~ry^AP<=_BU)Lx`CNJuq#~q0Xe)^B>UuvA*#;q;jtN6`AZN@hMhv&da4=r$4yu0qw#B&?s=eB^$Sxf7fdn@jh%zEsPe)3R2kh054S&4W74 zTFdi)7eu4KE<|o8W)^bqbgFe>&05EOya_E1gXtrk58e3${V%S*lIi(`5g#_IfqzlD z?U+dXvMh5AvaR*})rZ5Qi>+Mu|-k=d{`#XBVo z!(pNbaTWS)x3Bw`4>&NZf{{&WryMG1?F$2{>> zB=Vn+1L@|1f`ULQZYwo*RQT7W<5}5fl;dG~f8{nb=9w-XmyGDbvHXH|#cf~owl@-F z@E>s~zj#c!dOGwhUbh66xO48x8|ENGH9sh<+rI0*QhpPnKbX3?-Q02x7naD3GPHzP z8Z*Ka?=h(QF>#daYbuvm|$^uAFil)tx@G;$GFK=+WLNfh(qAaQXXRfU#_&h~e3 z1tq+keXW}9Caw7~$jLIlx~Z|DRci(##%x#)W{+$&w$gA{aAYE&NUXJ7oY}o?Wd(?vS}yjw#B2jVYO%REHdzZ$ti$D|S6|TwLAT#>dCyK`Z!(f#%W2u!V%#Wfja^51pig zXsv<*xL5(Ow%5I>cOU}Wv2`o_z3sK}@SWMHQ{Z}EZCyzA*JTnTjAX)KLUo<@$!`VJ zEQpFIjNXoPvA0|FWFr`)dr-3WPBFhb#+cM|NvTSf*eL=wOZ`O0# zKoYmtX1%q{2Md&42Uf0%W%CF5Sm0LBkKBBVTQFOH86tjfWpBgk>D31)$v?4qG{C$Q z@;U22BrqJVMT%2cvI;8-vRU4Jd~dLg&057i3-^8fK2mtEuo|?nZnSCX*hWSzr954~@jdJ+yW0J9eF_{V`c-taL!)WZ@F|7{ToQl?_jDR&wiN zU1Y*Q7`+^xg|FXjSCMPE>1+aiR4llO-l?hJguGO6{s3aS1OG+MoP}A!=ntaD0)6BN zeBn^C8~?BsQMkN`i0IAp#|4vIJIak5O!ACqwtER(LQHqwjZ0ILtb`h)W+mGJIs5%I z9^XpH1wl8v0%o|zQ}Nzg<%pMBTJIuVCfV(x{-ryLH20DHoNre;vsMtEppJtobIOgW zNk2tddvz+1g1HDlT#>cFCXT;Xz%HiTUtzw&+2SDI&tX8?`TVruGxpLG`J!ct%UWP- z47y$C-dw>GOhLPk1yn>;<-q>ZWVD?i_N+#w@$jL^1^uy*GQ zHSb@4rGcPMxj{0b#uwv}M849Sx&5S}xChE1i4PFig5PnY(_;YMi^US|t`zTk^Pg82 zD_uDu2as+{fcD^-lNFBYV!jKtvKVXYQNdo{!TW1l1>fKzfLrn7PSO1NpnX#o5Es1-el|E^K%_&I2CJmD-ZCcPi>6jy|EJw z=+Z6C*Js!J3z9+_>Ysb!;&HC*0;JB%+L{zZzk?n;=9V@AT(`(Da53Z&HS2YnLOIk1 zsO~45=@AuMmER>Yl1)R%o5;5(U?YN%Do9Cuuhu2&b5ky)oeinKl~-9Fr(F*{>g?NSN*d$_Z08$GWqeB;!CFU2?Z>7S zjKC^k8G>kGLMx^jHLnlPSa{RECyw?q>vfr)d5+L}bE)yHl8)?N0j$qw?dM)qj(vL} zq=;1|?5h|Sm)eowm>^q8BKM2UoClLD!8;#C^EhjxT?^rxzsUXMtboP~?W|D#AUR9n z!l(E~Yci^{jx{>Whbmtu$3!+q}`N=@$jLGc}1@_(nuu${=8q ze#(>U`m-FtgvZ01Xny>J4ke9(TgLk9x<>1tl;;VrpI*PIH3rSZ*lO}l94Cly-s7<0 z1m!mBXSbC(ZFG^F>OP-EU1%@|REVM+_;$Zn15#i3&$#JB1HVDfXy3V$GOglGl>LRh zR=RK(f?e}&FGIy%WKGf0(elw~R3wV+2VH9|<#sujuh8t!E5ZV+C99K#?yi~P3iD4t zqoXbR)7O>8fB1%U`!~ZTKEu4M-NZ-h{cQed>3qmS{q7ztsRj&+ZH(zSW$H6|&{;>~ zLrkxa%_7u#^Ne$iRE`zrXDZhEABth;QhTzQcYIOA5KfYcB@djT6YkIarlGFZ7jDMf zJ=0%hwb!Ai?+!!+uLyOdBs?Ck=&rP`#LgDPeisPXe&lpt2?PD!j6u%t)$_A7J||2hMD?D3`oCDCZc~>cQ~tNk zh+<>z0k6M{%`NP;;$Oe+m7PA#9?f+h(fn6yArm3Y`~9u)ck&S#M&ygxy#;)m>myqP zbrl31w6$({Aa7MEu2*q$C|))Vmhl3gGdYA~8~k!y8+2!nzllIPVx#kEeRYjVnwy@w zD!tY1*QEr`9VUBGsGu?M_kP6 zM_bLGgf@RI)K+n3N5=fK_2&nMWJJ+I{CyFaJHw<{DUhND^8a|EQVz7V-&~*3@?Kai z#x#opp7{1-I~axd;h8DoR-_ZQ{pxPYkqQAG$JZY{w+|$_?v2xbV|c*6GH7l|D06S| z7kf%hNMJ7sj+7EjG+2*o%F%w*16xkUp2{vSsHVw(CG8|czx*@l`IkuQYR5dbFLeTi znR-IGf>RLl)Se`Z9f%R)4|Cyw^0GpW1!n$QPVpPw!k75+fCZgMFGR2P@99ULM8myF z4KO^I$rfGyPo~XsTFGYT#)S^BcQavI7Sw)~?U$kMK=VA}fK;9_JOCj2>n8%fM=~R3 z-aq_%W*)3Z?=*n+DkdH68D!m4cxW}gl(#qQhi@y)!w-zy8I=NVVMYkCe={}SaeUCb zsKPx*j{gJ~Zp}8~vNaeZZ*l~i>i4F46a!~q4EzWtbc4KEzX0+%QwnZY<0mj@cs$}< zw6uXnUF5~bP~fVw>Ff1HIo99~2N=tA6}2yrbUye?$1~QSJ{nL*+Z&R0;-xk=HR$it z!PUcTDw>O3zh5}VPrjRA?2ZHIn7f^!a3BOY4c0`+zNiwF!?9Rrlh}l$*Ey1Qt_ncr zyisi8>>6xsHQRFKvs*fD<_O}Z*}lIUB0f!h0{Ek@ww2Dcj>?#!+MnAxiz<`GiYa+116kppNhCuTd>VoJmURuf@SE;<$p;bm>hf3tZX)BeteyLfx-m|n7 z<_}nfPJAmD>|3m4y1#EYDeR@jS&V)+95(0+9)z%oUIkJ$IL${3@$hT)d&t^~JwXdeL2-F9af6z#L${ zLhO58iVsB^6XWzYUA0%anU5j%Xg|!6Hl-jGd6;5gON@bc2iO3c3&Xg_=QC?%ZxkzF zW!9Kf)Hg`(No6sX0F?Cb=1n;lX+EuT|73iH2ibu8enD?FtI;?Bb*;Yt z$kyHlSv!RQ@_yQ&I`cYrtTY+*^FniJm0QvfNcDo$T;H=NWjZ^q&&WbY zT69EDOPHrU5PAi6m8v>ns9w3R?~Z20`HS`8pH^Z1#A|s+O24gM=82asTdeZSXq?+c z2Vb88MCo&MY)CzO zF4t*ap1pQSnb?PbXp%KISoDR7PON`YAyL}?%TP|V8)40}VvSOJd;{lA{$NIo&g4_v z>iyW&_ej}mC_0nq8@lQlxQuUp<-?483Rms2YP||a!qFCAbbajtSb0BmK|lRa;emCN zX-$Yr){*kUE)1hl8Jb(j9h3E}niw(UQ)Mir-Ucu~m4s4`DStcF%dS^n{qFNA!7z1! zvhUc@w}$siVmU!Y@GnHkU&h%L%Sd7%=r`9*4!Ul(L<4y2jV`MskCP1xmqV@;(F(5c zS>Ab1Ee1CU*GDYzGneU+P~@A?ukpyc+-ImlWWFb$$7xL+^U4hz)6J6NqJ@l*-H&hi zk&h&QMMShwqC9iR;4Sk!mnmMCzN04+y&$AD^6y}0Ra} z^}hYb^T8~)(E}{*YM8u@&EMf`Un*b&5=LtnxV=+;fP!Zts9acp*tz8qtvSzg{kBDj zzoaE)wVgv&Bxgo~e|0XQlA>9w8!OFxkJ(qJg{zhPtlVVJt+4=uM6RqomKx@iYT6Ih zhut59u(wBX6xw}`Td}=pj?v_l6z#)BdruZ*h zkxX%-=FL$GKcL(%%LA|D2V~IA)Q}RG_-Xx$;f+&5*;iQ~&+RGCMIMjNxl-`W=QE8v z`0eiwCbA4ll%y79OKgiNj{#RVBf%R784T>#YPzd34{6o0Eow2h(wnA-+mrS$IX|g{ z&GJDv1nhYc-(gltJJ6v@z^mU|w~c(eHt?VX_-S4QFjkdRh{R6yb9(HqCufKT-tKjn9>}rm4Z^9~a-o@3Wf#g8mK#C-be>zmy=Oxc-G>sB&reOBmXHl8IFB&OG+BDS#yL%`? zr-x|{fta@dNq%v;7Z}iITAFz~qL@-DBdb@Uy08WcS%RsyQ|Q+f*1H{a^d|)dXiZAO z)8Kv`pnWl;{8dYL$DPC4aAk^@8x}I5o`4c05@9IutF}$@TEy#XCrT|!_Y4t}y#0_% zOk?^A<($+eUlGL0{CoD|Aih4pqk3LSMf1vn>rLB#PG9OBaw!XSr&n1wASw|x1YXD! z>4l^R`@t5aFMpkfQ#z37J$=QC^SxxOLgR+)Z1o)@wd6GB0<^5QTrA?`=r|kO7R>z{ zt9RC&hAv61MGxgPt>^B)=MCz2>ez9b1;@?@O8R!DXhQV$k52&P-&sWFun-zVJrZ4}tQnv4=c-!(Kzp8+dR4XHc}MrwHDDt8)E*tXffA<)`ao zXELH>;Dlm9@^z@=rC#IrhfQFGxl0$GqayrJs>r`5-t;;IHf4P?zn}RJ>FDII&Gj3s7lpqH;d1ERh0;_ z;>mws?!CVt4L#f6x^pXGaJgtnD^4diD|0>qF0A&2<_4AZBJAqqm*=|r&s+w zS|8<_Mb8A3iJP^0qA6{7OeD8f@!czr|5XhAJ=U$miD?wytVYEViY%}D(%=+_s|dZ{ zP#V_c2F~0i?LB`G#3Jf^XoXMqeNCBiHq1_-N9^W`-C*xbeLE8;cR%J5Un7=qiD3&K zS#k57#q0hE*c;4B&g%NTP5E4j@RB!yb!OFYcB;!y67eapjjheb#&Rg$B{2be}=T0)j1FLqB za~r{uuTeXqihq#n)P5n>Qt{1xZv1+o`~+~DFSXT-^UMdWt^KrFou62&hH`i7uzA0m zP%iPLmqrU(F86p|ePMBqx#KKSnAt~&eaqYWp4I%q&LBlT)%E8=50&k!mVu|& zTcqBu>)B@CUXcsdp9L|pShux&;UUCtmLD5( zg{YN_6Dzip9VQXps{-E8p-`o)iP0B%oUo@A;N6_dj;99xd=&EW!2C0^f7L|E>GqRe z-4x8nKBmdYV#KB(#eEMnS*wCM1YnkWVmO>lFYCeR(4nED>}2>YG#)?8xum=&vEP7y zKU>l(*+2@AxYrbO9!A~`EDD3;ktYYlPsHBRtvm8mc-R*+AEOhz2uVD((}&LR z3C}xxsnNJ28 ztOP`_S*5ZUf6Y$q&UHn$28q z;iW6nEpQrV*R>{RE`(5|87pQfERuf=@c2iw%fgF{fiyB z=68#vdH!z5X^|WK_oA%fhXO#Myz6O zrjQwg1nwi(r3XGXj}Qf(M0#1*4z5^NICFr?MyRqPvD^oy@>Ogv6*nt&PSyupdJZ_S zL@&0#JHOfsB9yfb^^pcl`R0KH5JXq6J^k?J(sNM1-UQ+Q)z2oLN5&_jYUMNXx36^B;h zpMM1Yf?7d_qu&*4fVqgBzpG}1W$R~8C(nL8cBAp^YQ%!yBWk~X!clee@|WWI`d^cl zhm@Jq&-4swD`dYc%CP-gChXhmfdSP2ZV1LgZy?9#5NZtCS|U2)25NB|u8?53Ub+;3jjrezMXunXUO}**P>kdZuGm= ze^2v4A6oBvAdH2Ge&w<<0Z5zHBu6@!1ur=;sY#^b*BJh)+{~$@pGfmSRiaR2&8FvH zIB89~biFJVRMK_VW63UJ60R(}^(yirKjBShKbrF>?7J%|h=@Fs&-UJ2C0`{!co(p; zgKHr-2%zr3Gc?l#I7(zGt1rgOFZ}zX(SM2;1jS0U9*WX@{yP3HpZIrwl6obM6_qIl zU#Q^Ze`T^&Fu}}(ZKL`t?kh}wj5Sy~y2lY(;zJ{D zRYXxy`bpWV@8$Q*`7f&FxTTAv*02Zy{T`Bx^0F#|HQq^2hQ>Ahl5drDO~7yOw$v|g zhW@K^64<<88f_^pUCv^ev;OC~llh-}lYLP6(0UhrS36i@J5op5iLm2rGBLl{jWdftL+U-)FQ0AVr-Ny_4l0C`DU{*gzVli7*& zExSpucgMo7LWe9|-m4o^%AmqRhZnl4p9AiQWOTL}L%BLUThCZP@n+8cDnzcM$|pVo z#(+X&CpAWh=GcEX_^`%HUVyAGGxuxP(BKreG5DYX)CID!o>(GA(vGoepooAEQ7&S} zkW6jH-^Fo>f`yvA=}uoF>buuy1Ie$vPdLY|tdfRU6RFvCf|M1wcL8>tuOFBYV!0zx z2ZGfj+&3K5W=Ye=Pw& zi%z+Xy>`oa#jX9LokGXYW$!5ul35GFC?Ht5f>VlV#RgBQ;V zM6i-CGql510{2KlA}p8plbwzGQn?-hLHeT#o%F!8cAYPDRCz=isr{dhiv(4)1PNAw zN^RR~wFU9(+!_Cco%`86MjUI~)gOdXvZ<@QWJriow%MDNk2|i#XE8&PvlVkH@3jyT zR@T>_g8-*1<(=G$ZSfX*PH$<*nDhE4TO(tG|E(J{htnE(^%?B1URC}=u?v``gpdTc z9_7rv^gmXEe9uQ{*PbMY?=cpY(|&sX3Kzo>;c#g~e5b^g$o>@1v)JAs7yG)Dc~;xFarEiiCYKN13c~DO z!0I06ie3O9c!sP|l!oPZR75_3Aj{7mH`}WupQb8!K=_-jy@ATJ_DXKVyR_ z=-_7@=4hm#nc&4Zgp?`?#Id6bC+Q{cc)o)ipAgHdB36i*pt+YVq$;lXddsPD(0?CF z<)TS4X`n1JP`qT8w@EEz={c;6dE@qzz@|Oz1^QK2m+B9wKiCg0hNdRc1BY%UnFG+{y08 z=99pQyGA+?13Sbr6~M8V+hIj#NnLT&=-Z0!;m-cWR-fX>+1+|tOV(^?xnd!p^g`2z zr^|qM;r2#o0vqtZfs3$Lm;peN`KUA()fB1;+wq4ISIXv~rCxG7?qtl~fjS4HG}m}E zkUOs3#GU`)DY#ijz(JFZjsIq8$kSwGRI%c;P4e81!f@W0qUXEmyQZGKO=X%Ad+v=c z*&#gR<$|4`=@L>nh-*4^#(viku@WM`av6p{4G?jtO^DZdcli9NwQ1-CNCuln0H>aP z%g#l9$WUWsdKAtD>A~)^W60YTgF+a z31)BC;YTMz5)~0LYl@c1UO3}#ur919#|xYR6H zk#E(PSnWfR4uy|tqhOCvUlT}|>NMMpO^+W!0*!h!V^DDZh)czz z)}Q)?d9R51^AI&prq4boP_xv-INdE{i)ZV1gFPHSadeR!^4Sq3G^<`RZPG+56PJdN za7@!!3cNyxi+Ru_3rDEBP{cP$jJl>hQa{eE55AFlqe*DAda#5{UG1zZk#&m{JO?ys z;#0zWMYFer6F!HEUu*{O`*4Z4AJw;Tam22RC0t%*hmrs+qbtQp0D5Ekex;rj8>ysD zR0?n8v1JQ)_uM6Ad;0xZR04WRj0X6wgyluXZ}>LYr!A{@SnDU3&=tu-}}n3-r5oxc*xne#{Wb!U;EU*92L(0AAt%9sj74@(v{dtp*! z402<{1|zn@Cj99zo>Zt@Eo&-BaTtk-3Kl2%JOX1{$t;_o0Z$hu911WmD(I0g{{Gt$ zFvvrvfbGiC+-=E^sP>On99yj}lF|ODYIiWITl@<~F}0ipl}6!T=`R#ooQx8|(LaQS zcB;w&rK@nlXa8{aWNd&xI5_72nDuk)cha$6Q$^fp=*abfsj#lfOBuxOSI@ZpZR8hD z?bH~lOEXGX%0TJm- z92#Xr)6szc@@)CwpU#I0Nx4tn;obO5SnrbR*;%j^yRWu=DFGew; zU^au!9KgUgvx4E&o8BY4&f87BsAA8Rp;+ERYf2XD;J=(lJ(5VWK%DbCrSn?XYN^_& zxHL_X>=xroRY!ww+WM=I`ty)K-w}F}pwGThv>otPfir>K?gT<~}u6m{=gYu8>_wUBnxmQtWMi_MF?}`xM$5H=r8n4=GK% zW?g(u$k`ekqFSvLcAn0{Nv%c8052Fk<_K;&-R0Z3N|q3d^rx@*ySH2jTRTN{&Tyy!0m!ef}-N zO#;v8RvGm+tQ~thJ{{Lrtnde#tVpNACw!n9SA}_H9$61CXlwB!N7fg!*quarmV%sx zN5{k!WEoPmUt^y8Cp}4pXC+Bn&MB@-c|(K77lpa0h54_$ia<>{_)OWYAv1i?n&@w# zb%fxgX(2l~u~$=zah`3&Y{cJ#N*G4x|7qkUfxuRSCL;xvKVc}< zPc}zp^JPtP8&jbn04Z`zQEeGZhWhXSp8;rD=X}%;n#DxJaX;k1Em6WfN@Y0Q{I~aZ z*?Iyxd;A)FPfkZ75-g$b@?Oo;eI2}U$m}loq)+&S?v+0{L#C{x_LBn6AVH{t_mQy9 z|7ALX^sNE2EK&G>zkT9ash3CO=^PmkY5QqS zBhYkZ_1}|QIQ!@`&v3}{XeF7~mVw>w@5iD?fY=gl;*lxpRD2`kKWZl@Mo{0&<<6IJ z5TaJ|34s=R!pC7B8>Mm2XLOSYo`HkXSDoP25-D){=X*JDW-1F`}lRD`7I~Xpec&G;o zb*Ni>Hk|_h_xvY{Qg%=SgW?%Rte6mc9RJO*V;2Z??72z$pJXu*MUs+5?Gq`zoX4F) z5?CxWgMzaoacGi$mm@YpQGLwP(zBi7_Ks$MfnGI3U(v37Vkzh{u_V!K@`-@WHN6Av)_>} zg3T`(fTmw~XD4-q;Us_0xX5B5H4>-tk8S(gZ&>U_x(Ob<4fb5?SEVm(FJ@*8P~P^m zReveS{@eeS{^EVgf9pSl;6G-$Lrmfq=ek;sRl29YQ1rYu7(;aZlmJ?BzfgK$#qzmH z%e`OZyKF1ZD7F^zJNM2ZICfKbS_~%YDDjysdQwG@qkGfDzS4lhIYD;#Sl;$DuVH>B zF3^#z;<=fIY3C~LTt&b(@fGj&#i>M{Q^n;&v4X9ZTE1B11HI4IfV|@4NFW5-9mW4b zHk4$ZD*c;5Y(1rg)+*vMWS3yPG^kp&_tw8`1DtT%t%@+Jst?>2B09WgxrZ%f)qlX? zN8(WA1rW*x<&AllQkAs^hwlX_w`vSretn&M?Yhh8Alau3=0>yQK&uPoC6;8ki-3ym zXb*7qE3hU}N-(4Kb#HJ9OquGm);(RPEw|Yv#ok`c~8`K#pl7#3ET#y zWVijhCNVXK+S7W!PhJyt#4gi#_=bcA_2JxQ zT`*uvkZxf%c!v zKH=GlZJ^m?Pb<75k!%6c4dOH1OVkpbOPLtu_U<;NVIH}Go@X8+hcM-iQx!|DGW6(% ztY0!5v}`N4HFS*ivXi^qYiuGt^#9UFTy;)h+g>2oZE{PDo=pChuH_j3rhh1sSrl#r}Qf&Swz{2M5Z8fQ$sfD2uZpcQnz6A2Bp0%BQ@NcM(fYzsFg{-bbXq{y^R zKq4{%>Z;7VB-f;WM^lk!>Xp85(IxWgBB&H;;qXB9Zd3FJEf_nfU^V|g9g^0v&_sf45 z%v^meqp&~xMQ2p&$Awx>fb(SnP7%E1&yM&3x%Z*D0CCnoZu)S{>Fq8-6 zzn@o?uh6XVGn~xidF6{${j)ef-(TZ*U(rz6#7g8eOfE!F`n_WDaPgCig{v)Beiud= zcamb8?2T-ExxRJzBuP~0F`w+7X4Y3nul8Ps)P{LR8PEZ5;)B(hqNW-j8V)dg9LX>u zazT#3+tA`ZGw&CP@Wk_~XMNka7$9L9hU}W8R3AE?m&L^$*v7CC7nu8}tar2Ii}r(~ z#nyt^*oNLenz%Y0FOJxWIRzLy6SNv~gl4E~0*6li-S6AW{DTvDb}(HTL)<+4OMT7) zF&TZWWhS)YphM*rsJ%l68?ErO1I!vI8yI~tG>BF!A1Wl!H#a%-nh_I7>{WMH%atJ` z(AY(lJoh)ht&hb{i|eRQL_vxk#!12^1WlF${Q3Hq4z4#s76LBd2N?LDPc_t=ehI@c zWCCbGB=+L|GHv5Emp-{$w#+`x0|PiC1S% zJ(BDQqL|zYxBVonS7W(qhbesiTcC$t$7w}wtoAgqd*@#=H_`L9>m6EmK)&R?ZAm#O zXwjA@cXWT-vMYjt?`zVyJ)^)Q`law{aN$FTO_-l+H79(m}< zfxLgF#ITdUs;Cj!vjdsXyZ@UdNPQdYIy>LHIxgGKy0v$Ne)UISGX1RI{}*V}G76KM zjRa{3Ken>#pG|W3eIoO#W7lEYM#5*!{-?{JH2A;pm^q z1g}@Uh+5lQT=r@Fnlc?{dyIpgX|fm;Ud@cif`kCxyvY1OYfyP`Nsv9EW2gIW`UXY= z>Tq+nhg$lT1-$Tyc;hFn*qJ4zSKj5Lt6<>HUpr_=b}YlH{M}$!kJG)Vyy*+W!I$Cm zfJ@@gb<>;~)=%C!lFd|*1jU5RLcqu^dq(OaaPK^XJ4v~@XILv4!U4~vDc3{X(9(;% z;w50BLew|D-htr+O9Qta>zsq!ZJmrkmJ_PZU zEjIj(5tf4iip|s)RWP%=fJ1u0!6%}K&=I8_j6ngwP$yOQ`c(pDNhc2(USl8?uB>&P zu?j=L70+xgEuS$SUoRjg*gsIjv7iXQl!k8|VfSs7!1>Z4Hn>1gqlb1~`zt@`WeS;t zlZaEaGnUOA_uKBKkct*N2uMKZKhRH8Yr!W*_;X_{?dM{ebC@$xOxPGDG*SyT>K=y{ ze>Vj!!aGs;$IZ)G4HtGaMCq}0FE-eu1-$8TT2>;N<(8850wtqw zMWNXZ*a1W5T{V2#WOBZ9XrvB8ZYw<6k-LTY&C3(&ic@Z}E1S9zRP<}p4n;usqvXq@AX8`pu|G?W}{a~lXZ3SUUWME+KE4~<7j&k?upWb;r-$Swg!-$FHe{K*i(S6uLM;+~{MA<^eb_@kGe z!Kv_%t5L?9eLN;Dheu-f_3O=hBrw3<|8)&PZRfO_@%m~{DoxQ~9nmAM~2(lUTJlt)T{|lx1r4Jds)Yn**8aH3mNPDLi5?&Ef9INP9Rq{ z67VnFmz73x}7Xz`Qe3 zW%RYK4<~n5y~oxvCYDSPN1olm=n*`bJ5oa#~alJrpE= zeUUx;d*My?n^a<=OPsGN57y8C)))S5={k6czEWG#&XsF*5h-`n|z~*F6|M#Dzp)-xWO}6!S z9n$RNvdVA-DHx_q?$=oFsSL++1n|a^mmm8PI%>ATM+bS#c{Y9;j#?%{oRHT`348(g zo%%tg7ONV`T}cfmxO0^uZqsWh(_E4JVOVepFD_UK^J6ciQkwiK{n4Po=j08lGr})1 z1}aGU7$?8q=;VAM|E2W)6XD%ol%XDQN2z@NHO!8zxB94E-z%?Xm4}BgYhg|r9hz`% zP{OEr?`KkxnujV+HJ83Yqm?LX`Re2&Pore>0E?YK2^{F9wYx!)u^A`go=6~}nj^LF zK-;SJ#^JD8e)}3j?afmqX%dp^GF+eFmw2txxB@%%y zzv-v3xEhn_SZh_YHFUexncNrIrGtLGHH0#+q(%)rsR8;tSyoKeifZ!(MRj%8E(SRl zj1l9r6WhV=#0NlxU5Fa3`X%ZD7mFwB$fNH#jQ~2-rtaN2zM+jgX+@NDy+pO|ms}-$ z;himrk1)?suSFaYiN2V{y_7TlQco#N+dKQ^PcmoH-vUyOipC>C zClL4Hm1PZ@JNQME*Dw!rV1OXn8L!sb;LPD|`$)3acVkargV~t*(u7R&?K~Bj((wzN zveGhfxda+dQv65?wf{Gp!*IHbW#|~lrj#GDuU zIPqZ%eC5O6!w_<&=90!iuomA(R!8eNsNQnEnE`=R^0l0TQ0HU)e;PMa5WQIQ0pW+fPzEFM zqUuscxLg@V@84?C;F(!;wVQ0q2eO0!D;dS)Q3RlAr6G$+d1N<|COt zD{-nKwYaOyy`7UI@T~CC2 zFghP_`bnVL2nON^5(1u$-SP65Y_m|cxu2rd@Hb^Fyw>gaVJpu^e84Sw`h@hxNd^@$ zfElgRoLm}vmoq4W$d;@=40Za2sUp{b^cd7b{CmV7WqgFp+vuOQ(vg1S70kR|5VPDd zsxT&MLFaBIX1jax4g5ca->mV0c%J))egMsU5B!{uK3^N;k# z`&>Fehy#x>T`8j^PEXfVt~vN}vcuo!ja{m$C3b85`4xs}^qX2=cNBYIRMX(PW3Mvl z+p6%LYwaL;EP~NMfNU!YU?A}Exp#$!8QjWx|8_XJMQV6uUMMYo;29r91q+{0%fQB3WZ;HZ~1OfBWq2R-Xw&{(W$Ve=J|2_eVAiO6X9WCXnXl@Xp zZ_gJdsLNNT)g#Act!%GTdi(p+g_i$@p{p)LFvw$wF9p;%rvO@pz$q2Q#Q;UE(M0xm ztcGlcQGCq06cK->O)ZZ*M>yB$4oHTGGsNjCbJ4cnDQRm>Es&L?=GRzEQdL&MTh%N- z6XnEBFE`aL-IQes9Y#>~R+g2dej8@GsWI_o*4gS?TDS-m8K1r%im2Rz(%rg(aNlhY zFxRU~qoUorL~{pdlpMX5*4N~z%Nplp)bB_8sL%Nu2;F3Yyv%GUKD6RGy! z%eDGpo~0uGz`XyY#G=H6cQqzas4JZRIN+34>=)P_Vx}up*~cz{n4)_54-2>)waO>V zY%Ew>eC^KN_PE=oj~~}P7Vc|1KEuZFFAM@)G$_@U&&BddHsO#F3MBwybMUZ`kmN^z z1crirRPxzNZmw|VLJ7Gtko!-w-nN6+9cF+_A#gjpR^B{4HuG){a>fhsU%%YH_rsJX z0?f4NkHU>C@_z1b%Hj62&aifwXZIVgf8wrySyx2Y9zuwR!185|m;v6&n6Gh6#Y0&Gj=u$%Je+gPYXPKXo++#EvF2aF(}tA;kQa z%89N|XJ{f&c&&>6h%6!*ASkNzLg#lxopwXWT`axAN-OHG#6le;SR7zLr^1p<_LAWT z!izFQmifrll}(0%h@F~5L5_XOO2tSPM1F}Nqh!0pk=`qzK!-!;kE_>Ugvz|gYQ)M# zr%X&pxW+BMkC}~x_)133qP%DZ;gq!KUHAeo2I*l=HGanZXM|zVvHB|56E!CSW{~}+ z&}UXL1@|(~ix0-opgWo3Wl=g)43=8>=(ysGtleD_xho|SOWnitD zg$O#SqeQoHcHQpBPT>jY=jxW<21I;({}z=Stx~tG7`SjR`y`Fg&Z~p8*F@-2DFS?0 z<2$NsurVWoEfA?!cM3RxKRQf`6|CH{E)F*);;27IBnWH#5k!5eh1qp#VVQLxH@2qu z$xtrIEA5s&d7&=ob}tY=oSgg)5Sc7Op1^C!^y__3No&nD)&!rnOrR1bG{Av~CdTgE zoozfX4Lyj$7)d4Xv=@-zOBnvU|1Y2WB?y8MXEoALu)4kX+S&u}b^r`6s-$_YB$QGI z&@1H4d*-$xz^7EWBGD`#giHNZG=-DPiZ)=wZBwYZkj7Q>B8#L+y$Rf|!PKR0W(6)j zl|HIrHW*oM==1_r+$0iwy2$wPhy995)HbUPL)E@Z$ytc&-t*}}4?W5+A+xjZlVbCF zvIT4R=qL85o7IdOCUQwOA zmA)fk0|S_WD8-qGAD$%?{qA_k(s=<}dinF}qIA=ufxGF(3l*WzqJb)!NWhK|?EHFV z0nd_nI%u|o+KFAfUO_TQ7)Y>fE|Ybl>LZm!{?+{%w$UOUJO-#kMOUp(y+gS8glp3O z$)!|%d#^EE|0ZT)@f_A%kyX>A*D_!&wvpO=*6dMrVRd9}@eGgM(`w#4c?X<@C?1@} zL30kT&wqE%2_FrOORkr`LY z*D+_1dyBNR3-y6p%}ol?JW&3JP!y(sRPMo{_o_mC4Hh}uWD*Py zTJY}(Lqw$?Rw#&%tV)x044tuktadq!EDtILJCDJ}7~MD$C^hhl`X4WhV1jr*v;iN7 z`Jti6WI*2iq;hom&m(Rds>$^>XZtLO95cHw_J^i@!^C%Q;F%ssn=L-8bYPzEC!>(d z8ZHdJyp;M(BX$x-Knq-VX@U+-exzu=NY!X(wv>}hr_4Iisp)Z5I?1o4^v4s1rJqtX zyeK?>YRt=N<@xbS{r!s$xwE?Hr}{>c+#)B_d?D!z$KAW;0$Y&%4YcOA0r>p_-ThwM z9|9Kj*xG%fkkkE69eVk!LGkExZU>7jLj z_zX}!q>w-yPxcZW!m&NpZD?mU33O1pgbYyl7c-g8f7`7+svw@GU#W#5d^6lCTCfTB zXY&uhIA$)K&Bo5&f2+RvHkYvnWwtbUKIXOLh$ z5@6HyB>?zfKD+#sXaC4Tk>FaxFV$795l&JS6wg}`rg&n=4{VJ~rUFlQ6qBkP+n0R2 zER`%fjnVHrc?OXguD2$A4+NVg)x&c(}$FEwZ zPVy-)OEV`3lbtvsJVQ2#?ABxS9J;sSRXtEkY|>aRpn-_@sQ;8v*JA_}zowolUVL1A z5epyG$K!nbmUp<>-|Ndud^+Bc-Y0KHV%Mq8lsU?$n)Gd)Cb1t1Bf-H!EeCvo8V%h5 zS8PS}A>?gNVlJhA_zrR|zntATp(-Q~p^mSm>wpp=N5nU!g(8H7)dj$bm~R@H4t^mv zbNJ$_>!>TN)(vNBPj2*?njt!XOnTWAHH13EceUSGYvIdMa4!jd zOr4V7D(4+@&i1lf@SJSOB!_J#dfZz5HGD}Ie@&-wKZ4cvLTd;9ZbLKYLq1HBTN8yk zC5EgRjD!?q0o4spPC*?cnygtoO`N|tTOq4sc=EHH38bm*o$QxeHK&d_w}RX0o6?MI zD=&Ih8UH6wDmoX9WSy&(+hn@R3_8tJdJf47>#ZX$QC$M3pB)Jds!7VTIrx{1J+ z_soTypp=^Y`cFyjAF{9PLT@fZ@;S)gVFf5&E-idJjNdh{FL^$OgNNpkIW;g6Dq{Z% zflUJpwmh7-_xv!;d^LQSq8_s=@IKs}1CnrwG!$x!uJq!p%vQ)d84d?k;{=Zb?~ANw z@+Ca7r&4t6Bm{F{x^GWccNYmG4>}Y`$N?yq96dg_>7gx94!c2=qf6Lbj2<4a2Rt!- zrK-2x^ioqg)+C`#Mt#>J*8|FRC_Mb!6UJRU)IttY)S;hzXMvxB%eU1o2~Y)NXh*X# zPInvAf+B}-LL;6^%0>Z#5n%xzB{{1|)x1f7(o<-4J%_n`iPwnXd^jo6PK8h5grX!q zP07Q_pF0e02 zgxcnz7WgW6zWL%+vJuodt{4o92sKw6Ebas}&OE~;rrJV^)82yVk=a&3qCE-r4K8k? zZeGKcD`>b}exs-yS8)N%Lf17o2jB%~UY7Kg&ODiNi6M!k)aIOqb0X8RXr&eE{AblI z{F;xc_w_dT?TuGb=kz1w#LY8(iJ;=*w=a7VV-^sd=4H#0tOuVpG`?gQPes9pV*`EQ z)#8{yuf^l{Zpw9*#w0hGrpRtMH#3F868?u3)i*M1xXjka`x z{h!OEPd@)XinPP)A;u_e`&9nC-DWryWAS@*?@!FNKld-#ILuj}t9hdV!(E~;%H=;= zqPwB;yxgJQJa#|;hhrOqb-Tz!Cb1tJ>i4SUUWdII_8%%`YVD^_4-Z9sdA4FB!8IvL z{PovClKlu913gfAqk3mEznS#^J!wMFHWt~Z_Tdc? z-jVp;q!f)MUp1z`vamCls73ni`Gn6#YJ9Kpz**SfYi-u)cZ7DU61|(G`lgg^uRZ+A zcdwUKzyUDttBsPysb7g0V06j)BSo2#md)|NVMZ}^`H=ZxovTZuD2R+JSnx~Ys-!&1|!%{tDj4vH#fu} z!ua)76Q^zCesBfb+abtcgbT4F&WF_&){Zjq9I&m2u2SBTPh(#5z+O^UiraeieX4r@!sN4OX3|+w;wY{kjUPbhkOP z+lOzWBuK?m+&4eIFtjTZiasT{HqbETwgc@R#A-Lp^9z||dO!13mL}=>83HCj!tJ+D zEchyPT*>_Sj)*LYpeLs=0OgBcLC}}cDmTP+&!a4%)`Jus1(M<$;4g?Xua$ z-{osGmX=n%cx&Iw7h+Zg6VHAt1zbx__$rKvI!#$+LdAOpNgiY?s`1!lad5UD9-u|8 zCEX#L@qP&DccN7>zYBD62cWyM+h?;OSVZfA&7$xIMy=sFqDP+M`7qeQ=xP!d&(b?5 z^*076&^Be#%|f!fE%o2Xjz1j(S?L%*&<#!(i|^3GOxXj%RX;(!KT7yko}gScm^Q5F8`57K@2a&;iXc-K~RrVSaxRe3Szh@adyu zFF$hcK?ol*IQ_%MdqW3g`!9OfV;+Cu+K{6LtHLt=wT|^%61*JtM2KBw@`>4wVb2kA z>j|QlBKCXA)$rPy%2KL38={2Z!?A~p(d;gVp8+`{DmQJ(cMJFoIjefk`vPJUe+0SL z@IqXffpEh81uZSZgF;urTbWDR~MpQn_7+Qp+{H{u9&=FHcV?G{B z5Ay%4Uuo*QUZuZU&hA)?WtWp2XLcMHOGH<%Lh4D1A(8axU8@$l2Rt2Q$CzEPPxY6W zKmVJ`+@^%UZ#;dBb(IjEg+J>tIuH1{<4*j0JVF4)CC5TB9Nac(NkvT_VkUK5gW`*Etl~-4U#`4fZtxvhvva7P$v-|v zKp~+nBD{bDwwy4H1;6|z=SF*5y1Gv2M#xtR=)xJD{VA)7?KeFPH!Tcf&)k^PZjaP9LZAKiuHytobVhJaO zGkW^7#yow+BCNynBmi)%}_5Atj$3$&gk5sk}kIjdIbs%0JN0+VCRURY$7 z6{a8R5}Uh2|DlZQgM%)la^ud<_IbNLcA!SMH+(d6P@*A?+8e~lbtj4 zbWe`k6knKG?Vbvg$8u+a3-r8t#>%ql___hgmcCKi306V^C+Kxg#6(xBl3<&Rvp~3r z5kJy7EQg&sJ3Aph9DA9NdihbLtEGRVQWHQ)@e4e6t#A6$SKIKV`3JrpN@dAeCAA2w zWH^eClpOxs!!iiisCzW>D96}57 z*}k(Wl$JCmC5AS_>6gZ?v0C^4ISc+fLK{HDkjt0?_Wc&0mDFXu3!WRwA9c39F33DgHSL`+TjYU7{U&Gp z(eN(v^V#6qW4N*?rHGX-y5M20^I^c;c*g%%Um*@W&E_0icf3FDGrW6A z-I{~-KwQ=*(Yq>|!Jj8QhTwNnlCiEO1d4i>(PVlM|8W4!qGh1?fX*+(W|`P;%S6J_ zcv-60=ou<@REW+K25Vl?7vW}6KF4{~ka}qS%CEUJ-lj;Iq#OQMn*;=sC&FxVx<64i z?I+m!{_mXH+QrlJ^D&^KMKeU0A&ww?b;_s|6QGF0D|Dkrj{$%vK9Z|r&O?8O_OHJe z<28A#XN_RVf)7B`%+LuDZX}c4elyRlGlE#Gl94n@MGLruFIF2 zZeeM;(|%UnfuiLES(<*>>b>Bjs@d0T*~1Bwo$KIyVI!90*G-Ppt+=a7^G%4NH0~GA zh}QblHPsDkY59$X^IdkrK*j8|w!x>pd1AG0;iTg`lA+!z0lt5sX`NLY{m*}2CIyOT zC7*Y`_w3iI#dIm8|9jRzTthrSNTrhX_v&Gu1US%kpH3c}qMJV+H{Sc7a>SANsQJ!6 zCv^BcY((%t&l}0%?TUV)8GT?a0w6<$0uDyjy81_86SL~e;B`mdd9p0u#XSl=t&4y*y`_Ke zLZ(Uc*}{?W%r<%o5~EVnuY!D+t*Cl>)@i()_3$rU|ADH!pkyd<%DmQ%_|H<4=_9EI zVPPKvBq0`a#<z;&tqg7o0<~0tdKuqM)tqw{7B1@B?ls<=R~FE1RX*;lQo>a(Xd-e zerq@T_H3DSRosNpC~q9yOk*nfX(j8n)<5OK{bA)6rEhm&6tbH9DaZWaImVcUDKA2v zKZ7oc5zZ(OcS;dp@x$tBerQV4gk{&nCutwrf(ph4GJ0XW9des=zS|Bde)o3l!}{hV z-nd3b*UVqc9yELyVUwLbUxBRAsSfxo{j6y+-U2B%06hywg@iTEcjq2&qOabWvJtYf{#5n#DqZ^;&B+&>A9jIYNOWwQs9FDAQA|wm z)c>r>w6?aDX5>CAc%zlRHlhv93TW%r4UT?^dUZy-|Mt;j&nXy@z~CPTIfJ1v6-if!J+1~28Di6yODjkGjvJffcJR}vJu3P zq~w@TonPXXA({(OD_opsozpleA!5@*=d?|x&dZ~*!MC`7FHa0j4%JJlA1P~u6I_rK zIPe!6+wlYO4!)B3*E4LEl_6stEtGN)AFTj9t`G1?st!cb(bdzq6pwAbahM78-zxD> zAAkPk^L8#s<{Uury|wlHg;hU58i_pDUmcRPGY!3c(^-aqYlQEBPTn@3K1ZryZsfat z^f5~E#IWaFfc%vu^hjR%03PWAmM5|>lo%;*Q4)U^cZ&+@*Z{Tx#nQZtwSU5bilKMF zx8B%+qqPUm62f1YvkjbgHCXAzaLTwUl&#&Ad!N3y;tRQR4->tu3x+reVTI++EDzjX z)yGbLANuFHiUVMbCL$T}_`b zb=tpuE{!%0@%n{H?}b9OWHMI^W#j;Rig1(4xe=!>1RXvL&QP2y zT$-F}6XuW-3-5;?OSj1d}A zSW=GM01&4@m#4oq|8Zrc{!Z7O4>2P3U;Aqh^b{KoCL6iSpd$4nl-?!7p8cAZdTSl}y{j$bySBWc1}nf=v){v?v( z51I~^?qDaUiQ^qy@a|nrgE`QIv+O>Me1=oUBE!z&A!HUCJsmah7W00jG~jWkG`9nb zxe8!%P1TPp78F#pOuQ>9by8DJbnE{kBd@U_PGMrMePBs>E>_yQZK_=#*HzbUHrjeH zy6e~1?Up+-FJk#Ogibz&Z$f*dDai&b#|PP^!*G5ctQo3*I#lx8K2zIuogN@z-?Z?H^2lD z=N14rvTl&8T|9@V<^A8%`g`Qz4N_@rBejwO1nSG7XMhmp1K`5 z_*$whP9edi?3ctmx#?kolSCumcbhM6*p)+EMIMWY{4JlAK(r8prh!!g){V1exicI4AG1*BFml_d#Y+IRiCju39wifLNU{s(+=}%ahykwMe8=mW5w2JdlT_M zDlB08s3p^NxVmzi)ndY#b3t=eRNJga{=SOyUZoJV&=sRfy0HDd|AsL#w3UQ3?6e}# z@&6I^6#;E^UDv@~i@UqKySuwfix#JNC{WzJXbZ*N-HJo8;$GYd!99PT_Z$3!JIg(j zoO{mROZJkLFJ)qUna>IQApCPdPX(9(Q&zl(0UZl*^<6WB5jk8&lqR|o-7KGK6^|+a zzrqy#7!y=^ldCdk%Wf;dz3aFKx8Q;Aa5r*i*49V)A}yzX`wU_k&X;S zImKs8GkruTEXeq`c{Numrpl6MzCO9H@>{!V^&o8&JyONx7(_7lm$JBUWD_%)j>Msq z?Fa^cRSp?*u7Qygg>UAxKo6Yub%Au3_$&U5KpIIFq#o{P+>44BW(D6+D%eRbtmD~c z?!_x=U61309t|u}dlme8+Zp)`#ii=Gi{J9>b+wwXteD?|^KJN7J(sb<1>LTOc+L_k zvNwQjh3_SMA{?T?&FjSU_Yn3~b4}PL%@^UxQg1W9roiSH)q;(a46LZDKTVt<3>PNO z(A4Ol*X*Yopzs<-Ty&T9&J-Q@wmn*VJxY2_;XwzY6D7II6J);d^5f}3Y@$_-eH^<0 zJ0;@;D2E>b8ub7}xgDi8Vmln01x+|6ZCt%m^%YRbMy1jVs+HG?q2_P@!gK(%J&^UT z+k+I7O5pzuiYBJQk(3J$TxvybY>?6A9b?VN>V#(iu>PvjPCtncbnU(o}s)@h{M0vw-;?Ey%9L3gOzDws;a@Va*pW_EAZ|bhOaMy}Vat1xQ-5b>?B7RqSRF9e5Mhu79M` zen{)E49he^fkFd+npTK=C+Jon)vf*yS{D69Mf#fHaPGBYLo~+`8|k*&jx>}sQch8T zDuILLsf)mQHn;jQ)fXyB_?m#%x%vXY+6X4ky6g?uWXZ)D{!&ZJkRtpk&Zh=1VR#eC z4@{&;UI}KryXO*OoLWzG=BdOB@jVYi=xES-|6s&l@#SOlNtW)l#<*c0x}H8=;MDJR zq+rGU8}`TEnLpo6xx5Yupb2}22hI&Cxzp2&-e10ah|J_-(_xErX&m=1RbNlXXSFD5 z`+}jGWgr$JZ@1!nS{yBwY)Dt9B+(eEz*o+~@-eNAh7vwCqu^Rg2}~`_dTL|4GaE$o zfn+ost1{Yvj0Rx}El04ud*C1~gNpZg0%9eE-u^l_`hH!^qi*{LDS;xQf{ZHEfnx5J zi4SzY4TK~Wc>h)IqtMU*IJ?f*v~4{fL)9&!&UnuhcrELICDqhgfHctH8Rxs z^V8_OSnHUz(9Q9?%1`Xs4Y8QZ%jJ`ki|-j`q;V0>gWu?M^Zk6un8&OleuL34DX}Ez z)@u{cD2tT!Cf;}zej`=9GPs{c?hiWb{)a}ATvFT@!yx4OW#>$#xQGq&+UU}cVpRrc zoW5k=(>D-MF%&2(eo|~g6Z~?yf%V}VTwc3?W@vA3Zzf}b-|n0mL(}?yso_hnq_khL z7PtPk)J{3l??It;dEe_LuPwb#lppL8YZs+BKqANDqi$%QB-r)UM}qaI^+j}kd6vGu zDwBp(tuZaD=FED>fqB&`(|>u_9RwEeX)krK&^gMpJ6mo1fWxGxhdT&N80NvI zu9wT?c`Q%uao&0M?gqC?&rzIGrvEg+sf-!=2-^O5`LgrACvoo!N;m-45k_jQrWZT= z-nzapP}9Qt+2z1bAs2j*S(a1qMe=FC3c)61o}*XP(t=m5WBFALX{pclnWPCTv4d@N zj_qDDrg~9R`qal0Y)A?0#61jl9FIKUj;H|tnjO$_Eqo5saq>#{)yt`ee~Ycd->Y|E;u1CmaCpvabwdLlk#P z925X(fecxLvJYFH19OUX{Bv6l14IKu6kFpeJ+iR?irU78T3vl3^}DX#cozXmkRe6S zpEKsZB@u%O_P8wh5Ic5O+3D{pY5Ub7%#!~Xiv-i>)S>r0%y9I9sJZ?GG{OSJ zS1Endk)pQ&DjM)_BUpARdS!-Lv8~(wM~+DONau+O;HwK$yr-ZqwA?8h*#V5!x#IkT z5^GSxr%5%`{6CH@OYwWANY%EzsDn*=^*`|FWjvd&6EK5Il|>1dRGc|5(;5O#rMp^h z=9E*DSL4f=3}acTYN#>Fw~Wm;>V!0{|T6|@*mK2S%)m>J5Y^X`UX6ci!_ z35NNskHQXbL~N0FzB{a9T2{BaW9cF&~o=gb1UKG#L;Anpln9SmX7%ym%B_l0O?fecj-iR$A>HXf zDoh~viLr&@ZOmixbOzw*$v!fdQp1?zw}>&H2)goO)|1!#7Y>19;ZYOl+@vcFqg zi01d|sP{Oj2Txd&Ym1&p=m1+fHSV5ZXy*Fce?;z>c#XE4YLwKLZR-40?czT`N+oIV`_#h%MApg^I8J`WQEKLPNH&=m>C^_DHc z0YeK`8#@jjlNIxJr@VQUUgI29T?$23nhurSf%hOH1_Mf^jUdbfk^(AKN7`&39uid> zmzxV0+mbGCo3^P;%@bUF_&aJs#E(B!HT4NK_VP83FxryKNBCJs6P8+1BbF^ehmGS2 zV48VN^~^6QJGIZ@N`*eCg+8FCVmj;RWv_;}=%4LwZEmVI5a}`Z^@0pDRFj$dstjs= zbp_HFFdCg9%c_n%02`n+?IzI;r_`FAL?ube4|`2yy{zI+v7tbQp}w7a^#4V9ITZ7B8}1iapJoi)+{=0Y2()(D?=rg6gt4t=`)h@tkyX1r@1-`y>k+S!;o2 zWv^Dj@nvKmU(qk33bonrm&u~XyrI*F0$U)Vbp8TTAjj|BC%h-Ve~F;zSiJQF9&$A9 zzu~S6>Ma3)P#Ydr3H)ONthwB{v#~N|^$AAea2zekO(kB8!vj4@T-5G{&JP{~&O_-? zE_;=s-2X7)y>EV|a8`rdF)3tZ961ob4j?{x>9EFkzM|UH26|g^b*4?G&Du2rI^sof z#hyBhc=<0|ZYoc^9I_kgN?EJ>7m8vcdLSGHy7WEQdM`zh>vk8z+Tc9lS;a-zmZ-AOOeFczsK zA6|h1bKw=bWg-8DK4^BAl$Cv|IiL)A+?j%A(q>F5q(ydq_}8gPjId1wl0d&%y`gN? zxSNi)hC4saK++FlNOKI3?4QtYU8|rC=1Tv|M`z7nURGX%gp1%!^A6a$o^1@YSnOzw zQs_MA`mD9e`=j+zXmaOfvgjM%_DnEf!UUK>Zz-oI$JcS3_rm_;g5i)wE~D9Z1UbLQQ}a8lLzNen(x)jpsEJvq`%5?yusK6#SKQ<@qyeN zE$jsfwpg|ne7Gi&588=eIA%J|2 z1GX8iUZEjW&)e3T`<Zhb|p_4C-%x@b#Z3di8jeqnCXX%?Z_7pBu8wuCLZ7nS&IHdGh znCj1x-}koC`=U_p>z7`J=Z~7!L7diMZ2K_c>1(%W{Cvtff7ZgA6I8#Xp}p8iuza0) zTU`EBVlUAeFD4(0^^+l$s-1~?>(9U=ml<34)8U?*S-X2iWr#K1-DnsVRr&nwjxMq$ zOcEeTh$V)As34TVOQpNVaYsFCuLSi_tpFtjuGpBmCjQ{e?-}e{|c@%H2Y)xBR)GXQ$^nol+ zqU*b+kJoaLeluTg)t)ynX0C2F^)Vm$I8gJ|N4{pa&R)0%2y_O0GV3k9L`)eZq#Wsa zKP}cB_A49VT%LGgl+a5kkWv03y)$JAv)^dZQS(c(B4eFzEtL~YR*Kt3>H3#+?b!Zo z2iXIjNjSaq_(Ht$5>gz`^w8W-7OWJZwhqYRN%mwh>?4eEzSm3;}u3}do21fDc83!Fg_4B-d z(}j7hKWIO*35%v|SgZjy5jH>wOv}Z>NWJ0`C^@KCWJ)#_+wJ+5-5vA&w#@0^0s2Az zNoUTTU&{2wY&g&)iX`(HnmYp3Z+_0w%on@k!x7e%yChLB07Q?`(p)QP`~NKO{>L>( zMvH^WjrSaYwEvCBRifMpfKK9z)50I1i~DV18bno;6z%XGD<+Ii&Q#1843+5#8F^2# zi*7@k9Ls#KWtiM*!HeQCBx!DDqz_P^eYPU(-6iHim*_!i=X-ET>kVlFcRT@QIuo&z zFen^3_91##oQH)RJ?x@&y|(>s$+QphD^25hlS>R{DgNU&qR!SI@D^di=bx$Ng1Eti zU;7aQ-lilc>~qV+V@_3LiL?^%GaJ`F_`@irDtM28DPQLTVHo(^U^4{L?$dfFNA;%5 z9Lse|c0u+t7vBE6uM|9EjQm^PP{5+@Zm|+^gp}Vidn32UKL>JSP zQ69xhVBKX@R;u);gHsIisfms$i~_K5S~KVU_4oEW+o$}R(linYItORmwVWcFVZWc8 zh1X`fF)jbNRPyZiI*HRSFWVEQy-ikPVj@N^FQa|SD zD#0RWZb{mW=K7;9u)e!O(kQW$hZ3*9qkAy$Jyo=@@})p2-SP;Xot@pTNjuxw<}Fg` zDWAulr|Y7X6e^=6$C7-72fp8gi@jcbfWi^Je+qi|X|#K|;!p2x@%-NIE+3m>xzIhP zJ^s8tK_hMV#AZY_5m0D02}_T|7T!b&F)> z^1D`anI>&c6*8_D_4RZ4L3rsk87W!yH>|s>(XLCUPRF?-OJnE4S#IBfsZlnQaJ1NBn^>v-|pqtNf5;tS>>O8v4$ zAh+vUGtRdJ^vF&Q3!bru{YUU9gy@BNl~SIJ^%Gm2v^WwKrF$phHW@;A_C#MIl#(77~uTAMlGGP!js{%@{_CQ@xALOqE&|9J)Of z!a|=bjqu*HQVmzzwdRxC`;oILC+!xvbW5DUbmp{`ke5|x-(2g`_vTWno*NHR^ufJ- zh`PO#2j3QaGHR)e)335P=m8~k1Cz|_tq!2{@pB^g;oC^IThfrcK2CM!=u?EQ`JrA` z52U=~@=bBdr}EMQM-~_8=>FLH7~ZfuI6uRIBe@362JTE`++tXbkH9iu{rnSEGn5UE z`G&ebJuOZ|Ozy(uDR~6iEQXYJbp^Im7IaPz)zB(TAQ{>o;8k1=Jh)_mRyl^mQqn#A z+HqU}{1&wfvQsI|zLAQb6Llt!1^3bN?nht0OWiVDYp|N4T_HTlq<`?a|L0IM#q zqv;+$zL(pdo;SJ^pM{x(t*xJ5F5>EZ0dK)ogaZ6-*FH6r5h+Hzd!3Dzkkf;vT!tAx z>#YW2PV{i6zM~w8%5h@%9vOoYJ=Z5Y)_Wgqor(3fviI0@^=b?khlMdamq!Xb9n;?F z2amMDpkDdQ_TEW?K+!KU*~JwCMRE`moSx$^v_+>&x3wnl^~Z^pog$8BbZ;-4Ox%p` zq*RYeZ}#J0#g`Lj%M}*0O?>nAL*FP3`|H0YgfuT?h+UtUx)#iV>BIM`S#aN^r(ldTo@Y{w7P8yj6 zHK3h^EN@@0w^0HYtbui|U!ZbtyQV3-CW9{T`B9>og6ZK3bG(CNR`pVA(&l^S)B~E^& ziDa^y`j$s0Padp5CF8xqP$+9A-WRw?4M=}r->9Vu3Iwp#HQ^rK)?ttK(bX z(dU>iwuiv-99)C$oPz~tM(dPfH)gnNAE4X7f-q<%dyG=-_u@TLbSM4Ew3*!!@oTJc z7`7r#2_xBi9j7?7FjR5#FAERI9up1dlWLpg?FaYk zZ9N`4zq|6i4B>bc?D5W$sGpJ(p<(2^ZzCe%K9M%uQ1X|l0w`~v;&3rvLN{%hMk>zD z#k7Md?SA0O3B&g8R*hdxZaKg9xeGc`4!S1>q1GAy^FQBtXL7l1M|y34zRI4%Xeo&6 z+K^`we;t(M8r}#oZ}Smo-+1hxjke(^LilC^1Zd04a~-BhzML>lLsmwCWEAdt@J3m@y8czlPJY&R*;C=vZ-jxJ+Y6Y4j2~(UJ3n+L#p5ktN(A-!J z%T9uecECNf#L|G@`~B|-5Je$4j)&@en$(c_IduB{xIBYNwiosrjnZox;RW1x)DW~4 z4Y3I93Df-=6CCElmb4fsW{pLLFkF+7$JE;k!?W9?y#5{Eez$PnABuavIux2O;@jD1 zR_{)Rv!3L;Mlx7U;2lekN%^zUO)jq)9;*LD&PLV5l~^25aQqI{gaGM~-cwD+TPW-2khaS$5PAB8X;v1~XuG7+W5E@;RTONR@87_viM$+GjM=n5Fz}^e z2`3Upw^VK9M(rHK%F#LZPo;j^smZ%DxCD(uD-`M{2?pPhlegJ7tzwBBO*5iC-b7Zi zUdfdoa)2x2@3q-*o-w-qSyEzOMTK0TyGXtya@9gBE?brJ zN!~y_JS)NiSyQOHOReV8hByDKp;@Z*mnbH@-?H^A`ayortDkzxpl!ru5SAW3kbEzmr%h(5sPBf4F=d|ng&50J2-5C`0-$+r?U@qLu zC_8RVz!zd*cuL)W*O+6qD7O~(w@h^ie%vQxm|AAq;J3}!$1KY~0pDL2e>kVwg=+cS z=q4hNgsDlqHG>Kfj{nqrq1z0RQLHo=&iP(MZBYN0V0OZ!MsImpMHNnRq1m`X*GIy! z*qUaepGXdK@_|#I!M>|5!@8oQPDc@OL=N+l+Xw&Vi`!N>36#I-c2p{zu|QrOVO+Si z6Z@RcosD~et1=$y{Q3Auu*CgQd?IO_4d8Ozwmw|IcAP;4J0hiSi#$a`n8c5%5PKd1 zcH@5yB0ZRtH-{*$qNq>IDRvR9tA}Rl0 zi*&*QxXz9D!|~kbifUS9bV%%r_0>go<2u4m}7P;kx{X$B10&%kH(t4D?60zw7Ihxo*DK z*ON2#Hp8mj&!>~OcXzulr7kBLyE}ukxRDtxcbAuo)g~<@&g4}Fch`Sa>l#0*FN-AI z{bwCPOO$v%8_Bkn-;cVRaByNJ?`1$noIT`P zG;rh3GDWv=;-v>@vT00}9DMLehj{x!P!eA1up%c`{AEebT*W!bz%}LQgZNxE z(-jS1+9j?mOn+bog-?Dgv`t=PM!kqV|=^eoeubS)>s|0cq?>6=bkQYyRu zDw|)FJi-PD`B~P}TFH6l-W?;(RuWouyUw*os24u%yc z_3lCC1CU{&8*3cn?B0*8^Y6V{2R7JxL3)+sVc{-^ZdBs<8AcvVh;2tk;DMWN0;2F5 zK4U;n)3e_VOlXK>vTR4T{}3=_#;gOA(@ID%yLf$;l?Cyu{m zVlJbYx6My<4{W@tC^gL7;aOhCtWP7UQO0{V+e>u?Fk!hXn41T0h1*y90TSJdT<)a( z3+a~8P_q7rULvuMz59&?NsFcWU4Q?;(osd9{t2KH5*_{Baj-WH;JIo>Kd*A(>!R1o zIAP-S(gJ@n{D-IJgeP?&X>GYu1Z=6isQk>7)bkZ1maadTNjTzhtMq_ASh6Cu;#f$! z#}%MxjM?-(4`AkQ4CWhhA&~TQ2C|k{Mn_Xcmq&i<&FDjHKOC7f!?@6YD|zCwV(we* zxF+xqV|Pm_6Ub2`;jPM}mRuM^EtF-7PS3c-6EUh}JM(Uzl?H}hbh!>SR5X1=6OVd! zSTDW2^!6Qv;&rYYCa}BZG zqIFZ?8OH?_mXm~C=tU1ba?6GWAxi(>u9-iYIzzn*kzeCM^&|QGty9yY<#_tl=w6bb z-Da+6wICvp@k3AyBU1Js{_sWN;4LxO*TH<1W_l|z;d^&iCdlhqZiwL*(UHZfEdMZWMC;{|3cD7(4s^fbD$bmDO4 zeH)=-k-=6=CVjfoFOKuj%~(LfXDcPnL(=g#?r2U#HJjfQF#<*{Sh``x^cru@hOzx@ z*;BAeTh1Y${`UMl&2d_bCJLkp3xW*8^&swvFndScvgw!ha{YVzt06~P(?ny!i~QXW zMwS;*6JxAE+wnneHK~enY|K%6_(+`C-aUx|Y=A+3_wL*F`R48CX@29sU?7eMrwKRM z)C63gO1)wn(aCWYLmEU2?^H}8Jjo$rRW z$i+pka4t=om_a9#mUF2$5MI5QFLa)v)trAFoSoKx`-XmaTwR@2>)sxe=205e8Y+xfe0E9DPj6M1u<^+9`Bw-F0O%z+Ovr$q7$M3Hr#WyelrP?C6hht`#(>m(*U0XmhVdJuj%$?f05#Q$$EpM#3M3< zKB1M-@Ib96<=@k-=(pvIgO$Q;9s~it+uWQ=@|n&j5vR`fVz@v*;^%x?DMws1o0NVW zf_GH-AEL$I4T}0XrNK-)X@xZ2AH_u0)oKU-n62pl^r-v9Dz+|WV11z8LUA`$SM|Mj^^ zZCN&wjE?qN3PP$h8wS^>@vJ17cU>iJj^sqn{a!?K>tm(0o-W&!DpOg>11G(1g|%Uw z*mBYcosk!rGW)D%k1 zvUSqj|NKuSxYvTXM!IQe*6T)-qrSz$m6-j=E+{QMq@FC~f?V|rKN+fz%LsXg45MIB z$DV2aaQ|AiHqYmOtauDYOJots;FL4I87Lnt4N?&xpyOy()|oy2!of{>>}Y{Txy4d$ z0w}LKb~*@Ji^xd_ao&RWCMC1R_shg0JnIxh{TaEZS}0-00Yqsp4E>y(A%C4FT&3o{ z>4M8LdUM`0(szsb@0>@mA?j_GReA<@De+xv>ZM;j`T->&?4CyNrnH>nPdf|jpl+mM znkYaPvL(gTAv&geh}WZ0C@ZNh?`HJaq&vr9kow;ETS3b$M`}#ZL}quscCBasKJ{ zDRY)zw5UcNdK#(2uKJ;qBq^g;s$Qu{8Wc4kz2R^M@b9XVgTnqtDN2p{Fyd(k<6dQh z?|TIJ#ETOh)F>)7ea*hec+?yy!Z7wiu7Io+%V#>qpWwODKce060M5fr%VMD6>Wkw-{{&-uc>?>xz3lgcJP`q<-X>>W zw&>TDkX{cBa@+~siS2xXn_yN75D*08TvKYjjv zTg9EMD|LW!jNYz2P6KxP(qchnL3x#&{71h!d#-t`)N{v)SfAilvgKZCzOE^rx$kq) zGwOq156<*11C2+VC*zCAT3s830e#&iw;pn>v4}eF>c67OmDOQ>*FUOqA0(f_)MaCX2jMOE^xrO)9Dkg_GN+y3dDY@4Nks{EN$#u^*Ry;w ziiev}rWcfGpNLeV;TVz>)Pox&n*oph8Qlq1;ntu7BYOySqx8_F(lJ+`U+qkch(;Y% z`yFK>?hGn4b`8`gQ%st`8J`l(BauB2s-ph;bS?Pfa&E|`;IjPMJe`g(H0z0=KhZ6) z4SwLt(J0H)QQf)Tcj+z&>aP_cxR>U@5~8SjY31-VVj0NMiBawIjNlxBnAqd1oeDs6 z>!lVq3&#bvF=v}f>l(vaYmK^%jJu5-&%9SsOIGmd`_W>=0N8PeZDEl__oFvuBV90$ ze!`SF82{O-1ma>M6J`ga1%S%)HAFr{jvUVmrOZi8uCZNvDydbhe0zE8S5iO-YfV*9B>p? zCwIgTpXzd?zlblV$4=+Q;OOD5+h*?7-hKpLd+lEa{q(=-pgwc4IT;fm*q{87c{eFDwSZJjAlc zK|Irpahh`v;MN;l&QO>*fH;;(rUZ$W(W0W`9Z77}4BSgqPG|%&B3EzHwkPs;=4BhT z^Lr3SiQ8fa^iXMTlA0-o5yx8VoB-OqJ+$61J>w)0A1U&ELN^G0-C&+83VSC$S20tb zOC1)Zmd9%mh=I7#0ib|l0x3D+)H&h$M0A&5w<8Iv;dao`CohtB>RA1{ZhrEj0=L6L z@7r$b4-kyVq}DzV#@T+eR!^g;)&6t!79XddyQlMHMlo;L+yH+Yn*?+5JuwcL-oO`t z_tZKJL3wQc%oCiyhKHjeaahk-{dh!!h#jxcbxI;vnsen=la@nR!+BBJsi0q0>n7?b z1RtmA#Bi674Ps=8T$*aNC~I9y62Zd(U2Ao_F&@Fw&;B{a5sSR4x343L3u5elff|O@ z1=l_E*MvV0q?G$fdSru!-nSlixlEcc*5PG#1xWpe^rlVuw>`28jqX;w=buTnZflpg zP0z_DTbCmpV65nNNcm0fChNq@ATL152XRRt`)Ou*bY10m>|j5IoEXB8UEj*fVU?-* zGZ1Ut#v|Jsy`-n^!mnLv(U}g03`mEjuN^e4h2Z?Y)YYm%UMIULz0ZZd!?@kEO%SlP zqM>$pqm3TpH&hn9u^GYw7^0s*9l4Pgzs1|TMn8P5Y;XnSd7e|hz}tzM>kEbMR!or) zhTL|_w-r3?k%qJlw8?b&&be++I6(}9Wq9T&>O-;r;pCjpB#NHan=X~Tr6q~q9>IKv zpzt@6qoyEiluyNUK3KL~-2*%JMs0%? ziR}3@<-qec_@*c9hO^a42aOt2i`M-r0}b>z@q9HvG|xu!EoG^0ogp@gzChXHgzLyS z2sPv;`Vl&UX;AA=pK%6js#kA>{x}UIE?#{OH0=gud0!>!i$yf`pF@SAC@eN1GS)5s zrSXjMU$fB(ZGYp$V7$YaG-IvwrJzxP{1YFoxeZN(W?(p=r&=z`tY=Yw zbX#To=|s%_qpFueo742M0j;ZZ@Q$qf0DcV57UP8BfwxNxed`wE^dJ5MH>1aSCPFEq zpt;HY+WFW%X&MB5rxvDirC$GuTeMJKP0=SYP$g;aMe54oub@gdIurLQm+|jT!q;p} z54eHmiqfhl+;p}CF{f2}k$Dt`=O@4BLKS~+Au7Z|A;<0FoiS?_cfNb7a>l3wkbQ^B zvr3{OQ`9Jhe`g1%Evv(9lEKp8N{+vUQaYoOBF06mm5c37uwOF-EPv*oGOA&MxtBQK z`{`h*a$g_;%8AT>5)Dux*vlRJ#JPphk0m1$jJzia%Y($}C18D`njK$c&48LC1-^XxnzG;+kV7(-_#hh4eZ@0xJyi3*mq z13rR~%a>l(*EHRjhxTPZ30grRum(P7l;nkY9+#l#u0*2fHFn7Dl3O`&GfM@k>JKe|+j^=FYL zj8Ai>NT!bDJ>E^z)0zIJrR|$?RaKbMc{ZgZ8v$5?0?%OTX<@XF9Lgu(mzV12its7n zkBaQ#xo^Br`r5^+Gsqxk) zWNy>+$?d%OlfT~t2{0xi=z5Ut)|KP0cH|<*icrEs`*C_XZkPKxVOoE`Mg{XMux$(= z@oOSu5Fk>hZFW3{^LH79tV(SFwP~Yq#){@9jekaRLgtkaI7=IUVKQ!Yij#rKoW4HJ zVZXT15Y!JA3#teorp|vzpFQYVSq@~X4ngTUCB^H)lDaq=c*FbziE}?Nb6FNl*)kmW zy(^wXbJs*6hze(cm^XbZX%g$c5Q8r1FtJZdQal7iOxwgvVaiQKU-O6!8?L?(4Tn zkaUYSQl2_zwS%J$5oP4v$MA2;0s!9--$u);_tk*2m5jb)zp_2q(jR0hPhMF zZQA`2^z{O?!(0J_hBQnJmfncJu#2kD7W0P!ja+ffS?1%d~c(5op5bAnyzW4|o zv(Xb1pAtLM_t!eH%}+^ShWSRZ_7*niI9qn*b6XFSFvzc}lnjwdEu1=YIv@^YM{`Eo8b9@-!c&mV5&nj`pk}h=gCt6pVJOj1gAk3SoA8Nbzix?vlAp3^S1nD$bx+z|b2-SFiz!}jwL0%M!Md6nqdgf)E; z;$Kg!l)N%=eF^bCnkxLWr=Jqv4;|1X`k3RgrnH;=c|s5!-$iT^0X>AV5G=w-c4m#IeoBNasN-NyejqOet8&Vzmc3Ho% zWMu%MI|Le3ziMtTj!xP;OrUnOQe8Xi_L)Mu1tLt5WR#=81BF5888 zOSe!)gFQD>sVrKq9YBs@fGt?1&Br1m@jk@nA;ZYY&Hf#=$cSXaL<4!wA3S?_NhW2I zFK-lzum47yM&q&4a@pdv+p=P#C{6v-l)EZ}6y>LRLket@h_XF^!5(kF*FD^OH6Mpn z3Si(E8fi?9q+XAz=OLsVlp$X8>S=PnKJlIC?Tg0d8UAH^D*c!UO)JuNelc8rjWpB! zAhFYiaXEkDY|w2aFoK0jH?NigfGs9%)%d{(t2lQrNb z498ul=bh00z9(fl_>G>92^&vkpSjU#I2jG|f3}Q-d)+Mc`EgTo4iz+#*Xq5|4wQ@^ zuC5LcIWQjG4L5#({T*wWj~TbuqS1X@EgAq|_n*`hQ7`s(I%@+N@ z-j8$}n#qkGlXRcAXf*z@v2M+*B~gTYd`S5hyADyST?j5u>X|}TXlca$$E9r)Dx~+C z5&K?OI0*@H&7m>5@`IBUrf6gBkUAGC*p;L8J7J7N~A9Q-5w1J_jNgD*b z(RgHOn3A1|oDr&C^^>>DSRU1OyfP#W|1Ga%@nQc78z!Wu?lz-ps*%HU){-_8ko$1W zs%gkAuCDoPcMhB1je^Lee23S+#vk31M@WJO*o&=12wf1jBowahEU2_(mDNAu^AQ`< zY_uRaMqQ$$m2CBptz9gHLFZS`xik?(MoQ}iP0D z_RQ4Eza)h`5K4A>32%~*wHW4f=y zrfn(yM9arj!oX(FGo!K0BTS}j!~Zw8Vq$MaAhMay4JbDOqn2+s@osonMX@@0Bn`K0 zP6OWHl~DGNzi`S?ZmAmNWzyI4;LN>S+`?!{DHTNoWf!lcv!)Ic1v>z;^Cveqw6)J?{O~6^E`-NUKGmF$6Z9e|cuuLGO^tkSO#<(E~B{FVvCHj9v zeN|MOU9@d*C|T6!$F#a;O_2F+=F|PoBrqAab7a= zkdcvmYcJbtt~ozq^qK(V*G|yXKiaLXJB2|WAMej=?0Uhb?ZB7@SgF)eXwZq7^48IhXL{Z@nH< zmq}oDGj!EYYs|0&N4{h+T)M9})C8a7IusXn-PS>p)n@WebmGZX*NfHO2q5o=Ft)O+ z<}i|wy`8W8$gJaQD};SHpTAdvO0GSWRT~vV8DEC9V zpg7xfMfK1`+<djp}kpmykIhCR{pI`3v6@eQJ6*#n*rhQiBOkVVaq>FDfA{p<9(_u152775Y7 zAm3(1E)w0bdm>4Q$bz%JwODcMQsO5S^i^@53toy}NWC7&eh@gmm>uTcFGtI+I<9Dw(*~v?}m1bZoNfskV$=Lt5n& zN2LMS_;^E`UUN~6h0t^|St;;@um|Y?4{_j zBoql15dvvt(CPMsuxP8{E18Xp_9yNli1r3p#TrisfXtfhO(7+k9rfsIG^RH_?W$rK z2;(0&UQL7g1LN-_`&&-n<|WvG_iYD!Ckz1U47_wm#DJcD;lKa$8`f4{ zt&_`OrL3+cBEv=o)~k|P-H`u@-TD$3*C`N+N3D$=JyP^foi4i^O!^T?$778)tIGP- zT^rR3MF}sFl0`k~>lj)EnqS`B-{nQrW6G&MZl|_=Y-sN*rSc<|0S6-dnH1_QxJcfK z6%<-B4N?7D8Y|p)e^w;Y1LKo&+db6nV70iMzM@k&eNA=!E>T~k#B-mh+?N!tkd0b$ z5)f_}es!w`p<)#KoP;|e?j9{Cj0bAH#JPH%r@~;_aZ#6ZfM}^{wGvCPy`w44O#cSh zhfN@eS`wDX^jL^~`C0-6F(A^gn9ih0#g~<8;@8)`-YTc&7+gv(WKidkXYIC{T$%Na zIEq(g_y7RzJ~s{CzQUFJ@BT10)z4%L%y|E|>nwiHiXdXjx?zd<0;A6ryk$iU5A zsQ`%VI@9!ST6xObFfNQE;B5kZ+*b_wwcwSbVTH%DDoHFHcDCy~96?6;iHLs3TF>8n zc%|CA^|CgV;gu4_E6yO&7;Osmf~7jM!Iz{rlUXiLjT>d7CR*mqJ}ae%N-XjvC_(iH zJ*JVm4R{4B@|j6<;Of5!oPnhA$eiz@PME_=e2=^ojoxsi7Pr8TLc@03m|M>loD<=w zyp@!N@-?;W8vE8}w9-`|0ZGc@awq$G(CEi|!y>%r_n- z2#%Cn=n$>-OH*V5=nYxJiBdnI_7HPdh$Ac`-Do>_8!r=dq0s&UR1wl?&>hA#F0#0X z6~{DUIz*8m2|Xt-WQE5zP8>&A!2#yqS7({)`7q!F(-YBhQRv$~HQV3>+bgwkvpP7; z5YnFl6oIYQT)~(mC)2j>=_F5|OwgIszd|@5^V8Qklo4K1|1C1*{##04x;h01oxWy6 zya{y5^Fgf7uJa|X_lMs?-eMScJj_z^2iUC9_M0dnEdsPhL*V z5_$&T{Ndyi{bb-0ZXrs!Zf6$wCW3fazDGIlM3u?#oRdWO&me6$sTds2@Rj0gfT7P0 zc-WWr*su(L;toUg?Y=abZAj|R7pk9(L4Ou-JmL=`at;Yf_gxuXxj60onK;;W+xW5` zQJKM(fBphS?8Bi5Ct@K79as^qoKUGJwKB{N+bJ*@L&kq166Uvjm( zO6q`WTxbe>B!h8Jo4vlno>C z*8Ne5gt|VW!~3zXeF$=itUvrB^29X+%Z-SNrF0@5w?Z|U}78+m<10~*{xX@~9 zAFFdzk|E@>PQaPxWi6D(k7=^V5*|HVORSI zIo%=P{LW8`T#bnZg6Pde#Y@gTF*y2|FbXVxFu1+U*eKf$P>8phlEa8PFgqo0u11!W zu!)p60T?0ZGw~VzyS<_&fJdzlp~J#J6bq6mMD~a5h@S*Bk&lxvB=S@@7@x%-A7fd( zPN-DLKDr^$#IO)=JW`AO1-)?~S1%_w9_dJZs9InW9rl6Cbkzbr8jMeqE8f{n$!#=D zZiuf1UcV<03sV|o^U`qjY%G4R?hfdZ_EJsZdHt^OMPHRg{Jkf=W&~4Ome`m1wq-LX zKnEDk6dbi|;3Nh`GLTzyf2KzN)+zXLJq%e;!=(*N?5NZTvDEJtL)M94m!J4tBQIbh zGgTTwkxQf^YIpuC*4D_Sw}S(((w8C9OUEmS<0()wZc0cIegnLxLC>fPXo|QXFWawV z>XR9Q4;m6PUHqHRW6{u~%DBk3ON6@!0zj|iNIkUuNzcu`_>_FQ!6;PQ6_=y1n*d9Lt zuc8fcMhBBujhyU)w&sRp#w`hlEM0&5Za;3kDSFXSF!HX6ypL!Y_F%>?^mCi9<0*7} zYUGa<`C8jl=yhAY>k=Rhc#XA0l=JQ+l>{O0PmtKaq?sd6+QKB9p@ylHgtkBlLke@- zMG`)!>cpt&$LoV%uG)0J&LLEH6>w!*=eu5cubC6B))y~5M02w}y=EaH+WuRWl;wqC zCxncP<)C$h zpAN9;gtkl_;LG}D{R<;$8A=c@6r5tf&=i_B%Cn85Wl@?luq88ZO799$O$rRrj5<&& zkGwa)^g7^nUB8rrb0_M~3VuF(*m)~*){(hv1RN3G%j~?MQg18LtjlNgM8#LVLKOI8 zD$}OrqpWRA_?IiJWwTp493~{Okjk~Z;9OpF=;bxNxfz9S;B9wL_jKV6C@pB~tfbNB};x z%@djpUtR2?n92;&>%uZEl@QA+Ck$f8PbsSAtzWdInv&Nw={k6au0yUwdd!EKD&uco z-D9w7dK5nhggShP@*O8g$0a}s9RHekT8JG*W^X*5Z3iQ-cyCbVXg`_G9{aRaXng%= zJX=#oNR|HDQQ6iRW2Ox$sqXp>c=pQ@Xz4zKnDPo*uJcN*WCEgAfSY1l(OIkzO!hQV zWOq_9Sw!w^+WRG7uliWLgjt*hpB{;XR#RKjXjjX1;5|&cw$TM~J3xy02*doFd(Nj+ z9kg$%Dyuh+&cFXiX9dGp(SBGPS&) z2jyhx9!-7-srptbM?jSh|3KsdVMWDZRK9mxp!8t5GV$|N&e|Mldzu|fD0sm)x+2+qYdZcL%7zcT4> zZqROP9ny{|S@ZYZPVz++97_o2nn8W76$a2MKeX*{&8p+_NGkMoWC`NR`aJ~&?`Kau z_~smEAupH2o;51^DC{9I5ihj22h8p|8VjD7++Sw-KXJ?lFl<+WYuw332Pw6^>bOLmv zmoc}x9=BVVvTSu-1?V%s3dTH_r6SS9xQYeo)fN0EbkX?jKIuG?mmc~Fb(|jK9!F~j zs2#76fLIw--Q90vi;^WX0z$^=GgHS?($(-!;%wx$G)sRiM@20izGeNc_K5(ZOpH+e zB=0F?yzd~hA3`d-7>+59)-Ns_fe`}u21t1Q1sEaaMe3+d$_OzKsx`v+_jH=5Rwj>E zNZ^VjRz<_ za}kHGjqT^_o6>PPK<<2ZbJPCn0{(_~L!BHi!?97%2X%3MUG&WZx(ii;WuWwy!d3@- zjY&`4Z38dO<^!5Osm&0j<97*;3*VQHQ@)!sXJ7_=w>7=6kfFSRZv)`iM|z+-kaJmSyn0NJoL8*G_8 z836OoQPq{FI6$iZJ;&!hEGi+jgXRs=AEi3%EXl3poH9GqBz*jqyt^&}nz3A59dP4`mxSZb&8tIaiFQOe=Tn}HMNzkIRL}m}j%(UEx(aw-BN?GB{J=?J zhQnf&Ow{zVqY3x4bL89`O`?-3hb7q|?wh%b* zb2xw9`Jefn9nAPrw0- zPLePg&Ddy_HYJ^J>EHrNRd_9E9+6e0*yq zYu~{0qG!t3ONbUUl2B55X%sc%W~8WMQUa=-dsRu3GdAK`Ee)P)~+ardXeoBpUn=a=s>&&3Q~&_-d<#n_Df zo7m!Yb1K^}1FQEv7C0z%9Q4;LMp8>&wu7n$)RdX{<>H<0!@u)C@M6P?s~3oU{rpmq z)_^dG5*(9?E%6~^ogV7@>f-&6gktCDOBxr^3lISAE)fSZ4!C^2t4qCzlL)N3)j5Q- zA>nvGXctzv7`v`T{5Lra9@=)+G|1CqO(4fQ<{JmPU13S=>Sgkh%xbMxv^o3D(UO&Z zRJD4m^nosqAWIRBXW(&9K0cU}u0s4+k$FT)FO8W|Dlx9L`XT(%jij;BN%H=fA5DM% zL{G9{qQPA%h-~r9A|Z!a-jLiFuoIi4A(rl{Ta~TP5r=Ru{1Yv6uC+jd(N2kk##Kr~ zMZzA1KE(vzh1pE)nS62*a$~I%@YZin`(RZ=P1jnGB3fK~$50Lq{9PsC_~FyVD&-rr zah6knsi;ZxirrXD(|`Mqzbkd)10c|e`a&#vD3DYT{Uzi=pW-l))Q9vS<>yz9*DHH? zcXX8;bPK#8o8Q3WU1^TPzw~nazMWzzq~Kz!cVM1!U_=2CzBY3z3X!7H%HuiTlKeb* z^}qhY9!_-WmLD2anAmlSWCi@>1Z-UEZOkSR3psx6@bKEsB=2IM+@kGiI@ack#EJo& zT$&CvY!%*wodv?CYs|IVmo+yXQetjI%Z-J$rc7|{$})0hRw|7F7eR0_0R(|B(YDQ>Whzk$86Z{09lmcQ7!tcld7M_4Lchr4 zAq$Ym(v}-{q(?{$4n#gF0Lm&VjvmazV=_vvkks8or;DC2?QagmL0yRMRsKiPnjbQ6 ze@E6UTJ9tYmBts#JG}6wfrVCKzc15?1CPaV?x+J!RdgzK$T2G~Ra`>Q$mU8-8r+q* z7k*rcLyPN-dF)(&&9ND*hT$84c4EOPqn%zLk46`|ZCKMs*Y^tWbz4v?aGps#sL~g* zH>ir%{4kh};Wj>xIN`GAvZY(VdN9AYh=D|mkaEXT=jqw39s9x?b>fwj&i4Ajdl~CH zZPpWR!NGSL#z4g%FfTDLHVa3Y38(D7SSlKk!pQynwe%U(Pd z+N>J+_W**QXP8{bgrD{532V0%Qt4mp|CIn!T`u@6`*DrgH4eC0sUcf8gX5BZp<8j{v{1 z1zViV;4(4}Dmdnn2tTkqLfGF?fquC7gs-A(p86Rg?uia*-?E@ zdbwFU>aGzu_3KE>FM_c?TUPugBD1|@w#n};>m3!?G9!>&m_K7FQ>s)75Kj5PH$qPH z6EuA1b+*T+9PqFS_3H$}LZWyZ82!^0=Afb4yr28^7;pM-|5zDnvoB&tv&>{MO-D>8 z_a=GCY3Lj;Ac&fRcE%UQfB}cE%I*mg+l2Jqy(MatlG2R)D5<5^qp?}T)953&IBb2s z)p0RXr=MSsYk;Gzz=0z}S(x%lOOCxlI|^W=n}X;ljM|Jl z5bYCF{eUR~d6#S7GYLkqBI$ELs%5Kw&pa-Fb0u*kTaT-Y@kDoQjChayd8V_psUBio^xUMfw@7a-8e- zaQ(8qiFRXwY1Pz%Op$NJ1(8~N z8#;y8Ido>OiNM8p&#u^;179}8>IZH|>y+w)H&ZL-Ln^p6tM9Fn--(ZFoZe%& zSkNQis`>xEywF0QV^j)41@^e|(#m9etBTl^bG2($`O!u71kBL5W%oMhod4`@58@V6In!713vT`shACKjj3ux6G= zI_*kT>3m~i=-(`*Y?Dm~C_!j!#4Bpl=C_Ljbc^Tnj6a#QBKo;K@M!`%juqRteqR2C zu|p^EB%)zH2d7zd`^9}F2FVC4Jjq4~+S(Q?yS4`6)u;VvUYRXt8|&1tR4-pu(QCCe z4fpew1<}_i$_gZmBcgq0>klj3I$Z}`R_R)Ac zqbg8BR(~ftS;2LP`H^)oI#XL~-2+~9pk8EBzxXZ9X{9tJ41b}-4Ju8T_a=@eq-34H z3*+$klvy;Eex|!pRe#1*{)%#-=~E^#{JE-&*x*cez12eczEm!8NE;Mp%C(d(`s#Jn zdsRZ}Fxh;!fxLI``o0NprsPc0>gr=0>02IQQ#M*0`F|W`hvD*GQ9@vD43sM$@r9O*Ly}m&y*Tu4`?&%g{Rt8NMKiu~OD_LaME|u|P)V+= ztl^V+9d6aihT_Gs?6S%j6oyxn1Ss=u0Q!OZ2Z6@Yk16i7)Bd~xY>vJaHB%|0h3s~F zt;Zw$siSGI+SIhiESL`ZlZxn&^U5w)vf_8y4p~6NX%p4-#&KJR+otAu2rk&?5tq7- zF}o$C=``7z&yhJLNz*+BIW?w6Lso}~n)wEFYxzaWynGjLs(HN6{QL6iDQhZZOWn_Y zuqDm0Y4e_gxz?Q3xzH*q2m!ZWK5!nz{xg+#A3x?@IdFN@?`j!jw~}ntvFl=5EOjOz zcUGWA^qSKnYbw-oK|@!F^R(tkjqJ9Eyj*^S9cr_^e0 zq-iPZK$RYh+>`{A^9q2I_q<3(`R@w+wQZ%|pXDF>Dh4O4*sF>?>%=}^q!<^roP8xH zT#3m(2}jDCHB_y_l$p;TM<|c<2@~=wB6Z%V0$!DiUa!GjPV5@*)}|auA;uQ4epJ&b z3x<7{WosMM$4LaWo!vOGLnk12CUJulUr(E0f6O-6BW351N&;U0Av(XB3Brz)vxHCe z&wnNI-)8yW{cXKjBtM6*CwP`iU)t1j9!g1AXY{J@S9^q~-s&#Dua`$3P$PtsKr+!0 zKBE>|jrRuwDwx*SX-aQ|<*JyKKkFIQUU0*M5`5`G`tn~f{Xa)1IAKHMz3B@a_!t_t z5}=AolWE8iUnm5Ij0MEejx)k=4l1A^CKhKnnXjD19()J+ex4KQ|-&>oc z-1bX*adsf}AMl3qYY5{Hq%0phE+9*yaIDykx9ep3ZGkwJ{6QQ6N3_ogZl0I$T!5UF zOHpQoN!fR$uVf%~V_-taKwRownfxs9*|iuaVD%0h9|dv)1zg05kAkkdX2CiZaYI*C zS$%(Rk#;#FC?k`-tV4izb;?cIum%E%-#JKK;mS7l8^yw#(V)#^T{c7sOIkn<& zyN}|c!{Bd5I8kcWXWCVIWCQ6kj&f$QC(+yr6?2vykn(3+&)E6gp3$kAsd1;+g5@un7$O+6lZzilP|)9EjuqDyiuQzRMKgd?cT(bk6kaoThD=)gFZJ zC8M1;b@`vYg#N81InQptZS>pBA9AWOlodQdYk^&g1*yo0@V>+zSOZ;#FlIYgD%%De zYkcg=f~Mnp6~_q)n3ZD-u1um3q7b&=f-l}qjeVGisMR<1uS6vbH2EAwAzaI%isEz3 zFMDGD>o)%$#IFllKtsy?4PSB9r$v^wPFes#aBM^@ygQXN1enQ|l=Bs=mlMpsqwl=Z z)<)A-7zyZKENY_FEOHvj@GIvvdvVh`b0BgPkomBrm3VZE5kVf|hWM+)YuUVe(^&s$ zOSmbm;rprdG$-|fB!#n zF?++kZrsybUbZnJDeyAfD?6w(OnS~TNmPPJME#kZEA3iE=p=I^eSWfTZ$F7Yu6*Ws zQ4Xil`AsDuA|C2 zQy`#h{|^pMuOH=xjvrDak3ZY`4qGSD(9J9sJ#kpWs$hQ!VEJ070d7qW*Gc^}8IjxZ z@|3DkdhM8&vPL8r>i*s9v;)p)y3k|krAyv^RW&TN!^HmoJ)8eoXaS9Y9XY48hi2h= zw>e8YfR**^UjY#wJlujx-h}1qSbSyA!pOIY@`Q;Z`Zz`@0^r&R{^s|oJMOAohxcLS zj6wprySTJ;i1;zZHm=R=zD?|^dol%jM<}3kvRZ@Ve*B}R9QrojjxkKgmAksf6dOD6 zWh?XI-w)qa6h*VhC=@9jDl9Gix};DsFJAcWN?eUd`vT=YhZM{ilsNJ0OphdL#ATN` zAkYZNA)Wj<=|ov2kiAe0_jT^B6MV9)JCRr3kh| z`H&h0Qt`Th4{HJr0_kVcE{V5}d;U+(9rhtc)ENJ=F}{Z=V5YaC$PLT0qqH0=|5Iis zLHo@J&u^$I_~K6VL0qYdtpixOWh~ief1CsPSfa6Z}_>FJXQQdrEJOLPp_Y5%Wr z{*lKK5r`qvK)f6e(1e>he=)g#l9_9bpNnd&oDefEv&a4{jhaNM%b(fAD)iHR;MUsY zf!zA#n!UNW`ln(=xa_r_{o9Pn1E6-M=$7i{ren7x z?26wHx+u1_>Avbw>7mi$Bq~%k!ARMDQ2ZyVd5dOw(T?A}N>-@bK%2WM+@-k1ID@xl z?H-SbF*S-jRV&l?CfT->Qu>V4-c}{^BkGJc-$FX{xG|eKQ8Bv7*tNM8EjAk_=?1l~ z#4>5U?>QX{fIWWhqoBCd%3p);ZmFp};&g|%4jTLKS3*434?-Z;FSEk!*2WJ8XAJmA zM{oQYgDrM@fA*$>L*gE&vCgs&Gtd~MOYWy*M^{puZG8VPP=3TG@FfZ2ozZ)kedXck z3H4pHo20ilglMDA<;6>z|!o`hS++h(k0O)*Ov3a>avKI%c zb9|b(r@LxQO4mCR%tpz_q#=8~g&n2Zyhy-!%&Tx}mt;XrU*x@0S?0yTYBFKZ-A zU5$Zm1dN&@*_g7rbWMj;(P8W07#I|d81Z|xfFMUB)%AsLsh_SHn#zV2@{T38y$?u=GgD%eplJ$Pavwj zc2$#wFy#bnaMU^gU+%o2DafG(?Jnn-lu;aR_Ejyxrs6FMB?3ZxeyM{Jar6K^mycq5E}DK^gb9v$*8zyi@kCjTvQo zZ=H>m3YGO*G>LTd3R@0aJI=PR%Io^Rs0{^+v2WF*G;f&avrv$1N^^@&1JuCAxZS-; zJ-^-c?g-yhQk3>oI&WrB1MekKc(J0WZ`;TA$Xe31mY?lwAv*lA%*-FZ;*##1VICgA z>cj566(3da4LqEG6%03^B7ACH4Blh`Y(ff++)>h9JK+c3AH(}+z zyHS)npgL!)R;Pb?xY%@aGLYg{<@>q`^2E~A?tjhDCz|M@&#e;y1?Hz{b?u824TDn4 zS^pfBw77OG_12ns;3FJ;wYw4&r`06gPi&%H**F#?R5Cd`DVkT5Sy#soJ3Z-PB!)d0 zZBYTZ5-hdscN)q-AvU!U)QfV_Hjp$L!iM+$)1(vQ0ct$qm@+&t%0NF5Bwwmjztf4Mw^> z6KaHK(K!zQ>KLeII4iC``)VmE;r74OQ|$>yYN>&@4&@si#q<51v6ZF=g74~Hxvfs( zfY#yY{zq(OCHNubJpMJ+2EaKwJL131PD9Sj{2L%_^sJmb!AG|5d+N(3R39{hdYi@L|}BgCTWg@^l3OI8qVrFu9w_ zfvRF0m-Sy@Lmd=Uose9v_dn&QMigoKi@qXnYQe+lhPSaa_2=IK%#V#>K&FZDUAWI3 zi6#24^VDtwXx(JhY7>{}1`ueP@9CTUt!OY_Gz_bi^QvfQS_?emde7o!_HN=~$W4iQ z@tz_UK}G}&+3o=+&*#WD#SQ*+mBuTXiKAye(XwDkOnV8h>prMzzlggF7XGSP4?1DX$g2b$Q&wtj z%5~y!VR^|YnnO3M?(v$x{xf|gAgFl@E{L_+{%krnlM3rpzi=^{h6dZanQov3u>^|2 zCpGRb7RPnXGt2lLu2TO7I&t+?|Fs6Rf4RftOm5x)M4UHJ{}leK$xQRUv?sy7-1CJ) z`Dpq+KuRi1s?J+mcT@?57=%g<<$0%L$|^D}<#zOY%U_qVM0ljxvADHnHhY3DJS^zbrn|lIk>NPC@J794t~F46^@>MkBkOcau07PkaZL4=IXg&(1f_rZ z!eMd}>ODa93v$1vpHk(mr+kXRJ?+yxv9w#wmSEu_=-=X$wix)t*eG;hONd){cGuN= zGka%arrHr?Jj#pRACTVgD?_!Nf~=^p)QWl<0r$MJQs-|wxHMK43o&I;z|%Pi50bog4RyWuI&QNn=Qq>kJeij37C8}(9^ zG6~GPdCxifwIh|Fv-;cG1Q^Ykqt7AIjpK_FzvoN+WA`iNj%T`-w~w&XOrPI|+G(Kd z`!zrNBb6fIBl_?0-*NncB!UnmztB`NMQXxFHCl91d2d5j$0pP8r@vaQ4WOX)9+w^;{}G1M&$>{F$pu3ef*(*a6sEmb3|1rbW3wU z8D_ZiV4IxF39el#J5m@G;t)gE-nHT2I&zBnHW~F*T%FmO8=UoyoWFwdr?WIO3ssob zfOd!!}Pc(b5X~`RUHXrmny=^0&Xp?YKGb$@+3b5Tmu^bdak``Jpg)fdc_>eDeoOSt(_aW|294#^VjMiKr|~ z!Id`8inNE>7XtC(3e8!sHx(6LhuuQ~xa*aes)GW?vmD=g3PWUWBW8G=`_$;~<@<(_ zy2JCB5w~BWK2E1s|MGi_X9=qNFo$lqvk+axOr!{4i+ zHCJeLWU--iNMKFcWBmcr{8d&5-9~rJ8hXM4vBxi>hpNYjZ%Vhk95Y41G*E}b1?2kj z`(Ij@o$?;`ysOs#ZXRTd6oGE}KPqVfIQh)>Le9!5JuxZ1heiN{7fTG>T!f)w;46OKn+eOUgT z)w0E-(km39M;+AHqP(}AhKaTx^8AI61REs% z_itUDjK-S<8LZ@M z2TAO`q!#RB4UFysQ(#1n) z!hOtKd%xMT{c$+oU~YS8A{=~>TP3j9?X&TbX2Z=Ro@8In-x#y8>EWAl60!UFcTPZHjscpV{XnPAS}!F; z-+LR9EtOBc{ruNZarCqy&2pM8tsvCvGt8UnM+TH^D|b3zd2a(~0d!ZSUG)h_>iFOj z#k8!EJ2DoqpZ79~e~kn9)+1N9SYM7jWXxktzW{*JdPZU>@VUzb|4gzVbXQJ=?DIiS z=Z?hob$>;wb(Oszvr?)R(B<@Vq&*1rJJYPK;LDQYJARL^FLY0E2nTp|`Gf=qU{U4N zi53$`WO8k6Fq`nfB%02~-TE%QFL`;-&9~0o_O7+Dh^g~JU5$F|Z(0-@Nz5wt^hMmV z{aTfkPQ6$rWLhxvbiPDf)9{%ZP-DJx(Th-&AtsPH(l zSStrcoU$4B&%eE$pUf`-)d>O^Mq))XSI~o)v6l}$dhN9__L(O&44QmvYoUgF%|gMH z4UV5rOoJ6`+pqFlFdmN_NAt(p4g^e|o}zL|55{G>2e;*&OIB_xt_Bp>GX&|Ukc;TB z`&kv6#=Q0Ow??ohHy5Aab0GEy$Yj1+Uw6b#w>^W){l1^>rpj%@mqCv^t(dmLiiGoC z`Nc*LT%(;FeBZ&zo(sQGogWz{{tl%dyBkUrW}$^%El!WBC<9>TwXpjWIIrE-U>dWg%4)dmZnK z-TvuJv}VMZPh36SYew9;i{mdbiVt-&W#-HW6!(q=U&IGJuAR$jzC7--Ck<}5PH?Hc zM%fd~+e-i93C#B)>RD(W&TK;?jLG$;Y#1{aqTCupja{I--~}@zJs>uxN?)i_Me!S ziQHOqE%ND!V;rYe>3luEcQ*FPO+a@RQ{i6Ud&DM6vr%K~C4jJ|VFCy!7%cw(SwZu3 zX|@=4f&PkFn&7AOjL%_ntN-nSyW)CM9Tufxi%0{u7EZ%)bESk4Wr=w30O*hGgGSM3cRbcs`z1+mVA+3mUUMf6QI-;?uQlbL!W;rMuVAei3elDvi zIreB755=6=0*ZUdpxg zA><}T%kNBQ+H-#cw%Zx&SpEH!&6&q*R%O$AAUrVsnKa2eWM){4NCOjbk{AE^jYo8WA;JY?f~W z^gQ`gMJ?TU&oRcbM4uM{p;CY6=al1BI6=s2^RoaMi+7wD0uKBucuCK&XAtZ;!_yp; zVk9FCPS6^i#IMwmamar?KYZ|GC9!m|*B(dnWACoE<8$w-nruN85R-rX3{AJjCif0cF)e!IUm!pfCgvPt$u7f2BnI*2K*^+(nP_B=G3`eIMmaUc$@-p(`; z-02}l3TnaRLZd#60OQKif-COhg(BWx!almE^P1{rbJtSxDcqDQF#Hs`@|H9)l)V`= zS?k^bHZ%Jym4IRB0@*V3l%R-G#MqSYzyNO*!2*-{x>t0`mo_&>ToY{w8~#v)2``|F z4{5T7+>n?Hu2;$o?%zp->`}wtKsJU;<@gYn)haaOH{|=20v3M+9d+N%e=ac44Ee_+8$i(V+${I6cVjov z#)ccg>j!~>ViFkkMy2|$JR!?=#h#*7}cL$a-2Zmh+9phi|t?T{-O`i&Saw# z2Qcsq^!W=*;2&zv_qR1uk2(#6rf(iH&xNZng^{H8*=XDNwupG_h0RyAmu6;bO<%29 z7sSrZ;17HuotmwS#e`mx9t30u2>5SWXL@~?{A*?24lW62v` zyeq9hD!Z}NV=WyBNhR)v^c*Qc!L^4So3N_R4ZckWdvTlI<1l|G$oTEB^X5g#R@!_S zU$Ru``J}NIZdr+#jtc6m5<{rtTh!8AZdau0+mht?g18M?HHMQ99|5-p{ zC;ke3lTfIEl+dT&`Fk)|p8{7<(XLON=KHJ4;{E*M2b@7=2;tUCft-MmJ+zTytv4MA z+EKVmpR3{_IoOC$@c0HVpfxVpG1YwMGA6ARB~K~N}^4=_GH{wy4um~P`| ztoZ%QFKSX!T{O7p@>s-&LB!_DXDqmi#U@{4SH#nib!lE7h7kF;nY2Nw^~e_eywWv+bnA$(dSM16+wuX8uNCiC7d<4Q~yy+i_5b%rHp zk*_5PJu`czOfJfH@E>CWI1>I8HRa&Czh1v@V|+Ys0ApVp`0X>!j8nhfF_sY-jq7_p zc~AF)dD=wfLZ_~PnkY=g$4y+aUpvp_#xd}`XTcV&!sO!qmmUv;(qcLYdwx|3{Keyu zlD3ZbL6uVpFYu?4Qwkq*Vg~~xY>ayx!S;8bdKdGdA7WuYN_0l?GNL`bR<_LUp6QC5 zw%Ap6_a%UCX#q8#79Xy_*Z1??z9YXN(F<6ER+=?eeIypMm zPa#48i^F(D?)K_upEaayOyyZ(0BF<7C#cxVgW@Y@Jt%;|-(}q8xkK;L5+q9j1r`MXTsluuT*&9ZeRn1gLT90-1wFn^rGxEnj|wpqk8Hs}FwIo<^S}%@?Epm0ZYF6kpR<{d*(qR;!x?6`y|Ef01U!~Y zWrvt}LAx<81L|)!V|lplUDniPApp^*3xd5FOC2B3vjVMuPU0bajaG%38K?cjt6mev z3d`O$qtE=cIxoGj8)EW?d-#)Jom zJyaz&8i@Iy>d_cq+mEq?EqmNaj~A=_N!>83IYmyxY@)*ECO}VUfTeY;JZppuTH}8} z#1YzwR}9?f&EyGdK+At9PX+qspJsu_*Qr~D^LoiQ-y=!Oym+)%c~13_R!fUMg)r@M z+(SQ^T&FM`RQIa%H4lStodb{g6IX;fV+9VFv@iy8{d7r)rViVaic*R2cG{_I10g5I z9>eBe;HA1haFJ+S6Q?9=IKFOEP_yx-yh^*$;{!P2zM5A1dg1M|(Pp3!Uz!Q5Srwt< zWbwZCW%T|>%f^A#I|fRZ2(EoDxpswJ_{F#Rz&Mi%7o4pBQxXA~U5FXx(?TY#_+-?PJcnS>4D{6cUM%iCwf4LG(fMF_w6)ecMGaH`>&)g))vfEFb;a#=ymL|CEKJ9H(U5kk^}z;SzVbY#oR+WDGPD ztK)4a=AxGR?PbBf<{NNFo=Al-#QLQ2O%Kya=1+9D)C6NGRM3cgMm3x(WUfu^~WBrdA$Q*u9{otdwj^M9W3+I&E) zOL0O-lQM%{b2~qeUb!Onj?DxocKLyE)~oO%MtGiPxk;+hQaY?A3eV;bkB)p0Xs~)S zj|CItmp~oD-NtkhCfxOnjduWR<$6l&aDdD%OP7wP+h%e$9C7{dLv%1!v>Su-GxAnF z|5j4$NNbrscn+@Y)B54}-;+P&$yK8K?J95m!b~;;J6<7$xLj>^NL4;~5Q>WkJM zLb_XtfdQnubLdn$L|P=3?(XgokWM9}ySp0+>F(|v<{kd`-j^?%-{Ax2?7jA?=UHo= zxj;|P^T)E!9_8K6BwejIIS%blaPKPB3JGYr{@5IRBJ=_pxO7`O49i2;moGZA^S+6u zV*(yM=P3A#-493XTe1B!)WZJ&3iBS0o=Qh4l{>~4YGV)ql?(R|Bl6huG>~6LPrzR_H_HqhvKZ_dGhcY!6yzuR_7W`M%{VaK_!?xa~scp(;Ac@qDMi5-^$AD4Uz&o>w z+jgP3DqZH}a4N?xb22sPt%=6xocq_v*f9FjEkq=A>q9%5UpM;Mr~%kqB&pBoP@R&& z2=g5T(_}ZL7i?i?4GX!knNFCSJMDU%vt`FFa@^OAH6lqIIU~@U{o6GaYxv0Yx1t7_ zF~M&x?@+`oe?g^#9*TaVALa*7m{(XH{wY&;<8n($!g9oc5ROuzoJehyg*g&gh}Qf9edN?2F^R9XwMfGN9xY+`?No7 zQq6YMU;!$X0Fki3PnTT<|IC1EN1q3kQBb4kkM-7k)q0Wd%uJcppT`mLlKLI|+L;Ee z+2U^vUA#U!FGsPZL>@EsQ_DfZ&->XoLE2wLeI7{l2dtYlqXhKwHV346BDkRHaMc?*9OEW3P(ZW#ffQZrGu(@)6o}$xML^3Z=(I?I~xYt**yL8L%|Ri zP@T^`Fhbx>{4i$u@NUIy>?L!D)&Nv{72$1KEip&l=cFRHViL!sEuOWPsgZG~Si>Nl zhku#P4a+^l9Ro7ns`I>>Pzu+8W1d7{-uW|?#q}FXAiBp@d%``N*gZL#_kdQUZ`j?z zxWP$=G=Ue{zRb2}m^*l|6b{(UR^zhcY4xN4`HTh`2y}r*_G?Awh{P4Z*sH1pR~ z^jiKHJP$zlvqLt2(2E!m1-O%2VTri~R6>DAeZG2h59;&=Iu6_gT^Shfa0olZs?7DE zHm0!r!Fy%{e+%5NXsL-D2P>57PGz6VQG{MUy}YT}M3t{*C= zzqKGf({PTlLd-vu*wiu_P&4#+{u*MPRkWKgHHWJC=vRqpD)7oOZlXlUOz}~4JRSOG zKreln0j*n*Pyx0--d`qO$kb#X*0k$b>gv`10wsMCt3AKUf&hm@dX;8KN>6&DogU>P z7r|5SD~FkN{wg^v>ixSOt?zMH+=+dP>OlpHU|e`-J)Uzdj2|^Ljk8?UchFdZtwg;i zM1MfKs$l)!jH*5vIJ`y{CW|e*5{AkyeHo{!vpUtk$lo_q9e9?Kn%&!Km@lMh1tcG| z-b40e)afKc?OxiDbKHG3hLl|cM&I21lA{nrK3S_SGX?O%cfyX#APr@P8IA-`L35r| zg-NE~x9#&@)Ur$2JFBATkUG_;5`zJr)6nWrkk1M7zVQ`S%9$R-4TYV*a%bPk<8lx8 zDkNf&x%h>#gXURQy#343n#!QW>_9< ztxpgDTXzcO+YoX-FHf)Y{MfpD+=}0s8oYpu9`8GunaH-O7|Zp5%_%kn%E-IUMm2a3 ze|Q+Gm}es0q#^YwclA%txRxe#*O%81_A8F@rXTx|k~bmC-FortF5j1|tfj*jCesnT zKR${5^7%UQ$fH5{Zu!MAW<_o7{H-ncpZm%P)Zp>4nSsE8ARWtWKdZ@Z{LXuL(`aEIDl2ifoS`pWeG@1BLD z^9*Y!kj4$5HM}_M6)_4n^Llw$@YdsfVf%4wQmC$L5IU?8LpoSMMWw@NNcXE&d}($o zfU1yYmblQRbwzj1aWPzuD%O3i1$^LkF!!VLr+C#J&4Bd-Jm|M}iPnp@W&4Itf+X+Z zdHBiUNBU3)v?7pYuRA`!tpgr~CEL#LbfVTA)oTf%L@cr1vgJ3@Z!i__Bny&O%Wc-F zA!7gfMKq+PH8*)_U9y%b?!BR#v`Z9#Myo!$)}s#SnlWSW_k$G@-YhJenCPuJ@TOtR>tk95>mS*~a{^K_hkCqH!rWUz^;SQka^Nm5XM#pXQ_V*$z zq>7o8$6c!+?WVfMubTUH5}F^}+(Sf98w}huLk*7N7E7nHpC*LENIM=r&@Q)q+83E~ zrt|&~mGL_)d<&Sw2&b$`e9uVe$|B}>KMVZH zNGsf0KLxm29Eo*5^aKfR)c0^SIF<-MkwyWQ$eCExV2Kjd37){RVU()2o9EfP0#%CO z60@x$f3ehUy@Vav(5~+Soy1w+vbw36x_5~xO9Jj_kH*mF z9R6IWJIdZ5tdP|c7qy!rv;i$VYOg>0zhI{D@hCUp*n_b)H3(XhU5!bJPc#!^KmTx4 z+6+Jc^p7#8aA=DFgbas_8QnR9N#Fmr&KbTWzUV$e;eaLDd`-~+RkO^Etwf8fw@wyo zXU(NTbJc$s^?YjGQMbXxaE;S_w*~+n^r5xinFV6mt@mM0@Q^S(_3l+ZTQ1IZG@ZP7 z!cwaL9Vl!$gw3cc9WEJCky6}K#Gcy7`)a|(%V_nxc}(HwVg1qKY_s5wOv#LGA+ux( z6ZUZZ+>NIF*ZuRO9}BA`GFGR70US61UXW(RZf%I9^|uFsZ?R|NHTEt zu0+kCm(mTi+57EO@d3NUtiIIAW6be}+`y`_9f_>5fh&161R%ru9}| zms4h$*6xpb$a>mj%lvB}KR(cPwc^Li|M0UVcZb&wT{(`gh&7e*F3>|<8djYw(wk)r z!d)t6)osE1a!(SHf~;B0qfnQ166NJ21FGWwe4zpVE*e>~|B4qs8rb4jN=+hD=M(KwL ztp@ODJJrQp(S-G_y7eS`%SiX1@t6{icQTWrrp?dCA<;aMd(U59PGYvQXurI`#SiUV z(FST1aH@7la(@ys6z$Oe-Cchet6|2yBdf#e({T8v&MMX_3A1ON*Z_31b*O0jS$OPV zwOT$}{c3e_!dP=bEjaDT$QACt%Tiw{@V|z~8WB*(6{GSy*@_J__%mNx?w>48Yq3m~ zZ^Bof*Ua)?O1~F1Aj@QhmqpdAj!)aSS>KrA*kOD>SQsp}?c|47Oz~RvwpVQM2%m}W zjQ*xwk=DF68k5*3|C|_>0Rpik%^@YtO={!q@W{cFEV1$EuFhk$_^$(-gEea|e^AY{ zmQ~=w8cLq`)S28&KdZIOVg)#?@$4vCqpDDd)$u?|9%V7n4Rsq%7d*{@ZZkxFJ8Mm& z-{fg`(vF}kos=TpRrd|qJ^iL30^mQ#4gderP^;j>vD?5%Zn3<;wd12%!OFuQoEHo8 z(v&~GZ}RbBGhX<30))?hL*>Z4r)3R~npT;*1jsk;t!}iO)rSw8MX;RCW$@6bqpvF9_EU{}T)4HSUHL|N`0doN&25c>R+EwT$6FzO z4eB@2G^&C+HqK%{h*jHwH@=GJ#ot=(Kr!)BN_DDvSc7dp|3u@n*xx@oDXFF)3eJa&d_awI>et zzR}*vi#}Kbh2a0MN-n4KSK-({C~KHGg-TSEn$wsTOdd7g))L^c@XUvdV`i3NP9-C; zSuGWve#OY0-+5FM>2G#X+#5mPVbUZGV|}}E6Q?hR6Ed3Sf9$Iz@CLx?JnUri@X}8| zE9^{IiFOb6Bei+9+8nEJU)i21h{5k`r1Nu!wI9K^kg*`N25Y{K{&1NA+X7K8`zXCtJ`Dq}iluzS_m{%Tv9|=u3)P$b|N#N2V ze@9wDS&Xj6HFhkRdSnmdrSC%b2RHgaYVOKJ+`34SjzS2rof*x#RM`t>$V04i9h3Lw5*qj#rQlmPwzQ}*Y{*dJ=&yxQoW^sro2 z0z%H=cj*cZ0%-x>CYs4%s_EJEtWuTL)9>`#Eu1TQ`4dG=tN*GSqa9jyt|U)Xp$c_Y zDYYfX`$@-YB{L?O;%f8eJ6<=RLjC{`o4UOJ>EBh(#PG*Na$v>Sv;PQXD4Qjg3Ua9R zr3L#jMkG7D>77s|z?G&_CBRG0?xAF5wEy(f?t*>SH$l~zZDYEpE~xu|{zI~N#3C)A z4xT|&lf}9uc1x|Nrb6*Xye^7?eEv=|-CF-$Qtq!vq=ki%YPqkCQKj__3Q3xGnnLNi z^(~LjlTC-sH(SiH77Z&s4sGlh+!zSYxu2KPhJZe8R=3T@!Hhz;b)JpNK3FXO=dVN- z!m-Zuil&$bYY@cE9TJu$M`&`&75#K)84%Yl&=Yw0tg~R*Hj{hX=n+!OoHndGhCPy` zWz(YIqB#&dKiK49DNDQTF?eeA@F}aVOaWD!kxBDJu}{kr8#Yj3-P7X#eBDpX(dWA(Qy_=2O4xc_eW@Oe@IYdT_{~U zXDV;};;EQ-eU%Lr2152_na;jFG(FZBcq=Ks)n>v>iXojXZ5LHr0vJ9{r`)IbJ`mH( z2F~ge;|lDNjn0)dI`XdTIl&*#M~!2JrAACf2)7c|Jlfi0{9C4uGcm)RimZO?z1r8x z@2BSp{_|6u-x9CuBOk7%rtGXqiKI>Ig~M5A@j&ed8>I&By9$>22^)1ki@)gp1)nom z^s$Kp{aL1X&z#7ut*ygS@NTXIX|HCps%Gk7Hg06xxHIBEmnmv=OdAI8$Y|bSUSL0s z^SeaB@UAlao3rmAsJHEq!6L75CQK4W6meXir2khUZplTV4-*LI@v&Y7GS9qt-Al~| zqUEt97ET7Gc!L_*&^_Omy%64rundG1n1JU89ks!e$DhxO8in5OpEo92RY z^q+$t*>{<+Nez5JVW;Vr6+$pz+mtQgd-q%7!HYoJYaIbdqP0uLUiy1FO0juA?(q-` zc^u7;)wzd85!*sWEX+@&-8>1@26uo08|ykFX0_}B9D%)ue#-*sZ~ZphO~&DB9&yt4 zl)!&>&J5h=;Lw$XEl;cHG91j*)vwmx4p?LLp_B-99DT^U9R4r#+>jpA2dDa|sns0k2MPOQCA?5AgcZMVTOdgf357DFx zoZf#2<*&HZfnv<$cVEc}qcqgt*jjHWSMNoh|>hO3Hchb?M7S z24v0cH2CbJa+*`~Rx@%~DpBV?$%Gwo4^9AhF8E^J#l zTrTxJPx{K&7BdAsI=0kcXLZu)q&RX=enid+8n5^K&&6Hsw6T8$NR0zJI;8peS*|BS zT(n8Jk;rn}#1UA;_~NjB{G!hTvy(jwJGs)ELo=sW$xSKpHgPJ)Uz5jG#|Qh>O{nXQ zG|cKfsGS(N#ZmwiJdY4+{hflaeV@Q4g_JRGx#SAg4@DbKIMih;6&>|uTPI}?wllYK zH_{<4=8vIRA8c^E*9O?0((E&0P6P;K0>k1Iey?5L0HNhK(QHd+`a|-m(R@FiG!WR$ z$LGhQHnGQ;46f>LC3k^W@8@r@DmVYL?Bppr_(ZL^K{voQ~X5MtKD<9I__QPg#F z{ZvSd1-iLG3G{7k>^eV|jd58@3M30VNF2_uRKCYH8f7^ny?Vu_vA>vK2qC@!8O##s znz~oXcK-4pZgjJ>yhMb6iKFT!?0<58nfaf+Qep=f|HvkSjkry%GLTXRCip}mu5Q4a z^8WJWTjX1*7rMm^ARKAI#-H*l?%mkrI*%)L7gdOza7yCdd`{@b?D}MT7A7AOSKjo# zIwj=&D{v~*&q99XSfMYH!A{+|L%6;6gOTiIngC>MagJ+hH#3AIABz}+T5 zJ_Gtgr%fG!DLbX1w6---F_}YfDr^1Y$;IJVjrlbFzqi7u3PX}9Q9u)l$9DTr_H+Ok zqt+soCIsF*4#DW#492>v$j`ND(qAnN*Y%bJb-7mfGOxN*w6_tW3RJzHkmDzrr;L%T znxzVl>lNp4vouyApZ1HC^b*HxcNc@r%j6)3N2#T%8Vej|L66%4As5Z3Hg*BRi^HIJ{5P50A>XYMRYZog z-8F5Pj{L`3hWouU0YSgGmgdEU|(C!fX#v1Qzu3zM)SfcnW zLm8K&in3gBAUqa4i3A~R8)TyDjIpQiQSDDKk2xG z<62aNSEJ8qOk-TFsw8g8$obx$HsFJ_yE~|B;$I(@UxoL{w+H2~opu(Fdk9G^0VZ8`ue-=CvPLNH7Eer1cnrK4B>% z#0jbdANN^RUmc9MzAlS!ak-NGHsQI2E0f?J_N|=H8*8zO>WhAY_wkW5WMqUA&h{Xc z37jt|0NKI>I7(&+y+cX+CH&NM6Uqg(1Th&ZiuBZ%uoN^giAP7)gJSVAYD$*cT3Iqa zwqfB$Q1ySuV5`XEM>3++<~D|-!;nnBpLo3x;x7N-RPZm? z<~HK^HRylozi(olK8zdaQxqy{F4_wa3~MIQR&j=PXvyO)cNH!dz~gWf$3py-I~^q3 z%23Yfw@+D#nm>^{Wfew2jRNfC5|FUxz{8V{P&fvhb9WL-itZWxLXxwUJ5{0L5Xw1` z-)N-$M+*lNJmJCClV3E}<}97|SdtkF^o|^ygtXCe88cGOI8?F)>9|_?8&^Ra_}9;0 zOmAiPj<4RXXf|mEx4d7B@j&!WryMxGjfv!UOOR2lvNh?!IU_JKH**b;!Sb`VK5Af* zNzC-Eef!L(6br`HrI13SKmyMlE&Zvb?p1nYPpH1n;GNt{?APUG1Y$3-l7zzK#uWH9 zlnl@#0h2}2OVpGDb#jn!#79%d}?cLYpkkU>lLiI(%D~s6m zOwI)xl<_Oq$E6GIpyNX=i>X#QsaHps4m(vQomkg#PBY#c^JlG~4sJ`DURh5Y?H>zB zTW5fOJl3CIZ#tXND3;&5i#70?X}>sDf*pr7tGk|@Cysm39-a(qza#3*I*pQ8#vP@D zLTeFFj5&);Rv5kBmMQD{f0{kJ>@Fae#UpocliteFfs%LXV2BZqcw^dgax{&HgM|wKFvP9?T`@6@lYIUs`YDVQs^W+;2rtJhhW#l`=iPGT z?hBje$B|)Fvfc8WKK{#*(Cmq}+th`F7P`e$*?CL@i(b7RsR#@5twU&9N&dt;3(HZ8 z7Q`HmmhOLThyP=Ho=FlBj8gAiu^cRv8Yg$-J9`xSYF;ehw**O?DK9vqS}?vE7r)Jx z^NkH^z}q>Ksm)da*{gItSWP2wpBP8`N z`>CWDN6J$AIu8$EvauKx?UA5I<^|DnSe zvW5NCR)@dxgoyPB;n9!SUzYJC3!=isg$<_IYC{?wGE$OBQyyo=)W*XoAN0xJ+0f@M z(2pruMXlBhnom~x$Xot=ICT?PAz)?pw+-KPp86Z|8ePAhV%a^E<-7!y(=v7k7GnIg zz;}t5qJdi`RhhNVE?Xn~AF((yn!)lj-t2I*XkE?LBDQ9nc%);hc^UMPd!!B%sF{(1 z%Og$dzN5kL5SNHUkp=02^W?05L9NJwZ~`kN0{HEXdWi<1XxA=wOYB3g0Rq@xsrp-x zU_%&S6GocZ@E-7F5mdxJKG#ef5ITfLIK#tI1@VKej$<01&3phE(tt3csdHHZUxvG>Cy0ROii<5MVJ+1Vx@$S~ z6O6wx3xF>xxjg!Dgk;!e1pW2o+VGKS9!t+C%8^`i(~ugXM&l4kJqI`G*9LjABlXAI z(Fc^EovkPP<&WW4;wvGyAim;y%v-R@XDHG1FY0BiHiG`7wDxT@hwg6Wp^5zZA0Kx= zJ%0<5X}}@iyhqShAaL1Ag||`Z#YB@5kDnx%q{Q~g3dp8AM-R)ERj5Gs@%k7joEv`B zD83wGf`(($4Qx!vi4)J)6{GIWD1PtFrL^fJJRf<5>o)Xn&M83Sn{dcxE-U0pUvL*S zl1M%Ti&V$5>eC>Mgp;Qvx~@xm0hDkf4X!&IHpsl+bqj-fR5KA>n^q`!C3Y{mio5A9 z|E`gv1D=N2(Di zG0O%NVS-$&ScaNTP)2Z%lmC&7rH`*9renIU3H~>IiN?ZeUaF+}s z5Iz_7DszVCM;4e>^3(SmftB}UDedNMF4?O=SroYTMS@n&CJauzVM3#HSAHr4TU>9g z&Ja+Dj@t+e|TlDBzt=BTYS=c!uId8W=&GtN-J=2W$KL zsrRuOrHYOq7kDRU{_D{iRRAn{P8wa%_JGw@flZbpRS|DGV2r&7soUm*i4z;$>iLhp zte$mOs58*_5k||AT#A9d;~CyN=b7rac1r(zpET)*3HPQ}q zK9Z?^#klB~oM5pHPK@ps3nuFuZKeC)9}O6e!9>t_F7k>U!8kq!!LSe@9mywg0z@OP zb_W+I?WF{@zjgYtdbTKb^(<6`(Rb>%4j zxR3a#0s2OZiXl^@y=Q~=kgIyBm#lik&PKQXzAHTWr>B8ecgtAD37|0tnXu%m1v0J+ z5G?8?@y~RS-2y{CHV#z;kRdc{b+3C{l-HQefv+Qj`uLL!k-X8`s^ZpWP7+56&$G`D zJpP4(iHBBp{$58)j8VI4dzBp-1EJxKo!twjNmJG7E8+Mme#2`KYmd{}!Jh8Mf1_2GDU zed&kW#hJ{(PGnqf+-*77-;Y;GQ0@BT|2Ev-VzwGgbtFxM4?59pJfC*m=*E&wv}=`* zWNWj%h(qu8A%CIVS&(BC`9axpvN+&3{a^{iiJe@^5$z?NW%2?a-gaSX!}j_%o+s*A z(r-USEK&Ueg=V`l7X^#0M|GuMvxTN-#!J52Lc6FCE{wif#gdgb%hOuEL&Isl6+3Gq zo7scDY-;=Ox#95c`G3i^@8>@Nx_(cR#$muG_{jODbcdicQ)eM9W@*|S%-~j^hZ2VN z{=EtcF7>;`@eRo>q!tVG3pfHb(kqC`G2)8n1hMiz(1j(O^|`IV3n0P%!v!*{WZOL! z3fe=MhNqk>AB`EJ(`aPQ- z_^L7BbGOtIkCuV`eeFw2_M+Erf&77CU@L}L+*^wAGp+I?uu0boi|^8cD20ByXDG=- zjF>4{C;GZ1-@Fi9TVoxItee9|ewmWgQ!K`{G^z!TTBY1%dl2mx!QD{|m-*5%g#ocx zS~OUgN?MRvxrhZ=tOF)H82|*_Q5Dija~bqunb@ysdGFv5EI);PU+qvy*-#ZbeYD0n z*0D!fm|qLiv`IZLv>2kFaiKP_SxU<7`&+x-L7=8FI8~e}=m$A_$=hPi8;&zsW>Fs|_22%q9>*1X-+^m(oQIqa`9KaJKgy@@#*U{Wbci{b zr`QO-(BduiH^;p%+nzj|hC1!*e!qN|RpEG7Kls0Ng*{0~HuyuNWljKLpu#1RQ|oW} zzA5jTVrzbT5giIV7pV0P2lD)ORYVklX@WSxiyZej36f4#g?7nVcKW?91 zx_fAfLA|M9Ukt10JBw=^pDu(EmZ&N8aHo6?2mhABJGl0Fe?N>#A)#@2)BWXpBq_mW zQP4Af-iB$;yQQq>CpYFaK(r&NT&cPaT4kjZ+iMCyemAcR-+nm~5cUimWzAmZsUot@ zKE52%mwNGqUvDHnDbq#FvYSj=%~5eHD_I3QY2CV#H(dGeJz*`x^Jpg55s&$(T;nnNfWR#IohjEaU&=cg?=HH2^-}_X z7jvB(a~<&`k5aBZ^q4n-k>uF3+P3m+sJ(s6+uyHT_elcA*tti}F>n2!yk0K{Gknhb zBWP3*7r`U2sc7$u9`aW(o!7nr>aSSD9Ndm`T2lF!ItTO-9G^1_=4s{Mnu@1f;h z>C*2jJGYQ>l#&n6>4ah(nG|yx_VR#3QE+`Hf!3!OND|kH(=2w1wY<9%_8=yV1Z7z- z@9C5FA`VM|$FNap7EH==d+?8jul#h&!g;30rI|THSD10)i~aekL!^5C*XgL9-u-*G zGj+O~p;4jvRz8@2nNGJ@UR7P0UuM2@xH=z}a?b)9=rcFf>b?*J>iqTWpK|=1O<}DI zbEVqGDEZ`W?$R7i0(1^cJz*5a#1LYH9@qT1tvl)|yiIM=i(b9L%uyNWJD<;??=jp{2882w_H;a`p=Ku!sDzkf` zcIHV-AW!-h8R<#F5wo4F)99h)Myevq`%1;h=eUCU2>J2WpTtead_jBKz0eR@1i@yB z<}6LYty?aUt4*LFy8r3zy|b_4^VnP##S7+qW@Jav=SSETI9b8P{!v~hQtIT=A1f_} z45u$(+OHaS7EBZ*j5LoAGCbE4k6@x~Qi)5UE{@F!gvP4qC&&}i6vR1l*vLKQO2`t| zvLswyBEViWc9Qc7A&)z7wTABN6Od`)TLK>}J^`b3pycGH=o~5`C;&u1hJEZ7lg()yy0u)QGxV=)` zEqB(>BHo~sA?h=Y0R2JLGqCGgW8sY`aFqq)ce!~n*Y8P@d^GU$FtFQPAy=cylP&;Q zsgR%X+{@7Pmg#$NT22N54EBpnP&`^Z9XgtBenVt|SFU%;nH(lylMhVm9Q7H5uX&(_ z9+Fc)Q5M8D{ctiivLsT*hKx1a?d_Lw#AuXALs~Qm_6rwZwQH&~lXIrcj^9jCeUHK$ z$1ajzLUQvZ_ixEAK_9qa8C2vXmpVob?VsecShvD_+p{RU@(SLp5`6D@rZ`TqaG9x|s*3&U|!^cDE zXNL38Lz>kUcx1S+K{C4deXk-W-~R3xjd?j|piasN<)yFMllN`eo0@6jlj6;eC`MI8 z>HPiM>r50}+`a;waDes+5&oUd?Y~$V%L_#xku*h|H|`pJh^qQQUE?_={2)~loHq=4 zt>O7_j}8YQvAf+2E(;X2b;w~#N0b@RZU2mGuieo~cPR;ySUi*arQl8PzgE9j`F2&? z0t`;#R(Mvx_FI8;#?c;>B8J(okK}ha5gsw&7j6gfo5Vi9f|H0RZbpD<6Q`s;u-&;= zO0uMW!Aeh0Avy6hRymq{5I|A|56Y?_2FogbV4}cnr!N*iSM@UTmGDZE63lV4=LA4-6F6LUn-D6ew# zk&LR2xf(wzZW3=))WFkOIi8NETqvg0S1Shl)S4K z=ZC+_|G;(4?c>AFfl$gXKA-4bRIks$5bG_Pe^>ZB(YK1y;WhOq$;HqV0QK11eCUZb zP#gXHkrps(dNeZMFuU*ZaFZsHkzrez-pO-6M$uOpr~R(BN^&bks6d4zNh&Sx+j;uc z1b|0!BU$p+h_9N(wS_9v4rf5zUTjNty{R!AUz`a3jRf>iVZVc46eNw9y}auu#ai^| z!944A--l#r80rhQt?jwaj+URzHivS1Lw9V5`<8y`b+ zc-}{=Pi(&`)4n#RC+qo(4mq-SCQvT9>!j*9`R4}uy)48nF&F%P3`6-6H0XM+M|EA% z|FIqGE0xWq6nqmYD*U9|@g_fic-ZM}m~`X}D*{aU`)n@w>iAj2cRwD{EoNo@YJBlX zs4)m04uBPw3>-(R0%FU_z3|N%Iwkzs&mSP zI?C8zszRP)ZyO(&+(!z@E4Ym|M{S z-5@Q8_Lsfy#7;y!gr%-W*g9Ij4DOB*_`ek4aPMhXD2m>WP8dATR=mVPhuC}|SFqwa zvx%!e_b@0exh-iCs4H?6bo(~sy)1pb;N;hHYGPGl?{tkP|Qg@c26R#-C&}0+W#>d-7f?@T%P(@WYOwp4baMLP8BGVVd6S8nsN!RdZGK; z3?{1Z^DAq6bb2$kQ>22szHJz;(gCu56rBpxM0eMOhz_EH$lxgLaAaO89ZuE@K~wl) zj>*)!;Nr4GLVnD6OF&qLnOW`2G1~;#caEXPe9z^su|AkJ{RsXqe1LmQqjizslDZR! zgky2{SAiteKy_34*M~!+yHBmyYD8=7--$Y=E-cKTq(4f{xUIckUijfD>wsN;RD=F^ zb!>W78{q@l?i0RV7ZDXoS;7w}1I}Hk3h7G}W|kSMQtMBB=2;$x9pm0xr9M;hLjUy6 z&q0zn1oX*~+L|ozqz(cJ{sUjZC}~$KE5YOAJb1;$TD8D*hK=k zC=9T1NvVtzf`?vqM1A0R*P*jD-Vc}RKhZ_6l8Y z=VbA3B7ELUypVM(J1s2pbRy}rduW$o{9EcclX(vP41O{o+Ms56Q$&2F%0R2yq$hCX zn}2yT9^e3uc0p}qFgSo?OF-b|?V)kSv+g*0c0cQnYbvA8yLA>)LVleJ|Ea9_2}81gB+!01|5>Muto8KMPyP- zHED&4T(EjdSpI;(E?(-(2hV>+<+P)a1p0TKEJR}6)0;f9+#4HG@^V1bp>#1sLw&U} ziKpD|JpOOK$*g0wBBcaN)cYtVq~R#)_5@<|tcbc{_gpecvaR!y8$uVUxCEgZx_;_T z$D9BdCL;E`1I>=|(b1(ZpuI|ySN0e$-Rfsh!*}1t}j@8!4 zV^Tf}Z{s6S)RX#G`lq%$Xv3j0xMN*C`%we&kEh+(I%tBYA(Gv0 zQLe{#|5@CJX%daH``a$}MEk?90g90f$L;t&+@%HS<;L&jSMMz3#dUEIYw-K^$qcUx5bh}J*(yUPerYn;y0-;3KUEbm=SUXkwmK3&f8TAtAVTXpfd34rm< zeDWP`yrZ@W=z)C0*edN91jspHG)o)Sgmwt52l&&Dt%3d9I3uC#pH6}&qZtA<)sa1s zZ0-E8pH#;#=l2_!K?Dx=F;O6DArBCxY=*}dKeyj#*jDv_W={Si`y`7*!gx&(7WkMX z&I{5_;CrkX1qKsdIX5Ob61o>ID!DM6JmZY`4v$-4P9LE#;#-r!KRJ!!@e-+YgL^}F z{kbv4TEskXjYUl2JGujXIGdB3XtUyNnVG}(S0Frnq_fI@S~P#6sO&I<8vH#4`6KPF zTcir@19Sc291E&H!b*u2A}?Mj{05<8SQ@J}^Q|&3w(LXNN&StoFpSn91w6)oI)NBc z|5F_@^=sfv6q?~UUX1c@YnQvMEx+{W-ZC8WfUZm_@GCdjq zNk8?ye^@>u)Ao^MPQ~58lvT=f{R_EUgVy6K@f$a6PaWyqMtLHc*Ag20M!N-@f1)Y( zL}5oyr7?0bGI7Q2ee;VXmvBQY%Cp-4H%;EvSO^$~@E@J7$7D&5U{{YI)OX2sd+XL* zP@|`(&qXB7Bin+1jXnSbKp{r&>R2O)Y2ba1EAK0$UR*6fW z{6t12#szZ0L+l*~NIsuUvL~fG)G9ImceCJn!M{9q`+OU*mC&>o4@mlJDxI<(_YeB*``LW zB+4BHM^KU14q`Mu!>kk>0k-CJ(7iz4EJ`a5jYMEeXE=_I7*3)6Y-kWA2vH!^3{|cm z`1jrd8$S$tqrIw6Pk>>4s5;R5)VYONbQlkClUype4iGf`N#}d>MIX79FANA`KT5@k zfB4z3k~I3VpMi?)ZreLd?C_gEW*Ln;Wuo{{8SNWT=q!qBoaFuIiT(XS1Yig3@DkNm zATiElX0nK}t6nE5+4N(N*juld7!a0QYJ2zaL*p^NM!hEHxr^L&`65OJ5=DHM$vvMA z&bItGnn@@%brhBQH`+MMzqpsHXbV?@1uwFENG!6`KWn2=ZV2%m^n@%`~Xb2-J>ytBWU*KqEdoo2wK)BWpI7$uSl-lMAD{ub!poETy_gce0&^wTlZQ@n~cx z_Rw8(Z7mW#D^-Lfq7S%03r=?9SBxwKEVdq}9{L_Jsw*24UArsLge(wtU$`uUzQILA zO8JhgR@>c~g~SGYtDb*vGx}OS`p^6qJWkYkeiP)F;b+Z4LfcND37*Y@E)mw(WF+O> zUAx8c&w%BIzb>&{zTTp)2}i?h{_;DHXdR#Gb`~5b7RE=thH&j%54r+Mbf7Y1JWP1MuD_bNSMHfDXx{IW$)vvDgAz(SOH!8po z@Vns_IV`-1ZDbQ1D9?LUQh&;%E295cHx-o06Dubd#PTgn+tMl+mczcgnB@YTtgP60 z3PDG*MiO4(+QTV5&=%QL$eQZq8@XJV^pB6beT1f+h6$9^=BJi8e`6I?Q_+K&5+{+; zT33cuV=7Tr#t0^=O<6>npebbW7=AuHqC!;t+{k=mo4?@BV@P^!Imf^`-dYY%4N*M@AfI^^=~j_H6Dc0AHbTP z4lsjv^zSPlLG6`)d5tG*5Vq|10K<`gz3NP`eMtWyWf1>8N?BQDlMzW@vk)wL4F!#V2Xq_V zoSyJUxZb)X0L#OmC%KYb+a@3ktu1~@lNCv~>tKHqauc6GIo;WVH51-*$ooprYXcQ|XiJ5}w_Q4+q8@(=ma+KSbI619W{+@g8B zEBcStntXyU1YkrxRX_!Z1m)D0kEl|;z`?!uz%nF|P0GoM3#GwL_e*{efhy({8Xh41 z!p#lDDIge7mr!lpZ*r5TMcyoev0fDJy5Gas!eX$bCX}3wQ)fWXM)PPMItJqt9Oaai z1{!5(jHlsF6@%kI+X?yh29Iv6i{9St<(wC+gUb`Vh^xRh{udu+ z`+IJ9MXmBNLVr`CscQ_fRde==_e9H{i=Qnd$->#?jghE=GkSdCO%_eR7#1=&{znCN zXHb1IDQtTN8L-M1?XV440uVPm0AwI|kXI6of}lp22aawR18dAq;t^1rL9%lcYnu0`j@IdJd4aGN#ZLsY{Dh^#S^5{R1QVi5@?|2 zEOSu1QJ(5=ulWycTd^Ebtx59@O9 z=1>~#Dsy4^>+N-bi~N#_)DMKH#*RR>ZG@bC{Wfm|Tem)rr;}BhDB4$`>x!Cfd$l-b zS!FmcmJ-Oh&mokM&-Sx7Xp+XW{vKJZi(^s)k&a_n(C}$--euP2t!$Lti|y9J5TW*Q zrR^)`1;Zect)Uk30IGnbxiSTAZj-HO`;`=~?qqFz`5Tg96Z|w(T$#tz}rWm(#BMsHPbl`a1goPUI)vtNg|`{E+SR;2IW&qtmaL7x6#X}HkoLd zFX%+@(eFCCq&2i;bO%Ofi>cK_RPCE;Gsbq3mgp;NB>rdhn!<=QP2re}et4f1TxbsL zlDR*%{6_pHvO;7d zhhZzZ^Sk+{O5ejL7|nnt%D#O_DeMkWD%V0aE=*0TD=PveKBrGgLWaDI4n%jXkp6m} zuv74y!2MCTKGJRmuP;oPp7}?46zksA@5!xxQN5h0&f$v%^CfhdaWhb)O&_?+eqTp?8a)Z7ntS< z^ei(d+9F6a%2INpAhIGh z2LO`=5YkZoj0d;%_3MB~LZdjT(n$JIzE7PkV$NE66!j$SqqJ~S$-4ZL?)#EAhH-}x zfFJM*{lrIm7Xv7i+#Ro6?F@Us#KXhv4cEg3Ev~7uQ(}*I`yA+Q?5dKY)$TtN7TV0Y zmq2zV!%-lVwsW}4O5?v&+Uulg@W`l9gRG&r;NJ{<;7j$si))zyq`*3m=IY)IZ^cA`Drt!TmY7u7iBQ z(d-@#c_hmI{N^o;(cxt_4q8T-2^Kr%vXGRzKCQ&>>|b#;!t<}@07DplrGq&jmsZy~ z)VmO#Qr9})Z5<9x@@Vbo%-%8Waar9!JkfCzp`8z^kmC@a#w8$)@7GQ!#exvK%*pAEM&;X2V0#w>dHY#_e^ zFatnU2(pJzZ{aigh9;kfQuL`U@ThM4MfCr2#a8x0we_WIR~jiscxa)Qgxu0t*MB!w zM^Ou-lt=f#9Yuj+`6qM-gz!+rmrFIi%))tFEo>8(^OCJ#(xm(=DrTk}hT!4l)bdeP z95Bz~4FAuaI^P(~p7u7~@@LuKP103SgA?3R<0kjZP3|07Q86At+GL6*V7vTUBCz|rqn?{kS+%f2j((o1=)r8iZY_3qi|42!Muq}e}9+9n@UF* zVgMB^hJ@DtzCt>8W3e5^x}!;;sg6j9oPLYl#wNr)&L?Ok5gGnkE~?9vQN=BZnl?|- zFY8y-vOXY(^Aa<@mbsUTOxBThWymYn>i*}V0B3=L3*>C9FWo7f)B~fwCE(D@+=o!Z zK+B(pd)?Q|omzG4-Zp{|>#2q(CX z&$(z!8Jqt@KL1TE2bF9Ra(&SIW!3=wm|{tZerT34Tq_{AKXjF@*^0Iz469|v!jcM+ zY$6)Dfv86Nfllb6qkjcnGuJT(Y`wnf1-w}NlO8kebd3C)&|UUs=nIR+(4G%ik|^6Z zU45a|fBikMB`UUn1b!dGK5Qt0`sP?hr>W*6a{z@TUPD$@;E zp59N1*~_8}zH?Gxpj)8ab`WoFHxCgnkH_+(l8Kr@sHsyRUev;H*OiIHn%5Y0Js|Pg zrvPTjs(>f7ARPl8QJI!r-RbU1SkR&hap8RKKb!kw-pj3_)$hHhwY&e?Xt>$<_$J75 zXG)Q_RTTH6+SfRZfNLM&%H6>b+f&4Ui&hdR_|IBg0vKUn=Dnp}?nE7EdtZ|?iMZ^B zI&+g$=vy6?b5=UN0I13d;m3YB`FKF5SRr(vXq*dscuej_xE|XMbs9}# zrX8tR$#)dTX}I4(B}TY04gGQrXX{?bEH)1UBStnIFZ{WKYFTJ&5cw`*Nv^D^IiD>^ z{kp-I=X_G;9C}Gn>hsw6_zv!iXW-9Ge{lF_XVZYTs?v6hHbPDLy%Q@cD-NM-GVhU}K6Zcm2ht^bC8oJSo<{?D?yw5cxMglOUP+XXL$R z^8h`^V9BawlnAF$SErc|+%=NWS2|4(++FqfLhW=yn~1=PIMpT8Ypjxn{yqsm3)UQ6 z66|xDip+9pn>TW$j?#iGtgl1XTFYs7R&?^tzCG#9wBN6Qw!uWab!SVrjK^S~+aq+c zFc`4^g$|ImsDlH@=C)<+Y$`2KCc2a}h(!p`xp3@gSy|sf#l$%)SutG7S4Len;;cvgu)$9HL9`%%$J3DA{O7~Mds`BLa+$A&< z&*pS89^}&9F*X}(TaM=(o8eK9QQmV)c}XL6TxU#QzyR@u|K=k$$Z;_Nn26#telaO_ zYk(qx`+{zk?-2W3J*Pdta>|G((o8U!!Fm>V%a-31m;?Ca?#p$asineG8x~RhF~Z;} z37u+BbcF|MZW2d5wb=gbohJ!+1md4h2rxx831t;jBVso%hJ&#J0L-sceRhkoN_sx< znT=KlZzMrOI8q%g@Vam=Db5{-v5D*hPp_s-WMsssT}ZQB^O5JhKPEkMS>arM3;iQm z&?8qpwX4MWup0{?QwJ`K3S}JW?QrKbUSIWm?N7fg9T;@y_!%-1=PFJu(@}=^=ogL& ztI@ectN><24*>GnoC-+i06K�=me7jtm(-e7EQN^op7Sq-4NwtfIdH7LGDYt+SW+ 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

LspQYi>b08uvTt{zR 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 IrtbIu2PQs=-v9sr diff --git a/electrum/gui/kivy/theming/light.atlas b/electrum/gui/kivy/theming/light.atlas deleted file mode 100644 index acae07b0..00000000 --- a/electrum/gui/kivy/theming/light.atlas +++ /dev/null @@ -1 +0,0 @@ -{"light-0.png": {"electrum_icon640": [2, 702, 320, 320], "nfc_stage_one": [324, 900, 489, 122], "nfc_clock": [2, 460, 243, 240], "stepper_full": [324, 781, 392, 117], "stepper_left": [247, 583, 392, 117], "stepper_restore_password": [247, 464, 392, 117], "stepper_restore_seed": [2, 341, 392, 117], "qrcode": [2, 194, 145, 145], "manualentry": [149, 205, 145, 134], "gear": [2, 33, 105, 159], "calculator": [296, 211, 128, 128], "save": [426, 211, 128, 128], "share": [556, 211, 128, 128], "star_big_inactive": [686, 211, 128, 128], "nfc_phone": [816, 213, 128, 126], "logo": [815, 906, 128, 116], "error": [718, 784, 128, 114], "textinput_active": [848, 784, 114, 114], "close": [641, 612, 88, 88], "important": [731, 612, 88, 88], "paste_icon": [945, 945, 75, 77], "globe": [946, 267, 72, 72], "camera": [821, 636, 64, 64], "carousel_deselected": [887, 636, 64, 64], "carousel_selected": [953, 636, 64, 64], "clock1": [641, 517, 64, 64], "clock2": [707, 517, 64, 64], "clock3": [773, 517, 64, 64], "clock4": [839, 517, 64, 64], "clock5": [905, 517, 64, 64], "confirmed": [324, 715, 64, 64], "contact_overlay": [390, 715, 64, 64], "icon_border": [456, 715, 64, 64], "info": [522, 715, 64, 64], "logo_atom_dull": [588, 715, 64, 64], "nfc": [654, 715, 64, 64], "pen": [720, 715, 64, 64], "shadow": [786, 715, 64, 64], "tab": [852, 715, 64, 64], "unconfirmed": [918, 715, 64, 64], "mail_icon": [396, 404, 65, 54], "settings": [964, 834, 54, 64], "card": [946, 216, 64, 49], "tab_disabled": [641, 483, 96, 32], "tab_strip": [739, 483, 96, 32], "closebutton": [964, 789, 60, 43], "arrow_back": [971, 531, 50, 50], "contact": [463, 409, 49, 49], "wallets": [514, 418, 60, 40], "network": [396, 354, 48, 48], "bit_logo": [109, 141, 44, 51], "add_contact": [446, 359, 51, 43], "wallet": [155, 148, 49, 44], "btn_create_account": [945, 911, 64, 32], "action_group_dark": [984, 731, 33, 48], "action_group_light": [109, 91, 33, 48], "action_bar": [576, 422, 36, 36], "card_btn": [837, 483, 38, 32], "btn_create_act_disabled": [877, 483, 32, 32], "tab_btn": [911, 483, 32, 32], "tab_btn_disabled": [945, 483, 32, 32], "tab_btn_pressed": [979, 483, 32, 32], "dropdown_background": [614, 423, 29, 35], "overflow_background": [645, 423, 29, 35], "blue_bg_round_rb": [821, 614, 31, 20], "lightblue_bg_round_lb": [854, 614, 31, 20], "white_bg_round_top": [887, 614, 31, 20], "card_bottom": [920, 618, 32, 16], "card_top": [954, 618, 32, 16], "dialog": [641, 590, 18, 20], "btn_send_address": [988, 619, 18, 15], "btn_send_nfc": [641, 466, 18, 15], "create_act_text": [984, 719, 22, 10], "create_act_text_active": [971, 519, 22, 10], "action_button_group": [1008, 719, 16, 10], "overflow_btn_dn": [1008, 624, 16, 10], "shadow_right": [641, 583, 32, 5], "btn_nfc": [1011, 931, 13, 12]}} \ No newline at end of file From 77aefdfe71d0207f1167b01de598e6e6b6066f8d Mon Sep 17 00:00:00 2001 From: SomberNight Date: Thu, 6 Sep 2018 17:46:50 +0200 Subject: [PATCH 076/138] gitignore: add kivy atlas --- .gitignore | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/.gitignore b/.gitignore index 3b34d757..f3f2b590 100644 --- a/.gitignore +++ b/.gitignore @@ -6,19 +6,23 @@ dist/ *.egg/ contrib/pyinstaller/ Electrum.egg-info/ -electrum/gui/qt/icons_rc.py locale/ .devlocaltmp/ *_trial_temp packages env/ -.tox/ .buildozer/ bin/ /app.fil +.idea -# tox files +# icons +electrum/gui/qt/icons_rc.py +electrum/gui/kivy/theming/light-0.png +electrum/gui/kivy/theming/light.atlas + +# tests/tox +.tox/ .cache/ .coverage .pytest_cache -.idea From 8fe066707a928cc864a6b11353dcc56049101187 Mon Sep 17 00:00:00 2001 From: ThomasV Date: Thu, 6 Sep 2018 17:47:10 +0200 Subject: [PATCH 077/138] rm import --- electrum/plugins/labels/labels.py | 1 - 1 file changed, 1 deletion(-) diff --git a/electrum/plugins/labels/labels.py b/electrum/plugins/labels/labels.py index cf0833c5..30c0c312 100644 --- a/electrum/plugins/labels/labels.py +++ b/electrum/plugins/labels/labels.py @@ -1,6 +1,5 @@ import asyncio import hashlib -import requests import json import sys import traceback From 8467f95a2828c85ad2339eaddca32a2ee4d12634 Mon Sep 17 00:00:00 2001 From: SomberNight Date: Thu, 6 Sep 2018 17:51:13 +0200 Subject: [PATCH 078/138] rm @profiler from Transaction.estimated_size in certain situations, estimated_size is called hundreds of times, flooding the log --- electrum/transaction.py | 1 - 1 file changed, 1 deletion(-) diff --git a/electrum/transaction.py b/electrum/transaction.py index 446a8b77..b32752f2 100644 --- a/electrum/transaction.py +++ b/electrum/transaction.py @@ -1087,7 +1087,6 @@ class Transaction: def is_final(self): return not any([x.get('sequence', 0xffffffff - 1) < 0xffffffff - 1 for x in self.inputs()]) - @profiler def estimated_size(self): """Return an estimated virtual tx size in vbytes. BIP-0141 defines 'Virtual transaction size' to be weight/4 rounded up. From e5cd2ed52f172341623db5b79031d1042eb0d88b Mon Sep 17 00:00:00 2001 From: Johann Bauer Date: Thu, 6 Sep 2018 18:15:44 +0200 Subject: [PATCH 079/138] Goldcard: Change spelling mistake --- electrum/plugins/coldcard/qt.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/electrum/plugins/coldcard/qt.py b/electrum/plugins/coldcard/qt.py index 7e9c897f..583a845b 100644 --- a/electrum/plugins/coldcard/qt.py +++ b/electrum/plugins/coldcard/qt.py @@ -101,7 +101,7 @@ class Coldcard_Handler(QtHandlerBase): return def setup_dialog(self): - self.show_error(_('Please initialization your Coldcard while disconnected.')) + self.show_error(_('Please initialize your Coldcard while disconnected.')) return class CKCCSettingsDialog(WindowModalDialog): @@ -239,4 +239,3 @@ class CKCCSettingsDialog(WindowModalDialog): self.thread.add(doit) self.close() -# EOF From dc51e82f5463767178c73d17d01198d3cfc7f6f2 Mon Sep 17 00:00:00 2001 From: SomberNight Date: Thu, 6 Sep 2018 18:25:23 +0200 Subject: [PATCH 080/138] fx: don't dump trace if getting rates fails --- electrum/exchange_rate.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/electrum/exchange_rate.py b/electrum/exchange_rate.py index e94c0468..6a89a6e0 100644 --- a/electrum/exchange_rate.py +++ b/electrum/exchange_rate.py @@ -11,6 +11,7 @@ import csv import decimal from decimal import Decimal import concurrent.futures +import traceback from .bitcoin import COIN from .i18n import _ @@ -97,8 +98,7 @@ class ExchangeBase(PrintError): self.print_error("received fx history for", ccy) except BaseException as e: self.print_error("failed fx history:", e) - import traceback - traceback.print_exc() + #traceback.print_exc() return filename = os.path.join(cache_dir, self.name() + '_' + ccy) with open(filename, 'w', encoding='utf-8') as f: From 617103bb2a54990741ade636b697b42ec51cd462 Mon Sep 17 00:00:00 2001 From: Janus Date: Thu, 6 Sep 2018 18:29:55 +0200 Subject: [PATCH 081/138] labels: fix saving single label --- electrum/plugins/labels/labels.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/electrum/plugins/labels/labels.py b/electrum/plugins/labels/labels.py index 30c0c312..623023cb 100644 --- a/electrum/plugins/labels/labels.py +++ b/electrum/plugins/labels/labels.py @@ -54,7 +54,7 @@ class LabelsPlugin(BasePlugin): "walletNonce": nonce, "externalId": self.encode(wallet, item), "encryptedLabel": self.encode(wallet, label)} - asyncio.get_event_loop().create_task(self.do_post_safe("/label", False, bundle)) + asyncio.get_event_loop().create_task(self.do_post_safe("/label", bundle)) # Caller will write the wallet self.set_nonce(wallet, nonce + 1) @@ -71,7 +71,7 @@ class LabelsPlugin(BasePlugin): async def do_post(self, url = "/labels", data=None): url = 'https://' + self.target_host + url async with make_aiohttp_session(self.proxy) as session: - async with session.post(url, data=data) as result: + async with session.post(url, json=data) as result: return await result.json() async def push_thread(self, wallet): From 8f4b57f718fa31abbb098397f4dc8c592ee44c39 Mon Sep 17 00:00:00 2001 From: ThomasV Date: Thu, 6 Sep 2018 18:49:37 +0200 Subject: [PATCH 082/138] run freeze_packages --- contrib/deterministic-build/requirements.txt | 76 ++++++++++++++++++++ 1 file changed, 76 insertions(+) diff --git a/contrib/deterministic-build/requirements.txt b/contrib/deterministic-build/requirements.txt index c75d9fc4..45ca2c6a 100644 --- a/contrib/deterministic-build/requirements.txt +++ b/contrib/deterministic-build/requirements.txt @@ -1,3 +1,37 @@ +aiohttp==3.4.4 \ + --hash=sha256:0419705a36b43c0ac6f15469f9c2a08cad5c939d78bd12a5c23ea167c8253b2b \ + --hash=sha256:1812fc4bc6ac1bde007daa05d2d0f61199324e0cc893b11523e646595047ca08 \ + --hash=sha256:2214b5c0153f45256d5d52d1e0cafe53f9905ed035a142191727a5fb620c03dd \ + --hash=sha256:275909137f0c92c61ba6bb1af856a522d5546f1de8ea01e4e726321c697754ac \ + --hash=sha256:3983611922b561868428ea1e7269e757803713f55b53502423decc509fef1650 \ + --hash=sha256:51afec6ffa50a9da4cdef188971a802beb1ca8e8edb40fa429e5e529db3475fa \ + --hash=sha256:589f2ec8a101a0f340453ee6945bdfea8e1cd84c8d88e5be08716c34c0799d95 \ + --hash=sha256:789820ddc65e1f5e71516adaca2e9022498fa5a837c79ba9c692a9f8f916c330 \ + --hash=sha256:7a968a0bdaaf9abacc260911775611c9a602214a23aeb846f2eb2eeaa350c4dc \ + --hash=sha256:7aeefbed253f59ea39e70c5848de42ed85cb941165357fc7e87ab5d8f1f9592b \ + --hash=sha256:7b2eb55c66512405103485bd7d285a839d53e7fdc261ab20e5bcc51d7aaff5de \ + --hash=sha256:87bc95d3d333bb689c8d755b4a9d7095a2356108002149523dfc8e607d5d32a4 \ + --hash=sha256:9d80e40db208e29168d3723d1440ecbb06054d349c5ece6a2c5a611490830dd7 \ + --hash=sha256:a1b442195c2a77d33e4dbee67c9877ccbdd3a1f686f91eb479a9577ed8cc326b \ + --hash=sha256:ab3d769413b322d6092f169f316f7b21cd261a7589f7e31db779d5731b0480d8 \ + --hash=sha256:b066d3dec5d0f5aee6e34e5765095dc3d6d78ef9839640141a2b20816a0642bd \ + --hash=sha256:b24e7845ae8de3e388ef4bcfcf7f96b05f52c8e633b33cf8003a6b1d726fc7c2 \ + --hash=sha256:c59a953c3f8524a7c86eaeaef5bf702555be12f5668f6384149fe4bb75c52698 \ + --hash=sha256:cf2cc6c2c10d242790412bea7ccf73726a9a44b4c4b073d2699ef3b48971fd95 \ + --hash=sha256:e0c9c8d4150ae904f308ff27b35446990d2b1dfc944702a21925937e937394c6 \ + --hash=sha256:f1839db4c2b08a9c8f9788112644f8a8557e8e0ecc77b07091afabb941dc55d0 \ + --hash=sha256:f3df52362be39908f9c028a65490fae0475e4898b43a03d8aa29d1e765b45e07 +aiohttp_socks==0.1.6 \ + --hash=sha256:943148a3797ba9ffb6df6ddb006ffdd40538885b410589d589bda42a8e8bcd5a +aiorpcX==0.7.3 \ + --hash=sha256:24dd4fe2f65f743cb74c8626570470e325bb777bb66d1932e7d2965ae71d1164 \ + --hash=sha256:5120ca40beef6b6a45d3a7055e343815401385dc607da2fd93baca2762c8a97d +async_timeout==3.0.0 \ + --hash=sha256:474d4bc64cee20603e225eb1ece15e248962958b45a3648a9f5cc29e827a610c \ + --hash=sha256:b3c0ddc416736619bd4a95ca31de8da6920c3b9a140c64dbef2b2fa7bf521287 +attrs==18.2.0 \ + --hash=sha256:10cbf6e27dbce8c30807caf056c8eb50917e0eaafe86347671b57254006c3e69 \ + --hash=sha256:ca4be454458f9dec299268d472aaa5a11f67a4ff70093396e1ceae9c76cf4bbb certifi==2018.8.24 \ --hash=sha256:376690d6f16d32f9d1fe8932551d80b23e9d393a8578c5633a2ed39a64861638 \ --hash=sha256:456048c7e371c089d0a77a5212fb37a2c2dce1e24146e3b7e0261736aaeaa22a @@ -13,9 +47,41 @@ ecdsa==0.13 \ idna==2.7 \ --hash=sha256:156a6814fb5ac1fc6850fb002e0852d56c0c8d2531923a51032d1b70760e186e \ --hash=sha256:684a38a6f903c1d71d6d5fac066b58d7768af4de2b832e426ec79c30daa94a16 +idna_ssl==1.1.0 \ + --hash=sha256:a933e3bb13da54383f9e8f35dc4f9cb9eb9b3b78c6b36f311254d6d0d92c6c7c jsonrpclib-pelix==0.3.1 \ --hash=sha256:5417b1508d5a50ec64f6e5b88907f111155d52607b218ff3ba9a777afb2e49e3 \ --hash=sha256:bd89a6093bc4d47dc8a096197aacb827359944a4533be5193f3845f57b9f91b4 +multidict==4.4.0 \ + --hash=sha256:112eeeddd226af681dc82b756ed34aa7b6d98f9c4a15760050298c21d715473d \ + --hash=sha256:13b64ecb692effcabc5e29569ba9b5eb69c35112f990a16d6833ec3a9d9f8ec0 \ + --hash=sha256:1725373fb8f18c2166f8e0e5789851ccf98453c849b403945fa4ef59a16ca44e \ + --hash=sha256:2061a50b7cae60a1f987503a995b2fc38e47027a937a355a124306ed9c629041 \ + --hash=sha256:35b062288a9a478f627c520fd27983160fc97591017d170f966805b428d17e07 \ + --hash=sha256:467b134bcc227b91b8e2ef8d2931f28b50bf7eb7a04c0403d102ded22e66dbfc \ + --hash=sha256:475a3ece8bb450e49385414ebfae7f8fdb33f62f1ac0c12935c1cfb1b7c1076a \ + --hash=sha256:49b885287e227a24545a1126d9ac17ae43138610713dc6219b781cc0ad5c6dfc \ + --hash=sha256:4c95b2725592adb5c46642be2875c1234c32af841732c5504c17726b92082021 \ + --hash=sha256:4ea7ed00f4be0f7335c9a2713a65ac3d986be789ce5ebc10821da9664cbe6b85 \ + --hash=sha256:5e2d5e1d999e941b4a626aea46bdc4206877cf727107fdaa9d46a8a773a6e49b \ + --hash=sha256:8039c520ef7bb9ec7c3db3df14c570be6362f43c200ae9854d2422d4ffe175a4 \ + --hash=sha256:81459a0ebcca09c1fcb8fe887ed13cf267d9b60fe33718fc5fd1a2a1ab49470a \ + --hash=sha256:847c3b7b9ca3268e883685dc1347a4d09f84de7bd7597310044d847590447492 \ + --hash=sha256:8551d1db45f0ca4e8ec99130767009a29a4e0dc6558a4a6808491bcd3472d325 \ + --hash=sha256:8fa7679ffe615e0c1c7b80946ab4194669be74848719adf2d7867b5e861eb073 \ + --hash=sha256:a42a36f09f0f907579ff0fde547f2fde8a739a69efe4a2728835979d2bb5e17b \ + --hash=sha256:a5fcad0070685c5b2d04b468bf5f4c735f5c176432f495ad055fcc4bc0a79b23 \ + --hash=sha256:ae22195b2a7494619b73c01129ddcddc0dfaa9e42727404b1d9a77253da3f420 \ + --hash=sha256:b360e82bdbbd862e1ce2a41cc3bbd0ab614350e813ca74801b34aac0f73465aa \ + --hash=sha256:b96417899344c5e96bef757f4963a72d02e52653a4e0f99bbea3a531cedac59f \ + --hash=sha256:b9e921140b797093edfc13ac08dc2a4fd016dd711dc42bb0e1aaf180e48425a7 \ + --hash=sha256:c5022b94fc330e6d177f3eb38097fb52c7df96ca0e04842c068cf0d9fc38b1e6 \ + --hash=sha256:cf2b117f2a8d951638efc7592fb72d3eeb2d38cc2194c26ba7f00e7190451d92 \ + --hash=sha256:d79620b542d9d0e23ae9790ca2fe44f1af40ffad9936efa37bd14954bc3e2818 \ + --hash=sha256:e2860691c11d10dac7c91bddae44f6211b3da4122d9a2ebb509c2247674d6070 \ + --hash=sha256:e3a293553715afecf7e10ea02da40593f9d7f48fe48a74fc5dd3ce08a0c46188 \ + --hash=sha256:e465be3fe7e992e5a6e16731afa6f41cb6ca53afccb4f28ea2fa6457783edf15 \ + --hash=sha256:e6d27895ef922bc859d969452f247bfbe5345d9aba69b9c8dbe1ea7704f0c5d9 pip==18.0 \ --hash=sha256:070e4bf493c7c2c9f6a08dd797dd3c066d64074c38e9e8a0fb4e6541f266d96c \ --hash=sha256:a0e11645ee37c90b40c46d607070c4fd583e2cd46231b1c06e389c5e814eed76 @@ -64,6 +130,16 @@ urllib3==1.23 \ wheel==0.31.1 \ --hash=sha256:0a2e54558a0628f2145d2fc822137e322412115173e8a2ddbe1c9024338ae83c \ --hash=sha256:80044e51ec5bbf6c894ba0bc48d26a8c20a9ba629f4ca19ea26ecfcf87685f5f +yarl==1.2.6 \ + --hash=sha256:2556b779125621b311844a072e0ed367e8409a18fa12cbd68eb1258d187820f9 \ + --hash=sha256:4aec0769f1799a9d4496827292c02a7b1f75c0bab56ab2b60dd94ebb57cbd5ee \ + --hash=sha256:55369d95afaacf2fa6b49c84d18b51f1704a6560c432a0f9a1aeb23f7b971308 \ + --hash=sha256:6c098b85442c8fe3303e708bbb775afd0f6b29f77612e8892627bcab4b939357 \ + --hash=sha256:9182cd6f93412d32e009020a44d6d170d2093646464a88aeec2aef50592f8c78 \ + --hash=sha256:c8cbc21bbfa1dd7d5386d48cc814fe3d35b80f60299cdde9279046f399c3b0d8 \ + --hash=sha256:db6f70a4b09cde813a4807843abaaa60f3b15fb4a2a06f9ae9c311472662daa1 \ + --hash=sha256:f17495e6fe3d377e3faac68121caef6f974fcb9e046bc075bcff40d8e5cc69a4 \ + --hash=sha256:f85900b9cca0c67767bb61b2b9bd53208aaa7373dae633dbe25d179b4bf38aa7 colorama==0.3.9 \ --hash=sha256:463f8483208e921368c9f306094eb6f725c6ca42b0f97e313cb5d5512459feda \ --hash=sha256:48eb22f4f8461b1df5734a074b57042430fb06e1d61bd1e11b078c0fe6d7a1f1 From 52b877ac3d978021ff77f2196c737d2b838a48d0 Mon Sep 17 00:00:00 2001 From: Janus Date: Fri, 7 Sep 2018 11:34:56 +0200 Subject: [PATCH 083/138] network: add singleton accessor classmethod, port trustedcoin to aiohttp --- electrum/exchange_rate.py | 11 +--- .../gui/kivy/uix/dialogs/crash_reporter.py | 9 +-- electrum/gui/qt/exception_window.py | 9 +-- electrum/network.py | 8 +++ electrum/plugins/trustedcoin/trustedcoin.py | 60 +++++++++++-------- 5 files changed, 51 insertions(+), 46 deletions(-) diff --git a/electrum/exchange_rate.py b/electrum/exchange_rate.py index 6a89a6e0..4503ce31 100644 --- a/electrum/exchange_rate.py +++ b/electrum/exchange_rate.py @@ -17,7 +17,7 @@ from .bitcoin import COIN from .i18n import _ from .util import PrintError, ThreadJob, make_dir, aiosafe from .util import make_aiohttp_session - +from .network import Network # See https://en.wikipedia.org/wiki/ISO_4217 CCY_PRECISIONS = {'BHD': 3, 'BIF': 0, 'BYR': 0, 'CLF': 4, 'CLP': 0, @@ -27,8 +27,6 @@ CCY_PRECISIONS = {'BHD': 3, 'BIF': 0, 'BYR': 0, 'CLF': 4, 'CLP': 0, 'RWF': 0, 'TND': 3, 'UGX': 0, 'UYI': 0, 'VND': 0, 'VUV': 0, 'XAF': 0, 'XAU': 4, 'XOF': 0, 'XPF': 0} -PROXY = None - class ExchangeBase(PrintError): def __init__(self, on_quotes, on_history): @@ -40,14 +38,14 @@ class ExchangeBase(PrintError): async def get_raw(self, site, get_string): # APIs must have https url = ''.join(['https://', site, get_string]) - async with make_aiohttp_session(PROXY) as session: + async with make_aiohttp_session(Network.get_instance().proxy) as session: async with session.get(url) as response: return await response.text() async def get_json(self, site, get_string): # APIs must have https url = ''.join(['https://', site, get_string]) - async with make_aiohttp_session(PROXY) as session: + async with make_aiohttp_session(Network.get_instance().proxy) as session: async with session.get(url) as response: return await response.json() @@ -448,11 +446,8 @@ class FxThread(ThreadJob): self.trigger.set() self.set_exchange(self.config_exchange()) make_dir(self.cache_dir) - self.set_proxy('bogus', self.network.proxy) def set_proxy(self, trigger_name, *args): - global PROXY - PROXY = args[0] self.trigger.set() def get_currencies(self, h): diff --git a/electrum/gui/kivy/uix/dialogs/crash_reporter.py b/electrum/gui/kivy/uix/dialogs/crash_reporter.py index 00e96f2f..f02222fd 100644 --- a/electrum/gui/kivy/uix/dialogs/crash_reporter.py +++ b/electrum/gui/kivy/uix/dialogs/crash_reporter.py @@ -103,11 +103,6 @@ class CrashReporter(BaseCrashReporter, Factory.Popup): self.ids.crash_message.text = BaseCrashReporter.CRASH_MESSAGE self.ids.request_help_message.text = BaseCrashReporter.REQUEST_HELP_MESSAGE self.ids.describe_error_message.text = BaseCrashReporter.DESCRIBE_ERROR_MESSAGE - self.proxy = self.main_window.network.proxy - self.main_window.network.register_callback(self.set_proxy, ['proxy_set']) - - def set_proxy(self, evt, proxy): - self.proxy = proxy def show_contents(self): details = CrashReportDetails(self.get_report_string()) @@ -121,7 +116,9 @@ class CrashReporter(BaseCrashReporter, Factory.Popup): def send_report(self): try: - response = json.loads(BaseCrashReporter.send_report(self, self.main_window.network.asyncio_loop, self.proxy, "/crash.json")) + loop = self.main_window.network.asyncio_loop + proxy = self.main_window.network.proxy + response = json.loads(BaseCrashReporter.send_report(self, loop, proxy, "/crash.json")) except (ValueError, ClientError): self.show_popup(_('Unable to send report'), _("Please check your network connection.")) else: diff --git a/electrum/gui/qt/exception_window.py b/electrum/gui/qt/exception_window.py index c4e337f1..1d30b3ee 100644 --- a/electrum/gui/qt/exception_window.py +++ b/electrum/gui/qt/exception_window.py @@ -42,9 +42,6 @@ class Exception_Window(BaseCrashReporter, QWidget, MessageBoxMixin): BaseCrashReporter.__init__(self, exctype, value, tb) self.main_window = main_window - self.proxy = self.main_window.network.proxy - self.main_window.network.register_callback(self.set_proxy, ['proxy_set']) - QWidget.__init__(self) self.setWindowTitle('Electrum - ' + _('An Error Occurred')) self.setMinimumSize(600, 300) @@ -92,12 +89,10 @@ class Exception_Window(BaseCrashReporter, QWidget, MessageBoxMixin): self.setLayout(main_box) self.show() - def set_proxy(self, evt, proxy): - self.proxy = proxy - def send_report(self): try: - response = BaseCrashReporter.send_report(self, self.main_window.network.asyncio_loop, self.proxy) + proxy = self.main_window.network.proxy + response = BaseCrashReporter.send_report(self, self.main_window.network.asyncio_loop, proxy) except BaseException as e: traceback.print_exc(file=sys.stderr) self.main_window.show_critical(_('There was a problem with the automatic reporting:') + '\n' + diff --git a/electrum/network.py b/electrum/network.py index d14d2295..7794738e 100644 --- a/electrum/network.py +++ b/electrum/network.py @@ -158,6 +158,8 @@ def deserialize_server(server_str): def serialize_server(host, port, protocol): return str(':'.join([host, port, protocol])) +INSTANCE = None + class Network(PrintError): """The Network class manages a set of connections to remote electrum servers, each connected socket is handled by an Interface() object. @@ -173,6 +175,8 @@ class Network(PrintError): verbosity_filter = 'n' def __init__(self, config=None): + global INSTANCE + INSTANCE = self if config is None: config = {} # Do not use mutables as default values! self.config = SimpleConfig(config) if isinstance(config, dict) else config @@ -244,6 +248,10 @@ class Network(PrintError): # just to not trigger a warning from switch_to_interface the first time we change default_server self.server_info_job.set_result(1) + @staticmethod + def get_instance(): + return INSTANCE + def with_interface_lock(func): def func_wrapper(self, *args, **kwargs): with self.interface_lock: diff --git a/electrum/plugins/trustedcoin/trustedcoin.py b/electrum/plugins/trustedcoin/trustedcoin.py index ccd24e33..638cda27 100644 --- a/electrum/plugins/trustedcoin/trustedcoin.py +++ b/electrum/plugins/trustedcoin/trustedcoin.py @@ -22,10 +22,9 @@ # ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN # CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. - +import asyncio import socket import os -import requests import json import base64 from urllib.parse import urljoin @@ -38,8 +37,9 @@ from electrum.mnemonic import Mnemonic from electrum.wallet import Multisig_Wallet, Deterministic_Wallet from electrum.i18n import _ from electrum.plugin import BasePlugin, hook -from electrum.util import NotEnoughFunds +from electrum.util import NotEnoughFunds, make_aiohttp_session from electrum.storage import STO_EV_USER_PW +from electrum.network import Network # signing_xpub is hardcoded so that the wallet can be restored from seed, without TrustedCoin's server def get_signing_xpub(): @@ -104,34 +104,44 @@ class TrustedCoinCosignerClient(object): self.user_agent = user_agent def send_request(self, method, relative_url, data=None): - kwargs = {'headers': {}} - if self.user_agent: - kwargs['headers']['user-agent'] = self.user_agent - if method == 'get' and data: - kwargs['params'] = data - elif method == 'post' and data: - kwargs['data'] = json.dumps(data) - kwargs['headers']['content-type'] = 'application/json' + print("send_req") + return asyncio.run_coroutine_threadsafe(self._send_request(method, relative_url, data), Network.get_instance().asyncio_loop).result() + + async def handle_response(self, resp): + if resp.status != 200: + try: + r = await resp.json() + message = r['message'] + except: + message = await resp.text() + raise TrustedCoinException(message, resp.status) + try: + return await resp.json() + except: + return await resp.text() + + async def _send_request(self, method, relative_url, data): url = urljoin(self.base_url, relative_url) if self.debug: print('%s %s %s' % (method, url, data)) + headers = {} + if self.user_agent: + headers['user-agent'] = self.user_agent try: - response = requests.request(method, url, **kwargs) + proxy = Network.get_instance().proxy + async with make_aiohttp_session(proxy) as session: + if method == 'get': + async with session.get(url, params=data, headers=headers) as resp: + return await self.handle_response(resp) + elif method == 'post': + async with session.post(url, json=data, headers=headers) as resp: + return await self.handle_response(resp) + else: + assert False + except TrustedCoinException: + raise except Exception as e: raise ErrorConnectingServer(e) - if self.debug: - print(response.text) - if response.status_code != 200: - message = str(response.text) - if response.headers.get('content-type') == 'application/json': - r = response.json() - if 'message' in r: - message = r['message'] - raise TrustedCoinException(message, response.status_code) - if response.headers.get('content-type') == 'application/json': - return response.json() - else: - return response.text def get_terms_of_service(self, billing_plan='electrum-per-tx-otp'): """ From 1fa07c920ca0e4a9533c51c11410b43ae02482e3 Mon Sep 17 00:00:00 2001 From: SomberNight Date: Fri, 7 Sep 2018 17:07:15 +0200 Subject: [PATCH 084/138] network: restore previous API for broadcast_transaction --- electrum/network.py | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/electrum/network.py b/electrum/network.py index 7794738e..85fe8213 100644 --- a/electrum/network.py +++ b/electrum/network.py @@ -734,9 +734,18 @@ class Network(PrintError): async def get_merkle_for_transaction(self, tx_hash, tx_height): return await self.interface.session.send_request('blockchain.transaction.get_merkle', [tx_hash, tx_height]) - def broadcast_transaction(self, tx): + def broadcast_transaction(self, tx, timeout=5): fut = asyncio.run_coroutine_threadsafe(self.interface.session.send_request('blockchain.transaction.broadcast', [str(tx)]), self.asyncio_loop) - return True, fut.result(1) + try: + out = fut.result(timeout) + except asyncio.TimeoutError as e: + return False, "error: operation timed out" + except Exception as e: + return False, "error: " + str(e) + + if out != tx.txid(): + return False, "error: " + out + return True, out async def request_chunk(self, height, tip, session=None): if session is None: session = self.interface.session From 26172686b87780ab5341b86d62fb97d1a74e6a08 Mon Sep 17 00:00:00 2001 From: SomberNight Date: Fri, 7 Sep 2018 19:34:28 +0200 Subject: [PATCH 085/138] restructure synchronizer/verifier <--> interface coupling --- electrum/address_synchronizer.py | 26 ++++++++++------------ electrum/interface.py | 32 ++++++++++++++++++--------- electrum/network.py | 7 ++++-- electrum/synchronizer.py | 25 +++++++++------------ electrum/verifier.py | 38 +++++++++++++++----------------- 5 files changed, 66 insertions(+), 62 deletions(-) diff --git a/electrum/address_synchronizer.py b/electrum/address_synchronizer.py index 65a75402..80708b18 100644 --- a/electrum/address_synchronizer.py +++ b/electrum/address_synchronizer.py @@ -26,6 +26,8 @@ import asyncio import itertools from collections import defaultdict +from aiorpcx import TaskGroup + from . import bitcoin from .bitcoin import COINBASE_MATURITY, TYPE_ADDRESS, TYPE_PUBKEY from .util import PrintError, profiler, bfh, VerifiedTxInfo, TxMinedStatus @@ -59,6 +61,7 @@ class AddressSynchronizer(PrintError): # verifier (SPV) and synchronizer are started in start_threads self.synchronizer = None self.verifier = None + self.sync_restart_lock = asyncio.Lock() # locks: if you need to take multiple ones, acquire them in the order they are defined here! self.lock = threading.RLock() self.transaction_lock = threading.RLock() @@ -135,20 +138,15 @@ class AddressSynchronizer(PrintError): # add it in case it was previously unconfirmed self.add_unverified_tx(tx_hash, tx_height) - def on_default_server_changed(self, evt): - for i in self.network.futures: - if i.done() and i.exception(): - raise i.exception() - if not i.done(): - i.cancel() - self.network.futures.clear() - if self.network.interface is None: - return - # FIXME there are races here.. network.interface can become None - self.network.futures.append(asyncio.get_event_loop().create_task(self.verifier.main())) - self.network.futures.append(asyncio.get_event_loop().create_task(self.synchronizer.send_subscriptions())) - self.network.futures.append(asyncio.get_event_loop().create_task(self.synchronizer.handle_status())) - self.network.futures.append(asyncio.get_event_loop().create_task(self.synchronizer.main())) + async def on_default_server_changed(self, evt): + async with self.sync_restart_lock: + interface = self.network.interface + if interface is None: + return # we should get called again soon + await interface.group.spawn(self.verifier.main(interface)) + await interface.group.spawn(self.synchronizer.send_subscriptions(interface)) + await interface.group.spawn(self.synchronizer.handle_status(interface)) + await interface.group.spawn(self.synchronizer.main()) def start_threads(self, network): self.network = network diff --git a/electrum/interface.py b/electrum/interface.py index d0e63f2f..517253ab 100644 --- a/electrum/interface.py +++ b/electrum/interface.py @@ -32,7 +32,7 @@ import traceback import aiorpcx import asyncio import concurrent.futures -from aiorpcx import ClientSession, Notification +from aiorpcx import ClientSession, Notification, TaskGroup import requests @@ -82,11 +82,15 @@ class Interface(PrintError): self.port = int(self.port) self.config_path = config_path self.cert_path = os.path.join(self.config_path, 'certs', self.host) - self.fut = asyncio.get_event_loop().create_task(self.run()) self.tip_header = None self.tip = 0 self.blockchain = None self.network = network + + # TODO combine? + self.fut = asyncio.get_event_loop().create_task(self.run()) + self.group = TaskGroup() + if proxy: username, pw = proxy.get('user'), proxy.get('password') if not username or not pw: @@ -231,18 +235,24 @@ class Interface(PrintError): self.tip = subscription_res['height'] self.mark_ready() copy_header_queue = asyncio.Queue() - block_retriever = asyncio.get_event_loop().create_task(self.run_fetch_blocks(subscription_res, copy_header_queue)) - while True: - try: - new_header = await asyncio.wait_for(header_queue.get(), 300) - self.tip_header = new_header - self.tip = new_header['block_height'] - await copy_header_queue.put(new_header) - except concurrent.futures.TimeoutError: - await asyncio.wait_for(session.send_request('server.ping'), 5) + async with self.group as group: + await group.spawn(self.run_fetch_blocks(subscription_res, copy_header_queue)) + await group.spawn(self.subscribe_to_headers(header_queue, copy_header_queue)) + # NOTE: group.__aexit__ will be called here; this is needed to notice exceptions in the group! + + async def subscribe_to_headers(self, header_queue, copy_header_queue): + while True: + try: + new_header = await asyncio.wait_for(header_queue.get(), 300) + self.tip_header = new_header + self.tip = new_header['block_height'] + await copy_header_queue.put(new_header) + except concurrent.futures.TimeoutError: + await asyncio.wait_for(self.session.send_request('server.ping'), 5) def close(self): self.fut.cancel() + asyncio.get_event_loop().create_task(self.group.cancel_remaining()) @aiosafe async def run_fetch_blocks(self, sub_reply, replies): diff --git a/electrum/network.py b/electrum/network.py index 85fe8213..8cf94273 100644 --- a/electrum/network.py +++ b/electrum/network.py @@ -243,7 +243,6 @@ class Network(PrintError): self.start_network(deserialize_server(self.default_server)[2], deserialize_proxy(self.config.get('proxy'))) self.asyncio_loop = asyncio.get_event_loop() - self.futures = [] self.server_info_job = asyncio.Future() # just to not trigger a warning from switch_to_interface the first time we change default_server self.server_info_job.set_result(1) @@ -278,7 +277,11 @@ class Network(PrintError): def trigger_callback(self, event, *args): with self.callback_lock: callbacks = self.callbacks[event][:] - [callback(event, *args) for callback in callbacks] + for callback in callbacks: + if asyncio.iscoroutinefunction(callback): + asyncio.run_coroutine_threadsafe(callback(event, *args), self.asyncio_loop) + else: + callback(event, *args) def read_recent_servers(self): if not self.config.path: diff --git a/electrum/synchronizer.py b/electrum/synchronizer.py index 3fe16a25..84130312 100644 --- a/electrum/synchronizer.py +++ b/electrum/synchronizer.py @@ -159,20 +159,16 @@ class Synchronizer(PrintError): await self.status_queue.put((h, status)) self.requested_addrs.remove(addr) - @aiosafe - async def send_subscriptions(self): - async with TaskGroup() as group: - while True: - addr = await self.add_queue.get() - await group.spawn(self.subscribe_to_address(addr)) + async def send_subscriptions(self, interface): + while True: + addr = await self.add_queue.get() + await interface.group.spawn(self.subscribe_to_address(addr)) - @aiosafe - async def handle_status(self): - async with TaskGroup() as group: - while True: - h, status = await self.status_queue.get() - addr = self.scripthash_to_address[h] - await group.spawn(self.on_address_status(addr, status)) + async def handle_status(self, interface): + while True: + h, status = await self.status_queue.get() + addr = self.scripthash_to_address[h] + await interface.group.spawn(self.on_address_status(addr, status)) @property def session(self): @@ -180,11 +176,10 @@ class Synchronizer(PrintError): assert s is not None return s - @aiosafe async def main(self): for addr in self.wallet.get_addresses(): self.add(addr) while True: - await asyncio.sleep(1) + await asyncio.sleep(0.1) self.wallet.synchronize() up_to_date = self.is_up_to_date() if up_to_date != self.wallet.is_up_to_date(): diff --git a/electrum/verifier.py b/electrum/verifier.py index 39ecf82a..f1bc1aad 100644 --- a/electrum/verifier.py +++ b/electrum/verifier.py @@ -48,13 +48,12 @@ class SPV(ThreadJob): self.merkle_roots = {} # txid -> merkle root (once it has been verified) self.requested_merkle = set() # txid set of pending requests - @aiosafe - async def main(self): + async def main(self, interface): while True: - await self._request_proofs() - await asyncio.sleep(1) + await self._request_proofs(interface) + await asyncio.sleep(0.1) - async def _request_proofs(self): + async def _request_proofs(self, interface): blockchain = self.network.blockchain() if not blockchain: self.print_error("no blockchain") @@ -63,22 +62,21 @@ class SPV(ThreadJob): local_height = self.network.get_local_height() unverified = self.wallet.get_unverified_txs() - async with TaskGroup() as group: - for tx_hash, tx_height in unverified.items(): - # do not request merkle branch before headers are available - if tx_height <= 0 or tx_height > local_height: - continue + for tx_hash, tx_height in unverified.items(): + # do not request merkle branch before headers are available + if tx_height <= 0 or tx_height > local_height: + continue - header = blockchain.read_header(tx_height) - if header is None: - index = tx_height // 2016 - if index < len(blockchain.checkpoints): - await group.spawn(self.network.request_chunk, tx_height, None) - elif (tx_hash not in self.requested_merkle - and tx_hash not in self.merkle_roots): - self.print_error('requested merkle', tx_hash) - self.requested_merkle.add(tx_hash) - await group.spawn(self._request_and_verify_single_proof, tx_hash, tx_height) + header = blockchain.read_header(tx_height) + if header is None: + index = tx_height // 2016 + if index < len(blockchain.checkpoints): + await interface.group.spawn(self.network.request_chunk, tx_height, None) + elif (tx_hash not in self.requested_merkle + and tx_hash not in self.merkle_roots): + self.print_error('requested merkle', tx_hash) + self.requested_merkle.add(tx_hash) + await interface.group.spawn(self._request_and_verify_single_proof, tx_hash, tx_height) if self.network.blockchain() != self.blockchain: self.blockchain = self.network.blockchain() From fd40dee33702c4003abf32e1f9b4401ac82c20d5 Mon Sep 17 00:00:00 2001 From: SomberNight Date: Fri, 7 Sep 2018 19:35:35 +0200 Subject: [PATCH 086/138] make sure to retry nodes for network --- electrum/network.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/electrum/network.py b/electrum/network.py index 8cf94273..9fc65ee1 100644 --- a/electrum/network.py +++ b/electrum/network.py @@ -854,10 +854,10 @@ class Network(PrintError): for i in range(self.num_server - len(self.interfaces) - len(self.connecting)): if self.start_random_interface(): changed = True - if now - self.nodes_retry_time > NODES_RETRY_INTERVAL: - self.print_error('network: retrying connections') - self.disconnected_servers = set([]) - self.nodes_retry_time = now + if now - self.nodes_retry_time > NODES_RETRY_INTERVAL: + self.print_error('network: retrying connections') + self.disconnected_servers = set([]) + self.nodes_retry_time = now # main interface if not self.is_connected(): From 56c3c76d8b674095e295b15922933c5d03df1d9d Mon Sep 17 00:00:00 2001 From: SomberNight Date: Fri, 7 Sep 2018 19:54:26 +0200 Subject: [PATCH 087/138] follow-up 26172686b87780ab5341b86d62fb97d1a74e6a08 --- electrum/interface.py | 1 - 1 file changed, 1 deletion(-) diff --git a/electrum/interface.py b/electrum/interface.py index 517253ab..0c1515ea 100644 --- a/electrum/interface.py +++ b/electrum/interface.py @@ -254,7 +254,6 @@ class Interface(PrintError): self.fut.cancel() asyncio.get_event_loop().create_task(self.group.cancel_remaining()) - @aiosafe async def run_fetch_blocks(self, sub_reply, replies): if self.tip < self.network.max_checkpoint(): raise GracefulDisconnect('server tip below max checkpoint') From 7500b1fbee57cd34bcdaaec7846e88a97cc8b829 Mon Sep 17 00:00:00 2001 From: SomberNight Date: Fri, 7 Sep 2018 20:26:45 +0200 Subject: [PATCH 088/138] detect lost connection supersedes #4697 --- electrum/interface.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/electrum/interface.py b/electrum/interface.py index 0c1515ea..21e165e1 100644 --- a/electrum/interface.py +++ b/electrum/interface.py @@ -68,7 +68,7 @@ class NotificationSession(ClientSession): assert False, request.method - +# FIXME this is often raised inside a TaskGroup, but then it's not silent :( class GracefulDisconnect(AIOSafeSilentException): pass @@ -238,8 +238,15 @@ class Interface(PrintError): async with self.group as group: await group.spawn(self.run_fetch_blocks(subscription_res, copy_header_queue)) await group.spawn(self.subscribe_to_headers(header_queue, copy_header_queue)) + await group.spawn(self.monitor_connection()) # NOTE: group.__aexit__ will be called here; this is needed to notice exceptions in the group! + async def monitor_connection(self): + while True: + await asyncio.sleep(1) + if not self.session or self.session.is_closing(): + raise GracefulDisconnect('server closed session') + async def subscribe_to_headers(self, header_queue, copy_header_queue): while True: try: From 64a03c245ce6aec596f9db0d58fe3ca632ddc17a Mon Sep 17 00:00:00 2001 From: SomberNight Date: Sat, 8 Sep 2018 00:25:38 +0200 Subject: [PATCH 089/138] small timeout change (re KeyError: can happen after proxy settings change) --- electrum/interface.py | 2 +- electrum/network.py | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/electrum/interface.py b/electrum/interface.py index 21e165e1..a0c928b3 100644 --- a/electrum/interface.py +++ b/electrum/interface.py @@ -213,7 +213,7 @@ class Interface(PrintError): return None async def get_block_header(self, height, assert_mode): - res = await asyncio.wait_for(self.session.send_request('blockchain.block.header', [height]), 1) + res = await asyncio.wait_for(self.session.send_request('blockchain.block.header', [height]), 5) return blockchain.deserialize_header(bytes.fromhex(res), height) async def request_chunk(self, idx, tip): diff --git a/electrum/network.py b/electrum/network.py index 9fc65ee1..497ca02b 100644 --- a/electrum/network.py +++ b/electrum/network.py @@ -32,6 +32,8 @@ import socket import json import sys import ipaddress +import asyncio +import concurrent.futures import dns import dns.resolver @@ -42,9 +44,6 @@ from .bitcoin import COIN from . import constants from . import blockchain from .interface import Interface - -import asyncio -import concurrent.futures from .version import PROTOCOL_VERSION NODES_RETRY_INTERVAL = 60 @@ -700,7 +699,8 @@ class Network(PrintError): self.connection_down(interface.server) return finally: - self.connecting.remove(server) + try: self.connecting.remove(server) + except KeyError: pass with self.interface_lock: self.interfaces[server] = interface @@ -757,7 +757,7 @@ class Network(PrintError): if tip is not None: size = min(size, tip - index * 2016) size = max(size, 0) - res = await session.send_request('blockchain.block.headers', [index * 2016, size]) + res = await asyncio.wait_for(session.send_request('blockchain.block.headers', [index * 2016, size]), 20) conn = self.blockchain().connect_chunk(index, res['hex']) if not conn: return conn, 0 From 32528d6aa64bee26cf2560c6ce1fad34c80715c6 Mon Sep 17 00:00:00 2001 From: SomberNight Date: Sat, 8 Sep 2018 01:10:41 +0200 Subject: [PATCH 090/138] rm dupe code --- electrum/synchronizer.py | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/electrum/synchronizer.py b/electrum/synchronizer.py index 84130312..f03b18cf 100644 --- a/electrum/synchronizer.py +++ b/electrum/synchronizer.py @@ -100,18 +100,7 @@ class Synchronizer(PrintError): # Store received history self.wallet.receive_history_callback(addr, hist, tx_fees) # Request transactions we don't have - # "hist" is a list of [tx_hash, tx_height] lists - transaction_hashes = [] - for tx_hash, tx_height in hist: - if tx_hash in self.requested_tx: - continue - if tx_hash in self.wallet.transactions: - continue - transaction_hashes.append(tx_hash) - self.requested_tx[tx_hash] = tx_height - - for tx_hash in transaction_hashes: - await self.get_transaction(tx_hash) + await self.request_missing_txs(hist) # Remove request; this allows up_to_date to be True self.requested_histories.pop(addr) From 136df7e5ee8bb51636feed4d4d2d342411416574 Mon Sep 17 00:00:00 2001 From: SomberNight Date: Sat, 8 Sep 2018 01:34:33 +0200 Subject: [PATCH 091/138] wallet: recreate Synchronizer and Verifier when switching servers not that nice but solves races --- electrum/address_synchronizer.py | 4 ++-- electrum/interface.py | 12 ++++++++++-- electrum/network.py | 26 ++++++++++++-------------- electrum/synchronizer.py | 4 ++-- 4 files changed, 26 insertions(+), 20 deletions(-) diff --git a/electrum/address_synchronizer.py b/electrum/address_synchronizer.py index 80708b18..f976b1f5 100644 --- a/electrum/address_synchronizer.py +++ b/electrum/address_synchronizer.py @@ -143,6 +143,8 @@ class AddressSynchronizer(PrintError): interface = self.network.interface if interface is None: return # we should get called again soon + self.verifier = SPV(self.network, self) + self.synchronizer = Synchronizer(self) await interface.group.spawn(self.verifier.main(interface)) await interface.group.spawn(self.synchronizer.send_subscriptions(interface)) await interface.group.spawn(self.synchronizer.handle_status(interface)) @@ -151,8 +153,6 @@ class AddressSynchronizer(PrintError): def start_threads(self, network): self.network = network if self.network is not None: - self.verifier = SPV(self.network, self) - self.synchronizer = Synchronizer(self) self.network.register_callback(self.on_default_server_changed, ['default_server_changed']) self.network.trigger_callback('default_server_changed') else: diff --git a/electrum/interface.py b/electrum/interface.py index a0c928b3..d0a06c87 100644 --- a/electrum/interface.py +++ b/electrum/interface.py @@ -72,6 +72,14 @@ class NotificationSession(ClientSession): class GracefulDisconnect(AIOSafeSilentException): pass +class CustomTaskGroup(TaskGroup): + + def spawn(self, *args, **kwargs): + if self._closed: + raise asyncio.CancelledError() + return super().spawn(*args, **kwargs) + + class Interface(PrintError): def __init__(self, network, server, config_path, proxy): @@ -89,7 +97,7 @@ class Interface(PrintError): # TODO combine? self.fut = asyncio.get_event_loop().create_task(self.run()) - self.group = TaskGroup() + self.group = CustomTaskGroup() if proxy: username, pw = proxy.get('user'), proxy.get('password') @@ -255,7 +263,7 @@ class Interface(PrintError): self.tip = new_header['block_height'] await copy_header_queue.put(new_header) except concurrent.futures.TimeoutError: - await asyncio.wait_for(self.session.send_request('server.ping'), 5) + await asyncio.wait_for(self.session.send_request('server.ping'), 10) def close(self): self.fut.cancel() diff --git a/electrum/network.py b/electrum/network.py index 497ca02b..c3fe875f 100644 --- a/electrum/network.py +++ b/electrum/network.py @@ -242,9 +242,6 @@ class Network(PrintError): self.start_network(deserialize_server(self.default_server)[2], deserialize_proxy(self.config.get('proxy'))) self.asyncio_loop = asyncio.get_event_loop() - self.server_info_job = asyncio.Future() - # just to not trigger a warning from switch_to_interface the first time we change default_server - self.server_info_job.set_result(1) @staticmethod def get_instance(): @@ -330,7 +327,6 @@ class Network(PrintError): def is_connecting(self): return self.connection_status == 'connecting' - @util.aiosafe async def request_server_info(self, interface): await interface.ready session = interface.session @@ -560,7 +556,6 @@ class Network(PrintError): being opened, start a thread to connect. The actual switch will happen on receipt of the connection notification. Do nothing if server already is our interface.''' - old_default_server = self.default_server self.default_server = server if server not in self.interfaces: self.interface = None @@ -570,14 +565,18 @@ class Network(PrintError): i = self.interfaces[server] if self.interface != i: self.print_error("switching to", server) - # stop any current interface in order to terminate subscriptions - # fixme: we don't want to close headers sub - #self.close_interface(self.interface) + if self.interface is not None: + # Stop any current interface in order to terminate subscriptions, + # and to cancel tasks in interface.group. + # However, for headers sub, give preference to this interface + # over unknown ones, i.e. start it again right away. + self.close_interface(self.interface) + if len(self.interfaces) <= self.num_server: + self.start_interface(self.interface.server) + self.interface = i - if not self.server_info_job.done(): - self.print_error('cancelled previous request_server_info job, was it too slow? server was:', old_default_server) - self.server_info_job.cancel() - self.server_info_job = asyncio.get_event_loop().create_task(self.request_server_info(i)) + asyncio.get_event_loop().create_task( + i.group.spawn(self.request_server_info(i))) self.trigger_callback('default_server_changed') self.set_status('connected') self.notify('updated') @@ -876,12 +875,11 @@ class Network(PrintError): changed = True else: if self.config.is_fee_estimates_update_required(): - asyncio.get_event_loop().create_task(self.attempt_fee_estimate_update()) + await self.interface.group.spawn(self.attempt_fee_estimate_update()) if changed: self.notify('updated') await asyncio.sleep(1) - @util.aiosafe async def attempt_fee_estimate_update(self): await asyncio.wait_for(self.request_fee_estimates(self.interface), 5) diff --git a/electrum/synchronizer.py b/electrum/synchronizer.py index f03b18cf..d8a88760 100644 --- a/electrum/synchronizer.py +++ b/electrum/synchronizer.py @@ -151,13 +151,13 @@ class Synchronizer(PrintError): async def send_subscriptions(self, interface): while True: addr = await self.add_queue.get() - await interface.group.spawn(self.subscribe_to_address(addr)) + await interface.group.spawn(self.subscribe_to_address, addr) async def handle_status(self, interface): while True: h, status = await self.status_queue.get() addr = self.scripthash_to_address[h] - await interface.group.spawn(self.on_address_status(addr, status)) + await interface.group.spawn(self.on_address_status, addr, status) @property def session(self): From ddee03d324a119e7e6d3085b80b2c5a3f59834e2 Mon Sep 17 00:00:00 2001 From: SomberNight Date: Sat, 8 Sep 2018 02:15:51 +0200 Subject: [PATCH 092/138] interface.run: catch more exceptions --- electrum/interface.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/electrum/interface.py b/electrum/interface.py index d0a06c87..4c76d1fe 100644 --- a/electrum/interface.py +++ b/electrum/interface.py @@ -152,7 +152,7 @@ class Interface(PrintError): if not exists: try: ca_signed = await self.is_server_ca_signed(ca_sslc) - except (ConnectionRefusedError, socket.gaierror) as e: + except (ConnectionRefusedError, socket.gaierror, aiorpcx.socks.SOCKSFailure) as e: self.print_error('disconnecting due to: {}'.format(e)) self.exception = e return From 57e66324cb5e7eac8df946598e660de528594870 Mon Sep 17 00:00:00 2001 From: SomberNight Date: Sat, 8 Sep 2018 15:36:16 +0200 Subject: [PATCH 093/138] batch fee estimates --- electrum/interface.py | 3 ++- electrum/network.py | 16 +++++++++------- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/electrum/interface.py b/electrum/interface.py index 4c76d1fe..903b1e2d 100644 --- a/electrum/interface.py +++ b/electrum/interface.py @@ -170,7 +170,8 @@ class Interface(PrintError): sslc.check_hostname = 0 try: await self.open_session(sslc, exit_early=False) - except (asyncio.CancelledError, ConnectionRefusedError, socket.gaierror, ssl.SSLError, TimeoutError) as e: + except (asyncio.CancelledError, ConnectionRefusedError, socket.gaierror, + ssl.SSLError, TimeoutError, aiorpcx.socks.SOCKSFailure) as e: self.print_error('disconnecting due to: {}'.format(e)) self.exception = e return diff --git a/electrum/network.py b/electrum/network.py index c3fe875f..bf1709c6 100644 --- a/electrum/network.py +++ b/electrum/network.py @@ -37,6 +37,7 @@ import concurrent.futures import dns import dns.resolver +from aiorpcx import TaskGroup from . import util from .util import PrintError, print_error, aiosafe, bfh @@ -343,14 +344,15 @@ class Network(PrintError): session = interface.session from .simple_config import FEE_ETA_TARGETS self.config.requested_fee_estimates() - histogram = await session.send_request('mempool.get_fee_histogram') - fees = [] - for i in FEE_ETA_TARGETS: - fees.append((i, await session.send_request('blockchain.estimatefee', [i]))) - self.config.mempool_fees = histogram + async with TaskGroup() as group: + histogram_task = await group.spawn(session.send_request('mempool.get_fee_histogram')) + fee_tasks = [] + for i in FEE_ETA_TARGETS: + fee_tasks.append((i, await group.spawn(session.send_request('blockchain.estimatefee', [i])))) + self.config.mempool_fees = histogram_task.result() self.notify('fee_histogram') - for i, result in fees: - fee = int(result * COIN) + for i, task in fee_tasks: + fee = int(task.result() * COIN) self.config.update_fee_estimates(i, fee) self.print_error("fee_estimates[%d]" % i, fee) self.notify('fee') From c9ffffc5267275a65e0449bc6bbc90434d1d9bfc Mon Sep 17 00:00:00 2001 From: Dzhelil Rufat Date: Sat, 8 Sep 2018 08:24:23 -0700 Subject: [PATCH 094/138] Remove unneccessary imports from the unit testing directory. (#4699) --- electrum/tests/test_bitcoin.py | 1 - electrum/tests/test_interface.py | 2 -- electrum/tests/test_mnemonic.py | 1 - electrum/tests/test_simple_config.py | 1 - electrum/tests/test_storage_upgrade.py | 2 -- electrum/tests/test_transaction.py | 2 -- electrum/tests/test_util.py | 1 - electrum/tests/test_wallet.py | 1 - electrum/tests/test_wallet_vertical.py | 3 +-- 9 files changed, 1 insertion(+), 13 deletions(-) diff --git a/electrum/tests/test_bitcoin.py b/electrum/tests/test_bitcoin.py index 2575ec78..f14fb63c 100644 --- a/electrum/tests/test_bitcoin.py +++ b/electrum/tests/test_bitcoin.py @@ -1,5 +1,4 @@ import base64 -import unittest import sys from electrum.bitcoin import ( diff --git a/electrum/tests/test_interface.py b/electrum/tests/test_interface.py index 402588ca..463cb58b 100644 --- a/electrum/tests/test_interface.py +++ b/electrum/tests/test_interface.py @@ -1,5 +1,3 @@ -import unittest - from electrum import interface from . import SequentialTestCase diff --git a/electrum/tests/test_mnemonic.py b/electrum/tests/test_mnemonic.py index 191ce902..24d07c43 100644 --- a/electrum/tests/test_mnemonic.py +++ b/electrum/tests/test_mnemonic.py @@ -1,4 +1,3 @@ -import unittest from electrum import keystore from electrum import mnemonic from electrum import old_mnemonic diff --git a/electrum/tests/test_simple_config.py b/electrum/tests/test_simple_config.py index 6a3dbd02..4ec2a7e4 100644 --- a/electrum/tests/test_simple_config.py +++ b/electrum/tests/test_simple_config.py @@ -1,7 +1,6 @@ import ast import sys import os -import unittest import tempfile import shutil diff --git a/electrum/tests/test_storage_upgrade.py b/electrum/tests/test_storage_upgrade.py index 8117176f..8d24e279 100644 --- a/electrum/tests/test_storage_upgrade.py +++ b/electrum/tests/test_storage_upgrade.py @@ -6,8 +6,6 @@ from electrum.wallet import Wallet from .test_wallet import WalletTestCase -from . import SequentialTestCase - # TODO add other wallet types: 2fa, xpub-only # TODO hw wallet with client version 2.6.x (single-, and multiacc) diff --git a/electrum/tests/test_transaction.py b/electrum/tests/test_transaction.py index 71a0406b..c1212945 100644 --- a/electrum/tests/test_transaction.py +++ b/electrum/tests/test_transaction.py @@ -1,5 +1,3 @@ -import unittest - from electrum import transaction from electrum.bitcoin import TYPE_ADDRESS from electrum.keystore import xpubkey_to_address diff --git a/electrum/tests/test_util.py b/electrum/tests/test_util.py index 1ffe1945..a88bd8c3 100644 --- a/electrum/tests/test_util.py +++ b/electrum/tests/test_util.py @@ -1,4 +1,3 @@ -import unittest from electrum.util import format_satoshis, parse_URI from . import SequentialTestCase diff --git a/electrum/tests/test_wallet.py b/electrum/tests/test_wallet.py index a1997024..9117392e 100644 --- a/electrum/tests/test_wallet.py +++ b/electrum/tests/test_wallet.py @@ -1,7 +1,6 @@ import shutil import tempfile import sys -import unittest import os import json diff --git a/electrum/tests/test_wallet_vertical.py b/electrum/tests/test_wallet_vertical.py index 1a38c922..52fab530 100644 --- a/electrum/tests/test_wallet_vertical.py +++ b/electrum/tests/test_wallet_vertical.py @@ -1,10 +1,9 @@ -import unittest from unittest import mock import shutil import tempfile from typing import Sequence -from electrum import storage, bitcoin, keystore, constants +from electrum import storage, bitcoin, keystore from electrum import Transaction from electrum import SimpleConfig from electrum.address_synchronizer import TX_HEIGHT_UNCONFIRMED, TX_HEIGHT_UNCONF_PARENT From 86bc59cd6015652cd0f4dd37739e660132a480cd Mon Sep 17 00:00:00 2001 From: SomberNight Date: Sat, 8 Sep 2018 17:32:28 +0200 Subject: [PATCH 095/138] update mainnet block header checkpoints --- electrum/checkpoints.json | 80 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 80 insertions(+) diff --git a/electrum/checkpoints.json b/electrum/checkpoints.json index 0055895f..58fd65f9 100644 --- a/electrum/checkpoints.json +++ b/electrum/checkpoints.json @@ -986,5 +986,85 @@ [ "000000000000000000cee3bff56ee49c0f96d1cbd17fa17dc6f84b3f48aed765", 16946223147907286639275870228581142863500004051737247938 + ], + [ + "00000000000000000089ef13654974b8896b0b0909dd9ae8e350b8a8a7807ce3", + 14393235111671584691995228944147692615427239344048996539 + ], + [ + "0000000000000000003105a067417c318dab31e25ae1583fa2b27be226945fdd", + 13960554065678404881662765388314788446457906960835196843 + ], + [ + "000000000000000000720da39f66f29337b9a29223e1ce05fd5ee57bb72a9223", + 12101157814506873037325199894442204023473205005719474983 + ], + [ + "0000000000000000006a8957cbd52c2038861514f106f7f9f76392d5cb83fd4c", + 10356794104728254122144804026855362068260936623802026210 + ], + [ + "0000000000000000006b68e55432541794388c94fe9e805652038e7b3cac0681", + 9378292707998313412116380171862644964293497276319204201 + ], + [ + "00000000000000000001c9deea9f0302eadb1250df1ad53da802dfb40d47face", + 8964448809071454563198782190249047923745291487292520783 + ], + [ + "00000000000000000013aaa8778111530a626a3fe57e4e6f4a878c92669b04d1", + 8192879673885498125868612536191253209089530007606798637 + ], + [ + "0000000000000000002f67aa98789b98304a32e54bffbb34c8693eb0acac4c30", + 7786052299140735828822313223500239047404586439857310526 + ], + [ + "0000000000000000002e5f072398ee27b25b6cdcf69051bcdbbece417093c979", + 7678459575374433725135064732059630548334362167840519275 + ], + [ + "00000000000000000028d7447c20ade2053bbaf49e8a16eb5fb1bc74335d0d18", + 7021962387297538215162191668190420818507007046641761211 + ], + [ + "00000000000000000042d89446b9043387be2d4c09aa9e9524176c5754616510", + 6702919661112618417011103564460059073928318846609410368 + ], + [ + "00000000000000000018ec4d369bab2c13174834a02138decea7c85685d46bd6", + 6505870722004004229230504292495188676492429416682571694 + ], + [ + "0000000000000000000d4a6c2237c6c46b963b17f60d9c850c4915518deb6678", + 6259544227059496163548942066110099807402951752241008049 + ], + [ + "00000000000000000031adb986da21237ce06b57ae5390b7f0f890ab8e21b66a", + 5456617768214852996771856909727813546477083066109605574 + ], + [ + "000000000000000000031df41201cd3789559333cd9529f99834a805014c9b13", + 5309609731779463925710783996961452866664143937023784605 + ], + [ + "00000000000000000020c68bfc8de14bc9dd2d6cf45161a67e0c6455cf28cfd8", + 5026315858682664529586803062495716614500737280720290905 + ], + [ + "00000000000000000009dce52e227d46a6bdf38a8c1f2e88c6044893289c2bf0", + 5205879841852030921059527756813029926469497427631238471 + ], + [ + "0000000000000000002eca92f4e44dcf144115851689ace0ff4ce271792f16fe", + 4531443141490318780034113235264455891508287828291522257 + ], + [ + "00000000000000000000943de85f4495f053ff55f27d135edc61c27990c2eec5", + 4219471567912784283817862725463546097477954228203549938 + ], + [ + "0000000000000000001d9d48d93793aaa85b5f6d17c176d4ef905c7e7112b1cf", + 4007527398636149719774488173266778882653753905718962657 ] ] \ No newline at end of file From 4a88ca1a3a5b26fef068751e98e034e0e2bedeb9 Mon Sep 17 00:00:00 2001 From: SomberNight Date: Sat, 8 Sep 2018 17:56:29 +0200 Subject: [PATCH 096/138] fix --offline option for fx and trustedcoin --- electrum/exchange_rate.py | 3 ++- electrum/plugins/trustedcoin/trustedcoin.py | 7 +++++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/electrum/exchange_rate.py b/electrum/exchange_rate.py index 4503ce31..e4d0e348 100644 --- a/electrum/exchange_rate.py +++ b/electrum/exchange_rate.py @@ -436,7 +436,8 @@ class FxThread(ThreadJob): def __init__(self, config, network): self.config = config self.network = network - self.network.register_callback(self.set_proxy, ['proxy_set']) + if self.network: + self.network.register_callback(self.set_proxy, ['proxy_set']) self.ccy = self.get_currency() self.history_used_spot = False self.ccy_combo = None diff --git a/electrum/plugins/trustedcoin/trustedcoin.py b/electrum/plugins/trustedcoin/trustedcoin.py index 638cda27..8227a3a8 100644 --- a/electrum/plugins/trustedcoin/trustedcoin.py +++ b/electrum/plugins/trustedcoin/trustedcoin.py @@ -104,8 +104,11 @@ class TrustedCoinCosignerClient(object): self.user_agent = user_agent def send_request(self, method, relative_url, data=None): - print("send_req") - return asyncio.run_coroutine_threadsafe(self._send_request(method, relative_url, data), Network.get_instance().asyncio_loop).result() + network = Network.get_instance() + if network: + return asyncio.run_coroutine_threadsafe(self._send_request(method, relative_url, data), network.asyncio_loop).result() + else: + raise ErrorConnectingServer('You are offline.') async def handle_response(self, resp): if resp.status != 200: From c49e563881f3b7101d98ca768f58b0b7fee9bea2 Mon Sep 17 00:00:00 2001 From: SomberNight Date: Sat, 8 Sep 2018 18:10:21 +0200 Subject: [PATCH 097/138] verifier: if we fail to verify SPV proof, disconnect from server --- electrum/verifier.py | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/electrum/verifier.py b/electrum/verifier.py index f1bc1aad..1013648b 100644 --- a/electrum/verifier.py +++ b/electrum/verifier.py @@ -24,12 +24,11 @@ import asyncio from typing import Sequence, Optional -from aiorpcx import TaskGroup - -from .util import ThreadJob, bh2u, VerifiedTxInfo, aiosafe +from .util import ThreadJob, bh2u, VerifiedTxInfo from .bitcoin import Hash, hash_decode, hash_encode from .transaction import Transaction from .blockchain import hash_header +from .interface import GracefulDisconnect class MerkleVerificationFailure(Exception): pass @@ -94,14 +93,10 @@ class SPV(ThreadJob): verify_tx_is_in_block(tx_hash, merkle_branch, pos, header, tx_height) except MerkleVerificationFailure as e: self.print_error(str(e)) - # FIXME: we should make a fresh connection to a server - # to recover from this, as this TX will now never verify - return + raise GracefulDisconnect(e) # we passed all the tests self.merkle_roots[tx_hash] = header.get('merkle_root') try: - # note: we could pop in the beginning, but then we would request - # this proof again in case of verification failure from the same server self.requested_merkle.remove(tx_hash) except KeyError: pass self.print_error("verified %s" % tx_hash) From b33b2c094507afedc96ec18794fb0850503e9eb9 Mon Sep 17 00:00:00 2001 From: SomberNight Date: Sat, 8 Sep 2018 18:38:58 +0200 Subject: [PATCH 098/138] synchronizer: more batching --- electrum/synchronizer.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/electrum/synchronizer.py b/electrum/synchronizer.py index d8a88760..ff17a34c 100644 --- a/electrum/synchronizer.py +++ b/electrum/synchronizer.py @@ -118,11 +118,12 @@ class Synchronizer(PrintError): transaction_hashes.append(tx_hash) self.requested_tx[tx_hash] = tx_height - for tx_hash in transaction_hashes: - await self.get_transaction(tx_hash) + async with TaskGroup() as group: + for tx_hash in transaction_hashes: + await group.spawn(self.get_transaction, tx_hash) async def get_transaction(self, tx_hash): - result = await self.session.send_request('blockchain.transaction.get', [tx_hash]) + result = await asyncio.wait_for(self.session.send_request('blockchain.transaction.get', [tx_hash]), 20) tx = Transaction(result) try: tx.deserialize() From 77d86f074f5134bf496867991d1043445d087a26 Mon Sep 17 00:00:00 2001 From: SomberNight Date: Sat, 8 Sep 2018 19:11:02 +0200 Subject: [PATCH 099/138] verifier: don't try to request same chunk multiple times --- electrum/network.py | 11 +++++++++-- electrum/verifier.py | 2 +- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/electrum/network.py b/electrum/network.py index bf1709c6..d51b8ab1 100644 --- a/electrum/network.py +++ b/electrum/network.py @@ -751,14 +751,21 @@ class Network(PrintError): return False, "error: " + out return True, out - async def request_chunk(self, height, tip, session=None): + async def request_chunk(self, height, tip, session=None, can_return_early=False): if session is None: session = self.interface.session index = height // 2016 + if can_return_early and index in self.requested_chunks: + return size = 2016 if tip is not None: size = min(size, tip - index * 2016) size = max(size, 0) - res = await asyncio.wait_for(session.send_request('blockchain.block.headers', [index * 2016, size]), 20) + try: + self.requested_chunks.add(index) + res = await asyncio.wait_for(session.send_request('blockchain.block.headers', [index * 2016, size]), 20) + finally: + try: self.requested_chunks.remove(index) + except KeyError: pass conn = self.blockchain().connect_chunk(index, res['hex']) if not conn: return conn, 0 diff --git a/electrum/verifier.py b/electrum/verifier.py index 1013648b..493d402f 100644 --- a/electrum/verifier.py +++ b/electrum/verifier.py @@ -70,7 +70,7 @@ class SPV(ThreadJob): if header is None: index = tx_height // 2016 if index < len(blockchain.checkpoints): - await interface.group.spawn(self.network.request_chunk, tx_height, None) + await interface.group.spawn(self.network.request_chunk(tx_height, None, can_return_early=True)) elif (tx_hash not in self.requested_merkle and tx_hash not in self.merkle_roots): self.print_error('requested merkle', tx_hash) From c5bedbd3ef9e5eaacf03642d7dee5ce5584b4683 Mon Sep 17 00:00:00 2001 From: SomberNight Date: Sat, 8 Sep 2018 19:38:38 +0200 Subject: [PATCH 100/138] wallet: only do fiat history computations if specifically enabled --- electrum/wallet.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/electrum/wallet.py b/electrum/wallet.py index 84e9ea19..3007261c 100644 --- a/electrum/wallet.py +++ b/electrum/wallet.py @@ -426,7 +426,7 @@ class Abstract_Wallet(AddressSynchronizer): else: income += value # fiat computations - if fx and fx.is_enabled(): + if fx and fx.is_enabled() and fx.get_history_config(): fiat_value = self.get_fiat_value(tx_hash, fx.ccy) fiat_default = fiat_value is None fiat_value = fiat_value if fiat_value is not None else value / Decimal(COIN) * self.price_at_timestamp(tx_hash, fx.timestamp_rate) # @@ -462,7 +462,7 @@ class Abstract_Wallet(AddressSynchronizer): 'income': Satoshis(income), 'expenditures': Satoshis(expenditures) } - if fx and fx.is_enabled(): + if fx and fx.is_enabled() and fx.get_history_config(): unrealized = self.unrealized_gains(domain, fx.timestamp_rate, fx.ccy) summary['capital_gains'] = Fiat(capital_gains, fx.ccy) summary['fiat_income'] = Fiat(fiat_income, fx.ccy) From 86733279f6e320f45269433ba0dfc0a7ba7330cd Mon Sep 17 00:00:00 2001 From: SomberNight Date: Sat, 8 Sep 2018 19:57:20 +0200 Subject: [PATCH 101/138] docker-wine: update package versions the previous version is no longer available. hopefully these versions are "lts" ref: 6899ca25278701137022d9ffa3ba229951d3eebd --- contrib/build-wine/docker/Dockerfile | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/contrib/build-wine/docker/Dockerfile b/contrib/build-wine/docker/Dockerfile index f46e9812..2a2deff7 100644 --- a/contrib/build-wine/docker/Dockerfile +++ b/contrib/build-wine/docker/Dockerfile @@ -8,7 +8,8 @@ RUN dpkg --add-architecture i386 && \ wget=1.19.4-1ubuntu2.1 \ gnupg2=2.2.4-1ubuntu1.1 \ dirmngr=2.2.4-1ubuntu1.1 \ - software-properties-common=0.96.24.32.4 \ + python3-software-properties=0.96.24.32.1 \ + software-properties-common=0.96.24.32.1 \ && \ wget -nc https://dl.winehq.org/wine-builds/Release.key && \ apt-key add Release.key && \ From 57cac47944860e5b77e7ffc58cf4f757481137a8 Mon Sep 17 00:00:00 2001 From: SomberNight Date: Sat, 8 Sep 2018 22:44:14 +0200 Subject: [PATCH 102/138] fix synchronizer: ask for missing txns on start Previously it could happen that a wallet was fully synced, except it had missing transactions, and it would not recover from this state. --- electrum/synchronizer.py | 29 ++++++++++++++++++----------- 1 file changed, 18 insertions(+), 11 deletions(-) diff --git a/electrum/synchronizer.py b/electrum/synchronizer.py index ff17a34c..a939f77e 100644 --- a/electrum/synchronizer.py +++ b/electrum/synchronizer.py @@ -22,19 +22,15 @@ # ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN # CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. -import traceback -import ssl import asyncio -from aiorpcx import ClientSession, Request, Notification, TaskGroup -from threading import Lock import hashlib -import concurrent.futures -# from .bitcoin import Hash, hash_encode +from aiorpcx import TaskGroup + from .transaction import Transaction -from .util import ThreadJob, bh2u, PrintError, aiosafe, bfh +from .util import bh2u, PrintError from .bitcoin import address_to_scripthash -from .version import ELECTRUM_VERSION, PROTOCOL_VERSION + def history_status(h): if not h: @@ -45,7 +41,6 @@ def history_status(h): return bh2u(hashlib.sha256(status.encode('ascii')).digest()) - class Synchronizer(PrintError): '''The synchronizer keeps the wallet up-to-date with its set of addresses and their transactions. It subscribes over the network @@ -65,7 +60,9 @@ class Synchronizer(PrintError): self.status_queue = asyncio.Queue() def is_up_to_date(self): - return (not self.requested_addrs and not self.requested_histories) + return (not self.requested_addrs + and not self.requested_histories + and not self.requested_tx) def add(self, addr): self.requested_addrs.add(addr) @@ -167,7 +164,17 @@ class Synchronizer(PrintError): return s async def main(self): - for addr in self.wallet.get_addresses(): self.add(addr) + # request missing txns, if any + async with TaskGroup() as group: + for history in self.wallet.history.values(): + # Old electrum servers returned ['*'] when all history for the address + # was pruned. This no longer happens but may remain in old wallets. + if history == ['*']: continue + await group.spawn(self.request_missing_txs, history) + # add addresses to bootstrap + for addr in self.wallet.get_addresses(): + self.add(addr) + # main loop while True: await asyncio.sleep(0.1) self.wallet.synchronize() From 2f224819ac5ea2e6a57aaf298ec304cecb69ad18 Mon Sep 17 00:00:00 2001 From: SomberNight Date: Sun, 9 Sep 2018 01:15:06 +0200 Subject: [PATCH 103/138] interface: small clean-up --- electrum/interface.py | 30 ++++++++++++++---------------- 1 file changed, 14 insertions(+), 16 deletions(-) diff --git a/electrum/interface.py b/electrum/interface.py index 903b1e2d..4c02191e 100644 --- a/electrum/interface.py +++ b/electrum/interface.py @@ -27,19 +27,14 @@ import re import socket import ssl import sys -import threading import traceback -import aiorpcx import asyncio import concurrent.futures + +import aiorpcx from aiorpcx import ClientSession, Notification, TaskGroup -import requests - from .util import PrintError, aiosafe, bfh, AIOSafeSilentException - -ca_path = requests.certs.where() - from . import util from . import x509 from . import pem @@ -52,6 +47,7 @@ class NotificationSession(ClientSession): def __init__(self, scripthash, header, *args, **kwargs): super(NotificationSession, self).__init__(*args, **kwargs) + # queues: self.scripthash = scripthash self.header = header @@ -59,8 +55,8 @@ class NotificationSession(ClientSession): async def handle_request(self, request): if isinstance(request, Notification): if request.method == 'blockchain.scripthash.subscribe' and self.scripthash is not None: - args = request.args - await self.scripthash.put((args[0], args[1])) + scripthash, status = request.args + await self.scripthash.put((scripthash, status)) elif request.method == 'blockchain.headers.subscribe' and self.header is not None: deser = deserialize_header(bfh(request.args[0]['hex']), request.args[0]['height']) await self.header.put(deser) @@ -211,7 +207,7 @@ class Interface(PrintError): break await asyncio.sleep(1) else: - assert False, "could not get certificate" + raise Exception("could not get certificate") async def get_certificate(self): sslc = ssl.SSLContext() @@ -339,8 +335,8 @@ class Interface(PrintError): header = await self.get_block_header(height, 'backward') chain = blockchain.check_header(header) if 'mock' not in header else header['mock']['check'](header) can_connect = blockchain.can_connect(header) if 'mock' not in header else header['mock']['connect'](height) - if checkp: - assert can_connect or chain, (can_connect, chain) + if checkp and not (can_connect or chain): + raise Exception("server chain conflicts with checkpoints. {} {}".format(can_connect, chain)) while not chain and not can_connect: bad = height bad_header = header @@ -355,8 +351,8 @@ class Interface(PrintError): header = await self.get_block_header(height, 'backward') chain = blockchain.check_header(header) if 'mock' not in header else header['mock']['check'](header) can_connect = blockchain.can_connect(header) if 'mock' not in header else header['mock']['connect'](height) - if checkp: - assert can_connect or chain, (can_connect, chain) + if checkp and not (can_connect or chain): + raise Exception("server chain conflicts with checkpoints. {} {}".format(can_connect, chain)) self.print_error("exiting backward mode at", height) if can_connect: self.print_error("could connect", height) @@ -414,12 +410,14 @@ class Interface(PrintError): # joining on regtest with a server that has a fork of height # one. the problem is observed only if forking is not during # electrum runtime - if ismocking and branch['check'](bad_header) or not ismocking and branch.check_header(bad_header): + if not ismocking and branch.check_header(bad_header) \ + or ismocking and branch['check'](bad_header): self.print_error('joining chain', bad) height += 1 return 'join', height else: - if ismocking and branch['parent']['check'](header) or not ismocking and branch.parent().check_header(header): + if not ismocking and branch.parent().check_header(header) \ + or ismocking and branch['parent']['check'](header): self.print_error('reorg', bad, self.tip) self.blockchain = branch.parent() if not ismocking else branch['parent'] height = bad From cdca74aa399402546af0ab86ed645da327fe0410 Mon Sep 17 00:00:00 2001 From: SomberNight Date: Sun, 9 Sep 2018 05:00:09 +0200 Subject: [PATCH 104/138] move max_checkpoint from network to constants --- electrum/blockchain.py | 3 ++- electrum/constants.py | 11 +++++++++-- electrum/interface.py | 13 +++++++------ electrum/network.py | 4 ---- electrum/tests/test_network.py | 18 +++++++++++++----- 5 files changed, 31 insertions(+), 18 deletions(-) diff --git a/electrum/blockchain.py b/electrum/blockchain.py index a7befad2..4936f0be 100644 --- a/electrum/blockchain.py +++ b/electrum/blockchain.py @@ -28,6 +28,7 @@ from .bitcoin import Hash, hash_encode, int_to_hex, rev_hex from . import constants from .util import bfh, bh2u + MAX_TARGET = 0x00000000FFFF0000000000000000000000000000000000000000000000000000 @@ -315,7 +316,7 @@ class Blockchain(util.PrintError): def get_hash(self, height): def is_height_checkpoint(): - within_cp_range = height < len(self.checkpoints) * 2016 + within_cp_range = height <= constants.net.max_checkpoint() at_chunk_boundary = (height+1) % 2016 == 0 return within_cp_range and at_chunk_boundary diff --git a/electrum/constants.py b/electrum/constants.py index 12cb4b1d..af3f7205 100644 --- a/electrum/constants.py +++ b/electrum/constants.py @@ -37,7 +37,14 @@ def read_json(filename, default): return r -class BitcoinMainnet: +class AbstractNet: + + @classmethod + def max_checkpoint(cls) -> int: + return max(0, len(cls.CHECKPOINTS) * 2016 - 1) + + +class BitcoinMainnet(AbstractNet): TESTNET = False WIF_PREFIX = 0x80 @@ -66,7 +73,7 @@ class BitcoinMainnet: BIP44_COIN_TYPE = 0 -class BitcoinTestnet: +class BitcoinTestnet(AbstractNet): TESTNET = True WIF_PREFIX = 0xef diff --git a/electrum/interface.py b/electrum/interface.py index 4c02191e..d612ca9d 100644 --- a/electrum/interface.py +++ b/electrum/interface.py @@ -41,6 +41,7 @@ from . import pem from .version import ELECTRUM_VERSION, PROTOCOL_VERSION from . import blockchain from .blockchain import deserialize_header +from . import constants class NotificationSession(ClientSession): @@ -267,7 +268,7 @@ class Interface(PrintError): asyncio.get_event_loop().create_task(self.group.cancel_remaining()) async def run_fetch_blocks(self, sub_reply, replies): - if self.tip < self.network.max_checkpoint(): + if self.tip < constants.net.max_checkpoint(): raise GracefulDisconnect('server tip below max checkpoint') async with self.network.bhi_lock: @@ -298,7 +299,7 @@ class Interface(PrintError): could_connect, num_headers = await self.request_chunk(height, next_height) self.tip = max(height + num_headers, self.tip) if not could_connect: - if height <= self.network.max_checkpoint(): + if height <= constants.net.max_checkpoint(): raise Exception('server chain conflicts with checkpoints or genesis') last, height = await self.step(height) self.tip = max(height, self.tip) @@ -328,8 +329,8 @@ class Interface(PrintError): bad_header = header height -= 1 checkp = False - if height <= self.network.max_checkpoint(): - height = self.network.max_checkpoint() + 1 + if height <= constants.net.max_checkpoint(): + height = constants.net.max_checkpoint() + 1 checkp = True header = await self.get_block_header(height, 'backward') @@ -343,8 +344,8 @@ class Interface(PrintError): delta = self.tip - height next_height = self.tip - 2 * delta checkp = False - if next_height <= self.network.max_checkpoint(): - next_height = self.network.max_checkpoint() + 1 + if next_height <= constants.net.max_checkpoint(): + next_height = constants.net.max_checkpoint() + 1 checkp = True height = next_height diff --git a/electrum/network.py b/electrum/network.py index d51b8ab1..52ae1065 100644 --- a/electrum/network.py +++ b/electrum/network.py @@ -818,10 +818,6 @@ class Network(PrintError): with open(path, 'w', encoding='utf-8') as f: f.write(json.dumps(cp, indent=4)) - @classmethod - def max_checkpoint(cls): - return max(0, len(constants.net.CHECKPOINTS) * 2016 - 1) - def start(self, fx=None): self.fut = threading.Thread(target=self._run, args=(fx,)) self.fut.start() diff --git a/electrum/tests/test_network.py b/electrum/tests/test_network.py index 07b5996c..b28dff77 100644 --- a/electrum/tests/test_network.py +++ b/electrum/tests/test_network.py @@ -2,7 +2,7 @@ import asyncio import tempfile import unittest -from electrum.constants import set_regtest +from electrum import constants from electrum.simple_config import SimpleConfig from electrum import blockchain from electrum.interface import Interface @@ -11,9 +11,6 @@ class MockInterface(Interface): def __init__(self, config): self.config = config super().__init__(None, 'mock-server:50000:t', self.config.electrum_path(), None) - class FakeNetwork: - max_checkpoint = lambda: 0 - self.network = FakeNetwork self.q = asyncio.Queue() self.blockchain = blockchain.Blockchain(self.config, 2002, None) self.tip = 12 @@ -26,6 +23,17 @@ class MockInterface(Interface): return item class TestNetwork(unittest.TestCase): + + @classmethod + def setUpClass(cls): + super().setUpClass() + constants.set_regtest() + + @classmethod + def tearDownClass(cls): + super().tearDownClass() + constants.set_mainnet() + def setUp(self): self.config = SimpleConfig({'electrum_path': tempfile.mkdtemp(prefix="test_network")}) self.interface = MockInterface(self.config) @@ -107,5 +115,5 @@ class TestNetwork(unittest.TestCase): self.assertEqual(times, 2) if __name__=="__main__": - set_regtest() + constants.set_regtest() unittest.main() From e3fb991b1be0ae96de74e5c15cbb91507b5abdc8 Mon Sep 17 00:00:00 2001 From: SomberNight Date: Sun, 9 Sep 2018 05:05:08 +0200 Subject: [PATCH 105/138] clean-up network start/stop a bit --- electrum/network.py | 28 ++++++++++------------------ 1 file changed, 10 insertions(+), 18 deletions(-) diff --git a/electrum/network.py b/electrum/network.py index 52ae1065..bdef5eec 100644 --- a/electrum/network.py +++ b/electrum/network.py @@ -723,18 +723,6 @@ class Network(PrintError): with b.lock: b.update_size() - def _run(self, fx): - self.init_headers_file() - jobs = [self.maintain_sessions()] - if fx: - jobs.append(fx) - jobs = [self.asyncio_loop.create_task(x) for x in jobs] - self.gat = asyncio.gather(*jobs) - try: - self.asyncio_loop.run_until_complete(self.gat) - except concurrent.futures.CancelledError: - pass - async def get_merkle_for_transaction(self, tx_hash, tx_height): return await self.interface.session.send_request('blockchain.transaction.get_merkle', [tx_hash, tx_height]) @@ -819,16 +807,20 @@ class Network(PrintError): f.write(json.dumps(cp, indent=4)) def start(self, fx=None): - self.fut = threading.Thread(target=self._run, args=(fx,)) - self.fut.start() + self.main_taskgroup = TaskGroup() + async def main(): + self.init_headers_file() + async with self.main_taskgroup as group: + await group.spawn(self.maintain_sessions()) + if fx: await group.spawn(fx) + self._wrapper_thread = threading.Thread(target=self.asyncio_loop.run_until_complete, args=(main(),)) + self._wrapper_thread.start() def stop(self): - async def stop(): - self.gat.cancel() - asyncio.run_coroutine_threadsafe(stop(), self.asyncio_loop) + asyncio.run_coroutine_threadsafe(self.main_taskgroup.cancel_remaining(), self.asyncio_loop) def join(self): - return self.fut.join(1) + self._wrapper_thread.join(1) async def maintain_sessions(self): while True: From 096b3e6026ed4610a70aa171c33880ff052b2220 Mon Sep 17 00:00:00 2001 From: SomberNight Date: Sun, 9 Sep 2018 05:32:07 +0200 Subject: [PATCH 106/138] network.maintain_sessions: rm redundant 'update' notifications --- electrum/network.py | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/electrum/network.py b/electrum/network.py index bdef5eec..5858ed21 100644 --- a/electrum/network.py +++ b/electrum/network.py @@ -840,16 +840,13 @@ class Network(PrintError): except BaseException as e: self.print_error(i.server, "errored because:", str(e), str(type(e))) remove.append(k) - changed = False for k in remove: self.connection_down(k) - changed = True # nodes now = time.time() for i in range(self.num_server - len(self.interfaces) - len(self.connecting)): - if self.start_random_interface(): - changed = True + self.start_random_interface() if now - self.nodes_retry_time > NODES_RETRY_INTERVAL: self.print_error('network: retrying connections') self.disconnected_servers = set([]) @@ -860,23 +857,18 @@ class Network(PrintError): if self.auto_connect: if not self.is_connecting(): self.switch_to_random_interface() - changed = True else: if self.default_server in self.disconnected_servers: if now - self.server_retry_time > SERVER_RETRY_INTERVAL: self.disconnected_servers.remove(self.default_server) self.server_retry_time = now - changed = True else: self.switch_to_interface(self.default_server) - changed = True else: if self.config.is_fee_estimates_update_required(): await self.interface.group.spawn(self.attempt_fee_estimate_update()) - if changed: - self.notify('updated') - await asyncio.sleep(1) + await asyncio.sleep(0.1) async def attempt_fee_estimate_update(self): await asyncio.wait_for(self.request_fee_estimates(self.interface), 5) From 48a5b8527ade20941d784893f757ec3167292e82 Mon Sep 17 00:00:00 2001 From: SomberNight Date: Sun, 9 Sep 2018 21:16:48 +0200 Subject: [PATCH 107/138] split up interface.run --- electrum/interface.py | 78 ++++++++++++++++++++++++++----------------- 1 file changed, 48 insertions(+), 30 deletions(-) diff --git a/electrum/interface.py b/electrum/interface.py index d612ca9d..597f33a3 100644 --- a/electrum/interface.py +++ b/electrum/interface.py @@ -122,6 +122,47 @@ class Interface(PrintError): return False return True + async def _try_saving_ssl_cert_for_first_time(self, ca_ssl_context): + try: + ca_signed = await self.is_server_ca_signed(ca_ssl_context) + except (ConnectionRefusedError, socket.gaierror, aiorpcx.socks.SOCKSFailure) as e: + self.print_error('disconnecting due to: {}'.format(e)) + self.exception = e + return False + if ca_signed: + with open(self.cert_path, 'w') as f: + # empty file means this is CA signed, not self-signed + f.write('') + else: + await self.save_certificate() + return True + + def _is_saved_ssl_cert_available(self): + if not os.path.exists(self.cert_path): + return False + with open(self.cert_path, 'r') as f: + contents = f.read() + if contents == '': # CA signed + return True + # pinned self-signed cert + try: + b = pem.dePem(contents, 'CERTIFICATE') + except SyntaxError: + self.print_error("error parsing already saved cert:", e) + return False + try: + x = x509.X509(b) + except Exception as e: + self.print_error("error parsing already saved cert:", e) + return False + try: + x.check_date() + return True + except x509.CertificateError as e: + self.print_error("certificate has expired:", e) + os.unlink(self.cert_path) + return False + @aiosafe async def run(self): if self.protocol != 's': @@ -129,42 +170,19 @@ class Interface(PrintError): assert False ca_sslc = ssl.create_default_context(ssl.Purpose.SERVER_AUTH) - exists = os.path.exists(self.cert_path) - if exists: - with open(self.cert_path, 'r') as f: - contents = f.read() - if contents != '': # if not CA signed - try: - b = pem.dePem(contents, 'CERTIFICATE') - except SyntaxError: - exists = False - else: - x = x509.X509(b) - try: - x.check_date() - except x509.CertificateError as e: - self.print_error("certificate problem", e) - os.unlink(self.cert_path) - exists = False - if not exists: - try: - ca_signed = await self.is_server_ca_signed(ca_sslc) - except (ConnectionRefusedError, socket.gaierror, aiorpcx.socks.SOCKSFailure) as e: - self.print_error('disconnecting due to: {}'.format(e)) - self.exception = e + if not self._is_saved_ssl_cert_available(): + done_saving_cert = await self._try_saving_ssl_cert_for_first_time(ca_sslc) + if not done_saving_cert: return - if ca_signed: - with open(self.cert_path, 'w') as f: - # empty file means this is CA signed, not self-signed - f.write('') - else: - await self.save_certificate() siz = os.stat(self.cert_path).st_size - if siz == 0: # if CA signed + if siz == 0: + # CA signed cert sslc = ca_sslc else: + # pinned self-signed cert sslc = ssl.create_default_context(ssl.Purpose.SERVER_AUTH, cafile=self.cert_path) sslc.check_hostname = 0 + # start main connection try: await self.open_session(sslc, exit_early=False) except (asyncio.CancelledError, ConnectionRefusedError, socket.gaierror, From b381a7fdbfbd73f1050ec9fe0af64476a566ed3d Mon Sep 17 00:00:00 2001 From: SomberNight Date: Sun, 9 Sep 2018 22:01:55 +0200 Subject: [PATCH 108/138] follow-up prev --- electrum/interface.py | 44 ++++++++++++++++++++++++++----------------- 1 file changed, 27 insertions(+), 17 deletions(-) diff --git a/electrum/interface.py b/electrum/interface.py index 597f33a3..5cdcd429 100644 --- a/electrum/interface.py +++ b/electrum/interface.py @@ -69,6 +69,12 @@ class NotificationSession(ClientSession): class GracefulDisconnect(AIOSafeSilentException): pass +class ErrorParsingSSLCert(Exception): pass + + +class ErrorGettingSSLCertFromServer(Exception): pass + + class CustomTaskGroup(TaskGroup): def spawn(self, *args, **kwargs): @@ -126,16 +132,13 @@ class Interface(PrintError): try: ca_signed = await self.is_server_ca_signed(ca_ssl_context) except (ConnectionRefusedError, socket.gaierror, aiorpcx.socks.SOCKSFailure) as e: - self.print_error('disconnecting due to: {}'.format(e)) - self.exception = e - return False + raise ErrorGettingSSLCertFromServer(e) from e if ca_signed: with open(self.cert_path, 'w') as f: # empty file means this is CA signed, not self-signed f.write('') else: await self.save_certificate() - return True def _is_saved_ssl_cert_available(self): if not os.path.exists(self.cert_path): @@ -147,33 +150,32 @@ class Interface(PrintError): # pinned self-signed cert try: b = pem.dePem(contents, 'CERTIFICATE') - except SyntaxError: + except SyntaxError as e: self.print_error("error parsing already saved cert:", e) - return False + raise ErrorParsingSSLCert(e) from e try: x = x509.X509(b) except Exception as e: self.print_error("error parsing already saved cert:", e) - return False + raise ErrorParsingSSLCert(e) from e try: x.check_date() return True except x509.CertificateError as e: self.print_error("certificate has expired:", e) - os.unlink(self.cert_path) + os.unlink(self.cert_path) # delete pinned cert only in this case return False - @aiosafe - async def run(self): + async def _get_ssl_context(self): if self.protocol != 's': - await self.open_session(None, exit_early=False) - assert False + # using plaintext TCP + return None + # see if we already have cert for this server; or get it for the first time ca_sslc = ssl.create_default_context(ssl.Purpose.SERVER_AUTH) if not self._is_saved_ssl_cert_available(): - done_saving_cert = await self._try_saving_ssl_cert_for_first_time(ca_sslc) - if not done_saving_cert: - return + await self._try_saving_ssl_cert_for_first_time(ca_sslc) + # now we have a file saved in our certificate store siz = os.stat(self.cert_path).st_size if siz == 0: # CA signed cert @@ -182,9 +184,17 @@ class Interface(PrintError): # pinned self-signed cert sslc = ssl.create_default_context(ssl.Purpose.SERVER_AUTH, cafile=self.cert_path) sslc.check_hostname = 0 - # start main connection + return sslc + + @aiosafe + async def run(self): try: - await self.open_session(sslc, exit_early=False) + ssl_context = await self._get_ssl_context() + except (ErrorParsingSSLCert, ErrorGettingSSLCertFromServer) as e: + self.exception = e + return + try: + await self.open_session(ssl_context, exit_early=False) except (asyncio.CancelledError, ConnectionRefusedError, socket.gaierror, ssl.SSLError, TimeoutError, aiorpcx.socks.SOCKSFailure) as e: self.print_error('disconnecting due to: {}'.format(e)) From ecf4ea9ba7984dcd0f75c4317ded359f909cff73 Mon Sep 17 00:00:00 2001 From: SomberNight Date: Sun, 9 Sep 2018 23:08:44 +0200 Subject: [PATCH 109/138] move (de)serialize_server to interface; and use it --- electrum/gui/qt/network_dialog.py | 4 ++-- electrum/interface.py | 19 +++++++++++++++++-- electrum/network.py | 19 ++++--------------- 3 files changed, 23 insertions(+), 19 deletions(-) diff --git a/electrum/gui/qt/network_dialog.py b/electrum/gui/qt/network_dialog.py index 268e01b7..7949eab5 100644 --- a/electrum/gui/qt/network_dialog.py +++ b/electrum/gui/qt/network_dialog.py @@ -33,7 +33,7 @@ import PyQt5.QtCore as QtCore from electrum.i18n import _ from electrum import constants, blockchain from electrum.util import print_error -from electrum.network import serialize_server, deserialize_server +from electrum.interface import serialize_server, deserialize_server from .util import * @@ -337,7 +337,7 @@ class NetworkChoiceLayout(object): def update(self): host, port, protocol, proxy_config, auto_connect = self.network.get_parameters() self.server_host.setText(host) - self.server_port.setText(port) + self.server_port.setText(str(port)) self.autoconnect_cb.setChecked(auto_connect) interface = self.network.interface diff --git a/electrum/interface.py b/electrum/interface.py index 5cdcd429..2b63c197 100644 --- a/electrum/interface.py +++ b/electrum/interface.py @@ -30,6 +30,7 @@ import sys import traceback import asyncio import concurrent.futures +from typing import Tuple, Union import aiorpcx from aiorpcx import ClientSession, Notification, TaskGroup @@ -83,14 +84,28 @@ class CustomTaskGroup(TaskGroup): return super().spawn(*args, **kwargs) +def deserialize_server(server_str: str) -> Tuple[str, int, str]: + # host might be IPv6 address, hence do rsplit: + host, port, protocol = str(server_str).rsplit(':', 2) + if protocol not in ('s', 't'): + raise ValueError('invalid network protocol: {}'.format(protocol)) + port = int(port) # Throw if cannot be converted to int + if not (0 < port < 2**16): + raise ValueError('port {} is out of valid range'.format(port)) + return host, port, protocol + + +def serialize_server(host: str, port: Union[str, int], protocol: str) -> str: + return str(':'.join([host, str(port), protocol])) + + class Interface(PrintError): def __init__(self, network, server, config_path, proxy): self.exception = None self.ready = asyncio.Future() self.server = server - self.host, self.port, self.protocol = self.server.split(':') - self.port = int(self.port) + self.host, self.port, self.protocol = deserialize_server(self.server) self.config_path = config_path self.cert_path = os.path.join(self.config_path, 'certs', self.host) self.tip_header = None diff --git a/electrum/network.py b/electrum/network.py index 5858ed21..ebe40f05 100644 --- a/electrum/network.py +++ b/electrum/network.py @@ -20,7 +20,6 @@ # ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN # CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. -import concurrent.futures import time import queue import os @@ -33,7 +32,6 @@ import json import sys import ipaddress import asyncio -import concurrent.futures import dns import dns.resolver @@ -44,7 +42,7 @@ from .util import PrintError, print_error, aiosafe, bfh from .bitcoin import COIN from . import constants from . import blockchain -from .interface import Interface +from .interface import Interface, serialize_server, deserialize_server from .version import PROTOCOL_VERSION NODES_RETRY_INTERVAL = 60 @@ -126,6 +124,7 @@ def deserialize_proxy(s): if s.lower() == 'none': return None proxy = { "mode":"socks5", "host":"localhost" } + # FIXME raw IPv6 address fails here args = s.split(':') n = 0 if proxy_modes.count(args[n]) == 1: @@ -147,19 +146,9 @@ def deserialize_proxy(s): return proxy -def deserialize_server(server_str): - host, port, protocol = str(server_str).rsplit(':', 2) - if protocol not in 'st': - raise ValueError('invalid network protocol: {}'.format(protocol)) - int(port) # Throw if cannot be converted to int - return host, port, protocol - - -def serialize_server(host, port, protocol): - return str(':'.join([host, port, protocol])) - INSTANCE = None + class Network(PrintError): """The Network class manages a set of connections to remote electrum servers, each connected socket is handled by an Interface() object. @@ -794,7 +783,7 @@ class Network(PrintError): if self.interface: server = self.interface.server host, port, protocol, proxy, auto_connect = self.get_parameters() - host, port, protocol = server.split(':') + host, port, protocol = deserialize_server(server) self.set_parameters(host, port, protocol, proxy, auto_connect) def get_local_height(self): From 3d424077fd310b0644e7a466a813f4f411bd66ac Mon Sep 17 00:00:00 2001 From: SomberNight Date: Mon, 10 Sep 2018 00:59:53 +0200 Subject: [PATCH 110/138] introduce NetworkParameters namedtuple --- electrum/gui/kivy/main_window.py | 15 +++---- electrum/gui/kivy/uix/dialogs/settings.py | 11 +++-- electrum/gui/kivy/uix/ui_screens/proxy.kv | 5 ++- electrum/gui/kivy/uix/ui_screens/server.kv | 8 ++-- electrum/gui/qt/main_window.py | 2 +- electrum/gui/qt/network_dialog.py | 26 +++++++----- electrum/gui/text.py | 14 ++++--- electrum/interface.py | 7 ++-- electrum/network.py | 48 +++++++++++++--------- 9 files changed, 80 insertions(+), 56 deletions(-) diff --git a/electrum/gui/kivy/main_window.py b/electrum/gui/kivy/main_window.py index 0fd45be8..4ba41465 100644 --- a/electrum/gui/kivy/main_window.py +++ b/electrum/gui/kivy/main_window.py @@ -94,8 +94,9 @@ class ElectrumWindow(App): auto_connect = BooleanProperty(False) def on_auto_connect(self, instance, x): - host, port, protocol, proxy, auto_connect = self.network.get_parameters() - self.network.set_parameters(host, port, protocol, proxy, self.auto_connect) + net_params = self.network.get_parameters() + net_params = net_params._replace(auto_connect=self.auto_connect) + self.network.set_parameters(net_params) def toggle_auto_connect(self, x): self.auto_connect = not self.auto_connect @@ -267,11 +268,11 @@ class ElectrumWindow(App): if self.network: self.num_blocks = self.network.get_local_height() self.num_nodes = len(self.network.get_interfaces()) - host, port, protocol, proxy_config, auto_connect = self.network.get_parameters() - self.server_host = host - self.server_port = port - self.auto_connect = auto_connect - self.proxy_config = proxy_config if proxy_config else {} + net_params = self.network.get_parameters() + self.server_host = net_params.host + self.server_port = net_params.port + self.auto_connect = net_params.auto_connect + self.proxy_config = net_params.proxy_config if net_params.proxy_config else {} self.plugins = kwargs.get('plugins', []) self.gui_object = kwargs.get('gui_object', None) diff --git a/electrum/gui/kivy/uix/dialogs/settings.py b/electrum/gui/kivy/uix/dialogs/settings.py index 4e63c4a5..5247c0ff 100644 --- a/electrum/gui/kivy/uix/dialogs/settings.py +++ b/electrum/gui/kivy/uix/dialogs/settings.py @@ -8,6 +8,7 @@ from electrum.i18n import languages from electrum.gui.kivy.i18n import _ from electrum.plugin import run_hook from electrum import coinchooser +from electrum.network import NetworkProxy from .choice_dialog import ChoiceDialog @@ -154,13 +155,16 @@ class SettingsDialog(Factory.Popup): self._coinselect_dialog.open() def proxy_status(self): - server, port, protocol, proxy, auto_connect = self.app.network.get_parameters() + net_params = self.app.network.get_parameters() + proxy = net_params.proxy return proxy.get('host') +':' + proxy.get('port') if proxy else _('None') def proxy_dialog(self, item, dt): if self._proxy_dialog is None: - server, port, protocol, proxy, auto_connect = self.app.network.get_parameters() + net_params = self.app.network.get_parameters() + proxy = net_params.proxy def callback(popup): + nonlocal net_params if popup.ids.mode.text != 'None': proxy = { 'mode':popup.ids.mode.text, @@ -171,7 +175,8 @@ class SettingsDialog(Factory.Popup): } else: proxy = None - self.app.network.set_parameters(server, port, protocol, proxy, auto_connect) + net_params = net_params._replace(proxy=proxy) + self.app.network.set_parameters(net_params) item.status = self.proxy_status() popup = Builder.load_file('electrum/gui/kivy/uix/ui_screens/proxy.kv') popup.ids.mode.text = proxy.get('mode') if proxy else 'None' diff --git a/electrum/gui/kivy/uix/ui_screens/proxy.kv b/electrum/gui/kivy/uix/ui_screens/proxy.kv index b7231855..087254ad 100644 --- a/electrum/gui/kivy/uix/ui_screens/proxy.kv +++ b/electrum/gui/kivy/uix/ui_screens/proxy.kv @@ -63,7 +63,7 @@ Popup: height: '48dp' text: _('OK') on_release: - host, port, protocol, proxy, auto_connect = app.network.get_parameters() + net_params = app.network.get_parameters() proxy = {} proxy['mode']=str(root.ids.mode.text).lower() proxy['host']=str(root.ids.host.text) @@ -71,6 +71,7 @@ Popup: proxy['user']=str(root.ids.user.text) proxy['password']=str(root.ids.password.text) if proxy['mode']=='none': proxy = None - app.network.set_parameters(host, port, protocol, proxy, auto_connect) + net_params = net_params._replace(proxy=proxy) + app.network.set_parameters(net_params) app.proxy_config = proxy if proxy else {} nd.dismiss() diff --git a/electrum/gui/kivy/uix/ui_screens/server.kv b/electrum/gui/kivy/uix/ui_screens/server.kv index 293d4645..686ee3be 100644 --- a/electrum/gui/kivy/uix/ui_screens/server.kv +++ b/electrum/gui/kivy/uix/ui_screens/server.kv @@ -56,8 +56,8 @@ Popup: height: '48dp' text: _('OK') on_release: - host, port, protocol, proxy, auto_connect = app.network.get_parameters() - host = str(root.ids.host.text) - port = str(root.ids.port.text) - app.network.set_parameters(host, port, protocol, proxy, auto_connect) + net_params = app.network.get_parameters() + net_params = net_params._replace(host=str(root.ids.host.text), + port=str(root.ids.port.text)) + app.network.set_parameters(net_params) nd.dismiss() diff --git a/electrum/gui/qt/main_window.py b/electrum/gui/qt/main_window.py index b62dd3e9..539b7229 100644 --- a/electrum/gui/qt/main_window.py +++ b/electrum/gui/qt/main_window.py @@ -562,7 +562,7 @@ class ElectrumWindow(QMainWindow, MessageBoxMixin, PrintError): def donate_to_server(self): d = self.network.get_donation_address() if d: - host = self.network.get_parameters()[0] + host = self.network.get_parameters().host self.pay_to_URI('bitcoin:%s?message=donation for %s'%(d, host)) else: self.show_error(_('No donation address for this server')) diff --git a/electrum/gui/qt/network_dialog.py b/electrum/gui/qt/network_dialog.py index 7949eab5..b9b185e8 100644 --- a/electrum/gui/qt/network_dialog.py +++ b/electrum/gui/qt/network_dialog.py @@ -335,7 +335,9 @@ class NetworkChoiceLayout(object): w.setEnabled(False) def update(self): - host, port, protocol, proxy_config, auto_connect = self.network.get_parameters() + net_params = self.network.get_parameters() + host, port, protocol = net_params.host, net_params.port, net_params.protocol + proxy_config, auto_connect = net_params.proxy, net_params.auto_connect self.server_host.setText(host) self.server_port.setText(str(port)) self.autoconnect_cb.setChecked(auto_connect) @@ -368,7 +370,7 @@ class NetworkChoiceLayout(object): self.nodes_list_widget.update(self.network) def fill_in_proxy_settings(self): - host, port, protocol, proxy_config, auto_connect = self.network.get_parameters() + proxy_config = self.network.get_parameters().proxy if not proxy_config: proxy_config = {"mode": "none", "host": "localhost", "port": "9050"} @@ -409,9 +411,10 @@ class NetworkChoiceLayout(object): def follow_server(self, server): self.network.switch_to_interface(server) - host, port, protocol, proxy, auto_connect = self.network.get_parameters() + net_params = self.network.get_parameters() host, port, protocol = deserialize_server(server) - self.network.set_parameters(host, port, protocol, proxy, auto_connect) + net_params = net_params._replace(host=host, port=port, protocol=protocol) + self.network.set_parameters(net_params) self.update() def server_changed(self, x): @@ -440,14 +443,14 @@ class NetworkChoiceLayout(object): pass def set_server(self): - host, port, protocol, proxy, auto_connect = self.network.get_parameters() - host = str(self.server_host.text()) - port = str(self.server_port.text()) - auto_connect = self.autoconnect_cb.isChecked() - self.network.set_parameters(host, port, protocol, proxy, auto_connect) + net_params = self.network.get_parameters() + net_params = net_params._replace(host=str(self.server_host.text()), + port=str(self.server_port.text()), + auto_connect=self.autoconnect_cb.isChecked()) + self.network.set_parameters(net_params) def set_proxy(self): - host, port, protocol, proxy, auto_connect = self.network.get_parameters() + net_params = self.network.get_parameters() if self.proxy_cb.isChecked(): proxy = { 'mode':str(self.proxy_mode.currentText()).lower(), 'host':str(self.proxy_host.text()), @@ -457,7 +460,8 @@ class NetworkChoiceLayout(object): else: proxy = None self.tor_cb.setChecked(False) - self.network.set_parameters(host, port, protocol, proxy, auto_connect) + net_params = net_params._replace(proxy=proxy) + self.network.set_parameters(net_params) def suggest_proxy(self, found_proxy): self.tor_proxy = found_proxy diff --git a/electrum/gui/text.py b/electrum/gui/text.py index 61e3ac1d..c27eb2df 100644 --- a/electrum/gui/text.py +++ b/electrum/gui/text.py @@ -7,7 +7,10 @@ import electrum from electrum.util import format_satoshis, set_verbosity from electrum.bitcoin import is_address, COIN, TYPE_ADDRESS from electrum.transaction import TxOutput -from .. import Wallet, WalletStorage +from electrum.wallet import Wallet +from electrum.storage import WalletStorage +from electrum.network import NetworkParameters +from electrum.interface import deserialize_server _ = lambda x:x @@ -376,8 +379,9 @@ class ElectrumGui: def network_dialog(self): if not self.network: return - params = self.network.get_parameters() - host, port, protocol, proxy_config, auto_connect = params + net_params = self.network.get_parameters() + host, port, protocol = net_params.host, net_params.port, net_params.protocol + proxy_config, auto_connect = net_params.proxy, net_params.auto_connect srv = 'auto-connect' if auto_connect else self.network.default_server out = self.run_dialog('Network', [ {'label':'server', 'type':'str', 'value':srv}, @@ -389,13 +393,13 @@ class ElectrumGui: auto_connect = server == 'auto-connect' if not auto_connect: try: - host, port, protocol = server.split(':') + host, port, protocol = deserialize_server(server) except Exception: self.show_message("Error:" + server + "\nIn doubt, type \"auto-connect\"") return False if out.get('server') or out.get('proxy'): proxy = electrum.network.deserialize_proxy(out.get('proxy')) if out.get('proxy') else proxy_config - self.network.set_parameters(host, port, protocol, proxy, auto_connect) + self.network.set_parameters(NetworkParameters(host, port, protocol, proxy, auto_connect)) def settings_dialog(self): fee = str(Decimal(self.config.fee_per_kb()) / COIN) diff --git a/electrum/interface.py b/electrum/interface.py index 2b63c197..718fe6a1 100644 --- a/electrum/interface.py +++ b/electrum/interface.py @@ -84,13 +84,13 @@ class CustomTaskGroup(TaskGroup): return super().spawn(*args, **kwargs) -def deserialize_server(server_str: str) -> Tuple[str, int, str]: +def deserialize_server(server_str: str) -> Tuple[str, str, str]: # host might be IPv6 address, hence do rsplit: host, port, protocol = str(server_str).rsplit(':', 2) if protocol not in ('s', 't'): raise ValueError('invalid network protocol: {}'.format(protocol)) - port = int(port) # Throw if cannot be converted to int - if not (0 < port < 2**16): + int(port) # Throw if cannot be converted to int + if not (0 < int(port) < 2**16): raise ValueError('port {} is out of valid range'.format(port)) return host, port, protocol @@ -106,6 +106,7 @@ class Interface(PrintError): self.ready = asyncio.Future() self.server = server self.host, self.port, self.protocol = deserialize_server(self.server) + self.port = int(self.port) self.config_path = config_path self.cert_path = os.path.join(self.config_path, 'certs', self.host) self.tip_header = None diff --git a/electrum/network.py b/electrum/network.py index ebe40f05..440d41ca 100644 --- a/electrum/network.py +++ b/electrum/network.py @@ -32,6 +32,7 @@ import json import sys import ipaddress import asyncio +from typing import NamedTuple, Optional import dns import dns.resolver @@ -44,6 +45,7 @@ from . import constants from . import blockchain from .interface import Interface, serialize_server, deserialize_server from .version import PROTOCOL_VERSION +from .simple_config import SimpleConfig NODES_RETRY_INTERVAL = 60 SERVER_RETRY_INTERVAL = 10 @@ -106,7 +108,12 @@ def pick_random_server(hostmap = None, protocol = 's', exclude_set = set()): return random.choice(eligible) if eligible else None -from .simple_config import SimpleConfig +NetworkParameters = NamedTuple("NetworkParameters", [("host", str), + ("port", str), + ("protocol", str), + ("proxy", Optional[dict]), + ("auto_connect", bool)]) + proxy_modes = ['socks4', 'socks5'] @@ -118,7 +125,7 @@ def serialize_proxy(p): p.get('user', ''), p.get('password', '')]) -def deserialize_proxy(s): +def deserialize_proxy(s: str) -> Optional[dict]: if not isinstance(s, str): return None if s.lower() == 'none': @@ -369,9 +376,9 @@ class Network(PrintError): else: self.trigger_callback(key, self.get_status_value(key)) - def get_parameters(self): + def get_parameters(self) -> NetworkParameters: host, port, protocol = deserialize_server(self.default_server) - return host, port, protocol, self.proxy, self.auto_connect + return NetworkParameters(host, port, protocol, self.proxy, self.auto_connect) def get_donation_address(self): if self.is_connected(): @@ -416,14 +423,13 @@ class Network(PrintError): self.start_interface(server) return server - def set_proxy(self, proxy): + def set_proxy(self, proxy: Optional[dict]): self.proxy = proxy # Store these somewhere so we can un-monkey-patch if not hasattr(socket, "_socketobject"): socket._getaddrinfo = socket.getaddrinfo if proxy: self.print_error('setting proxy', proxy) - proxy_mode = proxy_modes.index(proxy["mode"]) + 1 # prevent dns leaks, see http://stackoverflow.com/questions/13184205/dns-over-proxy socket.getaddrinfo = lambda *args: [(socket.AF_INET, socket.SOCK_STREAM, 6, '', (args[0], args[1]))] else: @@ -465,7 +471,7 @@ class Network(PrintError): return socket._getaddrinfo(addr, *args, **kwargs) @with_interface_lock - def start_network(self, protocol, proxy): + def start_network(self, protocol: str, proxy: Optional[dict]): assert not self.interface and not self.interfaces assert not self.connecting and self.socket_queue.empty() self.print_error('starting network') @@ -487,9 +493,11 @@ class Network(PrintError): # Get a new queue - no old pending connections thanks! self.socket_queue = queue.Queue() - def set_parameters(self, host, port, protocol, proxy, auto_connect): + def set_parameters(self, net_params: NetworkParameters): + proxy = net_params.proxy proxy_str = serialize_proxy(proxy) - server = serialize_server(host, port, protocol) + host, port, protocol = net_params.host, net_params.port, net_params.protocol + server_str = serialize_server(host, port, protocol) # sanitize parameters try: deserialize_server(serialize_server(host, port, protocol)) @@ -498,21 +506,21 @@ class Network(PrintError): int(proxy['port']) except: return - self.config.set_key('auto_connect', auto_connect, False) + self.config.set_key('auto_connect', net_params.auto_connect, False) self.config.set_key("proxy", proxy_str, False) - self.config.set_key("server", server, True) + self.config.set_key("server", server_str, True) # abort if changes were not allowed by config - if self.config.get('server') != server or self.config.get('proxy') != proxy_str: + if self.config.get('server') != server_str or self.config.get('proxy') != proxy_str: return - self.auto_connect = auto_connect + self.auto_connect = net_params.auto_connect if self.proxy != proxy or self.protocol != protocol: # Restart the network defaulting to the given server with self.interface_lock: self.stop_network() - self.default_server = server + self.default_server = server_str self.start_network(protocol, proxy) - elif self.default_server != server: - self.switch_to_interface(server) + elif self.default_server != server_str: + self.switch_to_interface(server_str) else: self.switch_lagging_interface() self.notify('updated') @@ -781,10 +789,10 @@ class Network(PrintError): with self.interface_lock: if self.interface: - server = self.interface.server - host, port, protocol, proxy, auto_connect = self.get_parameters() - host, port, protocol = deserialize_server(server) - self.set_parameters(host, port, protocol, proxy, auto_connect) + net_params = self.get_parameters() + host, port, protocol = deserialize_server(self.interface.server) + net_params = net_params._replace(host=host, port=port, protocol=protocol) + self.set_parameters(net_params) def get_local_height(self): return self.blockchain().height() From 97ea4679a7c920eaa0c95ad1f9d94bcd23451f12 Mon Sep 17 00:00:00 2001 From: SomberNight Date: Mon, 10 Sep 2018 01:08:28 +0200 Subject: [PATCH 111/138] network: fix monkey-patching in set_proxy --- electrum/network.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/electrum/network.py b/electrum/network.py index 440d41ca..24ba1182 100644 --- a/electrum/network.py +++ b/electrum/network.py @@ -426,7 +426,7 @@ class Network(PrintError): def set_proxy(self, proxy: Optional[dict]): self.proxy = proxy # Store these somewhere so we can un-monkey-patch - if not hasattr(socket, "_socketobject"): + if not hasattr(socket, "_getaddrinfo"): socket._getaddrinfo = socket.getaddrinfo if proxy: self.print_error('setting proxy', proxy) From b2547601a50cb9cac4b4d5ef75a961adfc330c57 Mon Sep 17 00:00:00 2001 From: SomberNight Date: Mon, 10 Sep 2018 01:08:51 +0200 Subject: [PATCH 112/138] rm dead code --- electrum/network.py | 53 --------------------------------------------- 1 file changed, 53 deletions(-) diff --git a/electrum/network.py b/electrum/network.py index 24ba1182..a0840273 100644 --- a/electrum/network.py +++ b/electrum/network.py @@ -599,59 +599,6 @@ class Network(PrintError): self.recent_servers = self.recent_servers[0:20] self.save_recent_servers() - def process_response(self, interface, response, callbacks): - if self.debug: - self.print_error(interface.host, "<--", response) - error = response.get('error') - result = response.get('result') - method = response.get('method') - params = response.get('params') - - # We handle some responses; return the rest to the client. - if method == 'server.version': - interface.server_version = result - elif method == 'blockchain.headers.subscribe': - if error is None: - self.on_notify_header(interface, result) - else: - # no point in keeping this connection without headers sub - self.connection_down(interface.server) - return - elif method == 'server.peers.subscribe': - if error is None: - self.irc_servers = parse_servers(result) - self.notify('servers') - elif method == 'server.banner': - if error is None: - self.banner = result - self.notify('banner') - elif method == 'server.donation_address': - if error is None: - self.donation_address = result - elif method == 'mempool.get_fee_histogram': - if error is None: - self.print_error('fee_histogram', result) - self.config.mempool_fees = result - self.notify('fee_histogram') - elif method == 'blockchain.estimatefee': - if error is None and result > 0: - i = params[0] - fee = int(result*COIN) - self.config.update_fee_estimates(i, fee) - self.print_error("fee_estimates[%d]" % i, fee) - self.notify('fee') - elif method == 'blockchain.relayfee': - if error is None: - self.relay_fee = int(result * COIN) if result is not None else None - self.print_error("relayfee", self.relay_fee) - elif method == 'blockchain.block.headers': - self.on_block_headers(interface, response) - elif method == 'blockchain.block.get_header': - self.on_get_header(interface, response) - - for callback in callbacks: - callback(response) - @classmethod def get_index(cls, method, params): """ hashable index for subscriptions and cache""" From 6b2509b1064de5d73c3e3cb4ed9ee8b52df3137d Mon Sep 17 00:00:00 2001 From: SomberNight Date: Mon, 10 Sep 2018 01:09:35 +0200 Subject: [PATCH 113/138] interface.run: catch OSError instead of subtypes --- electrum/interface.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/electrum/interface.py b/electrum/interface.py index 718fe6a1..6368cf23 100644 --- a/electrum/interface.py +++ b/electrum/interface.py @@ -147,7 +147,7 @@ class Interface(PrintError): async def _try_saving_ssl_cert_for_first_time(self, ca_ssl_context): try: ca_signed = await self.is_server_ca_signed(ca_ssl_context) - except (ConnectionRefusedError, socket.gaierror, aiorpcx.socks.SOCKSFailure) as e: + except (OSError, aiorpcx.socks.SOCKSFailure) as e: raise ErrorGettingSSLCertFromServer(e) from e if ca_signed: with open(self.cert_path, 'w') as f: @@ -211,8 +211,7 @@ class Interface(PrintError): return try: await self.open_session(ssl_context, exit_early=False) - except (asyncio.CancelledError, ConnectionRefusedError, socket.gaierror, - ssl.SSLError, TimeoutError, aiorpcx.socks.SOCKSFailure) as e: + except (asyncio.CancelledError, OSError, aiorpcx.socks.SOCKSFailure) as e: self.print_error('disconnecting due to: {}'.format(e)) self.exception = e return From 999ae1f7134016814a4337542cd32941ff42132c Mon Sep 17 00:00:00 2001 From: SomberNight Date: Mon, 10 Sep 2018 02:03:42 +0200 Subject: [PATCH 114/138] test_mnemonic: add foreign lang tests --- electrum/tests/test_mnemonic.py | 60 +++++++++++++++++++++++--- electrum/tests/test_wallet_vertical.py | 2 +- 2 files changed, 56 insertions(+), 6 deletions(-) diff --git a/electrum/tests/test_mnemonic.py b/electrum/tests/test_mnemonic.py index 24d07c43..1f5f18f1 100644 --- a/electrum/tests/test_mnemonic.py +++ b/electrum/tests/test_mnemonic.py @@ -1,18 +1,68 @@ from electrum import keystore from electrum import mnemonic from electrum import old_mnemonic -from electrum.util import bh2u +from electrum.util import bh2u, bfh +from electrum.bitcoin import is_new_seed +from electrum.version import SEED_PREFIX_SW from . import SequentialTestCase +from .test_wallet_vertical import UNICODE_HORROR + + +SEED_WORDS_JAPANESE = 'なのか ć²ć‚ć„ しなん まなぶ 恤恵悙恙 恕恋悙恙 恊恗悃悌 恋悏恏 恊恄恋恑悋 恑恕恍 かいとう 恕恟悓' +assert bh2u(SEED_WORDS_JAPANESE.encode('utf8')) == 'e381aae381aee3818b20e381b2e3828de3818420e38197e381aae3829320e381bee381aae381b5e3829920e381a4e381b5e38299e3819920e38195e3818be38299e3819920e3818ae38197e38283e3828c20e3818be3828fe3818f20e3818ae38184e3818be38191e3828b20e38191e38195e3818d20e3818be38184e381a8e3818620e38195e3819fe38293' + +SEED_WORDS_CHINESE = '眼 悲 叛 改 节 跃 č”” 响 ē–† č‚” 遂 冬' +assert bh2u(SEED_WORDS_CHINESE.encode('utf8')) == 'e79cbc20e682b220e58f9b20e694b920e88a8220e8b78320e8a1a120e5938d20e7968620e882a120e9818220e586ac' + +PASSPHRASE_CHINESE = 'ē»™ęˆ‘äø€äŗ›ęµ‹čÆ•å‘é‡č°·ę­Œ' +assert bh2u(PASSPHRASE_CHINESE.encode('utf8')) == 'e7bb99e68891e4b880e4ba9be6b58be8af95e59091e9878fe8b0b7e6ad8c' class Test_NewMnemonic(SequentialTestCase): - def test_to_seed(self): + def test_mnemonic_to_seed_basic(self): seed = mnemonic.Mnemonic.mnemonic_to_seed(mnemonic='foobar', passphrase='none') - self.assertEqual(bh2u(seed), - '741b72fd15effece6bfe5a26a52184f66811bd2be363190e07a42cca442b1a5b' - 'b22b3ad0eb338197287e6d314866c7fba863ac65d3f156087a5052ebc7157fce') + self.assertEqual('741b72fd15effece6bfe5a26a52184f66811bd2be363190e07a42cca442b1a5bb22b3ad0eb338197287e6d314866c7fba863ac65d3f156087a5052ebc7157fce', + bh2u(seed)) + + def test_mnemonic_to_seed_japanese(self): + words = SEED_WORDS_JAPANESE + self.assertTrue(is_new_seed(words)) + + m = mnemonic.Mnemonic(lang='ja') + self.assertEqual(1938439226660562861250521787963972783469, m.mnemonic_decode(words)) + + seed = mnemonic.Mnemonic.mnemonic_to_seed(mnemonic=words, passphrase='') + self.assertEqual('d3eaf0e44ddae3a5769cb08a26918e8b308258bcb057bb704c6f69713245c0b35cb92c03df9c9ece5eff826091b4e74041e010b701d44d610976ce8bfb66a8ad', + bh2u(seed)) + + def test_mnemonic_to_seed_japanese_with_unicode_horror(self): + words = SEED_WORDS_JAPANESE + self.assertTrue(is_new_seed(words)) + + seed = mnemonic.Mnemonic.mnemonic_to_seed(mnemonic=words, passphrase=UNICODE_HORROR) + self.assertEqual('251ee6b45b38ba0849e8f40794540f7e2c6d9d604c31d68d3ac50c034f8b64e4bc037c5e1e985a2fed8aad23560e690b03b120daf2e84dceb1d7857dda042457', + bh2u(seed)) + + def test_mnemonic_to_seed_chinese(self): + words = SEED_WORDS_CHINESE + self.assertTrue(is_new_seed(words, prefix=SEED_PREFIX_SW)) + + m = mnemonic.Mnemonic(lang='zh') + self.assertEqual(3083737086352778425940060465574397809099, m.mnemonic_decode(words)) + + seed = mnemonic.Mnemonic.mnemonic_to_seed(mnemonic=words, passphrase='') + self.assertEqual('0b9077db7b5a50dbb6f61821e2d35e255068a5847e221138048a20e12d80b673ce306b6fe7ac174ebc6751e11b7037be6ee9f17db8040bb44f8466d519ce2abf', + bh2u(seed)) + + def test_mnemonic_to_seed_chinese_with_passphrase(self): + words = SEED_WORDS_CHINESE + passphrase = PASSPHRASE_CHINESE + self.assertTrue(is_new_seed(words, prefix=SEED_PREFIX_SW)) + seed = mnemonic.Mnemonic.mnemonic_to_seed(mnemonic=words, passphrase=passphrase) + self.assertEqual('6c03dd0615cf59963620c0af6840b52e867468cc64f20a1f4c8155705738e87b8edb0fc8a6cee4085776cb3a629ff88bb1a38f37085efdbf11ce9ec5a7fa5f71', + bh2u(seed)) def test_random_seeds(self): iters = 10 diff --git a/electrum/tests/test_wallet_vertical.py b/electrum/tests/test_wallet_vertical.py index 52fab530..5162a78f 100644 --- a/electrum/tests/test_wallet_vertical.py +++ b/electrum/tests/test_wallet_vertical.py @@ -20,7 +20,7 @@ from .test_bitcoin import needs_test_with_all_ecc_implementations _UNICODE_HORROR_HEX = 'e282bf20f09f988020f09f98882020202020e3818620e38191e3819fe381be20e3828fe3828b2077cda2cda2cd9d68cda16fcda2cda120ccb8cda26bccb5cd9f6eccb4cd98c7ab77ccb8cc9b73cd9820cc80cc8177cd98cda2e1b8a9ccb561d289cca1cda27420cca7cc9568cc816fccb572cd8fccb5726f7273cca120ccb6cda1cda06cc4afccb665cd9fcd9f20ccb6cd9d696ecda220cd8f74cc9568ccb7cca1cd9f6520cd9fcd9f64cc9b61cd9c72cc95cda16bcca2cca820cda168ccb465cd8f61ccb7cca2cca17274cc81cd8f20ccb4ccb7cda0c3b2ccb5ccb666ccb82075cca7cd986ec3adcc9bcd9c63cda2cd8f6fccb7cd8f64ccb8cda265cca1cd9d3fcd9e' UNICODE_HORROR = bfh(_UNICODE_HORROR_HEX).decode('utf-8') -# '₿ šŸ˜€ 😈 恆 ć‘ćŸć¾ 悏悋 wĶ¢Ķ¢ĶhĶ”o͔͢ ĢøĶ¢k̵͟n̓͘ǫwĢøĢ›s͘ ̀́w͘͢ḩ̵a҉̔͢t ̧̕h́o̵rĶĢµrorsĢ” ̶͔͠lį̶e͟͟ Ģ¶ĶinĶ¢ ĶtĢ•h̷̔͟e ͟͟dĢ›a͜r͔̕k̢̨ Ķ”hĢ“eĶa̷̢̔rtĢĶ ̷̓͠ò̵̶fĢø u̧͘nĆ­Ģ›ĶœcĶ¢ĶoĢ·ĶdĢøĶ¢eĢ”Ķ?Ķž' +assert UNICODE_HORROR == '₿ šŸ˜€ 😈 恆 ć‘ćŸć¾ 悏悋 wĶ¢Ķ¢ĶhĶ”o͔͢ ĢøĶ¢k̵͟n̓͘ǫwĢøĢ›s͘ ̀́w͘͢ḩ̵a҉̔͢t ̧̕h́o̵rĶĢµrorsĢ” ̶͔͠lį̶e͟͟ Ģ¶ĶinĶ¢ ĶtĢ•h̷̔͟e ͟͟dĢ›a͜r͔̕k̢̨ Ķ”hĢ“eĶa̷̢̔rtĢĶ ̷̓͠ò̵̶fĢø u̧͘nĆ­Ģ›ĶœcĶ¢ĶoĢ·ĶdĢøĶ¢eĢ”Ķ?Ķž' class WalletIntegrityHelper: From 526319630e265a28c4cbbca19c97c42879dce43e Mon Sep 17 00:00:00 2001 From: SomberNight Date: Mon, 10 Sep 2018 02:30:27 +0200 Subject: [PATCH 115/138] network: minor fix in switch_to_interface --- electrum/interface.py | 2 +- electrum/network.py | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/electrum/interface.py b/electrum/interface.py index 6368cf23..1ac52d0b 100644 --- a/electrum/interface.py +++ b/electrum/interface.py @@ -212,7 +212,7 @@ class Interface(PrintError): try: await self.open_session(ssl_context, exit_early=False) except (asyncio.CancelledError, OSError, aiorpcx.socks.SOCKSFailure) as e: - self.print_error('disconnecting due to: {}'.format(e)) + self.print_error('disconnecting due to: {} {}'.format(e, type(e))) self.exception = e return # should never get here (can only exit via exception) diff --git a/electrum/network.py b/electrum/network.py index a0840273..b9e12752 100644 --- a/electrum/network.py +++ b/electrum/network.py @@ -569,9 +569,10 @@ class Network(PrintError): # and to cancel tasks in interface.group. # However, for headers sub, give preference to this interface # over unknown ones, i.e. start it again right away. + old_server = self.interface.server self.close_interface(self.interface) if len(self.interfaces) <= self.num_server: - self.start_interface(self.interface.server) + self.start_interface(old_server) self.interface = i asyncio.get_event_loop().create_task( From e8f87d2e62cd5d56a66c68a44ffed195ea1e0413 Mon Sep 17 00:00:00 2001 From: ThomasV Date: Mon, 10 Sep 2018 13:06:48 +0200 Subject: [PATCH 116/138] remove requests and pysocks from requirements --- contrib/requirements/requirements.txt | 2 -- 1 file changed, 2 deletions(-) diff --git a/contrib/requirements/requirements.txt b/contrib/requirements/requirements.txt index 3536b894..9d5cf196 100644 --- a/contrib/requirements/requirements.txt +++ b/contrib/requirements/requirements.txt @@ -1,11 +1,9 @@ pyaes>=0.1a1 ecdsa>=0.9 -requests qrcode protobuf dnspython jsonrpclib-pelix -PySocks>=1.6.6 qdarkstyle<3.0 typing>=3.0.0 aiorpcx>=0.7.1 From 061231494dc065aebb3108c3425f7add1a2dc7ff Mon Sep 17 00:00:00 2001 From: ThomasV Date: Mon, 10 Sep 2018 13:26:50 +0200 Subject: [PATCH 117/138] revert rm requests --- contrib/requirements/requirements.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/contrib/requirements/requirements.txt b/contrib/requirements/requirements.txt index 9d5cf196..85dd81be 100644 --- a/contrib/requirements/requirements.txt +++ b/contrib/requirements/requirements.txt @@ -1,5 +1,6 @@ pyaes>=0.1a1 ecdsa>=0.9 +requests qrcode protobuf dnspython From 3e3d3871615e0f22eb5c72a1c16c1338e363ac45 Mon Sep 17 00:00:00 2001 From: SomberNight Date: Mon, 10 Sep 2018 15:18:11 +0200 Subject: [PATCH 118/138] fix kivy: follow-up 3d424077fd310b0644e7a466a813f4f411bd66ac --- electrum/gui/kivy/main_window.py | 2 +- electrum/gui/kivy/uix/dialogs/settings.py | 1 - electrum/gui/kivy/uix/ui_screens/server.kv | 3 +-- 3 files changed, 2 insertions(+), 4 deletions(-) diff --git a/electrum/gui/kivy/main_window.py b/electrum/gui/kivy/main_window.py index 4ba41465..0ba85313 100644 --- a/electrum/gui/kivy/main_window.py +++ b/electrum/gui/kivy/main_window.py @@ -272,7 +272,7 @@ class ElectrumWindow(App): self.server_host = net_params.host self.server_port = net_params.port self.auto_connect = net_params.auto_connect - self.proxy_config = net_params.proxy_config if net_params.proxy_config else {} + self.proxy_config = net_params.proxy if net_params.proxy else {} self.plugins = kwargs.get('plugins', []) self.gui_object = kwargs.get('gui_object', None) diff --git a/electrum/gui/kivy/uix/dialogs/settings.py b/electrum/gui/kivy/uix/dialogs/settings.py index 5247c0ff..07530a0a 100644 --- a/electrum/gui/kivy/uix/dialogs/settings.py +++ b/electrum/gui/kivy/uix/dialogs/settings.py @@ -8,7 +8,6 @@ from electrum.i18n import languages from electrum.gui.kivy.i18n import _ from electrum.plugin import run_hook from electrum import coinchooser -from electrum.network import NetworkProxy from .choice_dialog import ChoiceDialog diff --git a/electrum/gui/kivy/uix/ui_screens/server.kv b/electrum/gui/kivy/uix/ui_screens/server.kv index 686ee3be..ee959cba 100644 --- a/electrum/gui/kivy/uix/ui_screens/server.kv +++ b/electrum/gui/kivy/uix/ui_screens/server.kv @@ -57,7 +57,6 @@ Popup: text: _('OK') on_release: net_params = app.network.get_parameters() - net_params = net_params._replace(host=str(root.ids.host.text), - port=str(root.ids.port.text)) + net_params = net_params._replace(host=str(root.ids.host.text), port=str(root.ids.port.text)) app.network.set_parameters(net_params) nd.dismiss() From fffec71fb38e13bba5e4b8d3071e4cd46233e55c Mon Sep 17 00:00:00 2001 From: SomberNight Date: Mon, 10 Sep 2018 16:43:04 +0200 Subject: [PATCH 119/138] kivy fx: make sure displayed fiat values get updated --- electrum/exchange_rate.py | 9 +++++---- electrum/gui/kivy/main_window.py | 1 + 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/electrum/exchange_rate.py b/electrum/exchange_rate.py index e4d0e348..f943c251 100644 --- a/electrum/exchange_rate.py +++ b/electrum/exchange_rate.py @@ -486,7 +486,8 @@ class FxThread(ThreadJob): return bool(self.config.get('use_exchange_rate')) def set_enabled(self, b): - return self.config.set_key('use_exchange_rate', bool(b)) + self.config.set_key('use_exchange_rate', bool(b)) + self.trigger.set() def get_history_config(self): return bool(self.config.get('history_rates')) @@ -519,7 +520,7 @@ class FxThread(ThreadJob): def set_currency(self, ccy): self.ccy = ccy self.config.set_key('currency', ccy, True) - self.trigger.set() # Because self.ccy changes + self.trigger.set() # Because self.ccy changes self.on_quotes() def set_exchange(self, name): @@ -541,8 +542,8 @@ class FxThread(ThreadJob): if self.network: self.network.trigger_callback('on_history') - def exchange_rate(self): - '''Returns None, or the exchange rate as a Decimal''' + def exchange_rate(self) -> Decimal: + """Returns the exchange rate as a Decimal""" rate = self.exchange.quotes.get(self.ccy) if rate is None: return Decimal('NaN') diff --git a/electrum/gui/kivy/main_window.py b/electrum/gui/kivy/main_window.py index 0ba85313..e100fba1 100644 --- a/electrum/gui/kivy/main_window.py +++ b/electrum/gui/kivy/main_window.py @@ -156,6 +156,7 @@ class ElectrumWindow(App): def on_quotes(self, d): Logger.info("on_quotes") + self._trigger_update_status() self._trigger_update_history() def on_history(self, d): From b279d351d83d5c66ab8e9aac12af795b71158704 Mon Sep 17 00:00:00 2001 From: SomberNight Date: Mon, 10 Sep 2018 17:12:05 +0200 Subject: [PATCH 120/138] interface.session: add default timeout to send_request --- electrum/interface.py | 14 +++++++++++--- electrum/network.py | 4 ++-- electrum/synchronizer.py | 2 +- 3 files changed, 14 insertions(+), 6 deletions(-) diff --git a/electrum/interface.py b/electrum/interface.py index 1ac52d0b..4630dd90 100644 --- a/electrum/interface.py +++ b/electrum/interface.py @@ -53,8 +53,9 @@ class NotificationSession(ClientSession): self.scripthash = scripthash self.header = header - @aiosafe async def handle_request(self, request): + # note: if server sends malformed request and we raise, the superclass + # will catch the exception, count errors, and at some point disconnect if isinstance(request, Notification): if request.method == 'blockchain.scripthash.subscribe' and self.scripthash is not None: scripthash, status = request.args @@ -65,6 +66,13 @@ class NotificationSession(ClientSession): else: assert False, request.method + async def send_request(self, *args, timeout=-1, **kwargs): + if timeout == -1: + timeout = 20 if not self.proxy else 30 + return await asyncio.wait_for( + super().send_request(*args, **kwargs), + timeout) + # FIXME this is often raised inside a TaskGroup, but then it's not silent :( class GracefulDisconnect(AIOSafeSilentException): pass @@ -262,7 +270,7 @@ class Interface(PrintError): return None async def get_block_header(self, height, assert_mode): - res = await asyncio.wait_for(self.session.send_request('blockchain.block.header', [height]), 5) + res = await self.session.send_request('blockchain.block.header', [height], timeout=5) return blockchain.deserialize_header(bytes.fromhex(res), height) async def request_chunk(self, idx, tip): @@ -304,7 +312,7 @@ class Interface(PrintError): self.tip = new_header['block_height'] await copy_header_queue.put(new_header) except concurrent.futures.TimeoutError: - await asyncio.wait_for(self.session.send_request('server.ping'), 10) + await self.session.send_request('server.ping', timeout=10) def close(self): self.fut.cancel() diff --git a/electrum/network.py b/electrum/network.py index b9e12752..e6f77d61 100644 --- a/electrum/network.py +++ b/electrum/network.py @@ -695,7 +695,7 @@ class Network(PrintError): size = max(size, 0) try: self.requested_chunks.add(index) - res = await asyncio.wait_for(session.send_request('blockchain.block.headers', [index * 2016, size]), 20) + res = await session.send_request('blockchain.block.headers', [index * 2016, size]) finally: try: self.requested_chunks.remove(index) except KeyError: pass @@ -816,4 +816,4 @@ class Network(PrintError): await asyncio.sleep(0.1) async def attempt_fee_estimate_update(self): - await asyncio.wait_for(self.request_fee_estimates(self.interface), 5) + await self.request_fee_estimates(self.interface) diff --git a/electrum/synchronizer.py b/electrum/synchronizer.py index a939f77e..ba4611d6 100644 --- a/electrum/synchronizer.py +++ b/electrum/synchronizer.py @@ -120,7 +120,7 @@ class Synchronizer(PrintError): await group.spawn(self.get_transaction, tx_hash) async def get_transaction(self, tx_hash): - result = await asyncio.wait_for(self.session.send_request('blockchain.transaction.get', [tx_hash]), 20) + result = await self.session.send_request('blockchain.transaction.get', [tx_hash]) tx = Transaction(result) try: tx.deserialize() From e2338581eb5f0aa2320a793e96db8ee38de2517f Mon Sep 17 00:00:00 2001 From: SomberNight Date: Mon, 10 Sep 2018 18:39:10 +0200 Subject: [PATCH 121/138] broadcast_transaction: introduce async variant --- electrum/commands.py | 2 +- electrum/gui/kivy/main_window.py | 2 +- electrum/gui/qt/main_window.py | 2 +- electrum/gui/stdio.py | 2 +- electrum/gui/text.py | 2 +- electrum/network.py | 10 +++++++--- 6 files changed, 12 insertions(+), 8 deletions(-) diff --git a/electrum/commands.py b/electrum/commands.py index e2cf87a2..1e38b102 100644 --- a/electrum/commands.py +++ b/electrum/commands.py @@ -255,7 +255,7 @@ class Commands: def broadcast(self, tx): """Broadcast a transaction to the network. """ tx = Transaction(tx) - return self.network.broadcast_transaction(tx) + return self.network.broadcast_transaction_from_non_network_thread(tx) @command('') def createmultisig(self, num, pubkeys): diff --git a/electrum/gui/kivy/main_window.py b/electrum/gui/kivy/main_window.py index e100fba1..9ccabfbb 100644 --- a/electrum/gui/kivy/main_window.py +++ b/electrum/gui/kivy/main_window.py @@ -880,7 +880,7 @@ class ElectrumWindow(App): Clock.schedule_once(lambda dt: on_success(tx)) def _broadcast_thread(self, tx, on_complete): - ok, txid = self.network.broadcast_transaction(tx) + ok, txid = self.network.broadcast_transaction_from_non_network_thread(tx) Clock.schedule_once(lambda dt: on_complete(ok, txid)) def broadcast(self, tx, pr=None): diff --git a/electrum/gui/qt/main_window.py b/electrum/gui/qt/main_window.py index 539b7229..22d7144e 100644 --- a/electrum/gui/qt/main_window.py +++ b/electrum/gui/qt/main_window.py @@ -1616,7 +1616,7 @@ class ElectrumWindow(QMainWindow, MessageBoxMixin, PrintError): if pr and pr.has_expired(): self.payment_request = None return False, _("Payment request has expired") - status, msg = self.network.broadcast_transaction(tx) + status, msg = self.network.broadcast_transaction_from_non_network_thread(tx) if pr and status is True: self.invoices.set_paid(pr, tx.txid()) self.invoices.save() diff --git a/electrum/gui/stdio.py b/electrum/gui/stdio.py index d155efb0..d3d16342 100644 --- a/electrum/gui/stdio.py +++ b/electrum/gui/stdio.py @@ -200,7 +200,7 @@ class ElectrumGui: self.wallet.labels[tx.txid()] = self.str_description print(_("Please wait...")) - status, msg = self.network.broadcast_transaction(tx) + status, msg = self.network.broadcast_transaction_from_non_network_thread(tx) if status: print(_('Payment sent.')) diff --git a/electrum/gui/text.py b/electrum/gui/text.py index c27eb2df..d00528cc 100644 --- a/electrum/gui/text.py +++ b/electrum/gui/text.py @@ -354,7 +354,7 @@ class ElectrumGui: self.wallet.labels[tx.txid()] = self.str_description self.show_message(_("Please wait..."), getchar=False) - status, msg = self.network.broadcast_transaction(tx) + status, msg = self.network.broadcast_transaction_from_non_network_thread(tx) if status: self.show_message(_('Payment sent.')) diff --git a/electrum/network.py b/electrum/network.py index e6f77d61..89ab8ff6 100644 --- a/electrum/network.py +++ b/electrum/network.py @@ -671,10 +671,14 @@ class Network(PrintError): async def get_merkle_for_transaction(self, tx_hash, tx_height): return await self.interface.session.send_request('blockchain.transaction.get_merkle', [tx_hash, tx_height]) - def broadcast_transaction(self, tx, timeout=5): - fut = asyncio.run_coroutine_threadsafe(self.interface.session.send_request('blockchain.transaction.broadcast', [str(tx)]), self.asyncio_loop) + def broadcast_transaction_from_non_network_thread(self, tx, timeout=10): + # note: calling this from the network thread will deadlock it + fut = asyncio.run_coroutine_threadsafe(self.broadcast_transaction(tx, timeout=timeout), self.asyncio_loop) + return fut.result() + + async def broadcast_transaction(self, tx, timeout=10): try: - out = fut.result(timeout) + out = await self.interface.session.send_request('blockchain.transaction.broadcast', [str(tx)], timeout=timeout) except asyncio.TimeoutError as e: return False, "error: operation timed out" except Exception as e: From 54cc822227ca7f68e58e7bf19eb9960072cdcb99 Mon Sep 17 00:00:00 2001 From: SomberNight Date: Mon, 10 Sep 2018 19:03:06 +0200 Subject: [PATCH 122/138] network: send out 'interfaces' event on new_interface network dialog was not always showing up-to-date data --- electrum/network.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/electrum/network.py b/electrum/network.py index 89ab8ff6..d2fc8beb 100644 --- a/electrum/network.py +++ b/electrum/network.py @@ -636,8 +636,9 @@ class Network(PrintError): self.add_recent_server(server) interface = Interface(self, server, self.config.path, self.proxy) + timeout = 10 if not self.proxy else 20 try: - await asyncio.wait_for(interface.ready, 5) + await asyncio.wait_for(interface.ready, timeout) except BaseException as e: #import traceback #traceback.print_exc() @@ -654,7 +655,7 @@ class Network(PrintError): if server == self.default_server: self.switch_to_interface(server) - #self.notify('interfaces') + self.notify('interfaces') def init_headers_file(self): b = blockchain.blockchains[0] From 19e244a85ee282354d7576267a175d4d9667aa7a Mon Sep 17 00:00:00 2001 From: SomberNight Date: Mon, 10 Sep 2018 19:47:36 +0200 Subject: [PATCH 123/138] interface: rm unnecessary writes to self.tip --- electrum/interface.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/electrum/interface.py b/electrum/interface.py index 4630dd90..0b026ce6 100644 --- a/electrum/interface.py +++ b/electrum/interface.py @@ -339,7 +339,6 @@ class Interface(PrintError): if self.tip < height: height = self.tip _, height = await self.step(height, item) - self.tip = max(height, self.tip) async def sync_until(self, height, next_height=None): if next_height is None: @@ -348,12 +347,10 @@ class Interface(PrintError): while last is None or height < next_height: if next_height > height + 10: could_connect, num_headers = await self.request_chunk(height, next_height) - self.tip = max(height + num_headers, self.tip) if not could_connect: if height <= constants.net.max_checkpoint(): raise Exception('server chain conflicts with checkpoints or genesis') last, height = await self.step(height) - self.tip = max(height, self.tip) continue height = (height // 2016 * 2016) + num_headers if height > next_height: @@ -361,7 +358,6 @@ class Interface(PrintError): last = 'catchup' else: last, height = await self.step(height) - self.tip = max(height, self.tip) return last, height async def step(self, height, header=None): @@ -509,6 +505,7 @@ class Interface(PrintError): height = bh + 1 return 'no_fork', height + def check_cert(host, cert): try: b = pem.dePem(cert, 'CERTIFICATE') From a4396f4f134b2052ca1e342aed4e0a4b82615806 Mon Sep 17 00:00:00 2001 From: Calin Culianu Date: Tue, 11 Sep 2018 00:58:19 +0300 Subject: [PATCH 124/138] Fixed potential bug when clicking in History List on slow wallet synch --- electrum/gui/qt/history_list.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/electrum/gui/qt/history_list.py b/electrum/gui/qt/history_list.py index 79fe4d3a..3a3430b5 100644 --- a/electrum/gui/qt/history_list.py +++ b/electrum/gui/qt/history_list.py @@ -330,6 +330,9 @@ class HistoryList(MyTreeWidget, AcceptFileDragDrop): tx_hash = item.data(0, Qt.UserRole) if not tx_hash: return + tx = self.wallet.transactions.get(tx_hash) + if not tx: + return if column is 0: column_title = "ID" column_data = tx_hash @@ -338,7 +341,6 @@ class HistoryList(MyTreeWidget, AcceptFileDragDrop): column_data = item.text(column) tx_URL = block_explorer_URL(self.config, 'tx', tx_hash) height = self.wallet.get_tx_height(tx_hash).height - tx = self.wallet.transactions.get(tx_hash) is_relevant, is_mine, v, fee = self.wallet.get_wallet_delta(tx) is_unconfirmed = height <= 0 pr_key = self.wallet.invoices.paid.get(tx_hash) From 20957ac4d92d0e7f016f81597c7f5b81729d8bc6 Mon Sep 17 00:00:00 2001 From: SomberNight Date: Tue, 11 Sep 2018 02:43:54 +0200 Subject: [PATCH 125/138] follow-up prev --- electrum/gui/qt/history_list.py | 2 ++ electrum/gui/qt/utxo_list.py | 3 ++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/electrum/gui/qt/history_list.py b/electrum/gui/qt/history_list.py index 3a3430b5..64538848 100644 --- a/electrum/gui/qt/history_list.py +++ b/electrum/gui/qt/history_list.py @@ -297,6 +297,8 @@ class HistoryList(MyTreeWidget, AcceptFileDragDrop): else: tx_hash = item.data(0, Qt.UserRole) tx = self.wallet.transactions.get(tx_hash) + if not tx: + return self.parent.show_transaction(tx) def update_labels(self): diff --git a/electrum/gui/qt/utxo_list.py b/electrum/gui/qt/utxo_list.py index 78e86536..f75ffb37 100644 --- a/electrum/gui/qt/utxo_list.py +++ b/electrum/gui/qt/utxo_list.py @@ -68,7 +68,8 @@ class UTXOList(MyTreeWidget): if len(selected) == 1: txid = selected[0].split(':')[0] tx = self.wallet.transactions.get(txid) - menu.addAction(_("Details"), lambda: self.parent.show_transaction(tx)) + if tx: + menu.addAction(_("Details"), lambda: self.parent.show_transaction(tx)) menu.exec_(self.viewport().mapToGlobal(position)) From 557334aa366108609f1415d3df6beec2853cbb03 Mon Sep 17 00:00:00 2001 From: SomberNight Date: Tue, 11 Sep 2018 11:44:49 +0200 Subject: [PATCH 126/138] interface: introduce tip_lock --- electrum/interface.py | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/electrum/interface.py b/electrum/interface.py index 0b026ce6..1b7e32a3 100644 --- a/electrum/interface.py +++ b/electrum/interface.py @@ -117,11 +117,13 @@ class Interface(PrintError): self.port = int(self.port) self.config_path = config_path self.cert_path = os.path.join(self.config_path, 'certs', self.host) - self.tip_header = None - self.tip = 0 self.blockchain = None self.network = network + self.tip_header = None + self.tip = 0 + self.tip_lock = asyncio.Lock() + # TODO combine? self.fut = asyncio.get_event_loop().create_task(self.run()) self.group = CustomTaskGroup() @@ -308,8 +310,9 @@ class Interface(PrintError): while True: try: new_header = await asyncio.wait_for(header_queue.get(), 300) - self.tip_header = new_header - self.tip = new_header['block_height'] + async with self.tip_lock: + self.tip_header = new_header + self.tip = new_header['block_height'] await copy_header_queue.put(new_header) except concurrent.futures.TimeoutError: await self.session.send_request('server.ping', timeout=10) @@ -329,12 +332,12 @@ class Interface(PrintError): while True: self.network.notify('updated') item = await replies.get() - async with self.network.bhi_lock: + async with self.network.bhi_lock and self.tip_lock: if self.blockchain.height() < item['block_height']-1: _, height = await self.sync_until(height, None) if self.blockchain.height() >= height and self.blockchain.check_header(item): # another interface amended the blockchain - self.print_error("SKIPPING HEADER", height) + self.print_error("skipping header", height) continue if self.tip < height: height = self.tip From 1728dff576ce5e435cfeb9695211c05c59939e6f Mon Sep 17 00:00:00 2001 From: SomberNight Date: Tue, 11 Sep 2018 12:25:57 +0200 Subject: [PATCH 127/138] fix prev: that's not how you use the context manager... --- electrum/interface.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/electrum/interface.py b/electrum/interface.py index 1b7e32a3..64e77384 100644 --- a/electrum/interface.py +++ b/electrum/interface.py @@ -332,7 +332,7 @@ class Interface(PrintError): while True: self.network.notify('updated') item = await replies.get() - async with self.network.bhi_lock and self.tip_lock: + async with self.network.bhi_lock, self.tip_lock: if self.blockchain.height() < item['block_height']-1: _, height = await self.sync_until(height, None) if self.blockchain.height() >= height and self.blockchain.check_header(item): From 3b6af914e1e89b1b86cdad73f10ec1ba260b9d6a Mon Sep 17 00:00:00 2001 From: ThomasV Date: Tue, 11 Sep 2018 14:57:59 +0200 Subject: [PATCH 128/138] add multiplexing capability to NotificationSession, simplify interface --- electrum/interface.py | 77 ++++++++++++++++++++-------------------- electrum/synchronizer.py | 4 +-- 2 files changed, 40 insertions(+), 41 deletions(-) diff --git a/electrum/interface.py b/electrum/interface.py index 64e77384..bac6f59f 100644 --- a/electrum/interface.py +++ b/electrum/interface.py @@ -47,22 +47,21 @@ from . import constants class NotificationSession(ClientSession): - def __init__(self, scripthash, header, *args, **kwargs): + def __init__(self, *args, **kwargs): super(NotificationSession, self).__init__(*args, **kwargs) - # queues: - self.scripthash = scripthash - self.header = header + self.subscriptions = {} + self.cache = {} async def handle_request(self, request): # note: if server sends malformed request and we raise, the superclass # will catch the exception, count errors, and at some point disconnect if isinstance(request, Notification): - if request.method == 'blockchain.scripthash.subscribe' and self.scripthash is not None: - scripthash, status = request.args - await self.scripthash.put((scripthash, status)) - elif request.method == 'blockchain.headers.subscribe' and self.header is not None: - deser = deserialize_header(bfh(request.args[0]['hex']), request.args[0]['height']) - await self.header.put(deser) + params, result = request.args[:-1], request.args[-1] + key = request.method + repr(params) + if key in self.subscriptions: + self.cache[key] = result + for queue in self.subscriptions[key]: + await queue.put(request.args) else: assert False, request.method @@ -73,6 +72,17 @@ class NotificationSession(ClientSession): super().send_request(*args, **kwargs), timeout) + async def subscribe(self, method, params, queue): + key = method + repr(params) + if key in self.subscriptions: + self.subscriptions[key].append(queue) + result = self.cache[key] + else: + result = await self.send_request(method, params) + self.subscriptions[key] = [queue] + self.cache[key] = result + await queue.put(params + [result]) + # FIXME this is often raised inside a TaskGroup, but then it's not silent :( class GracefulDisconnect(AIOSafeSilentException): pass @@ -122,7 +132,6 @@ class Interface(PrintError): self.tip_header = None self.tip = 0 - self.tip_lock = asyncio.Lock() # TODO combine? self.fut = asyncio.get_event_loop().create_task(self.run()) @@ -280,7 +289,7 @@ class Interface(PrintError): async def open_session(self, sslc, exit_early): header_queue = asyncio.Queue() - self.session = NotificationSession(None, header_queue, self.host, self.port, ssl=sslc, proxy=self.proxy) + self.session = NotificationSession(self.host, self.port, ssl=sslc, proxy=self.proxy) async with self.session as session: try: ver = await session.send_request('server.version', [ELECTRUM_VERSION, PROTOCOL_VERSION]) @@ -289,14 +298,10 @@ class Interface(PrintError): if exit_early: return self.print_error(ver, self.host) - subscription_res = await session.send_request('blockchain.headers.subscribe') - self.tip_header = blockchain.deserialize_header(bfh(subscription_res['hex']), subscription_res['height']) - self.tip = subscription_res['height'] - self.mark_ready() - copy_header_queue = asyncio.Queue() + await session.subscribe('blockchain.headers.subscribe', [], header_queue) async with self.group as group: - await group.spawn(self.run_fetch_blocks(subscription_res, copy_header_queue)) - await group.spawn(self.subscribe_to_headers(header_queue, copy_header_queue)) + await group.spawn(self.ping()) + await group.spawn(self.run_fetch_blocks(header_queue)) await group.spawn(self.monitor_connection()) # NOTE: group.__aexit__ will be called here; this is needed to notice exceptions in the group! @@ -306,33 +311,29 @@ class Interface(PrintError): if not self.session or self.session.is_closing(): raise GracefulDisconnect('server closed session') - async def subscribe_to_headers(self, header_queue, copy_header_queue): + async def ping(self): while True: - try: - new_header = await asyncio.wait_for(header_queue.get(), 300) - async with self.tip_lock: - self.tip_header = new_header - self.tip = new_header['block_height'] - await copy_header_queue.put(new_header) - except concurrent.futures.TimeoutError: - await self.session.send_request('server.ping', timeout=10) + await asyncio.sleep(300) + await self.session.send_request('server.ping', timeout=10) def close(self): self.fut.cancel() asyncio.get_event_loop().create_task(self.group.cancel_remaining()) - async def run_fetch_blocks(self, sub_reply, replies): - if self.tip < constants.net.max_checkpoint(): - raise GracefulDisconnect('server tip below max checkpoint') - - async with self.network.bhi_lock: - height = self.blockchain.height()+1 - await replies.put(blockchain.deserialize_header(bfh(sub_reply['hex']), sub_reply['height'])) - + async def run_fetch_blocks(self, header_queue): while True: self.network.notify('updated') - item = await replies.get() - async with self.network.bhi_lock, self.tip_lock: + item = await header_queue.get() + item = item[0] + height = item['height'] + item = blockchain.deserialize_header(bfh(item['hex']), item['height']) + self.tip_header = item + self.tip = height + if self.tip < constants.net.max_checkpoint(): + raise GracefulDisconnect('server tip below max checkpoint') + if not self.ready.done(): + self.mark_ready() + async with self.network.bhi_lock: if self.blockchain.height() < item['block_height']-1: _, height = await self.sync_until(height, None) if self.blockchain.height() >= height and self.blockchain.check_header(item): diff --git a/electrum/synchronizer.py b/electrum/synchronizer.py index ba4611d6..8182f832 100644 --- a/electrum/synchronizer.py +++ b/electrum/synchronizer.py @@ -141,9 +141,7 @@ class Synchronizer(PrintError): async def subscribe_to_address(self, addr): h = address_to_scripthash(addr) self.scripthash_to_address[h] = addr - self.session.scripthash = self.status_queue - status = await self.session.send_request('blockchain.scripthash.subscribe', [h]) - await self.status_queue.put((h, status)) + await self.session.subscribe('blockchain.scripthash.subscribe', [h], self.status_queue) self.requested_addrs.remove(addr) async def send_subscriptions(self, interface): From 09dfb0fd1da16c4660f50607ab559297044b363b Mon Sep 17 00:00:00 2001 From: Janus Date: Tue, 11 Sep 2018 17:16:37 +0200 Subject: [PATCH 129/138] fix off-by-one error when syncing from genesis w/o checkpoints --- electrum/interface.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/electrum/interface.py b/electrum/interface.py index bac6f59f..e3589000 100644 --- a/electrum/interface.py +++ b/electrum/interface.py @@ -381,7 +381,7 @@ class Interface(PrintError): height -= 1 checkp = False if height <= constants.net.max_checkpoint(): - height = constants.net.max_checkpoint() + 1 + height = constants.net.max_checkpoint() checkp = True header = await self.get_block_header(height, 'backward') @@ -396,7 +396,7 @@ class Interface(PrintError): next_height = self.tip - 2 * delta checkp = False if next_height <= constants.net.max_checkpoint(): - next_height = constants.net.max_checkpoint() + 1 + next_height = constants.net.max_checkpoint() checkp = True height = next_height From 4e0d1799375ec23cb4b453e569f7db95ef1fe765 Mon Sep 17 00:00:00 2001 From: SomberNight Date: Tue, 11 Sep 2018 18:13:52 +0200 Subject: [PATCH 130/138] rate limit txn notifications in qt --- electrum/gui/qt/main_window.py | 68 ++++++++++++++++++++-------------- 1 file changed, 41 insertions(+), 27 deletions(-) diff --git a/electrum/gui/qt/main_window.py b/electrum/gui/qt/main_window.py index 4d2eb241..b6f7756c 100644 --- a/electrum/gui/qt/main_window.py +++ b/electrum/gui/qt/main_window.py @@ -31,6 +31,7 @@ import csv from decimal import Decimal import base64 from functools import partial +import queue from PyQt5.QtGui import * from PyQt5.QtCore import * @@ -90,7 +91,6 @@ class ElectrumWindow(QMainWindow, MessageBoxMixin, PrintError): payment_request_ok_signal = pyqtSignal() payment_request_error_signal = pyqtSignal() - notify_transactions_signal = pyqtSignal() new_fx_quotes_signal = pyqtSignal() new_fx_history_signal = pyqtSignal() network_signal = pyqtSignal(str, object) @@ -120,10 +120,13 @@ class ElectrumWindow(QMainWindow, MessageBoxMixin, PrintError): self.not_enough_funds = False self.pluginsdialog = None self.require_fee_update = False - self.tx_notifications = [] self.tl_windows = [] self.tx_external_keypairs = {} + self.tx_notification_queue = queue.Queue() + self.tx_notification_last_time = 0 + self.tx_notification_event = threading.Event() + self.create_status_bar() self.need_update = threading.Event() @@ -181,7 +184,6 @@ class ElectrumWindow(QMainWindow, MessageBoxMixin, PrintError): self.payment_request_ok_signal.connect(self.payment_request_ok) self.payment_request_error_signal.connect(self.payment_request_error) - self.notify_transactions_signal.connect(self.notify_transactions) self.history_list.setFocus(True) # network callbacks @@ -299,8 +301,10 @@ class ElectrumWindow(QMainWindow, MessageBoxMixin, PrintError): self.gui_object.network_updated_signal_obj.network_updated_signal \ .emit(event, args) elif event == 'new_transaction': - self.tx_notifications.append(args[0]) - self.notify_transactions_signal.emit() + # FIXME maybe this event should also include which wallet + # the tx is for. now all wallets get this. + self.tx_notification_queue.put(args[0]) + self.tx_notification_event.set() elif event in ['status', 'banner', 'verified', 'fee']: # Handle in GUI thread self.network_signal.emit(event, args) @@ -356,7 +360,6 @@ class ElectrumWindow(QMainWindow, MessageBoxMixin, PrintError): self.utxo_list.update() self.need_update.set() # Once GUI has been initialized check if we want to announce something since the callback has been called before the GUI was initialized - self.notify_transactions() # update menus self.seed_menu.setEnabled(self.wallet.has_seed()) self.update_lock_icon() @@ -587,28 +590,37 @@ class ElectrumWindow(QMainWindow, MessageBoxMixin, PrintError): self.show_message(msg, title="Electrum - " + _("Reporting Bugs")) def notify_transactions(self): - if not self.network or not self.network.is_connected(): + # note: during initial history sync for a wallet, many txns will be + # received multiple times. hence the "total amount received" will be + # a lot higher than should be. this is expected though not intended + if not self.tx_notification_event.is_set(): return - self.print_error("Notifying GUI") - if len(self.tx_notifications) > 0: - # Combine the transactions if there are at least three - num_txns = len(self.tx_notifications) - if num_txns >= 3: - total_amount = 0 - for tx in self.tx_notifications: - is_relevant, is_mine, v, fee = self.wallet.get_wallet_delta(tx) - if v > 0: - total_amount += v - self.notify(_("{} new transactions received: Total amount received in the new transactions {}") - .format(num_txns, self.format_amount_and_units(total_amount))) - self.tx_notifications = [] - else: - for tx in self.tx_notifications: - if tx: - self.tx_notifications.remove(tx) - is_relevant, is_mine, v, fee = self.wallet.get_wallet_delta(tx) - if v > 0: - self.notify(_("New transaction received: {}").format(self.format_amount_and_units(v))) + now = time.time() + if self.tx_notification_last_time + 5 > now: + return + self.tx_notification_event.clear() + self.tx_notification_last_time = now + self.print_error("Notifying GUI about new transactions") + txns = [] + while True: + try: + txns.append(self.tx_notification_queue.get_nowait()) + except queue.Empty: + break + # Combine the transactions if there are at least three + if len(txns) >= 3: + total_amount = 0 + for tx in txns: + is_relevant, is_mine, v, fee = self.wallet.get_wallet_delta(tx) + if v > 0: + total_amount += v + self.notify(_("{} new transactions received: Total amount received in the new transactions {}") + .format(len(txns), self.format_amount_and_units(total_amount))) + else: + for tx in txns: + is_relevant, is_mine, v, fee = self.wallet.get_wallet_delta(tx) + if v > 0: + self.notify(_("New transaction received: {}").format(self.format_amount_and_units(v))) def notify(self, message): if self.tray: @@ -651,6 +663,8 @@ class ElectrumWindow(QMainWindow, MessageBoxMixin, PrintError): if self.require_fee_update: self.do_update_fee() self.require_fee_update = False + self.notify_transactions() + def format_amount(self, x, is_diff=False, whitespaces=False): return format_satoshis(x, self.num_zeros, self.decimal_point, is_diff=is_diff, whitespaces=whitespaces) From 19d4bd4837ae1ebb59ad9ea325897e43e8cc12c6 Mon Sep 17 00:00:00 2001 From: SomberNight Date: Tue, 11 Sep 2018 18:28:59 +0200 Subject: [PATCH 131/138] simplify prev --- electrum/gui/qt/main_window.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/electrum/gui/qt/main_window.py b/electrum/gui/qt/main_window.py index b6f7756c..b1781b33 100644 --- a/electrum/gui/qt/main_window.py +++ b/electrum/gui/qt/main_window.py @@ -125,7 +125,6 @@ class ElectrumWindow(QMainWindow, MessageBoxMixin, PrintError): self.tx_notification_queue = queue.Queue() self.tx_notification_last_time = 0 - self.tx_notification_event = threading.Event() self.create_status_bar() self.need_update = threading.Event() @@ -304,7 +303,6 @@ class ElectrumWindow(QMainWindow, MessageBoxMixin, PrintError): # FIXME maybe this event should also include which wallet # the tx is for. now all wallets get this. self.tx_notification_queue.put(args[0]) - self.tx_notification_event.set() elif event in ['status', 'banner', 'verified', 'fee']: # Handle in GUI thread self.network_signal.emit(event, args) @@ -593,12 +591,11 @@ class ElectrumWindow(QMainWindow, MessageBoxMixin, PrintError): # note: during initial history sync for a wallet, many txns will be # received multiple times. hence the "total amount received" will be # a lot higher than should be. this is expected though not intended - if not self.tx_notification_event.is_set(): + if self.tx_notification_queue.qsize() == 0: return now = time.time() if self.tx_notification_last_time + 5 > now: return - self.tx_notification_event.clear() self.tx_notification_last_time = now self.print_error("Notifying GUI about new transactions") txns = [] From e829d6bbcfd65910ff778406a0f14ac9cececa77 Mon Sep 17 00:00:00 2001 From: SomberNight Date: Tue, 11 Sep 2018 20:24:01 +0200 Subject: [PATCH 132/138] wallet: put Sync and Verifier in their own TaskGroup, and that into interface.group --- electrum/address_synchronizer.py | 52 +++++++++++++++++++------------- electrum/daemon.py | 2 +- electrum/gui/kivy/main_window.py | 2 +- electrum/gui/qt/__init__.py | 2 +- electrum/gui/stdio.py | 2 +- electrum/gui/text.py | 2 +- electrum/interface.py | 22 ++++++-------- electrum/network.py | 14 +-------- electrum/synchronizer.py | 8 ++--- electrum/util.py | 18 ++++++++--- electrum/verifier.py | 12 +++++--- run_electrum | 2 +- 12 files changed, 73 insertions(+), 65 deletions(-) diff --git a/electrum/address_synchronizer.py b/electrum/address_synchronizer.py index f976b1f5..4793074d 100644 --- a/electrum/address_synchronizer.py +++ b/electrum/address_synchronizer.py @@ -26,11 +26,9 @@ import asyncio import itertools from collections import defaultdict -from aiorpcx import TaskGroup - from . import bitcoin from .bitcoin import COINBASE_MATURITY, TYPE_ADDRESS, TYPE_PUBKEY -from .util import PrintError, profiler, bfh, VerifiedTxInfo, TxMinedStatus +from .util import PrintError, profiler, bfh, VerifiedTxInfo, TxMinedStatus, aiosafe, CustomTaskGroup from .transaction import Transaction, TxOutput from .synchronizer import Synchronizer from .verifier import SPV @@ -62,6 +60,7 @@ class AddressSynchronizer(PrintError): self.synchronizer = None self.verifier = None self.sync_restart_lock = asyncio.Lock() + self.group = None # locks: if you need to take multiple ones, acquire them in the order they are defined here! self.lock = threading.RLock() self.transaction_lock = threading.RLock() @@ -138,34 +137,45 @@ class AddressSynchronizer(PrintError): # add it in case it was previously unconfirmed self.add_unverified_tx(tx_hash, tx_height) - async def on_default_server_changed(self, evt): + @aiosafe + async def on_default_server_changed(self, event): async with self.sync_restart_lock: - interface = self.network.interface - if interface is None: - return # we should get called again soon - self.verifier = SPV(self.network, self) - self.synchronizer = Synchronizer(self) - await interface.group.spawn(self.verifier.main(interface)) - await interface.group.spawn(self.synchronizer.send_subscriptions(interface)) - await interface.group.spawn(self.synchronizer.handle_status(interface)) - await interface.group.spawn(self.synchronizer.main()) + self.stop_threads() + await self._start_threads() - def start_threads(self, network): + def start_network(self, network): self.network = network if self.network is not None: self.network.register_callback(self.on_default_server_changed, ['default_server_changed']) - self.network.trigger_callback('default_server_changed') - else: - self.verifier = None - self.synchronizer = None + asyncio.run_coroutine_threadsafe(self._start_threads(), network.asyncio_loop) + + async def _start_threads(self): + interface = self.network.interface + if interface is None: + return # we should get called again soon + + self.verifier = SPV(self.network, self) + self.synchronizer = synchronizer = Synchronizer(self) + assert self.group is None, 'group already exists' + self.group = CustomTaskGroup() + + async def job(): + async with self.group as group: + await group.spawn(self.verifier.main(group)) + await group.spawn(self.synchronizer.send_subscriptions(group)) + await group.spawn(self.synchronizer.handle_status(group)) + await group.spawn(self.synchronizer.main()) + # we are being cancelled now + interface.session.unsubscribe(synchronizer.status_queue) + await interface.group.spawn(job) def stop_threads(self): if self.network: - #self.network.remove_jobs([self.verifier]) self.synchronizer = None self.verifier = None - # Now no references to the synchronizer or verifier - # remain so they will be GC-ed + if self.group: + asyncio.run_coroutine_threadsafe(self.group.cancel_remaining(), self.network.asyncio_loop) + self.group = None self.storage.put('stored_height', self.get_local_height()) self.save_transactions() self.save_verified_tx() diff --git a/electrum/daemon.py b/electrum/daemon.py index f2a9316e..c939d109 100644 --- a/electrum/daemon.py +++ b/electrum/daemon.py @@ -243,7 +243,7 @@ class Daemon(DaemonThread): if storage.get_action(): return wallet = Wallet(storage) - wallet.start_threads(self.network) + wallet.start_network(self.network) self.wallets[path] = wallet return wallet diff --git a/electrum/gui/kivy/main_window.py b/electrum/gui/kivy/main_window.py index 9ccabfbb..0dbb5280 100644 --- a/electrum/gui/kivy/main_window.py +++ b/electrum/gui/kivy/main_window.py @@ -512,7 +512,7 @@ class ElectrumWindow(App): def on_wizard_complete(self, wizard, wallet): if wallet: # wizard returned a wallet - wallet.start_threads(self.daemon.network) + wallet.start_network(self.daemon.network) self.daemon.add_wallet(wallet) self.load_wallet(wallet) elif not self.wallet: diff --git a/electrum/gui/qt/__init__.py b/electrum/gui/qt/__init__.py index b49826c6..3fd204d7 100644 --- a/electrum/gui/qt/__init__.py +++ b/electrum/gui/qt/__init__.py @@ -236,7 +236,7 @@ class ElectrumGui: if not self.daemon.get_wallet(wallet.storage.path): # wallet was not in memory - wallet.start_threads(self.daemon.network) + wallet.start_network(self.daemon.network) self.daemon.add_wallet(wallet) try: for w in self.windows: diff --git a/electrum/gui/stdio.py b/electrum/gui/stdio.py index d3d16342..cbb0d340 100644 --- a/electrum/gui/stdio.py +++ b/electrum/gui/stdio.py @@ -34,7 +34,7 @@ class ElectrumGui: self.str_fee = "" self.wallet = Wallet(storage) - self.wallet.start_threads(self.network) + self.wallet.start_network(self.network) self.contacts = self.wallet.contacts self.network.register_callback(self.on_network, ['updated', 'banner']) diff --git a/electrum/gui/text.py b/electrum/gui/text.py index d00528cc..98134013 100644 --- a/electrum/gui/text.py +++ b/electrum/gui/text.py @@ -30,7 +30,7 @@ class ElectrumGui: password = getpass.getpass('Password:', stream=None) storage.decrypt(password) self.wallet = Wallet(storage) - self.wallet.start_threads(self.network) + self.wallet.start_network(self.network) self.contacts = self.wallet.contacts locale.setlocale(locale.LC_ALL, '') diff --git a/electrum/interface.py b/electrum/interface.py index e3589000..da2e08ad 100644 --- a/electrum/interface.py +++ b/electrum/interface.py @@ -24,24 +24,21 @@ # SOFTWARE. import os import re -import socket import ssl import sys import traceback import asyncio -import concurrent.futures from typing import Tuple, Union import aiorpcx -from aiorpcx import ClientSession, Notification, TaskGroup +from aiorpcx import ClientSession, Notification -from .util import PrintError, aiosafe, bfh, AIOSafeSilentException +from .util import PrintError, aiosafe, bfh, AIOSafeSilentException, CustomTaskGroup from . import util from . import x509 from . import pem from .version import ELECTRUM_VERSION, PROTOCOL_VERSION from . import blockchain -from .blockchain import deserialize_header from . import constants @@ -83,6 +80,14 @@ class NotificationSession(ClientSession): self.cache[key] = result await queue.put(params + [result]) + def unsubscribe(self, queue): + """Unsubscribe a callback to free object references to enable GC.""" + # note: we can't unsubscribe from the server, so we keep receiving + # subsequent notifications + for v in self.subscriptions.values(): + if queue in v: + v.remove(queue) + # FIXME this is often raised inside a TaskGroup, but then it's not silent :( class GracefulDisconnect(AIOSafeSilentException): pass @@ -94,13 +99,6 @@ class ErrorParsingSSLCert(Exception): pass class ErrorGettingSSLCertFromServer(Exception): pass -class CustomTaskGroup(TaskGroup): - - def spawn(self, *args, **kwargs): - if self._closed: - raise asyncio.CancelledError() - return super().spawn(*args, **kwargs) - def deserialize_server(server_str: str) -> Tuple[str, str, str]: # host might be IPv6 address, hence do rsplit: diff --git a/electrum/network.py b/electrum/network.py index d2fc8beb..20ebde59 100644 --- a/electrum/network.py +++ b/electrum/network.py @@ -211,9 +211,6 @@ class Network(PrintError): self.banner = '' self.donation_address = '' self.relay_fee = None - # callbacks passed with subscriptions - self.subscriptions = defaultdict(list) # note: needs self.callback_lock - self.sub_cache = {} # note: needs self.interface_lock # callbacks set by the GUI self.callbacks = defaultdict(list) # note: needs self.callback_lock @@ -272,6 +269,7 @@ class Network(PrintError): callbacks = self.callbacks[event][:] for callback in callbacks: if asyncio.iscoroutinefunction(callback): + # FIXME: if callback throws, we will lose the traceback asyncio.run_coroutine_threadsafe(callback(event, *args), self.asyncio_loop) else: callback(event, *args) @@ -605,16 +603,6 @@ class Network(PrintError): """ hashable index for subscriptions and cache""" return str(method) + (':' + str(params[0]) if params else '') - def unsubscribe(self, callback): - '''Unsubscribe a callback to free object references to enable GC.''' - # Note: we can't unsubscribe from the server, so if we receive - # subsequent notifications process_response() will emit a harmless - # "received unexpected notification" warning - with self.callback_lock: - for v in self.subscriptions.values(): - if callback in v: - v.remove(callback) - @with_interface_lock def connection_down(self, server): '''A connection to server either went down, or was never made. diff --git a/electrum/synchronizer.py b/electrum/synchronizer.py index 8182f832..a74961a3 100644 --- a/electrum/synchronizer.py +++ b/electrum/synchronizer.py @@ -144,16 +144,16 @@ class Synchronizer(PrintError): await self.session.subscribe('blockchain.scripthash.subscribe', [h], self.status_queue) self.requested_addrs.remove(addr) - async def send_subscriptions(self, interface): + async def send_subscriptions(self, group: TaskGroup): while True: addr = await self.add_queue.get() - await interface.group.spawn(self.subscribe_to_address, addr) + await group.spawn(self.subscribe_to_address, addr) - async def handle_status(self, interface): + async def handle_status(self, group: TaskGroup): while True: h, status = await self.status_queue.get() addr = self.scripthash_to_address[h] - await interface.group.spawn(self.on_address_status, addr, status) + await group.spawn(self.on_address_status, addr, status) @property def session(self): diff --git a/electrum/util.py b/electrum/util.py index d252faa7..9d79ef99 100644 --- a/electrum/util.py +++ b/electrum/util.py @@ -35,14 +35,15 @@ import stat import inspect from locale import localeconv import asyncio - -from .i18n import _ +import urllib.request, urllib.parse, urllib.error +import queue import aiohttp from aiohttp_socks import SocksConnector, SocksVer +from aiorpcx import TaskGroup + +from .i18n import _ -import urllib.request, urllib.parse, urllib.error -import queue def inv_dict(d): return {v: k for k, v in d.items()} @@ -972,3 +973,12 @@ def make_aiohttp_session(proxy): return aiohttp.ClientSession(headers={'User-Agent' : 'Electrum'}, timeout=aiohttp.ClientTimeout(total=10), connector=connector) else: return aiohttp.ClientSession(headers={'User-Agent' : 'Electrum'}, timeout=aiohttp.ClientTimeout(total=10)) + + +class CustomTaskGroup(TaskGroup): + + def spawn(self, *args, **kwargs): + # don't complain if group is already closed. + if self._closed: + raise asyncio.CancelledError() + return super().spawn(*args, **kwargs) diff --git a/electrum/verifier.py b/electrum/verifier.py index 493d402f..3b502e7a 100644 --- a/electrum/verifier.py +++ b/electrum/verifier.py @@ -24,6 +24,8 @@ import asyncio from typing import Sequence, Optional +from aiorpcx import TaskGroup + from .util import ThreadJob, bh2u, VerifiedTxInfo from .bitcoin import Hash, hash_decode, hash_encode from .transaction import Transaction @@ -47,12 +49,12 @@ class SPV(ThreadJob): self.merkle_roots = {} # txid -> merkle root (once it has been verified) self.requested_merkle = set() # txid set of pending requests - async def main(self, interface): + async def main(self, group: TaskGroup): while True: - await self._request_proofs(interface) + await self._request_proofs(group) await asyncio.sleep(0.1) - async def _request_proofs(self, interface): + async def _request_proofs(self, group: TaskGroup): blockchain = self.network.blockchain() if not blockchain: self.print_error("no blockchain") @@ -70,12 +72,12 @@ class SPV(ThreadJob): if header is None: index = tx_height // 2016 if index < len(blockchain.checkpoints): - await interface.group.spawn(self.network.request_chunk(tx_height, None, can_return_early=True)) + await group.spawn(self.network.request_chunk(tx_height, None, can_return_early=True)) elif (tx_hash not in self.requested_merkle and tx_hash not in self.merkle_roots): self.print_error('requested merkle', tx_hash) self.requested_merkle.add(tx_hash) - await interface.group.spawn(self._request_and_verify_single_proof, tx_hash, tx_height) + await group.spawn(self._request_and_verify_single_proof, tx_hash, tx_height) if self.network.blockchain() != self.blockchain: self.blockchain = self.network.blockchain() diff --git a/run_electrum b/run_electrum index 3db004e2..0a43adbc 100755 --- a/run_electrum +++ b/run_electrum @@ -135,7 +135,7 @@ def run_non_RPC(config): if not config.get('offline'): network = Network(config) network.start() - wallet.start_threads(network) + wallet.start_network(network) print_msg("Recovering wallet...") wallet.synchronize() wallet.wait_until_synchronized() From 8b8ca14c6da1041174cebcc50e06a125fb280ab9 Mon Sep 17 00:00:00 2001 From: SomberNight Date: Tue, 11 Sep 2018 20:37:53 +0200 Subject: [PATCH 133/138] move get_index from network to session --- electrum/interface.py | 9 +++++++-- electrum/network.py | 5 ----- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/electrum/interface.py b/electrum/interface.py index da2e08ad..1d165f6f 100644 --- a/electrum/interface.py +++ b/electrum/interface.py @@ -54,7 +54,7 @@ class NotificationSession(ClientSession): # will catch the exception, count errors, and at some point disconnect if isinstance(request, Notification): params, result = request.args[:-1], request.args[-1] - key = request.method + repr(params) + key = self.get_index(request.method, params) if key in self.subscriptions: self.cache[key] = result for queue in self.subscriptions[key]: @@ -70,7 +70,7 @@ class NotificationSession(ClientSession): timeout) async def subscribe(self, method, params, queue): - key = method + repr(params) + key = self.get_index(method, params) if key in self.subscriptions: self.subscriptions[key].append(queue) result = self.cache[key] @@ -88,6 +88,11 @@ class NotificationSession(ClientSession): if queue in v: v.remove(queue) + @classmethod + def get_index(cls, method, params): + """Hashable index for subscriptions and cache""" + return str(method) + repr(params) + # FIXME this is often raised inside a TaskGroup, but then it's not silent :( class GracefulDisconnect(AIOSafeSilentException): pass diff --git a/electrum/network.py b/electrum/network.py index 20ebde59..06d33935 100644 --- a/electrum/network.py +++ b/electrum/network.py @@ -598,11 +598,6 @@ class Network(PrintError): self.recent_servers = self.recent_servers[0:20] self.save_recent_servers() - @classmethod - def get_index(cls, method, params): - """ hashable index for subscriptions and cache""" - return str(method) + (':' + str(params[0]) if params else '') - @with_interface_lock def connection_down(self, server): '''A connection to server either went down, or was never made. From ecc296cf6751cea95ef077e254a92ce8c7f8510e Mon Sep 17 00:00:00 2001 From: SomberNight Date: Tue, 11 Sep 2018 20:39:16 +0200 Subject: [PATCH 134/138] fix race in session.subscribe --- electrum/interface.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/electrum/interface.py b/electrum/interface.py index 1d165f6f..d1e83c39 100644 --- a/electrum/interface.py +++ b/electrum/interface.py @@ -75,8 +75,8 @@ class NotificationSession(ClientSession): self.subscriptions[key].append(queue) result = self.cache[key] else: - result = await self.send_request(method, params) self.subscriptions[key] = [queue] + result = await self.send_request(method, params) self.cache[key] = result await queue.put(params + [result]) From bed35a65c703a4977d18246e570a7fef9cb1afdf Mon Sep 17 00:00:00 2001 From: SomberNight Date: Tue, 11 Sep 2018 21:04:36 +0200 Subject: [PATCH 135/138] bump min python to 3.6 --- README.rst | 2 +- contrib/requirements/requirements.txt | 2 +- setup.py | 5 +++-- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/README.rst b/README.rst index c7665604..42df1790 100644 --- a/README.rst +++ b/README.rst @@ -5,7 +5,7 @@ Electrum - Lightweight Bitcoin client Licence: MIT Licence Author: Thomas Voegtlin - Language: Python + Language: Python (>= 3.6) Homepage: https://electrum.org/ diff --git a/contrib/requirements/requirements.txt b/contrib/requirements/requirements.txt index 85dd81be..6585a4b7 100644 --- a/contrib/requirements/requirements.txt +++ b/contrib/requirements/requirements.txt @@ -7,6 +7,6 @@ dnspython jsonrpclib-pelix qdarkstyle<3.0 typing>=3.0.0 -aiorpcx>=0.7.1 +aiorpcx>=0.7.1,<0.8 aiohttp aiohttp_socks diff --git a/setup.py b/setup.py index fefd32c5..9da14c01 100755 --- a/setup.py +++ b/setup.py @@ -20,8 +20,8 @@ with open('contrib/requirements/requirements-hw.txt') as f: version = imp.load_source('version', 'electrum/version.py') -if sys.version_info[:3] < (3, 4, 0): - sys.exit("Error: Electrum requires Python version >= 3.4.0...") +if sys.version_info[:3] < (3, 6, 0): + sys.exit("Error: Electrum requires Python version >= 3.6.0...") data_files = [] @@ -71,6 +71,7 @@ class CustomInstallCommand(install): setup( name="Electrum", version=version.ELECTRUM_VERSION, + python_requires='>=3.6', install_requires=requirements, extras_require=extras_require, packages=[ From 6b9a83ae8032f5ff3347043accee53f52a992d88 Mon Sep 17 00:00:00 2001 From: SomberNight Date: Tue, 11 Sep 2018 21:10:47 +0200 Subject: [PATCH 136/138] don't test with python 3.5 also, typing is no longer needed (part of stdlib from 3.5) --- .travis.yml | 1 - contrib/requirements/requirements.txt | 1 - tox.ini | 2 +- 3 files changed, 1 insertion(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index 6f28247b..4690db75 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,7 +2,6 @@ sudo: true dist: xenial language: python python: - - 3.5 - 3.6 - 3.7 addons: diff --git a/contrib/requirements/requirements.txt b/contrib/requirements/requirements.txt index 6585a4b7..3fdf9eac 100644 --- a/contrib/requirements/requirements.txt +++ b/contrib/requirements/requirements.txt @@ -6,7 +6,6 @@ protobuf dnspython jsonrpclib-pelix qdarkstyle<3.0 -typing>=3.0.0 aiorpcx>=0.7.1,<0.8 aiohttp aiohttp_socks diff --git a/tox.ini b/tox.ini index b00d2923..895f302a 100644 --- a/tox.ini +++ b/tox.ini @@ -1,5 +1,5 @@ [tox] -envlist = py35, py36 +envlist = py36 [testenv] deps= From 518c6280e9b29a9b9f09f2a5db3df1c8dc2c25b4 Mon Sep 17 00:00:00 2001 From: SomberNight Date: Tue, 11 Sep 2018 21:23:37 +0200 Subject: [PATCH 137/138] interface: minor clean-up re timeouts --- electrum/interface.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/electrum/interface.py b/electrum/interface.py index d1e83c39..5cde63cf 100644 --- a/electrum/interface.py +++ b/electrum/interface.py @@ -284,7 +284,9 @@ class Interface(PrintError): return None async def get_block_header(self, height, assert_mode): - res = await self.session.send_request('blockchain.block.header', [height], timeout=5) + # use lower timeout as we usually have network.bhi_lock here + timeout = 5 if not self.proxy else 10 + res = await self.session.send_request('blockchain.block.header', [height], timeout=timeout) return blockchain.deserialize_header(bytes.fromhex(res), height) async def request_chunk(self, idx, tip): @@ -317,7 +319,7 @@ class Interface(PrintError): async def ping(self): while True: await asyncio.sleep(300) - await self.session.send_request('server.ping', timeout=10) + await self.session.send_request('server.ping') def close(self): self.fut.cancel() From 014c0d3a41090698b3d3d0c602988ad9bf771f73 Mon Sep 17 00:00:00 2001 From: SomberNight Date: Tue, 11 Sep 2018 21:44:17 +0200 Subject: [PATCH 138/138] network: update UI when downloading chunks --- electrum/interface.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/electrum/interface.py b/electrum/interface.py index 5cde63cf..47fdf308 100644 --- a/electrum/interface.py +++ b/electrum/interface.py @@ -355,12 +355,14 @@ class Interface(PrintError): last = None while last is None or height < next_height: if next_height > height + 10: + self.print_error("requesting chunk from height {}".format(height)) could_connect, num_headers = await self.request_chunk(height, next_height) if not could_connect: if height <= constants.net.max_checkpoint(): raise Exception('server chain conflicts with checkpoints or genesis') last, height = await self.step(height) continue + self.network.notify('updated') height = (height // 2016 * 2016) + num_headers if height > next_height: assert False, (height, self.tip)

LspQYi>b08uvTt{zR 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 IrtbIu2PQs=-v9sr literal 0 HcmV?d00001 diff --git a/electrum/gui/kivy/theming/light.atlas b/electrum/gui/kivy/theming/light.atlas new file mode 100644 index 00000000..acae07b0 --- /dev/null +++ b/electrum/gui/kivy/theming/light.atlas @@ -0,0 +1 @@ +{"light-0.png": {"electrum_icon640": [2, 702, 320, 320], "nfc_stage_one": [324, 900, 489, 122], "nfc_clock": [2, 460, 243, 240], "stepper_full": [324, 781, 392, 117], "stepper_left": [247, 583, 392, 117], "stepper_restore_password": [247, 464, 392, 117], "stepper_restore_seed": [2, 341, 392, 117], "qrcode": [2, 194, 145, 145], "manualentry": [149, 205, 145, 134], "gear": [2, 33, 105, 159], "calculator": [296, 211, 128, 128], "save": [426, 211, 128, 128], "share": [556, 211, 128, 128], "star_big_inactive": [686, 211, 128, 128], "nfc_phone": [816, 213, 128, 126], "logo": [815, 906, 128, 116], "error": [718, 784, 128, 114], "textinput_active": [848, 784, 114, 114], "close": [641, 612, 88, 88], "important": [731, 612, 88, 88], "paste_icon": [945, 945, 75, 77], "globe": [946, 267, 72, 72], "camera": [821, 636, 64, 64], "carousel_deselected": [887, 636, 64, 64], "carousel_selected": [953, 636, 64, 64], "clock1": [641, 517, 64, 64], "clock2": [707, 517, 64, 64], "clock3": [773, 517, 64, 64], "clock4": [839, 517, 64, 64], "clock5": [905, 517, 64, 64], "confirmed": [324, 715, 64, 64], "contact_overlay": [390, 715, 64, 64], "icon_border": [456, 715, 64, 64], "info": [522, 715, 64, 64], "logo_atom_dull": [588, 715, 64, 64], "nfc": [654, 715, 64, 64], "pen": [720, 715, 64, 64], "shadow": [786, 715, 64, 64], "tab": [852, 715, 64, 64], "unconfirmed": [918, 715, 64, 64], "mail_icon": [396, 404, 65, 54], "settings": [964, 834, 54, 64], "card": [946, 216, 64, 49], "tab_disabled": [641, 483, 96, 32], "tab_strip": [739, 483, 96, 32], "closebutton": [964, 789, 60, 43], "arrow_back": [971, 531, 50, 50], "contact": [463, 409, 49, 49], "wallets": [514, 418, 60, 40], "network": [396, 354, 48, 48], "bit_logo": [109, 141, 44, 51], "add_contact": [446, 359, 51, 43], "wallet": [155, 148, 49, 44], "btn_create_account": [945, 911, 64, 32], "action_group_dark": [984, 731, 33, 48], "action_group_light": [109, 91, 33, 48], "action_bar": [576, 422, 36, 36], "card_btn": [837, 483, 38, 32], "btn_create_act_disabled": [877, 483, 32, 32], "tab_btn": [911, 483, 32, 32], "tab_btn_disabled": [945, 483, 32, 32], "tab_btn_pressed": [979, 483, 32, 32], "dropdown_background": [614, 423, 29, 35], "overflow_background": [645, 423, 29, 35], "blue_bg_round_rb": [821, 614, 31, 20], "lightblue_bg_round_lb": [854, 614, 31, 20], "white_bg_round_top": [887, 614, 31, 20], "card_bottom": [920, 618, 32, 16], "card_top": [954, 618, 32, 16], "dialog": [641, 590, 18, 20], "btn_send_address": [988, 619, 18, 15], "btn_send_nfc": [641, 466, 18, 15], "create_act_text": [984, 719, 22, 10], "create_act_text_active": [971, 519, 22, 10], "action_button_group": [1008, 719, 16, 10], "overflow_btn_dn": [1008, 624, 16, 10], "shadow_right": [641, 583, 32, 5], "btn_nfc": [1011, 931, 13, 12]}} \ No newline at end of file From 573760daf009192e02706527bf6c1ce514c8010b Mon Sep 17 00:00:00 2001 From: Janus Date: Thu, 6 Sep 2018 17:25:11 +0200 Subject: [PATCH 075/138] remove generated kivy theming --- electrum/gui/kivy/theming/light-0.png | Bin 480803 -> 0 bytes electrum/gui/kivy/theming/light.atlas | 1 - 2 files changed, 1 deletion(-) delete mode 100644 electrum/gui/kivy/theming/light-0.png delete mode 100644 electrum/gui/kivy/theming/light.atlas diff --git a/electrum/gui/kivy/theming/light-0.png b/electrum/gui/kivy/theming/light-0.png deleted file mode 100644 index c418938ae505e7c0c6c035f71940164eee06e176..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 480803 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 TCiaS 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

6VNh69Pu4fZ`DU~%(H-jdw)*PcwQ6mfD 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%0AW7%v6h?eUo&YK(~{0K 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 DeC`tS7V&~ zAJ5-I_L6U6X1F{tv23!^w_Bmf7P8%)O$;9GzS5`JeBBkEvbnU2_PefN)N7ptPT4$7 zD=Lx&sr?=TS{@M(-b6fO$0p^$xZdN>@e^$jG&cfaGr5aT`DGsBmP`KTLtH!4VWz1VRT<@cLtKF> zutf#f!e@j}TL}RCy-wABor3#Q_=hnApfgGnL0Q0hgxswxWvi}CI3w4W{hS!ybi%!d zUS)Ix=we`;YRl0I$-8MHjdg7Y+=8cg*DIj2%#)iD}Txz)?A2RN}BE&F4mah)Pp_RhzfHH}Wm7$Oy`Sjx}zw)-fyH zzm_x-b%n5-B)l4%(3lWRNCs}x%guALxc1b@+R5m(TO&99fn5`$X*@9N4XSIX?!-&C`}opHe{7-BO@$mAJWoqCj2kUC-Sqcm9Nld>!w}du zYS`KIJhyX~*uD>D&QmOA9eS3_%xdOjEkfuhjS{0yCWkV5bYrQDzh;iCcrfS^N!|8_ zPDX|hQY43I7Kd-Z%~cxSbV6VDbA`h~=DISrX=DwJ>uA@t$MfG7wy=dQY~lZI?Em(o z=g^tI6nk*sb^U+5zpwwszl1mbCC&1Ccx$`c$T|hQ=btIxe-)!~+P^6QTY%Ra;@e)$ z4i7=oTcoMN(|-Ho!)#n-9J-z)4&P1#Uo5JJ*-=8B0--&jQ4IHL>@dMN9|!kNVR z3#0Ztrs2YGseSU_8jk#Y%{#7u^B%LRC%mA`Lz&(AmEX7IIz*z>BK>`@tEckVEg1r^D~ zqcVzujv=c}7VJhzXI~SfAYukZ**J4G4gxsQ_>U|-q&@^O>5cbUqrahGv&U&hgREUC3t#0*ZZ znqj#r_T{kWOi}C>%d?{LLLM{Q3*Y^0TOhH*w?l-+17?Z~VfQiaOh$MaX^~xPgs$ zR`(0O`Kj=Szex6pYq+RW@SHKBQ5pKCS8{SDCyZr|DcRltPkRjAFM2FR8~E?^Hjh&e zoT3nzw%DI4{BJhopK@K`&XcXs>#6fRb>1nfUc`%Er zfyqZ^wuk$3%DQ>n=9(sM%xjwr$YY$M78R!$n(s}y@nI*qG#8=M5Qh;~W-|um&~vvQ z5%qCvZb8iS>`+S02vkASv|-eu6pXVvT{Z5+CU1qgDM>hqU_n$iC4*697(`zyX!j*#Yb@^soz3 zxg3#WGUQz8yF5(?YqQr!O(yHH+F&w5TK_Q{*H|@jL!!&q;09C$7=n*SaolDG>0;~) z#yq=}_(5TVc;*WHH#F5-99OR*5K&z!R;8K~gSdRfD7@%JmHvv2s($Qwnf82D=I)nw z{Isu;LJ{a>a+p-!B1U@{Q(go^7DQHq6^OaXI#6_ykl#oQgU~24OWF1T*c|6VPD-Pk zxHBEeD$7~ovDsGB2vt^hgl9^Kwp@xkkDEJ=Fery!na!kF(*fs!5I58echU0SU*pJA zZ@C*2wIu82c7HBtwg<|ssw)rrQm-rZ3rw*=zOzIFURjC$3FOc_Lxf8$odw#^0;Wt2 zh9H@wIkRtvc%6pFkLbe?yLljHqKT1Ul#h^B9OEF(dCh&;t3Lk6UW~Kn!DTlCFZ%Q^ zu!SvbVGI9xvH#m|*+X~lPowZ1jEzCv4m{`$gZ&SB{cmynqd#-tZI536JXiB`ia&e< z=p35$f8;O5)c@WL`mH}={f=dtNwoT@^;4ihL;QoEWm~n%B%0DB`_L(Ctv7g#n}Yyu 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