ttest_lnrouter.py - electrum - Electrum Bitcoin wallet
HTML git clone https://git.parazyd.org/electrum
DIR Log
DIR Files
DIR Refs
DIR Submodules
---
ttest_lnrouter.py (34448B)
---
1 import unittest
2 import tempfile
3 import shutil
4 import asyncio
5
6 from electrum.util import bh2u, bfh, create_and_start_event_loop
7 from electrum.lnonion import (OnionHopsDataSingle, new_onion_packet,
8 process_onion_packet, _decode_onion_error, decode_onion_error,
9 OnionFailureCode, OnionPacket)
10 from electrum import bitcoin, lnrouter
11 from electrum.constants import BitcoinTestnet
12 from electrum.simple_config import SimpleConfig
13 from electrum.lnrouter import PathEdge
14
15 from . import TestCaseForTestnet
16 from .test_bitcoin import needs_test_with_all_chacha20_implementations
17
18
19 class Test_LNRouter(TestCaseForTestnet):
20
21 def setUp(self):
22 super().setUp()
23 self.asyncio_loop, self._stop_loop, self._loop_thread = create_and_start_event_loop()
24 self.config = SimpleConfig({'electrum_path': self.electrum_path})
25
26 def tearDown(self):
27 self.asyncio_loop.call_soon_threadsafe(self._stop_loop.set_result, 1)
28 self._loop_thread.join(timeout=1)
29 super().tearDown()
30
31 def test_find_path_for_payment(self):
32 class fake_network:
33 config = self.config
34 asyncio_loop = asyncio.get_event_loop()
35 trigger_callback = lambda *args: None
36 register_callback = lambda *args: None
37 interface = None
38 fake_network.channel_db = lnrouter.ChannelDB(fake_network())
39 fake_network.channel_db.data_loaded.set()
40 cdb = fake_network.channel_db
41 path_finder = lnrouter.LNPathFinder(cdb)
42 self.assertEqual(cdb.num_channels, 0)
43 cdb.add_channel_announcement({'node_id_1': b'\x02bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb', 'node_id_2': b'\x02cccccccccccccccccccccccccccccccc',
44 'bitcoin_key_1': b'\x02bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb', 'bitcoin_key_2': b'\x02cccccccccccccccccccccccccccccccc',
45 'short_channel_id': bfh('0000000000000001'),
46 'chain_hash': BitcoinTestnet.rev_genesis_bytes(),
47 'len': 0, 'features': b''}, trusted=True)
48 self.assertEqual(cdb.num_channels, 1)
49 cdb.add_channel_announcement({'node_id_1': b'\x02bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb', 'node_id_2': b'\x02eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee',
50 'bitcoin_key_1': b'\x02bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb', 'bitcoin_key_2': b'\x02eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee',
51 'short_channel_id': bfh('0000000000000002'),
52 'chain_hash': BitcoinTestnet.rev_genesis_bytes(),
53 'len': 0, 'features': b''}, trusted=True)
54 cdb.add_channel_announcement({'node_id_1': b'\x02aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa', 'node_id_2': b'\x02bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb',
55 'bitcoin_key_1': b'\x02aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa', 'bitcoin_key_2': b'\x02bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb',
56 'short_channel_id': bfh('0000000000000003'),
57 'chain_hash': BitcoinTestnet.rev_genesis_bytes(),
58 'len': 0, 'features': b''}, trusted=True)
59 cdb.add_channel_announcement({'node_id_1': b'\x02cccccccccccccccccccccccccccccccc', 'node_id_2': b'\x02dddddddddddddddddddddddddddddddd',
60 'bitcoin_key_1': b'\x02cccccccccccccccccccccccccccccccc', 'bitcoin_key_2': b'\x02dddddddddddddddddddddddddddddddd',
61 'short_channel_id': bfh('0000000000000004'),
62 'chain_hash': BitcoinTestnet.rev_genesis_bytes(),
63 'len': 0, 'features': b''}, trusted=True)
64 cdb.add_channel_announcement({'node_id_1': b'\x02dddddddddddddddddddddddddddddddd', 'node_id_2': b'\x02eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee',
65 'bitcoin_key_1': b'\x02dddddddddddddddddddddddddddddddd', 'bitcoin_key_2': b'\x02eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee',
66 'short_channel_id': bfh('0000000000000005'),
67 'chain_hash': BitcoinTestnet.rev_genesis_bytes(),
68 'len': 0, 'features': b''}, trusted=True)
69 cdb.add_channel_announcement({'node_id_1': b'\x02aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa', 'node_id_2': b'\x02dddddddddddddddddddddddddddddddd',
70 'bitcoin_key_1': b'\x02aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa', 'bitcoin_key_2': b'\x02dddddddddddddddddddddddddddddddd',
71 'short_channel_id': bfh('0000000000000006'),
72 'chain_hash': BitcoinTestnet.rev_genesis_bytes(),
73 'len': 0, 'features': b''}, trusted=True)
74 cdb.add_channel_update({'short_channel_id': bfh('0000000000000001'), 'message_flags': b'\x00', 'channel_flags': b'\x00', 'cltv_expiry_delta': 10, 'htlc_minimum_msat': 250, 'fee_base_msat': 100, 'fee_proportional_millionths': 150, 'chain_hash': BitcoinTestnet.rev_genesis_bytes(), 'timestamp': 0})
75 cdb.add_channel_update({'short_channel_id': bfh('0000000000000001'), 'message_flags': b'\x00', 'channel_flags': b'\x01', 'cltv_expiry_delta': 10, 'htlc_minimum_msat': 250, 'fee_base_msat': 100, 'fee_proportional_millionths': 150, 'chain_hash': BitcoinTestnet.rev_genesis_bytes(), 'timestamp': 0})
76 cdb.add_channel_update({'short_channel_id': bfh('0000000000000002'), 'message_flags': b'\x00', 'channel_flags': b'\x00', 'cltv_expiry_delta': 99, 'htlc_minimum_msat': 250, 'fee_base_msat': 100, 'fee_proportional_millionths': 150, 'chain_hash': BitcoinTestnet.rev_genesis_bytes(), 'timestamp': 0})
77 cdb.add_channel_update({'short_channel_id': bfh('0000000000000002'), 'message_flags': b'\x00', 'channel_flags': b'\x01', 'cltv_expiry_delta': 10, 'htlc_minimum_msat': 250, 'fee_base_msat': 100, 'fee_proportional_millionths': 150, 'chain_hash': BitcoinTestnet.rev_genesis_bytes(), 'timestamp': 0})
78 cdb.add_channel_update({'short_channel_id': bfh('0000000000000003'), 'message_flags': b'\x00', 'channel_flags': b'\x01', 'cltv_expiry_delta': 10, 'htlc_minimum_msat': 250, 'fee_base_msat': 100, 'fee_proportional_millionths': 150, 'chain_hash': BitcoinTestnet.rev_genesis_bytes(), 'timestamp': 0})
79 cdb.add_channel_update({'short_channel_id': bfh('0000000000000003'), 'message_flags': b'\x00', 'channel_flags': b'\x00', 'cltv_expiry_delta': 10, 'htlc_minimum_msat': 250, 'fee_base_msat': 100, 'fee_proportional_millionths': 150, 'chain_hash': BitcoinTestnet.rev_genesis_bytes(), 'timestamp': 0})
80 cdb.add_channel_update({'short_channel_id': bfh('0000000000000004'), 'message_flags': b'\x00', 'channel_flags': b'\x01', 'cltv_expiry_delta': 10, 'htlc_minimum_msat': 250, 'fee_base_msat': 100, 'fee_proportional_millionths': 150, 'chain_hash': BitcoinTestnet.rev_genesis_bytes(), 'timestamp': 0})
81 cdb.add_channel_update({'short_channel_id': bfh('0000000000000004'), 'message_flags': b'\x00', 'channel_flags': b'\x00', 'cltv_expiry_delta': 10, 'htlc_minimum_msat': 250, 'fee_base_msat': 100, 'fee_proportional_millionths': 150, 'chain_hash': BitcoinTestnet.rev_genesis_bytes(), 'timestamp': 0})
82 cdb.add_channel_update({'short_channel_id': bfh('0000000000000005'), 'message_flags': b'\x00', 'channel_flags': b'\x01', 'cltv_expiry_delta': 10, 'htlc_minimum_msat': 250, 'fee_base_msat': 100, 'fee_proportional_millionths': 150, 'chain_hash': BitcoinTestnet.rev_genesis_bytes(), 'timestamp': 0})
83 cdb.add_channel_update({'short_channel_id': bfh('0000000000000005'), 'message_flags': b'\x00', 'channel_flags': b'\x00', 'cltv_expiry_delta': 10, 'htlc_minimum_msat': 250, 'fee_base_msat': 100, 'fee_proportional_millionths': 999, 'chain_hash': BitcoinTestnet.rev_genesis_bytes(), 'timestamp': 0})
84 cdb.add_channel_update({'short_channel_id': bfh('0000000000000006'), 'message_flags': b'\x00', 'channel_flags': b'\x00', 'cltv_expiry_delta': 10, 'htlc_minimum_msat': 250, 'fee_base_msat': 100, 'fee_proportional_millionths': 99999999, 'chain_hash': BitcoinTestnet.rev_genesis_bytes(), 'timestamp': 0})
85 cdb.add_channel_update({'short_channel_id': bfh('0000000000000006'), 'message_flags': b'\x00', 'channel_flags': b'\x01', 'cltv_expiry_delta': 10, 'htlc_minimum_msat': 250, 'fee_base_msat': 100, 'fee_proportional_millionths': 150, 'chain_hash': BitcoinTestnet.rev_genesis_bytes(), 'timestamp': 0})
86 path = path_finder.find_path_for_payment(
87 nodeA=b'\x02aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa',
88 nodeB=b'\x02eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee',
89 invoice_amount_msat=100000)
90 self.assertEqual([PathEdge(start_node=b'\x02aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa', end_node=b'\x02bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb', short_channel_id=bfh('0000000000000003')),
91 PathEdge(start_node=b'\x02bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb', end_node=b'\x02eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee', short_channel_id=bfh('0000000000000002')),
92 ], path)
93 route = path_finder.create_route_from_path(path)
94 self.assertEqual(b'\x02bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb', route[0].node_id)
95 self.assertEqual(bfh('0000000000000003'), route[0].short_channel_id)
96
97 cdb.stop()
98 asyncio.run_coroutine_threadsafe(cdb.stopped_event.wait(), self.asyncio_loop).result()
99
100 @needs_test_with_all_chacha20_implementations
101 def test_new_onion_packet_legacy(self):
102 # test vector from bolt-04
103 payment_path_pubkeys = [
104 bfh('02eec7245d6b7d2ccb30380bfbe2a3648cd7a942653f5aa340edcea1f283686619'),
105 bfh('0324653eac434488002cc06bbfb7f10fe18991e35f9fe4302dbea6d2353dc0ab1c'),
106 bfh('027f31ebc5462c1fdce1b737ecff52d37d75dea43ce11c74d25aa297165faa2007'),
107 bfh('032c0b7cf95324a07d05398b240174dc0c2be444d96b159aa6c7f7b1e668680991'),
108 bfh('02edabbd16b41c8371b92ef2f04c1185b4f03b6dcd52ba9b78d9d7c89c8f221145'),
109 ]
110 session_key = bfh('4141414141414141414141414141414141414141414141414141414141414141')
111 associated_data = bfh('4242424242424242424242424242424242424242424242424242424242424242')
112 hops_data = [
113 OnionHopsDataSingle(is_tlv_payload=False, payload={
114 "amt_to_forward": {"amt_to_forward": 0},
115 "outgoing_cltv_value": {"outgoing_cltv_value": 0},
116 "short_channel_id": {"short_channel_id": bfh('0000000000000000')},
117 }),
118 OnionHopsDataSingle(is_tlv_payload=False, payload={
119 "amt_to_forward": {"amt_to_forward": 1},
120 "outgoing_cltv_value": {"outgoing_cltv_value": 1},
121 "short_channel_id": {"short_channel_id": bfh('0101010101010101')},
122 }),
123 OnionHopsDataSingle(is_tlv_payload=False, payload={
124 "amt_to_forward": {"amt_to_forward": 2},
125 "outgoing_cltv_value": {"outgoing_cltv_value": 2},
126 "short_channel_id": {"short_channel_id": bfh('0202020202020202')},
127 }),
128 OnionHopsDataSingle(is_tlv_payload=False, payload={
129 "amt_to_forward": {"amt_to_forward": 3},
130 "outgoing_cltv_value": {"outgoing_cltv_value": 3},
131 "short_channel_id": {"short_channel_id": bfh('0303030303030303')},
132 }),
133 OnionHopsDataSingle(is_tlv_payload=False, payload={
134 "amt_to_forward": {"amt_to_forward": 4},
135 "outgoing_cltv_value": {"outgoing_cltv_value": 4},
136 "short_channel_id": {"short_channel_id": bfh('0404040404040404')},
137 }),
138 ]
139 packet = new_onion_packet(payment_path_pubkeys, session_key, hops_data, associated_data)
parazyd.org:70 /git/electrum/file/electrum/tests/test_lnrouter.py.gph:149: line too long