electrum

Electrum Bitcoin wallet
git clone https://git.parazyd.org/electrum
Log | Files | Refs | Submodules

commit 196b4c00a35b288f28885c0ceb8afdd5ffbd9a0f
parent 0491da2c662fdf74c1470acdb2bb856640780245
Author: ThomasV <thomasv@electrum.org>
Date:   Mon,  8 Mar 2021 18:49:52 +0100

Use new value of option_trampoline_routing flag, add it to our invoices.
Keep supporting old value for Eclair/Phoenix.
Do not add trampoline_routing_hints in invoices.

Diffstat:
Melectrum/lnpeer.py | 1-
Melectrum/lnutil.py | 17+++++++++--------
Melectrum/lnworker.py | 15++++-----------
Melectrum/trampoline.py | 26+++++++++-----------------
4 files changed, 22 insertions(+), 37 deletions(-)

diff --git a/electrum/lnpeer.py b/electrum/lnpeer.py @@ -1453,7 +1453,6 @@ class Peer(Logger): amount_to_pay=amt_to_forward, min_cltv_expiry=cltv_from_onion, r_tags=[], - t_tags=[], invoice_features=invoice_features, fwd_trampoline_onion=next_trampoline_onion, fwd_trampoline_fee=trampoline_fee, diff --git a/electrum/lnutil.py b/electrum/lnutil.py @@ -947,14 +947,15 @@ class LnFeatures(IntFlag): _ln_feature_contexts[OPTION_SUPPORT_LARGE_CHANNEL_OPT] = (LNFC.INIT | LNFC.NODE_ANN) _ln_feature_contexts[OPTION_SUPPORT_LARGE_CHANNEL_REQ] = (LNFC.INIT | LNFC.NODE_ANN) - OPTION_TRAMPOLINE_ROUTING_REQ = 1 << 50 - OPTION_TRAMPOLINE_ROUTING_OPT = 1 << 51 - - # We do not set trampoline_routing_opt in invoices, because the spec is not ready. - # This ensures that current version of Phoenix can pay us - # It also prevents Electrum from using t_tags from future implementations - _ln_feature_contexts[OPTION_TRAMPOLINE_ROUTING_REQ] = (LNFC.INIT | LNFC.NODE_ANN) # | LNFC.INVOICE) - _ln_feature_contexts[OPTION_TRAMPOLINE_ROUTING_OPT] = (LNFC.INIT | LNFC.NODE_ANN) # | LNFC.INVOICE) + OPTION_TRAMPOLINE_ROUTING_REQ = 1 << 24 + OPTION_TRAMPOLINE_ROUTING_OPT = 1 << 25 + + _ln_feature_contexts[OPTION_TRAMPOLINE_ROUTING_REQ] = (LNFC.INIT | LNFC.NODE_ANN | LNFC.INVOICE) + _ln_feature_contexts[OPTION_TRAMPOLINE_ROUTING_OPT] = (LNFC.INIT | LNFC.NODE_ANN | LNFC.INVOICE) + + # temporary + OPTION_TRAMPOLINE_ROUTING_REQ_ECLAIR = 1 << 50 + OPTION_TRAMPOLINE_ROUTING_OPT_ECLAIR = 1 << 51 def validate_transitive_dependencies(self) -> bool: # for all even bit set, set corresponding odd bit: diff --git a/electrum/lnworker.py b/electrum/lnworker.py @@ -961,7 +961,6 @@ class LNWallet(LNWorker): invoice_pubkey=decoded_invoice.pubkey.serialize(), min_cltv_expiry=decoded_invoice.get_min_final_cltv_expiry(), r_tags=decoded_invoice.get_routing_info('r'), - t_tags=decoded_invoice.get_routing_info('t'), invoice_features=decoded_invoice.get_tag('9') or 0, trampoline_fee_level=0, use_two_trampolines=False, @@ -984,7 +983,6 @@ class LNWallet(LNWorker): invoice_pubkey = lnaddr.pubkey.serialize() invoice_features = LnFeatures(lnaddr.get_tag('9') or 0) r_tags = lnaddr.get_routing_info('r') - t_tags = lnaddr.get_routing_info('t') amount_to_pay = lnaddr.get_amount_msat() status = self.get_payment_status(payment_hash) if status == PR_PAID: @@ -1006,7 +1004,6 @@ class LNWallet(LNWorker): amount_to_pay=amount_to_pay, min_cltv_expiry=min_cltv_expiry, r_tags=r_tags, - t_tags=t_tags, invoice_features=invoice_features, attempts=attempts, full_path=full_path) @@ -1032,7 +1029,6 @@ class LNWallet(LNWorker): amount_to_pay: int, # in msat min_cltv_expiry: int, r_tags, - t_tags, invoice_features: int, attempts: int = 1, full_path: LNPaymentPath = None, @@ -1065,7 +1061,6 @@ class LNWallet(LNWorker): invoice_pubkey=node_pubkey, min_cltv_expiry=min_cltv_expiry, r_tags=r_tags, - t_tags=t_tags, invoice_features=invoice_features, full_path=full_path, payment_hash=payment_hash, @@ -1288,7 +1283,7 @@ class LNWallet(LNWorker): final_total_msat: int, # total payment amount final receiver will get invoice_pubkey, min_cltv_expiry, - r_tags, t_tags, + r_tags, invoice_features: int, payment_hash, payment_secret, @@ -1326,7 +1321,6 @@ class LNWallet(LNWorker): invoice_features=invoice_features, node_id=chan.node_id, r_tags=r_tags, - t_tags=t_tags, payment_hash=payment_hash, payment_secret=payment_secret, local_height=local_height, @@ -1354,7 +1348,7 @@ class LNWallet(LNWorker): amount_msat=amount_msat, invoice_pubkey=invoice_pubkey, min_cltv_expiry=min_cltv_expiry, - r_tags=r_tags, t_tags=t_tags, + r_tags=r_tags, invoice_features=invoice_features, outgoing_channel=None, full_path=full_path) routes = [(route, amount_msat, final_total_msat, amount_msat, min_cltv_expiry, payment_secret, fwd_trampoline_onion)] @@ -1390,7 +1384,6 @@ class LNWallet(LNWorker): invoice_features=invoice_features, node_id=node_id, r_tags=r_tags, - t_tags=t_tags, payment_hash=payment_hash, payment_secret=payment_secret, local_height=local_height, @@ -1429,7 +1422,7 @@ class LNWallet(LNWorker): amount_msat=part_amount_msat, invoice_pubkey=invoice_pubkey, min_cltv_expiry=min_cltv_expiry, - r_tags=r_tags, t_tags=t_tags, + r_tags=r_tags, invoice_features=invoice_features, outgoing_channel=channel, full_path=None) routes.append((route, part_amount_msat, final_total_msat, part_amount_msat, min_cltv_expiry, payment_secret, fwd_trampoline_onion)) @@ -1446,7 +1439,7 @@ class LNWallet(LNWorker): amount_msat: int, invoice_pubkey: bytes, min_cltv_expiry: int, - r_tags, t_tags, + r_tags, invoice_features: int, outgoing_channel: Channel = None, full_path: Optional[LNPaymentPath]) -> Tuple[LNPaymentRoute, int]: diff --git a/electrum/trampoline.py b/electrum/trampoline.py @@ -91,21 +91,13 @@ def create_trampoline_route( invoice_features:int, my_pubkey: bytes, trampoline_node_id, - r_tags, t_tags, + r_tags, trampoline_fee_level: int, use_two_trampolines: bool) -> LNPaymentRoute: invoice_features = LnFeatures(invoice_features) - # We do not set trampoline_routing_opt in our invoices, because the spec is not ready - # Do not use t_tags if the flag is set, because we the format is not decided yet - if invoice_features.supports(LnFeatures.OPTION_TRAMPOLINE_ROUTING_OPT): - is_legacy = False - if len(r_tags) > 0 and len(r_tags[0]) == 1: - pubkey, scid, feebase, feerate, cltv = r_tags[0][0] - t_tags = [pubkey, feebase, feerate, cltv] - else: - t_tags = None - elif len(t_tags) > 0: + if invoice_features.supports(LnFeatures.OPTION_TRAMPOLINE_ROUTING_OPT)\ + or invoice_features.supports(LnFeatures.OPTION_TRAMPOLINE_ROUTING_OPT_ECLAIR): is_legacy = False else: is_legacy = True @@ -154,13 +146,14 @@ def create_trampoline_route( route[-1].outgoing_node_id = invoice_pubkey else: last_trampoline = route[-1].end_node - for t_tag in t_tags: - pubkey, feebase, feerate, cltv = t_tag + r_tags = [x for x in r_tags if len(x) == 1] + random.shuffle(r_tags) + for r_tag in r_tags: + pubkey, scid, feebase, feerate, cltv = r_tag[0] if pubkey == trampoline_node_id: break else: - random.shuffle(t_tags) - pubkey, feebase, feerate, cltv = t_tags[0] + pubkey, scid, feebase, feerate, cltv = r_tag[0] if route[-1].node_id != pubkey: route.append( TrampolineEdge( @@ -241,7 +234,7 @@ def create_trampoline_route_and_onion( invoice_features, my_pubkey: bytes, node_id, - r_tags, t_tags, + r_tags, payment_hash, payment_secret, local_height:int, @@ -256,7 +249,6 @@ def create_trampoline_route_and_onion( invoice_features=invoice_features, trampoline_node_id=node_id, r_tags=r_tags, - t_tags=t_tags, trampoline_fee_level=trampoline_fee_level, use_two_trampolines=use_two_trampolines) # compute onion and fees