tchannel_establishment_flow: wait for confirmations of funding txn - electrum - Electrum Bitcoin wallet HTML git clone https://git.parazyd.org/electrum DIR Log DIR Files DIR Refs DIR Submodules --- DIR commit 4aa9d7ea0d660d706e3fb7d29eba942773ee68a3 DIR parent a4809245b3618fb1644a8f4f2a944b6bbfcdb43b HTML Author: SomberNight <somber.night@protonmail.com> Date: Thu, 19 Apr 2018 15:05:38 +0200 channel_establishment_flow: wait for confirmations of funding txn Diffstat: M lib/lnbase.py | 27 +++++++++++++++++++++++++-- M lib/tests/test_lnbase_online.py | 3 ++- 2 files changed, 27 insertions(+), 3 deletions(-) --- DIR diff --git a/lib/lnbase.py b/lib/lnbase.py t@@ -449,11 +449,12 @@ def make_commitment(ctn, local_funding_pubkey, remote_funding_pubkey, remotepubk class Peer(PrintError): - def __init__(self, host, port, pubkey, request_initial_sync=True): + def __init__(self, host, port, pubkey, request_initial_sync=True, network=None): self.host = host self.port = port self.privkey = os.urandom(32) + b"\x01" self.pubkey = pubkey + self.network = network self.read_buffer = b'' self.ping_time = 0 self.channel_accepted = {} t@@ -706,6 +707,7 @@ class Peer(PrintError): remote_revocation_basepoint = payload['revocation_basepoint'] remote_payment_basepoint = payload['payment_basepoint'] remote_delayed_payment_basepoint = payload['delayed_payment_basepoint'] + funding_txn_minimum_depth = int.from_bytes(payload['minimum_depth'], byteorder="big") self.print_error('remote dust limit', remote_dust_limit_satoshis) self.print_error('remote delay', remote_delay) # create funding tx t@@ -772,6 +774,22 @@ class Peer(PrintError): self.remote_funding_locked[channel_id] = asyncio.Future() self.network.broadcast(funding_tx) # wait until we see confirmations + + def on_network_update(event, *args): + if event == 'updated': + conf = wallet.get_tx_height(funding_txid)[1] + if conf >= funding_txn_minimum_depth: + try: + self.local_funding_locked[channel_id].set_result(1) + except (asyncio.InvalidStateError, KeyError) as e: + # FIXME race condition if updates come in quickly, set_result might be called multiple times + # or self.local_funding_locked[channel_id] might be deleted already + self.print_error('local_funding_locked.set_result error for channel {}: {}'.format(channel_id, e)) + self.network.unregister_callback(on_network_update, ['updated']) + else: + self.print_error("unexpected network message:", event, args) + self.network.register_callback(on_network_update, ['updated']) + try: await self.local_funding_locked[channel_id] finally: t@@ -874,7 +892,12 @@ class ChannelDB(PrintError): def on_channel_update(self, msg_payload): short_channel_id = msg_payload['short_channel_id'] - self._id_to_channel_info[short_channel_id].on_channel_update(msg_payload) + try: + channel_info = self._id_to_channel_info[short_channel_id] + except KeyError: + pass # ignore channel update + else: + channel_info.on_channel_update(msg_payload) def remove_channel(self, short_channel_id): try: DIR diff --git a/lib/tests/test_lnbase_online.py b/lib/tests/test_lnbase_online.py t@@ -34,8 +34,9 @@ if __name__ == "__main__": # wallet storage = WalletStorage(config.get_wallet_path()) wallet = Wallet(storage) + wallet.start_threads(network) # start peer - peer = Peer(host, port, pubkey, request_initial_sync=False) + peer = Peer(host, port, pubkey, request_initial_sync=False, network=network) network.futures.append(asyncio.run_coroutine_threadsafe(peer.main_loop(), network.asyncio_loop)) # run blocking test start = time.time()