From b64e97a68b5200dac52d3e9f341eabaf8aac9236 Mon Sep 17 00:00:00 2001 From: ThomasV Date: Wed, 11 Apr 2018 11:02:10 +0200 Subject: [PATCH] integrate lnbase with network --- electrum/commands.py | 3 ++- electrum/network.py | 29 +++++++++++++++++++++-------- lib/lnbase.py | 26 ++++++++++++++++++++------ 3 files changed, 43 insertions(+), 15 deletions(-) diff --git a/electrum/commands.py b/electrum/commands.py index b82f4e3f..5528143e 100644 --- a/electrum/commands.py +++ b/electrum/commands.py @@ -855,7 +855,8 @@ def add_global_options(parser): group.add_argument("--testnet", action="store_true", dest="testnet", default=False, help="Use Testnet") group.add_argument("--regtest", action="store_true", dest="regtest", default=False, help="Use Regtest") group.add_argument("--simnet", action="store_true", dest="simnet", default=False, help="Use Simnet") - group.add_argument("--lightning", action="store_true", dest="lightning", default=False, help="Enable Lightning support") + group.add_argument("--lightning", action="store_true", dest="lightning", default=False, help="Enable Lightning support via hub") + group.add_argument("--lnbase", action="store_true", dest="lnbase", default=False, help="Enable Lightning support") def get_parser(): # create main parser diff --git a/electrum/network.py b/electrum/network.py index 48914989..761977db 100644 --- a/electrum/network.py +++ b/electrum/network.py @@ -1090,16 +1090,27 @@ class Network(util.DaemonThread): def run(self): self.init_headers_file() + self.futures = [] loop = asyncio.new_event_loop() networkAndWalletLock = QLock() def asyncioThread(): asyncio.set_event_loop(loop) - self.lightninglock.acquire() - if self.lightningrpc is not None and self.lightningworker is not None: - task = asyncio.ensure_future(asyncio.gather(self.lightningrpc.run(networkAndWalletLock), self.lightningworker.run(networkAndWalletLock))) - loop.run_forever() - if self.config.get("lightning", False): - threading.Thread(target=asyncioThread).start() + if self.config.get("lightning", False): + self.lightninglock.acquire() + if self.lightningrpc is not None and self.lightningworker is not None: + task = asyncio.ensure_future(asyncio.gather(self.lightningrpc.run(networkAndWalletLock), self.lightningworker.run(networkAndWalletLock))) + loop.run_forever() + if self.config.get('lnbase', False): + from .lnbase import Peer + import binascii + host, port, pubkey = ('ecdsa.net', '9735', '038370f0e7a03eded3e1d41dc081084a87f0afa1c5b22090b4f3abb391eb15d8ff') + pubkey = binascii.unhexlify(pubkey) + port = int(port) + privkey = b"\x21"*32 + b"\x01" + peer = Peer(privkey, host, port, pubkey) + self.futures.append(asyncio.run_coroutine_threadsafe(peer.main_loop(loop), loop)) + + threading.Thread(target=asyncioThread).start() networkAndWalletLock.acquire() while self.is_running(): self.maintain_sockets() @@ -1109,12 +1120,14 @@ class Network(util.DaemonThread): self.process_pending_sends() networkAndWalletLock.release() networkAndWalletLock.acquire() + # cancel tasks + [f.cancel for f in self.futures] loop.stop() if loop.is_running(): time.sleep(0.1) try: - loop.close() + loop.close() except: - pass + pass self.stop_network() self.on_stop() diff --git a/lib/lnbase.py b/lib/lnbase.py index 9b84560f..cafdb970 100644 --- a/lib/lnbase.py +++ b/lib/lnbase.py @@ -18,6 +18,7 @@ import cryptography.hazmat.primitives.ciphers.aead as AEAD from electrum.bitcoin import public_key_from_private_key, ser_to_point, point_to_ser, string_to_number from electrum.bitcoin import int_to_hex, bfh, rev_hex from electrum.util import PrintError +from electrum.wallet import Wallet tcp_socket_timeout = 10 server_response_timeout = 60 @@ -111,7 +112,6 @@ def gen_msg(msg_type, **kwargs): data += param return data -############################### def decode(string): @@ -309,6 +309,9 @@ class Peer(PrintError): elif message == 'channel_update': pass + def open_channel(self): + pass + async def main_loop(self, loop): self.reader, self.writer = await asyncio.open_connection(self.host, self.port, loop=loop) await self.handshake() @@ -323,12 +326,20 @@ class Peer(PrintError): msg = await self.read_message() self.process_message(msg) # close socket + self.print_error('closing lnbase') self.writer.close() + + +# replacement for lightningCall +class LNWallet(Wallet): - def run(self): - loop = asyncio.get_event_loop() - loop.run_until_complete(self.main_loop(loop)) - loop.close() + def __init__(self, wallet, peer): + self.wallet = wallet + self.peer = peer + + def openchannel(self): + # todo: get utxo from wallet + self.peer.open_channel() node_list = [ @@ -346,4 +357,7 @@ if __name__ == "__main__": port = int(port) privkey = b"\x21"*32 + b"\x01" peer = Peer(privkey, host, port, pubkey) - peer.run() + loop = asyncio.get_event_loop() + loop.run_until_complete(peer.main_loop(loop)) + loop.close() +