Trampoline routing.
- trampoline is enabled by default in config, to prevent download of `gossip_db`.
(if disabled, `gossip_db` will be downloaded, regardless of the existence of channels)
- if trampoline is enabled:
- the wallet can only open channels with trampoline nodes
- already-existing channels with non-trampoline nodes are frozen for sending.
- there are two types of trampoline payments: legacy and end-to-end (e2e).
- we decide to perform legacy or e2e based on the invoice:
- we use trampoline_routing_opt in features to detect Eclair and Phoenix invoices
- we use trampoline_routing_hints to detect Electrum invoices
- when trying a legacy payment, we add a second trampoline to the path to preserve privacy.
(we fall back to a single trampoline if the payment fails for all trampolines)
- the trampoline list is hardcoded, it will remain so until `trampoline_routing_opt` feature flag is in INIT.
- there are currently only two nodes in the hardcoded list, it would be nice to have more.
- similar to Phoenix, we find the fee/cltv by trial-and-error.
- if there is a second trampoline in the path, we use the same fee for both.
- the final spec should add fee info in error messages, so we will be able to fine-tune fees
This commit is contained in:
@@ -215,6 +215,10 @@ def lnencode(addr: 'LnAddr', privkey) -> str:
|
||||
pubkey, channel, feebase, feerate, cltv = step
|
||||
route.append(bitstring.BitArray(pubkey) + bitstring.BitArray(channel) + bitstring.pack('intbe:32', feebase) + bitstring.pack('intbe:32', feerate) + bitstring.pack('intbe:16', cltv))
|
||||
data += tagged('r', route)
|
||||
elif k == 't':
|
||||
pubkey, feebase, feerate, cltv = v
|
||||
route = bitstring.BitArray(pubkey) + bitstring.pack('intbe:32', feebase) + bitstring.pack('intbe:32', feerate) + bitstring.pack('intbe:16', cltv)
|
||||
data += tagged('t', route)
|
||||
elif k == 'f':
|
||||
data += encode_fallback(v, addr.currency)
|
||||
elif k == 'd':
|
||||
@@ -409,6 +413,13 @@ def lndecode(invoice: str, *, verbose=False, expected_hrp=None) -> LnAddr:
|
||||
s.read(32).uintbe,
|
||||
s.read(16).uintbe))
|
||||
addr.tags.append(('r',route))
|
||||
elif tag == 't':
|
||||
s = bitstring.ConstBitStream(tagdata)
|
||||
e = (s.read(264).tobytes(),
|
||||
s.read(32).uintbe,
|
||||
s.read(32).uintbe,
|
||||
s.read(16).uintbe)
|
||||
addr.tags.append(('t', e))
|
||||
elif tag == 'f':
|
||||
fallback = parse_fallback(tagdata, addr.currency)
|
||||
if fallback:
|
||||
|
||||
Reference in New Issue
Block a user