ttest_lnutil.py - electrum - Electrum Bitcoin wallet
HTML git clone https://git.parazyd.org/electrum
DIR Log
DIR Files
DIR Refs
DIR Submodules
---
ttest_lnutil.py (54929B)
---
1 import unittest
2 import json
3
4 from electrum import bitcoin
5 from electrum.json_db import StoredDict
6 from electrum.lnutil import (RevocationStore, get_per_commitment_secret_from_seed, make_offered_htlc,
7 make_received_htlc, make_commitment, make_htlc_tx_witness, make_htlc_tx_output,
8 make_htlc_tx_inputs, secret_to_pubkey, derive_blinded_pubkey, derive_privkey,
9 derive_pubkey, make_htlc_tx, extract_ctn_from_tx, UnableToDeriveSecret,
10 get_compressed_pubkey_from_bech32, split_host_port, ConnStringFormatError,
11 ScriptHtlc, extract_nodeid, calc_fees_for_commitment_tx, UpdateAddHtlc, LnFeatures,
12 ln_compare_features, IncompatibleLightningFeatures)
13 from electrum.util import bh2u, bfh, MyEncoder
14 from electrum.transaction import Transaction, PartialTransaction
15 from electrum.lnworker import LNWallet
16
17 from . import ElectrumTestCase
18
19
20 funding_tx_id = '8984484a580b825b9972d7adb15050b3ab624ccd731946b3eeddb92f4e7ef6be'
21 funding_output_index = 0
22 funding_amount_satoshi = 10000000
23 commitment_number = 42
24 local_delay = 144
25 local_dust_limit_satoshi = 546
26
27 local_payment_basepoint = bytes.fromhex('034f355bdcb7cc0af728ef3cceb9615d90684bb5b2ca5f859ab0f0b704075871aa')
28 remote_payment_basepoint = bytes.fromhex('032c0b7cf95324a07d05398b240174dc0c2be444d96b159aa6c7f7b1e668680991')
29 # obs = get_obscured_ctn(42, local_payment_basepoint, remote_payment_basepoint)
30 local_funding_privkey = bytes.fromhex('30ff4956bbdd3222d44cc5e8a1261dab1e07957bdac5ae88fe3261ef321f374901')
31 local_funding_pubkey = bytes.fromhex('023da092f6980e58d2c037173180e9a465476026ee50f96695963e8efe436f54eb')
32 remote_funding_pubkey = bytes.fromhex('030e9f7b623d2ccc7c9bd44d66d5ce21ce504c0acf6385a132cec6d3c39fa711c1')
33 local_privkey = bytes.fromhex('bb13b121cdc357cd2e608b0aea294afca36e2b34cf958e2e6451a2f27469449101')
34 localpubkey = bytes.fromhex('030d417a46946384f88d5f3337267c5e579765875dc4daca813e21734b140639e7')
35 remotepubkey = bytes.fromhex('0394854aa6eab5b2a8122cc726e9dded053a2184d88256816826d6231c068d4a5b')
36 local_delayedpubkey = bytes.fromhex('03fd5960528dc152014952efdb702a88f71e3c1653b2314431701ec77e57fde83c')
37 local_revocation_pubkey = bytes.fromhex('0212a140cd0c6539d07cd08dfe09984dec3251ea808b892efeac3ede9402bf2b19')
38 # funding wscript = 5221023da092f6980e58d2c037173180e9a465476026ee50f96695963e8efe436f54eb21030e9f7b623d2ccc7c9bd44d66d5ce21ce504c0acf6385a132cec6d3c39fa711c152ae
39
40
41 class TestLNUtil(ElectrumTestCase):
42 def test_shachain_store(self):
43 tests = [
44 {
45 "name": "insert_secret correct sequence",
46 "inserts": [
47 {
48 "index": 281474976710655,
49 "secret": "7cc854b54e3e0dcdb010d7a3fee464a9687b" +\
50 "e6e8db3be6854c475621e007a5dc",
51 "successful": True
52 },
53 {
54 "index": 281474976710654,
55 "secret": "c7518c8ae4660ed02894df8976fa1a3659c1" +\
56 "a8b4b5bec0c4b872abeba4cb8964",
57 "successful": True
58 },
59 {
60 "index": 281474976710653,
61 "secret": "2273e227a5b7449b6e70f1fb4652864038b1" +\
62 "cbf9cd7c043a7d6456b7fc275ad8",
63 "successful": True
64 },
65 {
66 "index": 281474976710652,
67 "secret": "27cddaa5624534cb6cb9d7da077cf2b22ab2" +\
68 "1e9b506fd4998a51d54502e99116",
69 "successful": True
70 },
71 {
72 "index": 281474976710651,
73 "secret": "c65716add7aa98ba7acb236352d665cab173" +\
74 "45fe45b55fb879ff80e6bd0c41dd",
75 "successful": True
76 },
77 {
78 "index": 281474976710650,
79 "secret": "969660042a28f32d9be17344e09374b37996" +\
80 "2d03db1574df5a8a5a47e19ce3f2",
81 "successful": True
82 },
83 {
84 "index": 281474976710649,
85 "secret": "a5a64476122ca0925fb344bdc1854c1c0a59" +\
86 "fc614298e50a33e331980a220f32",
87 "successful": True
88 },
89 {
90 "index": 281474976710648,
91 "secret": "05cde6323d949933f7f7b78776bcc1ea6d9b" +\
92 "31447732e3802e1f7ac44b650e17",
93 "successful": True
94 }
95 ]
96 },
97 {
98 "name": "insert_secret #1 incorrect",
99 "inserts": [
100 {
101 "index": 281474976710655,
102 "secret": "02a40c85b6f28da08dfdbe0926c53fab2d" +\
103 "e6d28c10301f8f7c4073d5e42e3148",
104 "successful": True
105 },
106 {
107 "index": 281474976710654,
108 "secret": "c7518c8ae4660ed02894df8976fa1a3659" +\
109 "c1a8b4b5bec0c4b872abeba4cb8964",
110 "successful": False
111 }
112 ]
113 },
114 {
115 "name": "insert_secret #2 incorrect (#1 derived from incorrect)",
116 "inserts": [
117 {
118 "index": 281474976710655,
119 "secret": "02a40c85b6f28da08dfdbe0926c53fab2de6" +\
120 "d28c10301f8f7c4073d5e42e3148",
121 "successful": True
122 },
123 {
124 "index": 281474976710654,
125 "secret": "dddc3a8d14fddf2b68fa8c7fbad274827493" +\
126 "7479dd0f8930d5ebb4ab6bd866a3",
127 "successful": True
128 },
129 {
130 "index": 281474976710653,
131 "secret": "2273e227a5b7449b6e70f1fb4652864038b1" +\
132 "cbf9cd7c043a7d6456b7fc275ad8",
133 "successful": True
134 },
135 {
136 "index": 281474976710652,
137 "secret": "27cddaa5624534cb6cb9d7da077cf2b22a" +\
138 "b21e9b506fd4998a51d54502e99116",
139 "successful": False
140 }
141 ]
142 },
143 {
144 "name": "insert_secret #3 incorrect",
145 "inserts": [
146 {
147 "index": 281474976710655,
148 "secret": "7cc854b54e3e0dcdb010d7a3fee464a9687b" +\
149 "e6e8db3be6854c475621e007a5dc",
150 "successful": True
151 },
152 {
153 "index": 281474976710654,
154 "secret": "c7518c8ae4660ed02894df8976fa1a3659c1" +\
155 "a8b4b5bec0c4b872abeba4cb8964",
156 "successful": True
157 },
158 {
159 "index": 281474976710653,
160 "secret": "c51a18b13e8527e579ec56365482c62f180b" +\
161 "7d5760b46e9477dae59e87ed423a",
162 "successful": True
163 },
164 {
165 "index": 281474976710652,
166 "secret": "27cddaa5624534cb6cb9d7da077cf2b22ab2" +\
167 "1e9b506fd4998a51d54502e99116",
168 "successful": False
169 }
170 ]
171 },
172 {
173 "name": "insert_secret #4 incorrect (1,2,3 derived from incorrect)",
174 "inserts": [
175 {
176 "index": 281474976710655,
177 "secret": "02a40c85b6f28da08dfdbe0926c53fab2de6" +\
178 "d28c10301f8f7c4073d5e42e3148",
179 "successful": True
180 },
181 {
182 "index": 281474976710654,
183 "secret": "dddc3a8d14fddf2b68fa8c7fbad274827493" +\
184 "7479dd0f8930d5ebb4ab6bd866a3",
185 "successful": True
186 },
187 {
188 "index": 281474976710653,
189 "secret": "c51a18b13e8527e579ec56365482c62f18" +\
190 "0b7d5760b46e9477dae59e87ed423a",
191 "successful": True
192 },
193 {
194 "index": 281474976710652,
195 "secret": "ba65d7b0ef55a3ba300d4e87af29868f39" +\
196 "4f8f138d78a7011669c79b37b936f4",
197 "successful": True
198 },
199 {
200 "index": 281474976710651,
201 "secret": "c65716add7aa98ba7acb236352d665cab1" +\
202 "7345fe45b55fb879ff80e6bd0c41dd",
203 "successful": True
204 },
205 {
206 "index": 281474976710650,
207 "secret": "969660042a28f32d9be17344e09374b379" +\
208 "962d03db1574df5a8a5a47e19ce3f2",
209 "successful": True
210 },
211 {
212 "index": 281474976710649,
213 "secret": "a5a64476122ca0925fb344bdc1854c1c0a" +\
214 "59fc614298e50a33e331980a220f32",
215 "successful": True
216 },
217 {
218 "index": 281474976710649,
219 "secret": "05cde6323d949933f7f7b78776bcc1ea6d9b" +\
220 "31447732e3802e1f7ac44b650e17",
221 "successful": False
222 }
223 ]
224 },
225 {
226 "name": "insert_secret #5 incorrect",
227 "inserts": [
228 {
229 "index": 281474976710655,
230 "secret": "7cc854b54e3e0dcdb010d7a3fee464a9687b" +\
231 "e6e8db3be6854c475621e007a5dc",
232 "successful": True
233 },
234 {
235 "index": 281474976710654,
236 "secret": "c7518c8ae4660ed02894df8976fa1a3659c1a" +\
237 "8b4b5bec0c4b872abeba4cb8964",
238 "successful": True
239 },
240 {
241 "index": 281474976710653,
242 "secret": "2273e227a5b7449b6e70f1fb4652864038b1" +\
243 "cbf9cd7c043a7d6456b7fc275ad8",
244 "successful": True
245 },
246 {
247 "index": 281474976710652,
248 "secret": "27cddaa5624534cb6cb9d7da077cf2b22ab21" +\
249 "e9b506fd4998a51d54502e99116",
250 "successful": True
251 },
252 {
253 "index": 281474976710651,
254 "secret": "631373ad5f9ef654bb3dade742d09504c567" +\
255 "edd24320d2fcd68e3cc47e2ff6a6",
256 "successful": True
257 },
258 {
259 "index": 281474976710650,
260 "secret": "969660042a28f32d9be17344e09374b37996" +\
261 "2d03db1574df5a8a5a47e19ce3f2",
262 "successful": False
263 }
264 ]
265 },
266 {
267 "name": "insert_secret #6 incorrect (5 derived from incorrect)",
268 "inserts": [
269 {
270 "index": 281474976710655,
271 "secret": "7cc854b54e3e0dcdb010d7a3fee464a9687b" +\
272 "e6e8db3be6854c475621e007a5dc",
273 "successful": True
274 },
275 {
276 "index": 281474976710654,
277 "secret": "c7518c8ae4660ed02894df8976fa1a3659c1a" +\
278 "8b4b5bec0c4b872abeba4cb8964",
279 "successful": True
280 },
281 {
282 "index": 281474976710653,
283 "secret": "2273e227a5b7449b6e70f1fb4652864038b1" +\
284 "cbf9cd7c043a7d6456b7fc275ad8",
285 "successful": True
286 },
287 {
288 "index": 281474976710652,
289 "secret": "27cddaa5624534cb6cb9d7da077cf2b22ab21" +\
290 "e9b506fd4998a51d54502e99116",
291 "successful": True
292 },
293 {
294 "index": 281474976710651,
295 "secret": "631373ad5f9ef654bb3dade742d09504c567" +\
296 "edd24320d2fcd68e3cc47e2ff6a6",
297 "successful": True
298 },
299 {
300 "index": 281474976710650,
301 "secret": "b7e76a83668bde38b373970155c868a65330" +\
302 "4308f9896692f904a23731224bb1",
303 "successful": True
304 },
305 {
306 "index": 281474976710649,
307 "secret": "a5a64476122ca0925fb344bdc1854c1c0a59f" +\
308 "c614298e50a33e331980a220f32",
309 "successful": True
310 },
311 {
312 "index": 281474976710648,
313 "secret": "05cde6323d949933f7f7b78776bcc1ea6d9b" +\
314 "31447732e3802e1f7ac44b650e17",
315 "successful": False
316 }
317 ]
318 },
319 {
320 "name": "insert_secret #7 incorrect",
321 "inserts": [
322 {
323 "index": 281474976710655,
324 "secret": "7cc854b54e3e0dcdb010d7a3fee464a9687b" +\
325 "e6e8db3be6854c475621e007a5dc",
326 "successful": True
327 },
328 {
329 "index": 281474976710654,
330 "secret": "c7518c8ae4660ed02894df8976fa1a3659c1a" +\
331 "8b4b5bec0c4b872abeba4cb8964",
332 "successful": True
333 },
334 {
335 "index": 281474976710653,
336 "secret": "2273e227a5b7449b6e70f1fb4652864038b1" +\
337 "cbf9cd7c043a7d6456b7fc275ad8",
338 "successful": True
339 },
340 {
341 "index": 281474976710652,
342 "secret": "27cddaa5624534cb6cb9d7da077cf2b22ab21" +\
343 "e9b506fd4998a51d54502e99116",
344 "successful": True
345 },
346 {
347 "index": 281474976710651,
348 "secret": "c65716add7aa98ba7acb236352d665cab173" +\
349 "45fe45b55fb879ff80e6bd0c41dd",
350 "successful": True
351 },
352 {
353 "index": 281474976710650,
354 "secret": "969660042a28f32d9be17344e09374b37996" +\
355 "2d03db1574df5a8a5a47e19ce3f2",
356 "successful": True
357 },
358 {
359 "index": 281474976710649,
360 "secret": "e7971de736e01da8ed58b94c2fc216cb1d" +\
361 "ca9e326f3a96e7194fe8ea8af6c0a3",
362 "successful": True
363 },
364 {
365 "index": 281474976710648,
366 "secret": "05cde6323d949933f7f7b78776bcc1ea6d" +\
367 "9b31447732e3802e1f7ac44b650e17",
368 "successful": False
369 }
370 ]
371 },
372 {
373 "name": "insert_secret #8 incorrect",
374 "inserts": [
375 {
376 "index": 281474976710655,
377 "secret": "7cc854b54e3e0dcdb010d7a3fee464a9687b" +\
378 "e6e8db3be6854c475621e007a5dc",
379 "successful": True
380 },
381 {
382 "index": 281474976710654,
383 "secret": "c7518c8ae4660ed02894df8976fa1a3659c1a" +\
384 "8b4b5bec0c4b872abeba4cb8964",
385 "successful": True
386 },
387 {
388 "index": 281474976710653,
389 "secret": "2273e227a5b7449b6e70f1fb4652864038b1" +\
390 "cbf9cd7c043a7d6456b7fc275ad8",
391 "successful": True
392 },
393 {
394 "index": 281474976710652,
395 "secret": "27cddaa5624534cb6cb9d7da077cf2b22ab21" +\
396 "e9b506fd4998a51d54502e99116",
397 "successful": True
398 },
399 {
400 "index": 281474976710651,
401 "secret": "c65716add7aa98ba7acb236352d665cab173" +\
402 "45fe45b55fb879ff80e6bd0c41dd",
403 "successful": True
404 },
405 {
406 "index": 281474976710650,
407 "secret": "969660042a28f32d9be17344e09374b37996" +\
408 "2d03db1574df5a8a5a47e19ce3f2",
409 "successful": True
410 },
411 {
412 "index": 281474976710649,
413 "secret": "a5a64476122ca0925fb344bdc1854c1c0a" +\
414 "59fc614298e50a33e331980a220f32",
415 "successful": True
416 },
417 {
418 "index": 281474976710648,
419 "secret": "a7efbc61aac46d34f77778bac22c8a20c6" +\
420 "a46ca460addc49009bda875ec88fa4",
421 "successful": False
422 }
423 ]
424 }
425 ]
426
427 for test in tests:
428 receiver = RevocationStore(StoredDict({}, None, []))
429 for insert in test["inserts"]:
430 secret = bytes.fromhex(insert["secret"])
431
432 try:
433 receiver.add_next_entry(secret)
434 except Exception as e:
435 if insert["successful"]:
436 raise Exception("Failed ({}): error was received but it shouldn't: {}".format(test["name"], e))
437 else:
438 if not insert["successful"]:
439 raise Exception("Failed ({}): error wasn't received".format(test["name"]))
440
441 for insert in test["inserts"]:
442 secret = bytes.fromhex(insert["secret"])
443 index = insert["index"]
444 if insert["successful"]:
445 self.assertEqual(secret, receiver.retrieve_secret(index))
446
447 print("Passed ({})".format(test["name"]))
448
449 def test_shachain_produce_consume(self):
450 seed = bitcoin.sha256(b"shachaintest")
451 consumer = RevocationStore(StoredDict({}, None, []))
452 for i in range(10000):
453 secret = get_per_commitment_secret_from_seed(seed, RevocationStore.START_INDEX - i)
454 try:
455 consumer.add_next_entry(secret)
456 except Exception as e:
457 raise Exception("iteration " + str(i) + ": " + str(e))
458 if i % 1000 == 0:
459 c1 = consumer
460 s1 = json.dumps(c1.storage, cls=MyEncoder)
461 c2 = RevocationStore(StoredDict(json.loads(s1), None, []))
462 s2 = json.dumps(c2.storage, cls=MyEncoder)
463 self.assertEqual(s1, s2)
464
465 def test_commitment_tx_with_all_five_HTLCs_untrimmed_minimum_feerate(self):
466 to_local_msat = 6988000000
467 to_remote_msat = 3000000000
468 local_feerate_per_kw = 0
469 # base commitment transaction fee = 0
470 # actual commitment transaction fee = 0
471
472 per_commitment_secret = 0x1f1e1d1c1b1a191817161514131211100f0e0d0c0b0a09080706050403020100
473 per_commitment_point = secret_to_pubkey(per_commitment_secret)
474
475 remote_htlcpubkey = remotepubkey
476 local_htlcpubkey = localpubkey
477
478 htlc_cltv_timeout = {}
479 htlc_payment_preimage = {}
480 htlc = {}
481
482 htlc_cltv_timeout[2] = 502
483 htlc_payment_preimage[2] = b"\x02" * 32
484 htlc[2] = make_offered_htlc(local_revocation_pubkey, remote_htlcpubkey, local_htlcpubkey, bitcoin.sha256(htlc_payment_preimage[2]))
485
486 htlc_cltv_timeout[3] = 503
487 htlc_payment_preimage[3] = b"\x03" * 32
488 htlc[3] = make_offered_htlc(local_revocation_pubkey, remote_htlcpubkey, local_htlcpubkey, bitcoin.sha256(htlc_payment_preimage[3]))
489
490 htlc_cltv_timeout[0] = 500
491 htlc_payment_preimage[0] = b"\x00" * 32
492 htlc[0] = make_received_htlc(local_revocation_pubkey, remote_htlcpubkey, local_htlcpubkey, bitcoin.sha256(htlc_payment_preimage[0]), htlc_cltv_timeout[0])
493
494 htlc_cltv_timeout[1] = 501
495 htlc_payment_preimage[1] = b"\x01" * 32
496 htlc[1] = make_received_htlc(local_revocation_pubkey, remote_htlcpubkey, local_htlcpubkey, bitcoin.sha256(htlc_payment_preimage[1]), htlc_cltv_timeout[1])
497
498 htlc_cltv_timeout[4] = 504
499 htlc_payment_preimage[4] = b"\x04" * 32
500 htlc[4] = make_received_htlc(local_revocation_pubkey, remote_htlcpubkey, local_htlcpubkey, bitcoin.sha256(htlc_payment_preimage[4]), htlc_cltv_timeout[4])
501
502 remote_signature = "304402204fd4928835db1ccdfc40f5c78ce9bd65249b16348df81f0c44328dcdefc97d630220194d3869c38bc732dd87d13d2958015e2fc16829e74cd4377f84d215c0b70606"
parazyd.org:70 /git/electrum/file/electrum/tests/test_lnutil.py.gph:512: line too long